重複した I/O 操作の処理

デバイス上の操作を重複させるドライバーの DpcForIsr または CustomDpc ルーチンは、StartIo ルーチンへの要求入力と、IoRequestDpc または KeInsertQueueDpc への ISR の呼び出しの間の 1 対 1 の対応に依存できません。 このようなドライバーの DpcForIsr または CustomDpc は、IRP と ISR が提供するコンテキストへの入力ポインター、またはターゲット デバイス オブジェクトの CurrentIrp ポインターを使用して、その IRP のみを完了することが必ずしもできません。

いずれの時点においても、同じ DPC オブジェクトを 2 回キューに入れることはできません。 対応する DpcForIsr または CustomDpc が実行される前に ISR が IoRequestDpc または KeInsertQueueDpc を複数回呼び出した場合、プロセッサ上の IRQL がDISPATCH_LEVEL を下回った場合のみ DPC ルーチンが 1 回だけ実行されます。 一方、対応する DpcForIsr または CustomDpc が別のプロセッサで実行されている間に ISR が IoRequestDpc または KeInsertQueueDpc を呼び出した場合、DPC ルーチンは 2 つのプロセッサで同時に実行できます。

そのため、デバイス上の割り込み駆動 I/O 操作と重複するドライバーには、以下が必要です。

  • 呼び出されるたびに未処理の要求のドライバーによって保持される数を完了できる DpcForIsr または CustomDpc ルーチン

  • DpcForIsr または CustomDpc ルーチンがコンテキスト情報を使用し、コンテキスト情報が属する IRP を完了するまで、そのルーチンに渡されるコンテキスト情報を上書きしない ISR

  • DpcForIsr または CustomDpc ルーチンの代わりに ISR のコンテキスト領域にアクセスする SynchCritSection ルーチン