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->如果deviceObject-Flags> 中設定了DO_BUFFERED_IO旗標,AssociatedIrp.SystemBuffer 會指向要當做中繼系統緩衝區使用的系統提供的緩衝區。 否則,這個成員會設定為 NULL

  • Irp->IoStatus 指向接收最終完成狀態和所要求作業相關信息 的IO_STATUS_BLOCK 結構。 如需詳細資訊,請參閱 IoStatusBlock 參數對 ZwReadFile 的描述。

  • Irp->MdlAddress 是記憶體描述項清單的位址, (MDL) 描述要讀取之數據的頁面。

  • *Irp->UserBuffer 指向呼叫端提供的輸出緩衝區,該緩衝區會接收從檔案讀取的數據。

  • IrpSp->FileObject 指向與 DeviceObject 相關聯的檔案物件。 如果在 IrpSp-FileObject-Flags>> 中設定FO_SYNCHRONOUS_IO旗標,則會針對同步 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結構的信息成員中傳回讀取的位元元數目。

備註

文件系統會在檔尾四捨五入寫入和讀取作業,最多為基礎檔案儲存裝置的多個扇區大小。 當篩選處理預先讀取或預先寫入作業時,配置和交換緩衝區的篩選條件必須將配置緩衝區的大小四捨五入到相關聯裝置的扇區大小的倍數。 如果沒有,從基礎文件系統傳輸的數據長度將會超過緩衝區的已配置長度。 如需交換緩衝區的詳細資訊,請參閱 swapBuffers Minifilter 範例

另請參閱

CcMdlRead

CcMdlReadComplete

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ (WDK 核心參考)

IRP_MJ_WRITE

ZwReadFile