共用方式為


IRP_MJ_READ (FS 與篩選驅動程式 )

傳送時

I/O 管理員或文件系統驅動程式會傳送IRP_MJ_READ要求。 例如,當使用者模式應用程式呼叫 Win32 函式,例如 ReadFile,或核心模式元件稱為 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 是目標裝置物件的指標。

  • 如果 deviceObject-Flags> 中設定了DO_BUFFERED_IO旗標,Irp-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_NORMAL)。

    MinorFunction 描述
    IRP_MN_NORMAL 讀取要求適用於標準讀取作業
    IRP_MN_DPC 讀取要求來自 DPC 例程
    IRP_MN_MDL 會傳回描述 Irp-MdlAddress>檔案快取數據的 MDL;呼叫端會使用此 MDL 直接讀取數據至快取
    IRP_MN_COMPLETE 表示標準讀取作業完成
    IRP_MN_COMPRESSED 讀取要求適用於壓縮檔案
    IRP_MN_MDL_DPC 讀取要求來自 DPC 例程,並傳回描述 Irp-MdlAddress> 中檔案快取數據的 MDL
    IRP_MN_COMPLETE_MDL 表示使用 MDL 直接讀取快取數據的呼叫端已完成使用 MDL
    IRP_MN_COMPLETE_MDL_DPC 表示使用 MDL 直接讀取快取數據的呼叫端已使用 MDL 完成;讀取要求來自 DPC 例程
  • 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