ExRegisterCallback 関数 (wdm.h)

ExRegisterCallback ルーチンは、特定のコールバック ルーチンを特定のコールバック オブジェクトに登録します。

構文

PVOID ExRegisterCallback(
  [in, out]      PCALLBACK_OBJECT   CallbackObject,
  [in]           PCALLBACK_FUNCTION CallbackFunction,
  [in, optional] PVOID              CallbackContext
);

パラメーター

[in, out] CallbackObject

ExCreateCallback ルーチンから取得したコールバック オブジェクトへのポインター。

[in] CallbackFunction

ドライバーによって実装されるコールバック ルーチンへのポインター。これは、非ページである必要があります。 コールバック ルーチンは、次のプロトタイプに準拠している必要があります。

VOID
(*PCALLBACK_FUNCTION ) (
    IN PVOID CallbackContext,
    IN PVOID Argument1,
    IN PVOID Argument2
    );

コールバック ルーチン パラメーターは次のとおりです。

CallbackContext

ExRegisterCallbackCallbackContext パラメーターで指定されたドライバー指定のコンテキスト領域へのポインター。

Argument1

コールバック オブジェクトによって定義されたパラメーターへのポインター。

Argument2

コールバック オブジェクトによって定義されたパラメーターへのポインター。

[in, optional] CallbackContext

コールバック ルーチンが呼び出されるたびに、コールバック ルーチンのコンテキスト パラメーターとして渡されるデータ項目の呼び出し元定義構造へのポインター。 通常、コンテキストは呼び出し元のデバイス オブジェクト拡張機能の一部です。

戻り値

ExRegisterCallback は、システム使用のために不透明で予約済みとして扱う必要があるコールバック登録ハンドルへのポインターを返します。 ExRegisterCallback がエラーで完了した場合、このポインターは NULL です

注釈

ドライバーは ExRegisterCallback を呼び出して、コールバック ルーチンを指定されたコールバック オブジェクトに登録します。

オブジェクトが登録されたコールバック ルーチンを 1 つだけ許可し、そのようなルーチンが既に登録されている場合、 ExRegisterCallbackNULL を返します。

ExRegisterCallback の呼び出し元は、ExUnregisterCallback の呼び出しで後で使用するために、返されたポインターを保存する必要があります。 コールバック オブジェクトの登録済みコールバック ルーチンの一覧からコールバック ルーチンを削除する場合は、ポインターが必要です。

登録されたコールバック ルーチンの Argument1Argument2 の意味はコールバック オブジェクトに依存し、作成したコンポーネントによって定義されます。 システム定義コールバック オブジェクトのパラメーターを次に示します。

\Callback\SetSystemTime

Argument1 (SetSystemTime)

  • 使用されていません。

Argument2 (SetSystemTime)

  • 使用されていません。

\Callback\PowerState**

Argument1 (PowerState)

  • PVOID 型にキャストされるPO_CB_XXX定数値。

  • PO_CB_AC_STATUS — システムが A/C からバッテリ電源に、またはその逆に変更されたことを示します。

  • PO_CB_LID_SWITCH_STATE — カバー スイッチが状態を変更したことを示します。

  • PO_CB_PROCESSOR_POWER_POLICY — システム プロセッサの電源ポリシーが変更されたことを示します。

  • PO_CB_SYSTEM_POWER_POLICY — システム電源ポリシーが変更されたことを示します。

  • PO_CB_SYSTEM_STATE_LOCK — システム電源状態の変化が差し迫っていることを示します。 ページング パス内のドライバーは、このような変更の早期警告を受け取るためにこのコールバックに登録できます。これにより、電源状態が変更される前にコードをメモリにロックできます。

Argument2 (PowerState)

PVOID 型にキャストされる TRUE または FALSE の値。

  • Argument1 がPO_CB_AC_STATUSの場合、コンピューターが現在 A/C 電源を使用している場合は Argument2TRUE になり、コンピューターがバッテリ電源で実行されている場合は FALSE になります。

  • 引数 1 がPO_CB_LID_SWITCH_STATEの場合、引数 2 は蓋が現在開いている場合は TRUE、蓋が閉じている場合は FALSE です。

  • 引数 1 がPO_CB_PROCESSOR_POWER_POLICY場合、Argument2 は使用されません。

  • 引数 1 がPO_CB_SYSTEM_POWER_POLICY場合、Argument2 は使用されません。

  • Argument1 がPO_CB_SYSTEM_STATE_LOCKの場合、コンピューターがシステム電源状態 S0 を終了しようとしている場合は Argument2FALSE になり、コンピューターが S0 を再入力した場合は TRUE になります。

\Callback\ProcessorAdd

Argument1 (ProcessorAdd)

  • プロセッサ変更通知イベントを記述する KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT 構造体へのポインター。 このポインターは PVOID 型にキャストされます。 コールバック ルーチンでは、この構造体の内容を変更することはできません。

Argument2 (ProcessorAdd)

NTSTATUS 値を含む変数へのポインター。 このポインターは PVOID 型にキャストされます。 特定の条件下では、コールバック ルーチンはエラー状態値をこの変数に書き込んで、新しいプロセッサを追加しない理由を示すことができます。 次の 3 つの条件がすべて当てはまる場合を除き、デバイス ドライバーはこの変数の値を変更しないでください。

  • 新しいプロセッサが追加されないようにする必要があるコールバック ルーチンの処理中にエラーが発生します。

  • Argument1 が指すKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT構造体の State メンバーの値は、KeProcessorAddStartNotify です

  • Argument2 が指す NSTATUS 変数には、STATUS_SUCCESS値が含まれています。 つまり、コールバック ルーチンは、以前に別のコールバック通知クライアントによって書き込まれたエラー状態値を上書きしないでください。

Windows Vista 以降では、 \Callback\ProcessorAdd コールバック オブジェクトを使用して、プロセッサの作成の変更を動的に追跡できます。 KeRegisterProcessorChangeCallback ルーチンは同様の情報を提供しますが、ドライバーが初期マルチプロセッサ システム構成でプロセッサを列挙するために使用できるKE_PROCESSOR_CHANGE_ADD_EXISTING フラグもサポートします。 Windows Server 2008 以降のバージョンの Windows で実行されるドライバーの場合は、可能であれば、\Callback\ProcessorAdd コールバック オブジェクトの代わりに KeRegisterProcessorChangeCallback を使用します。

コールバック オブジェクトの詳細については、「 コールバック オブジェクト」を参照してください。

オペレーティング システムは、コールバックを作成したドライバーが ExNotifyCallback ルーチンを呼び出したのと同じ IRQL で登録済みのコールバック ルーチンを呼び出します。

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL IRQL <= APC_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport), IrqlExApcLte2(wdm)

こちらもご覧ください

ExCreateCallback

ExNotifyCallback

ExUnregisterCallback

KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT

KeRegisterProcessorChangeCallback