コールバック オブジェクトの定義

ドライバーは、他のドライバーが作成ドライバーによって定義された条件の通知を要求できるコールバック オブジェクトを作成できます。 次の図は、コールバック オブジェクトの定義に関連する手順を示しています。

diagram illustrating defining a callback object.

オブジェクトを作成する前に、ドライバーは InitializeObjectAttributes を呼び出して属性を設定します。 コールバック オブジェクトには、システム定義コールバックの名前と同一でない名前が必要です。作成者が適切と判断する他の属性 (通常は OBJ_CASE_INSENSITIVE.) を持つことができます。 次に、ドライバーは ExCreateCallback を呼び出し、初期化された属性へのポインターと、コールバック オブジェクトへのハンドルを受け取る場所を渡します。 また、このような名前付きオブジェクトがまだ存在しない場合にシステムがコールバック オブジェクトを作成する必要があるかどうか、およびオブジェクトが複数の登録済みコールバック ルーチンを許可する必要があるかどうかを示す、2 つのブール値も渡されます。

ドライバーは、登録されたコールバック ルーチンを呼び出す条件を定義します。 条件は 2 つの引数の形式を取り、各引数は、コールバックを作成するドライバーによって定義されたパラメーターを指します。 ドライバーのクライアントに関するこれらの条件は、コールバック オブジェクトの名前および通知を要求する IRQL と共に文書化する必要があります。

コールバック条件が発生すると、ドライバーは ExNotifyCallback を呼び出し、そのハンドルをコールバック オブジェクトと 2 つの引数に渡します。 その後、システムは、コールバック オブジェクトに登録されているすべてのコールバック ルーチンを登録された順序で呼び出し、2 つの引数と、ルーチンの登録時に指定されたコンテキストへのポインターを渡します。 ドライバーは、IRQL <= DISPATCH_LEVEL で ExNotifyCallback を呼び出す必要があります。システムは、ドライバーがこの呼び出しを行ったのと同じ IRQL でコールバック ルーチンを呼び出します。

コールバック オブジェクトを使用してすべての操作が完了したら、コールバックを作成したドライバーは ObDereferenceObject を呼び出して参照カウントをデクリメントし、オブジェクトを確実に削除する必要があります。