Функция FltWriteFile (fltkernel.h)
FltWriteFile используется для записи данных в открытый файл, поток или устройство.
Синтаксис
NTSTATUS FLTAPI FltWriteFile(
[in] PFLT_INSTANCE InitiatingInstance,
[in] PFILE_OBJECT FileObject,
[in, optional] PLARGE_INTEGER ByteOffset,
[in] ULONG Length,
[in] PVOID Buffer,
[in] FLT_IO_OPERATION_FLAGS Flags,
[out, optional] PULONG BytesWritten,
[in, optional] PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine,
[in, optional] PVOID CallbackContext
);
Параметры
[in] InitiatingInstance
Указатель непрозрачного экземпляра для экземпляра драйвера минифильтра, в который должна быть отправлена операция. Экземпляр должен быть присоединен к тому, где находится файл. Этот параметр является обязательным и не может иметь значение NULL.
[in] FileObject
Указатель на FILE_OBJECT для файла, в который необходимо записать данные. Этот файловый объект должен быть открыт в данный момент. Вызов FltWriteFile , когда файловый объект еще не открыт или больше не открыт (например, в процедуре обратного вызова перед созданием или после очистки), приводит к тому, что система будет использовать ASSERT в проверенной сборке. Этот параметр является обязательным и не может иметь значение NULL.
[in, optional] ByteOffset
Указатель на переменную, выделенную вызывающим объектом, которая указывает начальное смещение байтов в файле, в котором начинается операция чтения.
Если указан параметр ByteOffset , операции ввода-вывода выполняются с таким смещением независимо от текущего значения поля CurrentByteOffset объекта файла.
- Если файл был открыт для синхронного ввода-вывода (FO_SYNCHRONOUS_IO задано в поле Флаги файлового объекта), вызывающий объект может задать для Параметра ByteOffset-LowPart> значение FILE_USE_FILE_POINTER_POSITION а для ByteOffset-HighPart значение -1, чтобы операции ввода-вывода> выполнялись в поле CurrentByteOffset объекта файла. Если файл не был открыт для синхронного ввода-вывода, использование FILE_USE_FILE_POINTER_POSITION является ошибкой.
- Вызывающий объект может задать для Параметра ByteOffset-LowPart> значение FILE_WRITE_TO_END_OF_FILE, а для ByteOffset-HighPart> — значение -1, чтобы начать запись в конце файла (т. е. выполнить добавив запись).
Если параметр ByteOffset не указан:
- Если файл не был открыт для синхронного ввода-вывода, это ошибка.
- В противном случае операции ввода-вывода выполняются в объекте CurrentByteOffset файла.
Если объект файла был открыт для синхронного ввода-вывода, поле CurrentByteOffset обновляется, если вызывающий объект не передает флаг FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET.
- Примечание. В этом случае файловая система по-прежнему обновляет CurrentByteOffset . Диспетчер фильтров сохраняет значение CurrentByteOffset перед отправкой ввода-вывода вниз стека и восстанавливает его при возврате ввода-вывода. С точки зрения вызывающего объекта FltWriteFile (и фильтров на больших высотах) CurrrentByteOffset не обновляется. Но фильтры под вызывающим объектом видят обновленное значение CurrentByteOffset в обратных вызовах после чтения и записи.
Если файловый объект не был открыт для синхронного ввода-вывода, поле CurrentByteOffset не обновляется независимо от состояния параметра ByteOffset .
Если объект файла, на который указывает FileObject , был открыт для асинхронного ввода-вывода, этот параметр является обязательным и не может иметь значение NULL.
До Windows 8 специальные константы FILE_WRITE_TO_END_OF_FILE и FILE_USE_FILE_POINTER_POSITION для этого параметра не поддерживались.
[in] Length
Размер (в байтах) буфера, на который указывает параметр Buffer .
[in] Buffer
Указатель на буфер, содержащий данные для записи в файл. Если файл открыт для операций ввода-вывода без кэширования, этот буфер должен быть выровнен в соответствии с требованиями к выравниванию базового запоминающего устройства. Драйверы минифильтра могут выделить такой выровненный буфер, вызвав FltAllocatePoolAlignedWithTag.
[in] Flags
Битовая маска флагов, указывающих тип выполняемой операции записи.
Flag | Значение |
---|---|
FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET | Драйверы минифильтра могут задать этот флаг, чтобы указать, что FltWriteFile не будет обновлять поле Объекта файла CurrentByteOffset . |
FLTFL_IO_OPERATION_NON_CACHED | Драйверы минифильтра могут задать этот флаг, чтобы указать запись без кэширования, даже если файловый объект не был открыт с FILE_NO_INTERMEDIATE_BUFFERING. |
FLTFL_IO_OPERATION_PAGING | Драйверы минифильтра могут задать этот флаг, чтобы указать запись подкачки. |
FLTFL_IO_OPERATION_SYNCHRONOUS_PAGING | Драйверы минифильтра могут задать этот флаг, чтобы указать синхронную запись ввода-вывода подкачки. Драйверы минифильтра, устанавливающие этот флаг, также должны установить флаг FLTFL_IO_OPERATION_PAGING. Этот флаг доступен начиная с Windows Vista. |
[out, optional] BytesWritten
Указатель на переменную, выделенную вызывающим объектом, которая получает количество байтов, записанных в файл. Если CallbackRoutine не имеет значение NULL, этот параметр игнорируется. В противном случае этот параметр является необязательным и может иметь значение NULL.
[in, optional] CallbackRoutine
Указатель на PFLT_COMPLETED_ASYNC_IO_CALLBACK типизированной процедуры обратного вызова, вызываемой по завершении операции записи. Этот параметр является необязательным и может иметь значение NULL.
[in, optional] CallbackContext
Указатель контекста, передаваемый в CallbackRoutine , если он присутствует. Этот параметр является необязательным и может иметь значение NULL. Если CallbackRoutine имеет значение NULL, этот параметр игнорируется.
Возвращаемое значение
FltWriteFile возвращает значение NTSTATUS, возвращенное файловой системой.
Комментарии
Драйвер минифильтра вызывает FltWriteFile для записи данных в открытый файл.
FltWriteFile вызывает отправку запроса на запись в экземпляры драйвера минифильтра, подключенные под инициирующим экземпляром, и в файловую систему. Указанный экземпляр и присоединенные к нему экземпляры не получают запрос на запись.
FltWriteFile выполняет некэшированные ввод-вывод, если выполняется одно из следующих значений:
Вызывающий объект задает флаг FLTFL_IO_OPERATION_NON_CACHED в параметре Flags .
Файловый объект был открыт для ввода-вывода без кэширования. Обычно это делается путем указания флага FILE_NO_INTERMEDIATE_BUFFERING CreateOptions в предыдущем вызове FltCreateFile, FltCreateFileEx или ZwCreateFile.
Некэшированные операции ввода-вывода накладывают следующие ограничения на значения параметров, передаваемые в FltWriteFile:
Буфер, на который указывает параметр Buffer , должен быть выровнен в соответствии с требованиями к выравниванию базового запоминающего устройства. Чтобы выделить такой выровненный буфер, вызовите Метод FltAllocatePoolAlignedWithTag.
Смещение байтов, на которое указывает параметр ByteOffset , должно быть неотрицательным, кратным размеру сектора тома.
Длина, указанная в параметре Length , должна быть неогрегативной, кратной размеру сектора тома.
Если значение параметра CallbackRoutine не равно NULL, операция записи выполняется асинхронно.
Если значение параметра CallbackRoutine равно NULL, операция записи выполняется синхронно. То есть FltWriteFile ожидает завершения операции записи перед возвратом. Это верно, даже если объект файла, на который указывает FileObject , был открыт для асинхронного ввода-вывода.
Если несколько потоков вызывают FltWriteFile для одного и того же объекта файла и файловый объект был открыт для синхронного ввода-вывода, диспетчер фильтров не пытается сериализовать операции ввода-вывода в файле. В этом отношении FltWriteFile отличается от ZwWriteFile.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | fltkernel.h (включая Fltkernel.h) |
Библиотека | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | PASSIVE_LEVEL |