IoCreateSynchronizationEvent 関数 (wdm.h)
IoCreateSynchronizationEvent ルーチンは、ハードウェアへのアクセスのシリアル化に使用する名前付き同期イベントを、それ以外の 2 つの関連付けられていないドライバー間で作成または開きます。
構文
PKEVENT IoCreateSynchronizationEvent(
[in] PUNICODE_STRING EventName,
[out] PHANDLE EventHandle
);
パラメーター
[in] EventName
イベントに名前を付ける null で終わる Unicode 文字列を含むバッファーへのポインター。
[out] EventHandle
イベント オブジェクトのハンドルを返す場所へのポインター。 Windows Server 2003 以降のバージョンの Windows では、返されるハンドルは カーネル ハンドルです。
戻り値
IoCreateSynchronizationEvent は、作成または開かれたイベント オブジェクトへのポインターを返し、イベント オブジェクトを作成または開けなかった場合は NULL を 返します。
注釈
イベント オブジェクトがまだ存在しない場合は作成されます。 IoCreateSynchronizationEvent は 、新しい同期イベントの状態を Signaled に設定します。 イベント オブジェクトが既に存在する場合は、単純に開かれます。 同期イベントを使用するドライバーのペアは、このルーチンによって返される PKEVENT ポインターを使用して KeWaitForSingleObject を呼び出します。
同期イベントが Signaled 状態に設定されると、イベントを待機していた単一の実行スレッドが解放され、イベントは自動的に Not-Signaled 状態にリセットされます。
イベントを解放するために、ドライバーはイベント ハンドルを使用して ZwClose を呼び出します。
ユーザー モードとカーネル モードの間でイベント オブジェクトを共有するには、注意が必要です。 イベント オブジェクトを共有するには、次の 2 つのメインメソッドがあります。
ユーザー モード アプリケーションは、イベント オブジェクトを作成し、IOCTL をドライバーに送信することによって、オブジェクトへのハンドルをドライバーに渡します。 ドライバーは、イベント オブジェクトを作成したプロセスのコンテキストで IOCTL を処理する必要があり、 ObReferenceObjectByHandle を呼び出してハンドルを検証する必要があります。 このメソッドは、ユーザー モードとカーネル モードの間でイベント オブジェクトを共有するために推奨される方法です。
ドライバーは、グローバル
\BaseNamedObjects
オブジェクト ディレクトリに名前付きイベント オブジェクトを作成します。 ユーザー モードからカーネル モード イベントにアクセスするには、Xxx という名前Global\\
を使用します。 セキュリティ設定により、アプリケーションがイベントを開くことができない可能性があることに注意してください。 \BaseNamedObjects オブジェクト ディレクトリは、Microsoft Win32 サブシステムが初期化されるまで作成されないため、起動時に読み込まれるドライバーは 、DriverEntry ルーチンの \BaseNamedObjects ディレクトリにイベント オブジェクトを作成できません
イベントの詳細については、「 イベント オブジェクト」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Ntddk.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDDIs(storport), IrqlIoPassive4(wdm), PowerIrpDDis(wdm) |