転送の非同期処理
最上位レベルのドライバーを除き、すべてのドライバーは IRP_MJ_READ と IRP_MJ_WRITE 要求を非同期的に処理します。 最上位レベルのドライバーでも、DispatchRead ルーチンと DispatchWrite ルーチンは、下位レベルのドライバーが非同期の読み取りまたは書き込み要求の処理を完了するのを待つことはできません。そのような要求を下位ドライバーに渡し、STATUS_PENDING を返す必要があります。
同様に、最下位レベルのデバイス ドライバーの DispatchReadWrite ルーチンは、デバイス I/O 要求を処理した後 STATUS_PENDING を返す他のドライバー ルーチンに、転送要求を渡す必要があります。
上位レベルのドライバーが部分的な転送 IRP を設定し、下位のドライバーに渡す必要が生じることがあります。 上位レベルのドライバーは、下位ドライバーによって部分的な転送要求が完了した場合のみ、元の読み取り/書き込み IRP を完了できます。
たとえば、SCSI クラス ドライバーの DispatchReadWrite ルーチンは、基になる HBA の転送機能を超える大規模な転送要求を一連の部分転送要求に分割する必要があります。 クラス ドライバーは、SCSI ポート/ミニポート ドライバーが単一の DMA 操作で各部分転送要求を満たすことができるよう、その部分転送 IRP のパラメーターを設定する必要があります。
DMA または PIO を使用する他のデバイス ドライバーも、大規模な転送要求を自身で分割する必要が生じることがあります。
DMA と PIO の使用方法について詳しくは、「入力/出力手法」をご覧ください。