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, файловая система должна выполнить запись тома на диск, заставляя дисковые структуры файловой системы переходить в согласованное и актуальное состояние. Файловая система должна блокировать файловую систему в подключаемом состоянии только для чтения, блокируя любые новые изменения файловой системы, чтобы любые кэшированные страницы диска не стали грязное. После того как файловая система передаст файловую систему в такое состояние, она должна передать IRP с IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL вниз по стеку следующему драйверу, продолжая поддерживать файловую систему в таком подключаемом состоянии только для чтения, пока приведенные ниже драйверы не завершат IRP. После завершения или отмены IRP файловая система повторно включает операции ввода-вывода на томе и возвращается.

Основной код

IRP_MJ_DEVICE_CONTROL

Входной буфер

IrpSp->Параметр Parameters.DeviceIoControl.IoControlCode имеет значение IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES.

Выходной буфер

None

Блок состояния

Для элемента Status задано значение STATUS_SUCCESS об успешном выполнении или соответствующее значение NTSTATUS, например одно из следующих значений:

STATUS_FILE_LOCK_CONFLICT

Обнаружен конфликт блокировки файла. Эта ошибка может быть возвращена диспетчером фильтров.

STATUS_VOLUME_DISMOUNTED

Том был отключен.

Комментарии

Теневая копия тома — это копия этого тома на определенный момент времени. Теневое копирование в основном используется приложением резервного копирования, чтобы оно пользовалось согласованной архивацией файлов, несмотря на то, что файлы могут действительно изменяться во время выполнения операции резервного копирования. Теневая копия также может использоваться для подготовки тома к гибернации в результате запроса PNP и для аварийных дампов.

Windows XP и более поздние версии операционной системы включают платформу для оркестрации времени для теневой копии, а также драйвер фильтра хранилища (а не драйвер фильтра файловой системы), который использует метод копирования при записи для создания теневой копии. Служба теневого копирования томов (VSS) управляет теневой копией. Драйвер теневого копирования томов, volsnap.sys, — это драйвер фильтра хранилища, который загружается поверх стека хранилища под файловыми системами.

Одним из важных snapshot 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 следующему драйверу в стеке.

Драйвер может удалить данные, удерживая этот IRP, содержащий IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL, перед передачей их драйверам более низкого уровня. Все данные, сброшенные на диск во время хранения этого IOCTL перед отправкой IRP в следующий драйвер нижнего уровня, будут доступны в полученной теневой копии.

Если это том, доступный только для чтения, обычно при получении IOCTL файловой системы или драйверу фильтра файловой системы не требуется ничего делать, кроме отправки его в следующий драйвер более низкого уровня.

Требования

Требование Значение
Заголовок ntifs.h (включая Ntifs.h, Fltkernel.h)

См. также раздел

IRP_MJ_DEVICE_CONTROL