上位レベル ドライバーの DispatchReadWrite
ファイル システム ドライバーを除き、上位ドライバーには通常、IRP の内部ドライバー キューはありません。 このようなドライバーの DispatchReadWrite ルーチンは、状況に応じて IoCompletion ルーチンを設定した後、「ドライバー スタックへの IRP の受け渡し」の説明に従って、有効なパラメーターを持つ IRP を下位のドライバーに渡すことができます。
ただし、SCSI クラス ドライバーの DispatchReadWrite ルーチンは、主要関数コードである IRP_MJ_READ または IRP_MJ_WRITE を使用して、IRP を SCSI ポート/ミニポート ドライバー ペアに転送する場合、事前に大量の転送要求を小さく分割する必要があります。 詳細については、記憶域クラス ドライバーの SplitTransferRequest ルーチンを参照してください。
上位ドライバーが、DispatchReadWrite ルーチンを使用して次の下位ドライバー用に IRP を設定し、1 つ以上の IRP を割り当てていくつかの部分転送を要求する場合、DispatchReadWrite ルーチンは、ドライバーが割り当てられた各 IRP で IoSetCompletionRoutine を呼び出す必要があります。 ドライバーは、IoCompletion ルーチンが、ドライバーによって割り当てられたすべての IRP を解放し、最終的に元の要求を完了できるように、その IoCompletion ルーチンを登録して、各部分転送操作で転送されるデータの量を追跡する必要があります。
基になるドライバーがリムーバブル メディア デバイスを制御する場合、上位レベルのドライバーによって割り当てられた IRP にはスレッド コンテキストが必要です。 スレッド コンテキストを設定するには、割り当て側のドライバーが、新しく割り当たられた各 IRP の Irp->Tail.Overlay.Thread を、受信転送 IRP の同じ値から設定する必要があります。 詳細については、「リムーバブル メディアのサポート」を参照してください。
基になるデバイス ドライバーが部分転送の IRP をエラーとともに返した場合、IoCompletion ルーチンは、上位ドライバーが割り当てた IRP とメモリを解放した後で、部分転送要求を再試行するか、I/O ステータス ブロックに I/O ステータス エラーを設定して元の IRP を完了させることができます。
上位レベルのドライバーの DispatchReadWrite ルーチンが部分転送操作のメモリを割り当て、その割り当てがドライバーの IoCompletion ルーチン (または基になるデバイス ドライバー) によってアクセスされる場合、DispatchReadWrite ルーチンは、非ページ プールからそのメモリを割り当てる必要があります。