发送 IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES 控制代码以强制刷新文件系统,然后卷影副本发生。 此 IOCTL 作为IRP_MJ_DEVICE_CONTROL请求发出,该请求仅发送到本地文件系统的卷设备对象以及可能已附加到该卷的文件系统筛选器驱动程序。 此 IOCTL 通常由卷影复制服务发送,但也可由其他用户模式应用程序或进程发出。 在特殊情况下,卷影复制驱动程序(volsnap.sys)在休眠请求或故障转储之前,卷影复制驱动程序也可以发送此 IOCTL。 此 IOCTL 将发送到文件系统筛选器驱动程序、文件系统驱动程序和其他设备驱动程序(例如,存储筛选器驱动程序和存储驱动程序)位于文件系统下方。
当 NTFS 等文件系统收到IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES时,文件系统应将卷刷新到磁盘,迫使文件系统的磁盘结构保持一致且 up-to日期状态。 文件系统应将文件系统锁定为只读可装载状态,阻止任何新的文件系统更改,以防止任何缓存的磁盘页变得脏。 文件系统将文件系统置于此类状态后,必须将 IRP 与 IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL 向下堆栈传递到下一个驱动程序,同时继续使文件系统处于此类只读可装载状态,直到以下驱动程序完成 IRP。 当 IRP 完成或取消时,文件系统随后在卷上重新启用 I/O 并返回。
主要代码
输入缓冲区
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_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL 的此 IRP 时刷新数据,然后再将其传递给较低级别的驱动程序。 在将 IRP 发送到下一个较低级别的驱动程序之前,在保存此 IOCTL 时刷新到磁盘的任何数据都将在生成的卷影副本上可用。
如果这是只读卷,则文件系统或文件系统筛选器驱动程序在接收此 IOCTL 时通常不需要执行任何作,但将其发送到下一个较低级别的驱动程序除外。
要求
| 要求 | 价值 |
|---|---|
| 标头 | ntifs.h(包括 Ntifs.h、Fltkernel.h) |