ドライバーは、他のドライバーが作成ドライバーによって定義された条件の通知を要求できるコールバック オブジェクトを作成できます。 次の図は、コールバック オブジェクトの定義に関連する手順を示しています。
オブジェクトを作成する前に、ドライバーは InitializeObjectAttributes を呼び出して属性を設定します。 コールバック オブジェクトには、システム定義コールバックの名前と一致しない名前が必要です。作成者が適切と見なす他の属性 (通常はOBJ_CASE_INSENSITIVE) を持つことができます。 次に、ドライバー ExCreateCallbackを呼び出し、初期化された属性へのポインターと、コールバック オブジェクトへのハンドルを受け取る場所を渡します。 また、このような名前付きオブジェクトがまだ存在しない場合にシステムがコールバック オブジェクトを作成する必要があるかどうか、およびオブジェクトが複数の登録済みコールバック ルーチンを許可する必要があるかどうかを示す、2 つのブール値も渡されます。
ドライバーは、登録されたコールバック ルーチンを呼び出す条件を定義します。 条件は 2 つの引数の形式をとります。各引数は、コールバックを作成するドライバーによって定義されたパラメーターを指します。 ドライバーのクライアントに対して、コールバック オブジェクトの名前と、通知を要求する IRQL と共に、これらの条件を文書化する必要があります。
コールバック条件が発生すると、ドライバーは ExNotifyCallback呼び出し、そのハンドルをコールバック オブジェクトと 2 つの引数に渡します。 その後、システムは、コールバック オブジェクトに登録されているすべてのコールバック ルーチンを、登録された順序で呼び出し、2 つの引数と、ルーチンの登録時に指定されたコンテキストへのポインターを渡します。 ドライバーは、IRQL <= DISPATCH_LEVEL で ExNotifyCallback 呼び出す必要があります。システムは、ドライバーがこの呼び出しを行ったのと同じ IRQL でコールバック ルーチンを呼び出します。
コールバック オブジェクトを使用してすべての操作が完了したら、コールバックを作成したドライバーは、ObDereferenceObject を呼び出して、その参照カウントを減らし、オブジェクトが削除されるようにする必要があります。