IRP_MJ_READ

デバイスからシステムにデータを転送するすべてのデバイス ドライバーは、DispatchRead ルーチンまたは DispatchReadWrite ルーチンで読み取り要求を処理する必要があります。これは、このようなデバイス ドライバーに階層化された上位レベルのドライバーも同様です。

送信時

作成要求が正常に完了した後、随時。

ターゲット デバイス オブジェクトを表すファイル オブジェクトのハンドルを持つユーザー モード アプリケーション、または Win32 コンポーネントが、デバイスからのデータ転送を要求した場合が考えられます。 上位レベルのドライバーが作成され、読み取り IRP を設定した場合も考えられます。

入力パラメーター

IRP のドライバーの I/O スタックの場所は、Parameters.Read.Length で転送するバイト数を示します。

一部のドライバーは、Parameters.Read.Key の値を使用して、受信する読み取り要求をデバイス キュー内、または IRP のドライバーで管理される内部キュー内で、ドライバーが決定した順序に並べ替えます。

特定の種類のドライバーでは、Parameters.Read.ByteOffset の値も使用されます。この値は、転送操作の開始オフセットを示します。 例として、インストール可能なファイル システム (IFS) に関するドキュメントの「IRP_MJ_READ」トピックを参照してください。

出力パラメーター

基になるデバイス ドライバーがターゲット デバイス オブジェクトのフラグを DO_BUFFERED_IO で設定するか、DO_DIRECT_IO で設定するかに応じて、データは次のいずれかに転送されます。

  • ドライバーがバッファー I/O を使用している場合は、Irp->AssociatedIrp.SystemBuffer のバッファー。

  • 基になるデバイス ドライバーがダイレクト I/O (DMA または PIO) を使用している場合は、Irp->MdlAddress の MDL によって記述されるバッファー。

操作

読み取り要求を受け取ると、上位レベルのドライバーは、次の下位ドライバーの IRP の I/O スタックの場所を設定するか、1 つ以上の下位ドライバー用に追加の IRP を作成して設定します。 ドライバーは、IoSetCompletionRoutine を呼び出すことによって、IoCompletion ルーチンを設定することができます。これは、入力 IRP では省略可能ですが、ドライバーが作成した IRP には必須です。 次に、ドライバーは 、IoCallDriver を使用して次の下位ドライバーに要求を渡します。

読み取り要求を受信すると、デバイス ドライバーはデバイスからシステム メモリにデータを転送します。 デバイス ドライバーは、I/O 状態ブロックの [情報] フィールドに IRP の完了時に転送されたバイト数を設定します。

要件

ヘッダー

Wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)

関連項目

DispatchRead

DispatchReadWrite

IoCallDriver

IoSetCompletionRoutine