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