次の方法で共有


KeRegisterProcessorChangeCallback 関数 (wdm.h)

KeRegisterProcessorChangeCallback ルーチンは、オペレーティング システムにコールバック関数を登録して、新しいプロセッサがハードウェア パーティションに追加されたときにオペレーティング システムからドライバーに通知されるようにします。

構文

PVOID KeRegisterProcessorChangeCallback(
  [in]           PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
  [in, optional] PVOID                        CallbackContext,
  [in]           ULONG                        Flags
);

パラメーター

[in] CallbackFunction

新しいプロセッサがハードウェア パーティションに追加されるたびにオペレーティング システムによって呼び出される、ドライバー提供のプロセッサ変更コールバック関数へのポインター。 プロセッサ変更コールバック関数は、次のように定義されます。

VOID
  ProcessorCallback(
    __in PVOID CallbackContext,
    __in PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
    __inout PNTSTATUS OperationStatus
    );

CallbackContext

コールバック関数がオペレーティング システムに登録されたときに、CallbackContext パラメーターで KeRegisterProcessorChangeCallback ルーチンに渡されたコンテキスト。

ChangeContext

プロセッサ変更通知イベントを記述する KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 構造体へのポインター。

OperationStatus

NTSTATUS コードを含む変数へのポインター。 ChangeContext パラメーターが指す KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 構造体の State メンバーに KeProcessorAddStartNotify が含まれている場合を除き、デバイス ドライバーはコールバック関数の処理中にエラーが発生した場合を除き、この変数の値を変更しないでください。

プロセッサ変更コールバック関数は、IRQL = PASSIVE_LEVEL で呼び出されます。

[in, optional] CallbackContext

コールバック関数に渡されるドライバー提供のコンテキスト。 このパラメーターは NULL できます。

[in] Flags

KeRegisterProcessorChangeCallback ルーチンの動作を変更する省略可能なフラグ。 考えられるフラグの 1 つを次に示します。

KE_PROCESSOR_CHANGE_ADD_EXISTING

このフラグを設定すると、新しいプロセッサがハードウェア パーティションに追加されるたびに呼び出されるだけでなく、ハードウェア パーティションに現在存在するアクティブなプロセッサごとに、登録済みのコールバック関数が直ちに呼び出されます。 このフラグが設定されていない場合、登録済みのコールバック関数は、新しいプロセッサがシステムに追加されるたびに呼び出されます。

戻り値

KeRegisterProcessorChangeCallback は、コールバック関数がオペレーティング システムに正常に登録された場合、非NULL コールバック登録ハンドルを返します。 それ以外の場合、KeRegisterProcessorChangeCallback は NULL 返します。 このハンドルの詳細については、次の「解説」セクションを参照してください。

備考

デバイス ドライバーは、KeRegisterProcessorChangeCallback ルーチンを呼び出して、新しいプロセッサがハードウェア パーティションに追加されるたびにオペレーティング システムによって呼び出されるコールバック関数を登録します。 ユーザーが新しいプロセッサをパーティションにホット プラグすると、オペレーティング システムは登録済みのコールバック関数を呼び出して、パーティション内のプロセッサ間で割り当てられているシステム リソースを再調整します。

登録済みのコールバック関数は、新しいプロセッサがハードウェア パーティションに追加されるたびに 2 回呼び出されます。 コールバック関数が初めて呼び出されると、ChangeContext パラメーターによって指される KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 構造体の State メンバーに、KeProcessorAddStartNotify が含まれます。 このコールバック中に、デバイス ドライバーはプロセッサごとのリソースを割り当て、ハードウェア パーティションで新しいプロセッサがアクティブになる準備として他のタスクを実行する必要があります。 オペレーティング システムが引き続き新しいプロセッサをハードウェア パーティションに追加する場合にバグチェックが発生する可能性があるこのコールバックをデバイス ドライバーが処理しているときにエラーが発生した場合、コールバック関数は、OperationStatus パラメーターが指す変数を、エラー状態を記述する NTSTATUS コードに設定します。 たとえば、デバイス ドライバーが新しいプロセッサのプロセッサごとのデータ構造のメモリ割り当てエラーが発生した場合、コールバック関数は、この変数をSTATUS_INSUFFICIENT_RESOURCESに設定します。 コールバックが正常に処理された場合、OperationStatus パラメーターが指す変数の内容は変更しないでください。

