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