ストリーミング ミニドライバー開発者には、クラス ドライバーが同期を処理できるようにするオプションがあります。 ミニドライバーは、クラス ドライバーに自分自身を登録するときに、HW_INITIALIZATION_DATAの TurnOffSynchronization メンバーを FALSE に設定することで、クラス ドライバーが提供する同期を選択できます。
クラス ドライバーが同期を処理するとき、ミニドライバー コードの 2 つの部分が同時に実行されないようにします。 クラス ドライバーは、すべてのストリーム要求をキューに入れ、一度に 1 つずつミニドライバーに渡します。
この同期の 1 つの目的は、ミニドライバー ライターが、マルチタスク、再入可能、マルチプロセッサ環境でのドライバーの同期と要求キューのすべての詳細を処理する必要をなくす方法です。 しかし、一部のミニドライバーはそれを使用すべきではありません。 同期に関してミニドライバーが実行する必要がある操作を示す 2 つの例が、「同期 の例 」トピックに示されています。
ストリームクラスの同期をオフにすると、すべての要求が送信スレッドのコンテキストで直ちに非同期的にミニドライバーに呼び出され、PASSIVE_LEVELで実行されます。 上記の規則の例外は、HwCancelPacket、TimeoutHandler、および Timer ルーチンです。 これらは、DISPATCH_LEVELで呼び出されます。 最後の例外は、DIRQL で呼び出される割り込みハンドラーです。
同期がオフの場合、ミニドライバーは WDM モデルに準拠して同期を実行します。 ミニドライバーがPASSIVE_LEVELで呼び出されると、その後、DPCや割り込みなどの高いIRQLイベントによって先取りされる可能性があります。 同様に、ミニドライバーがDISPATCH_LEVELで呼び出されると、その後、割り込みによってプリエンプトされる可能性があります。 共有リソースを操作するミニドライバー関数は、アクセスを同期する必要があります。
ストリーム クラスの同期がオフの場合、同じストリームまたは異なるストリームに対して複数の要求を同時に発行できます。 ミニドライバーは、独自の要求をキューに入れ、他のスレッドと ISR とのハードウェア同期を処理する必要があります。 スピン ロック、ミューテックス、 および KeSynchronizeExecution は、ストリーム クラスの同期なしで実行されているミニドライバーをストリームで使用できる同期オブジェクトの一部です。