コールバック関数が 2 回目に呼び出されると、ChangeContext パラメーターによって指される KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 構造体の State メンバーに、KeProcessorAddCompleteNotifyが含まれます。これは、オペレーティング システムが新しいプロセッサをハードウェア パーティションに正常に追加したことを示します。 または KeProcessorAddFailureNotify します。オペレーティング システムが新しいプロセッサをハードウェア パーティションに追加しなかったことを示します。 オペレーティング システムが新しいプロセッサをハードウェア パーティションに正常に追加した場合、コールバック関数は、新しいプロセッサが開始され、スレッド スケジュールに使用できるようになるまで、2 回目は呼び出されません。 オペレーティング システムがハードウェア パーティションに新しいプロセッサを追加しなかった場合、デバイス ドライバーは、最初のコールバック中に割り当てられた 2 番目のコールバック中にプロセッサごとのリソースを解放する必要があります。

KeRegisterProcessorChangeCallback ルーチンを呼び出すときに、デバイス ドライバーが Flags パラメーターにKE_PROCESSOR_CHANGE_ADD_EXISTING フラグを指定した場合、コールバック関数は、ハードウェア パーティションに現在存在するアクティブプロセッサごとに 1 回すぐに呼び出されます。 これらのコールバックの場合、ChangeContext パラメーターが指す KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 構造体の State メンバーには、KeProcessorAddStartNotify が含まれます。 これらのコールバック中に、デバイス ドライバーはプロセッサごとのリソースを割り当て、ハードウェア パーティション内の既存のプロセッサを使用する準備をするために他のタスクを実行する必要があります。 デバイス ドライバーが、ハードウェア パーティションに現在存在するすべてのアクティブなプロセッサに対してこのコールバックを正常に処理すると、現在ハードウェア パーティションに存在するアクティブなプロセッサごとにコールバック関数が直ちに再度呼び出されます。 これらのコールバックの場合、ChangeContext パラメーターが指す KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 構造体の State メンバーには、KeProcessorAddCompleteNotify が含まれます。 KeRegisterProcessorChangeCallback 、これらのコールバックの完了後に返されます。

デバイス ドライバーがハードウェア パーティション内の既存のアクティブなプロセッサの最初のコールバックを処理しているときにエラーが発生した場合、ドライバーが読み込み続ける場合にバグチェックが発生する可能性があります、コールバック関数は、エラー状態を記述する NTSTATUS コードに OperationStatus パラメーターによって指される変数を設定します。 たとえば、デバイス ドライバーで、既存のアクティブなプロセッサのプロセッサごとのデータ構造のメモリ割り当てエラーが発生した場合、コールバック関数は、この変数をSTATUS_INSUFFICIENT_RESOURCESに設定します。 コールバックが正常に処理された場合、OperationStatus パラメーターが指す変数の内容は変更しないでください。

デバイス ドライバーは、ハードウェア パーティション内の既存のアクティブなプロセッサのいずれかの最初のコールバックが処理されるときにエラーを示す場合、コールバック関数は呼び出されません既存のアクティブなプロセッサのそれ以上。 代わりに、コールバック関数は、コールバックが最初に呼び出されたアクティブなプロセッサごとに 2 回目にすぐに呼び出されます。コールバックがエラーを示したアクティブ なプロセッサは除きます。 これらのコールバックの場合、ChangeContext パラメーターが指す KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 構造体の State メンバーには、KeProcessorAddFailureNotify が含まれます。

通常、デバイス ドライバーは、DriverEntry ルーチン内から KeRegisterProcessorChangeCallback ルーチンを呼び出します。 KeRegisterProcessorChangeCallback ルーチンの呼び出しが NULL 返す場合、デバイス ドライバーの DriverEntry ルーチンは、エラー状態を説明する NTSTATUS コードを返す必要があります。

デバイス ドライバーは、コールバック関数がエラー条件を記述する NTSTATUS コードを格納できる場所として、KeRegisterProcessorChangeCallback ルーチンに CallbackContext パラメーターで渡されるコンテキストを使用できます。 この NTSTATUS コードは、デバイス ドライバーの DriverEntry ルーチンの戻り値として使用できます。

KeRegisterProcessorChangeCallback によって返される状態値は、コールバック関数の登録が成功したか失敗したかのみを示します。 KeRegisterProcessorChangeCallback が返 前に発生する可能性があるコールバック関数の呼び出しが成功または失敗したことを示すものではありません。

デバイス ドライバーがオペレーティング システムからアンロードされる前に、プロセッサの変更を通知するために登録されているコールバック関数を登録解除する必要があります。 コールバック関数の登録を解除するために、デバイス ドライバーは、KeDeregisterProcessorChangeCallback ルーチンを呼び出し、このルーチンに入力パラメーターとして、KeRegisterProcessorChangeCallback ルーチンの呼び出しによって返された登録ハンドルを渡します。

必要条件

要件 価値
ターゲット プラットフォーム 万国
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
ライブラリ NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

関連項目

KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT

KeDeregisterProcessorChangeCallback