次の方法で共有


IoCreateNotificationEvent 関数 (wdm.h)

IoCreateNotificationEvent ルーチンは、イベントが発生したことを 1 つ以上の実行スレッドに通知するために使用される名前付き通知イベントを作成または開きます。

構文

PKEVENT IoCreateNotificationEvent(
  [in]  PUNICODE_STRING EventName,
  [out] PHANDLE         EventHandle
);

パラメーター

[in] EventName

イベントに名前を付ける null で終わる Unicode 文字列を含むバッファーへのポインター。

[out] EventHandle

イベント オブジェクトのカーネル ハンドルを返す場所へのポインター。

戻り値

IoCreateNotificationEvent は、作成または開かれたイベント オブジェクトへのポインターを返し、イベント オブジェクトを作成または開くことができない場合は NULL を 返します。

注釈

イベント オブジェクトがまだ存在しない場合、 IoCreateNotificationEvent はそれを作成して開き、その状態を Signaled に設定します。

イベント オブジェクトが既に存在する場合、 IoCreateNotificationEvent はイベント オブジェクトを開くだけです。

通知イベントと同期イベントの両方を使用して、実行を調整します。 ただし、同期イベント自体はリセットされますが、ドライバーが KeClearEvent または KeResetEvent を呼び出すまで、通知イベントは Signaled 状態のままになります。

通知イベントで同期するには:

  1. IoCreateNotificationEvent を使用して通知イベントを開きます。 EventName 文字列を使用してイベントを識別します。
  2. IoCreateNotificationEvent によって返された PKEVENT を使用して KeWaitForSingleObject を呼び出して、イベントが通知されるまで待ちます。 複数の実行スレッドは、特定の通知イベントを待機できます。 停止の代わりにポーリングするには、0 の タイムアウトKeWaitForSingleObject に指定します。
  3. イベントへのアクセスが不要になった場合は、通知イベントのハンドルを ZwClose で閉じます。

イベント オブジェクトを共有するには、次の 2 つのメインメソッドがあります。

  • ユーザー モード アプリケーションは、イベント オブジェクトを作成し、IOCTL をドライバーに送信することによって、オブジェクトへのハンドルをドライバーに渡します。 ドライバーは、イベント オブジェクトを作成したプロセスのコンテキストで IOCTL を処理する必要があり、 ObReferenceObjectByHandle を呼び出してハンドルを検証する必要があります。 このメソッドは、ユーザー モードとカーネル モードの間でイベント オブジェクトを共有するために推奨される方法です。

  • ドライバーは、グローバル \BaseNamedObjects オブジェクト ディレクトリに名前付きイベント オブジェクトを作成します。 ユーザー モードからカーネル モード イベントにアクセスするには、Xxx という名前Global\\を使用します。 セキュリティ設定により、アプリケーションがイベントを開くことができない可能性があることに注意してください。 オブジェクト ディレクトリは\\BaseNamedObjects、Microsoft Win32 サブシステムが初期化されるまで作成されないため、起動時に読み込まれるドライバーは、その DriverEntry ルーチン内のディレクトリに\\BaseNamedObjectsイベント オブジェクトを作成できません。

イベントの詳細については、「 イベント オブジェクト」を参照してください。

要件

要件
サポートされている最小のクライアント Windows 2000 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport), IrqlIoPassive4(wdm)

こちらもご覧ください

IoCreateSynchronizationEvent

KeClearEvent

KeResetEvent

KeSetEvent

KeWaitForSingleObject

RtlInitUnicodeString

ZwClose