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