IRP_MJ_CLOSE (FS 和篩選驅動程式)

傳送時

I/O 管理員會傳送IRP_MJ_CLOSE要求,以指出檔案物件上的參考計數已達到零,通常是因為文件系統驅動程式或其他內核模式元件已在檔案物件上呼叫 ObDereferenceObject 。 此要求通常會遵循清除要求。 不過,雖然清除要求之後可能不會立即收到關閉要求。

作業:檔案系統驅動程式

如果目標裝置對像是檔案系統的控制裝置物件,檔案系統驅動程式必須在執行任何必要的處理之後完成 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_CLOSE。

另請參閱

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLOSE (WDK 核心參考)

IRP_MJ_CLEANUP

IRP_MJ_CREATE

ObDereferenceObject