ダイレクト I/O 用にデバイス オブジェクトを設定する下位レベルのデバイス ドライバーは、デバイスからシステム物理メモリに転送されたデータを返すことによって、読み取り要求を満たします。これは、 Irp->MdlAddress の MDL によって記述されます。 システムの物理メモリからデバイスにデータを転送することで、書き込み要求を満たします。
下位レベルのドライバーは、読み取り/書き込み要求を非同期的に処理する必要があります。 そのため、下位レベルのすべてのドライバーの DispatchReadWrite ルーチンは、ドライバー スタックへの IRP の渡し に関する説明に従って、有効なパラメーターを持 つ IRP_MJ_READ および IRP_MJ_WRITE IRP を他のドライバー ルーチンに 渡す必要があります。
下位レベルのドライバーに送信される読み取り/書き込み IRP の場合、 Irp->MdlAddress の MDL によって記述されたページングされた物理メモリは、要求された転送を実行するための正しいアクセス権について既にプローブされており、チェーンの最上位ドライバーまたは I/O マネージャーによって既にロックダウンされています。 ダイレクト I/O 用にデバイス オブジェクトを設定する中間または最下位レベルのドライバーでは、 MmProbeAndLockPages を呼び出さないでください。これは既に完了しているためです。 最下位レベルのドライバーは 、MmGetSystemAddressForMdlSafe を呼び出します。 (Windows 98 用ドライバーは、代わりに MmGetSystemAddressForMdl を呼び出します。Windows Me、Windows 2000 以降のバージョンの Windows 用ドライバーでは 、MmGetSystemAddressForMdlSafe を使用する必要があります)。
中間レベルまたは下位レベルのデバイス ドライバーの DispatchReadWrite ルーチンは、有効なパラメーターを持つ IRP のみを渡す上位レベルのドライバーを信頼できない場合は、読み取り/書き込み IRP の I/O スタックの場所でパラメーターを検証する必要があります。 DispatchReadWrite ルーチンがパラメーター エラーを検出した場合は、「IRP の完了」で既に説明されているように、適切なエラー STATUS_XXX 値で IRP を完了する必要があります。 パラメーターが有効な場合、中間ドライバーの DispatchReadWrite ルーチンは、Higher-Level ドライバーの DispatchReadWrite のガイドラインに従って、さらに処理するために要求を渡す必要があります。
最下位レベルのデバイス ドライバーの DispatchReadWrite ルーチンは、転送要求で IoMarkIrpPending を呼び出し、他のドライバー ルーチンによる処理のために IRP を渡し、「 ドライバー スタックに IRP を渡す」の説明に従って、STATUS_PENDINGを返す必要があります。
デバイス ドライバーの DispatchReadWrite ルーチンは、ドライバーによって決定されたキー値を使用して IoStartPacket を呼び出すことによって、I/O スループットを高速化するために、IRP がデバイスにキューに入れる順序を制御できることに注意してください。 ドライバーの別のルーチンは、後で IRP をデキューし、要求された長さを部分転送操作に分割する必要があるかどうかを判断し、データを転送するデバイスをプログラムします。
一般に、デバイスの制限に合わせて大きな転送要求を分割する必要があるデバイス ドライバーは、特定の転送要求のデバイスを設定する直前まで、これらの操作を延期する必要があります。 このようなデバイス ドライバーの DispatchReadWrite ルーチンは、デバイス固有の転送制約について受信 IRP の I/O スタックの場所を確認したり、部分的な転送範囲の計算を試行したりしないでください。ドライバーは、 StartIo (またはその他のドライバー ルーチン) プログラムの直前までこれらのチェックを延期して転送操作を行う必要があります。