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 サンプル」を参照してください。

関連項目

CcMdlRead

CcMdlReadComplete

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

Irp

IRP_MJ_READ (WDK カーネル リファレンス)

IRP_MJ_WRITE

ZwReadFile