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 状態のままになります。
通知イベントで同期するには:
- IoCreateNotificationEvent を使用して通知イベントを開きます。 EventName 文字列を使用してイベントを識別します。
- IoCreateNotificationEvent によって返された PKEVENT を使用して KeWaitForSingleObject を呼び出して、イベントが通知されるまで待ちます。 複数の実行スレッドは、特定の通知イベントを待機できます。 停止の代わりにポーリングするには、0 の タイムアウト を KeWaitForSingleObject に指定します。
- イベントへのアクセスが不要になった場合は、通知イベントのハンドルを 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) |