次の方法で共有


ダイレクト I/O を使用した DispatchReadWrite

ダイレクト I/O 用にデバイス オブジェクトを設定する下位デバイス ドライバーは、読み取り要求に対して、デバイスから転送されたデータをシステム物理メモリ (Irp->MdlAddress の MDL によって記述される) に返すことで対応します。 書き込み要求に対しては、システムの物理メモリからデバイスにデータを転送て対応します。

下位ドライバーは、読み取り/書き込み要求を非同期的に処理する必要があります。 したがって、下位ドライバーの DispatchReadWrite ルーチンは、IRP_MJ_READ IRP と IRP_MJ_WRITE IRP を有効なパラメーターとともに、他のドライバー ルーチンに渡す必要があります (「ドライバー スタックへの IRP の受け渡し」を参照)。

下位レベルのドライバーに送信される読み取り/書き込み IRP の場合、Irp->MdlAddress の MDL に記述されているページング付きの物理メモリは、要求された転送を実行するための正しいアクセス権が確認済みであり、チェーン内の最上位ドライバーまたは I/O マネージャーによってすでにロックダウンされています。 ダイレクト I/O 用にデバイス オブジェクトを設定する中間または最下位レベルのドライバーは、MmProbeAndLockPages の呼び出しがすでに完了しているため、これを再度呼び出さないでください。 最下位レベルのドライバーは、mGetSystemAddressForMdlSafe を呼び出します (Windows 98 用ドライバーは、代わりに MmGetSystemAddressForMdl を呼び出します。Windows Me、Windows 2000 以降のバージョンの Windows 用ドライバーでは、MmGetSystemAddressForMdlSafe を使用する必要があります)。

中間レベルまたは最下位レベルのデバイス ドライバーの DispatchReadWrite ルーチンでは、有効なパラメーターを持つ IRP のみを渡す上位レベルのドライバーを信頼できない場合、読み取り/書き込み IRP の I/O スタック位置にあるパラメーターを検証する必要があります。 DispatchReadWrite ルーチンでパラメーター エラーが検出された場合は、「IRP の完了」の説明に従って、適切なエラー STATUS_XXX 値を使用して IRP を完了する必要があります。 パラメーターが有効な場合、中間ドライバーの DispatchReadWrite ルーチンは、「上位レベル ドライバーの DispatchReadWrite」のガイドラインに従って、要求を渡してさらに処理する必要があります。

最下位デバイス ドライバーの DispatchReadWrite ルーチンは、転送要求で IoMarkIrpPending を呼び出し、「ドライバー スタックへの IRP の受け渡し」で説明されているように、他のドライバー ルーチンがさらに処理できるように IRP を渡し、STATUS_PENDING を返す必要があります。

デバイス ドライバーの DispatchReadWrite ルーチンは、IRP がキューをデバイスに登録する順序を制御して、I/O スループットを高速化することができます。これには、ドライバーによって決定された Key 値を使用して IoStartPacket 呼び出します。 ドライバーの別のルーチンは、後で IRP をデキューし、要求された長さを部分転送操作に分割する必要があるかどうかを判断し、データを転送するデバイスをプログラムします。

一般に、デバイスの制限に合わせて大きな転送要求を分割する必要があるデバイス ドライバーは、特定の転送要求のデバイスを設定する直前まで、これらの操作を延期する必要があります。 StartIo (または他のドライバー ルーチン) がデバイスに転送操作をプログラムする直前までこのようなチェックを延期することができる場合、このようなデバイス ドライバーの DispatchReadWrite ルーチンで、デバイス固有の転送制約のために、受信 IRP の I/O スタック位置をチェックしたり、部分転送範囲の計算を試みたりしないでください。