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 ドライバー キット (WDK) に含まれている CDFS と FASTFAT のサンプルを確認してください。
操作: レガシ ファイル システム フィルター ドライバー
フィルター ドライバーは必要な処理を実行する必要があり、フィルターの性質に応じて、次のいずれかのアクションを実行する必要があります。
- IRP の完了または失敗、または
- スタック上の次の下位ドライバーに IRP を渡します。
パラメーター
ファイル システムまたはフィルター ドライバーは、指定された IRP の IoGetCurrentIrpStackLocation を呼び出して、IRP 内の独自のスタック位置へのポインターを取得します。 次のパラメーターでは、Irp は IRP を指し、IrpSp はIO_STACK_LOCATIONを指します。 ドライバーは、読み取り要求を処理する IRP と IRP スタックの場所の次のメンバーに設定されている情報を使用できます。
DeviceObject は、ターゲット デバイス オブジェクトへのポインターです。
Irp->AssociatedIrp.SystemBuffer は、DO_BUFFERED_IO フラグが DeviceObject-Flags> で設定されている場合、中間システム バッファーとして使用されるシステム提供のバッファーを指します。 それ以外の場合、このメンバーは NULL に設定されます。
Irp->IoStatus は 、最終的な完了状態と要求された操作に関する情報を受け取る IO_STATUS_BLOCK 構造体を指します。 詳細については、ZwReadFile に対する IoStatusBlock パラメーターの説明を参照してください。
Irp->MdlAddress は、読み取るデータを含むページを記述するメモリ記述子リスト (MDL) のアドレスです。
*Irp->UserBuffer は 、ファイルから読み取られたデータを受け取る呼び出し元が指定した出力バッファーを指します。
IrpSp->FileObject は、 DeviceObject に関連付けられているファイル オブジェクトを指します。 FO_SYNCHRONOUS_IO フラグが IrpSp-FileObject-Flags>> で設定されている場合、ファイル オブジェクトは同期 I/O 用に開かれました。
IrpSp-FileObject> パラメーターには、RelatedFileObject フィールドへのポインターが含まれています。これは、FILE_OBJECT構造体でもあります。 FILE_OBJECT構造体の RelatedFileObject フィールドは、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構造体の Information メンバーで返されます。
解説
ファイル システムは、ファイルの最後の書き込みと読み取りの操作を、基になるファイル ストレージ デバイスのセクター サイズの倍数までラウンドします。 フィルターが事前読み取り操作または書き込み前操作を処理する場合、バッファーを割り当ておよびスワップするフィルターは、割り当てられたバッファーのサイズを、関連付けられているデバイスのセクター サイズの倍数に切り上げる必要があります。 そうでない場合、基になるファイル システムから転送されるデータの長さは、バッファーの割り当てられた長さを超えます。 バッファーのスワップの詳細については、「 swapBuffers Minifilter サンプル」を参照してください。