IRP_MJ_READ (FS およびフィルター ドライバー)
送信時
I/O マネージャーまたはファイル システム ドライバーは、IRP_MJ_READ リクエストを送信します。 この要求は、たとえば、ユーザー モード アプリケーションが ReadFile などの Win32 関数を呼び出したときや、カーネル モード コンポーネントが ZwReadFile を呼び出したときに送信できます。
操作: ファイル システム ドライバー
ファイル システム ドライバーは、ファイル オブジェクトを抽出およびデコードして、パラメーターとマイナー関数コードを決定する必要があります。
メモリ記述子リスト (MDL) 読み取り要求の場合、ファイル システムはマイナー関数コードをチェックして、どの操作が要求されているかを判断する必要があります。 以下は、キャッシュされたファイル I/O にのみ使用できる有効なマイナー関数コードです。
- IRP_MN_COMPLETE
- IRP_MN_COMPLETE_MDL
- IRP_MN_COMPLETE_MDL_DPC
- IRP_MN_COMPRESSED
- IRP_MN_DPC
- IRP_MN_MDL
- IRP_MN_MDL_DPC
- IRP_MN_NORMAL
この IRP の処理の詳細については、Windows Driver Kit (WDK) に含まれている CDFS および FASTFAT サンプルを調べてください。
操作: レガシー ファイル システム フィルター ドライバー
フィルター ドライバーは必要な処理を実行し、フィルターの性質に応じて次のアクションのいずれかを実行する必要があります。
- IRP を完了するか失敗するか、または
- IRP をスタック上の 1 つ下のドライバーに渡します。
パラメーター
ファイル システムまたはフィルター ドライバーは、指定された IRP で IoGetCurrentIrpStackLocation を呼び出して、IRP 内の独自のスタックの場所へのポインターを取得します。 次のパラメーターでは、Irp は IRP を指し、IrpSp は IO_STACK_LOCATION を指します。 ドライバーは、IRP の次のメンバーと IRP スタックの場所に設定されている情報を使用して、読み取り要求を処理できます。
DeviceObject ターゲット デバイス オブジェクトへのポインターです。
Irp->AssociatedIrp.SystemBuffer は、DO_BUFFERED_IO フラグが DeviceObject->Flags で設定されている場合、中間システム バッファーとして使用されるシステム提供のバッファーを指します。 それ以外の場合、このメンバーは NULL に設定されます。
Irp->Ioステータス は、最終的な完了ステータスと要求された操作に関する情報を受け取る IO_STATUS_BLOCK構造体を指します。 詳細については、IoStatusBlock パラメーターから ZwReadFile への説明を参照してください。
Irp->MdlAddress は、読み取られるデータを含むページを記述するメモリ記述子リスト (MDL) のアドレスです。
*Irp->UserBuffer は、ファイルから読み取られたデータを受け取る、呼び出し元が提供する出力バッファーを指します。
IrpSp->FileObject は、DeviceObject に関連付けられているファイル オブジェクトを指します。 FO_SYNCHRONOUS_IO フラグが IrpSp->FileObject->Flags で設定されている場合、ファイル オブジェクトは同期 I/O 用に開かれています。
IrpSp->FileObject パラメーターには、FILE_OBJECT構造体でもある RelatedFileObject フィールドへのポインターが含まれています。 RelatedFileObject FILE_OBJECT 構造体のフィールドは、IRP_MJ_READ の処理中は無効であるため、使用しないでください。
IrpSp->MajorFunction IRP_MJ_READ に設定されます。
IrpSp->MinorFunction 要求される操作を指定し、次のいずれかの値が含まれます。
IRP_MN_COMPLETE
IRP_MN_COMPLETE_MDL
IRP_MN_COMPLETE_MDL_DPC
IRP_MN_COMPRESSED
IRP_MN_DPC
IRP_MN_MDL
IRP_MN_MDL_DPC
IRP_MN_NORMAL
IrpSp->Parameters.Read.ByteOffset は、読み取るデータのファイル内の開始バイト オフセットを指定する LARGE_INTEGER 変数です。
IrpSp->Parameters.Read.Key は、ターゲット ファイルのバイト範囲ロックに関連付けられたキー値です。
IrpSp->Parameters.Read.Length は、読み取られるデータのバイト長さです。 読み取り操作が成功すると、読み取られたバイト数が Irp->IoStatus が指す IO_STATUS_BLOCK 構造体の 情報 メンバーに返されます。
解説
ファイル システムは、ファイルの終わりでの書き込みおよび読み取り操作を、基礎となるファイル ストレージ デバイスのセクター サイズの倍数まで丸めます。 フィルターが事前読み取りまたは事前書き込み操作を処理する場合、バッファーの割り当てと交換を行うフィルターは、割り当てられたバッファーのサイズを、関連するデバイスのセクター サイズの倍数に切り上げる必要があります。 そうしないと、基盤となるファイル システムから転送されるデータの長さが、割り当てられたバッファの長さを超えてしまいます。 バッファのスワップの詳細については、「swapBuffers ミニフィルターのサンプル」を参照してください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示