ミニドライバーの同期
ストリーミング ミニドライバー開発者には、クラス ドライバーに同期を処理できるようにするオプションがあります。 ミニドライバーをクラス ドライバーに登録する場合、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 は、ストリーム クラスの同期なしで実行するストリーム ミニドライバーが使用できる同期オブジェクトの一部です。