IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL (ntifs.h)

发送 IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES 控制代码以在卷影复制发生之前强制刷新文件系统。 此 IOCTL 作为IRP_MJ_DEVICE_CONTROL请求发出,该请求仅发送到本地文件系统的卷设备对象以及可能已附加到该卷的文件系统筛选器驱动程序。 此 IOCTL 通常由卷影复制服务发送,但也可由其他用户模式应用程序或进程发出。 在特殊情况下,卷影复制驱动程序也可能在休眠请求期间或故障转储之前 (volsnap.sys) 发送此 IOCTL。 此 IOCTL 将发送到文件系统筛选器驱动程序、文件系统驱动程序和其他设备驱动程序 (存储筛选器驱动程序和存储驱动程序,例如,) 位于文件系统下方。

当文件系统(如 NTFS)收到IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES时,文件系统应将卷刷新到磁盘,从而强制文件系统的磁盘结构进入一致且最新的状态。 文件系统应将文件系统锁定为只读可装载状态,阻止任何新的文件系统更改,以防止任何缓存的磁盘页脏。 文件系统将文件系统置于此类状态后,它必须将具有 IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL 的 IRP 向下传递到下一个驱动程序,同时继续将文件系统保持为只读可装载状态,直到下面的驱动程序完成 IRP。 当 IRP 完成或取消时,文件系统将在卷上重新启用 I/O 并返回。

主要代码

IRP_MJ_DEVICE_CONTROL

输入缓冲区

IrpSp->Parameters.DeviceIoControl.IoControlCode 设置为 IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES。

输出缓冲区

状态块

状态成员设置为成功时STATUS_SUCCESS或相应的 NTSTATUS 值,例如以下值之一:

STATUS_FILE_LOCK_CONFLICT

遇到文件锁冲突。 筛选器管理器可能会返回此错误。

STATUS_VOLUME_DISMOUNTED

已卸载卷。

注解

卷的卷影副本是该卷的时间点副本。 卷影副本主要由备份应用程序使用,因此它可以以一致的方式备份文件,即使文件在完成备份操作的过程中可能确实发生了更改。 卷影副本还可用于为 PNP 请求导致的休眠和故障转储准备卷。

Windows XP 和更高版本的操作系统包括用于协调卷影副本计时的框架,以及存储筛选器驱动程序 (而不是使用写入时复制技术来创建卷影副本的文件系统筛选器驱动程序) 。 卷影复制服务 (VSS) 协调卷影复制。 卷影复制驱动程序(volsnap.sys)是一个存储筛选器驱动程序,它加载在文件系统下方的存储堆栈之上。

影响文件系统的一个重要快照相关 IOCTL 是IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES。 此 IOCTL 实际上旨在由文件系统进行解释,即使它是 IOCTL。 这是因为所有文件系统都应将 IOCTL 向下传递到较低级别的驱动程序,该驱动程序正在等待在文件系统之后处理 IOCTL。

IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES仅发送到本地文件系统的卷设备对象,以及可能已附加到该卷的文件系统筛选器驱动程序。 通过卷参数块的 RealDevice 成员链接到卷的存储设备对象 (VPB) 结构将始终具有以下设备类型之一:

FILE_DEVICE_DISK

FILE_DEVICE_VIRTUAL_DISK

此 IOCTL 不会发送到远程文件系统。

当本地文件系统收到IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES时,驱动程序应创建文件系统元数据的一致映像。 驱动程序不应包含任何相互不一致的页面。 驱动程序必须刷新其元数据和映射缓存缓冲区的任何部分,这些部分尚未刷新到磁盘,并在 IOCTL 由较低级别的驱动程序完成之前保留写入。

对于微筛选器文件系统驱动程序,筛选器管理器将接收此 IOCTL,如果驱动程序已注册以接收此 IRP,则向微筛选器驱动程序发出回调。 当微筛选器驱动程序或旧文件系统筛选器驱动程序收到此 IOCTL 时,驱动程序必须刷新其元数据中尚未刷新到磁盘的任何部分。 如果筛选器驱动程序使用映射的缓存缓冲区来写入其元数据,则文件系统将负责所有刷新。 筛选器驱动程序只需确保在文件系统尝试将更改刷新到磁盘时,它不会写入任何映射的缓存缓冲区。 旧版文件系统筛选器驱动程序需要将 IRP 向下传递到堆栈中的下一个驱动程序。

驱动程序可以选择在保留包含 IOCTL IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL 的 IRP 时刷新数据,然后再将其传递给较低级别的驱动程序。 在将 IRP 发送到下一个较低级别的驱动程序之前,在保留此 IOCTL 时刷新到磁盘的任何数据都将是生成的卷影副本上可用的数据。

如果这是一个只读卷,则文件系统或文件系统筛选器驱动程序在接收此 IOCTL 时通常不需要执行任何操作,除非将其发送到下一个较低级别的驱动程序。

要求

要求
Header ntifs.h (包括 Ntifs.h、Fltkernel.h)

另请参阅

IRP_MJ_DEVICE_CONTROL