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。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