IRP_MJ_CLEANUP (FS 和 FS 篩選條件)

傳送時

收到IRP_MJ_CLEANUP要求表示檔案物件上的句柄參考計數已達到零。 (換句話說,檔案物件的所有句柄都已關閉。) 當使用者模式應用程式呼叫 Win32 CloseHandle 函式 (或內核模式驅動程式在最後一個未處理句柄上呼叫 ZwClose) 至檔案物件時,通常會傳送它。

請務必注意,當檔案物件的所有句柄都已關閉時,仍可能會使用檔案物件。 快取管理員和記憶體管理員等系統元件可能會保存對檔案物件的未處理參考。 即使收到IRP_MJ_CLEANUP要求,這些元件仍然可以讀取或寫入檔案。

作業:檔案系統驅動程式

如果目標裝置對像是文件系統的控制裝置物件,檔案系統驅動程式必須完成 IRP。

否則,文件系統驅動程式應該處理清除要求。

作業:舊版文件系統篩選驅動程式

如果目標裝置對像是篩選驅動程式的控制裝置對象,篩選驅動程式必須完成 IRP。

否則,篩選驅動程式應該在執行任何必要的處理之後,將 IRP 向下傳遞至堆疊上的下一個較低驅動程式。

檔系統篩選驅動程式寫入器應該注意 IoCreateStreamFileObject 會導致IRP_MJ_CLEANUP要求傳送至磁碟區的文件系統驅動程式堆疊。 由於文件系統通常會建立數據流文件物件做為IRP_MJ_CREATE以外的作業的副作用,因此篩選驅動程式很難可靠地偵測串流檔案物件建立。 因此,篩選驅動程式應該會收到先前未看到之檔案物件的IRP_MJ_CLEANUP和IRP_MJ_CLOSE要求。

篩選驅動程式寫入器也應該注意,不同於IoCreateStreamFileObject,IoCreateStreamFileObjectLite 不會造成IRP_MJ_CLEANUP要求傳送至文件系統驅動程式堆疊。 因此,由於文件系統通常會建立數據流文件物件做為IRP_MJ_CREATE以外的作業的副作用,因此篩選驅動程式很難可靠地偵測串流檔案物件的建立。 因此,篩選驅動程式應該會收到先前未看到之檔案物件的IRP_MJ_CLOSE要求。

參數

文件系統或舊版篩選驅動程式會使用指定的 IRP 呼叫 IoGetCurrentIrpStackLocation ,以取得 IRP 中本身 堆棧位置 的指標,如下列清單所示,如 IrpSp 所示。 (IRP 會顯示為 Irp.) 驅動程式可以使用 IRP 的下列成員中所設定的資訊,以及處理清除要求的 IRP 堆疊位置。

  • DeviceObject

    目標裝置物件的指標。

  • Irp-Flags>

    此要求會設定下列旗標:

    • IRP_CLOSE_OPERATION
    • IRP_SYNCHRONOUS_API
  • Irp-IoStatus>

    接收最終完成狀態和所要求作業相關信息 之IO_STATUS_BLOCK 結構的指標。

  • Irp-FileObject>

    DeviceObject 相關聯的檔案物件的指標。

    Irp-FileObject> 參數包含 RelatedFileObject 欄位的指標,這也是FILE_OBJECT結構。 FILE_OBJECT結構的 RelatedFileObject 字段在處理IRP_MJ_CLEANUP期間無效,不應使用。

  • Irp-MajorFunction>

    指定IRP_MJ_CLEANUP。

另請參閱

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP (WDK 核心參考)

IRP_MJ_CLOSE

IRP_MJ_CREATE

ZwClose