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 を含む) |