IRP_MJ_WRITE

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

送信時

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

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

入力パラメーター

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

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

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

基になるデバイス ドライバーがターゲット デバイス オブジェクトのフラグを 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 を含む)

関連項目

DispatchReadWrite

DispatchWrite

IoCallDriver

IoCompletion

IoSetCompletionRoutine