Функция FltCreateSectionForDataScan (fltkernel.h)
Подпрограмма fltCreateSectionForDataScan создает объект раздела для файла. Диспетчер фильтров может при необходимости синхронизировать ввод-вывод с созданным разделом.
Синтаксис
NTSTATUS FLTAPI FltCreateSectionForDataScan(
[in] PFLT_INSTANCE Instance,
[in] PFILE_OBJECT FileObject,
[in] PFLT_CONTEXT SectionContext,
[in] ACCESS_MASK DesiredAccess,
[in, optional] POBJECT_ATTRIBUTES ObjectAttributes,
[in, optional] PLARGE_INTEGER MaximumSize,
[in] ULONG SectionPageProtection,
[in] ULONG AllocationAttributes,
[in] ULONG Flags,
[out] PHANDLE SectionHandle,
[out] PVOID *SectionObject,
[out, optional] PLARGE_INTEGER SectionFileSize
);
Параметры
[in] Instance
Указатель непрозрачного экземпляра для экземпляра драйвера мини-фильтра, контекст которого требуется извлечь.
[in] FileObject
Объект файла для открытого файла. Объект раздела будет защищен указанным файлом. Этот параметр является обязательным и не может иметь значение NULL.
[in] SectionContext
Указатель на ранее выделенный контекст раздела.
[in] DesiredAccess
Тип доступа для объекта раздела как один или несколько из следующих флагов ACCESS_MASK.
Флаг | Разрешает вызывающим абонентам |
---|---|
SECTION_MAP_READ | Чтение представлений раздела. |
SECTION_MAP_WRITE | Написание представлений раздела. |
SECTION_QUERY | Запрос объекта раздела для получения сведений о разделе. Драйверы должны задать этот флаг. |
SECTION_ALL_ACCESS | Все действия, определенные предыдущими флагами, а также определенные STANDARD_RIGHTS_REQUIRED. Дополнительные сведения о STANDARD_RIGHTS_REQUIRED см. в ACCESS_MASK. |
[in, optional] ObjectAttributes
Указатель на необязательную структуру OBJECT_ATTRIBUTES, указывающую имя объекта и другие атрибуты. Используйте макрос InitializeObjectAttributes для инициализации этой структуры.
[in, optional] MaximumSize
Этот параметр зарезервирован для дальнейшего использования.
[in] SectionPageProtection
Защита, размещаемая на каждой странице в разделе. Укажите одно из следующих значений. Этот параметр является обязательным и не может быть нулевым.
Флаг | Значение |
---|---|
PAGE_READONLY | Включает доступ только для чтения к зафиксированной области страниц. Попытка записи в зафиксированный регион приводит к нарушению доступа. Если система отличается от доступа только для чтения и выполнения, попытка выполнить код в зафиксированном регионе приводит к нарушению доступа. |
PAGE_READWRITE | Включает доступ для чтения и записи к зафиксированной области страниц. |
[in] AllocationAttributes
Битовые маски флагов SEC_XXX определяют атрибуты выделения раздела. Укажите одно или несколько следующих значений. Этот параметр является обязательным и не может быть нулевым.
Флаг | Значение |
---|---|
SEC_COMMIT | Выделяет физическое хранилище в памяти или на диске на диске для всех страниц раздела. Это параметр по умолчанию. Обратите внимание, что этот флаг является обязательным и не может быть опущен. |
SEC_FILE | Файл, указанный параметром FileObject, является сопоставленным файлом. |
[in] Flags
Этот параметр зарезервирован для дальнейшего использования.
[out] SectionHandle
Указатель на выделенную вызывающим переменную, которая получает непрозрачный дескриптор в раздел. По умолчанию дескриптор раздела — это дескриптор пользователя. Если вызывающий объект нуждается в дескрипторе ядра, он должен передать указатель на инициализированную структуру OBJECT_ATTRIBUTES в параметре ObjectAttributes с набором флагов OBJ_KERNEL_HANDLE.
[out] SectionObject
Указатель на выделенную вызывающим переменную, которая получает непрозрачный указатель на объект раздела.
[out, optional] SectionFileSize
Указатель на выделенную вызывающим переменную, которая получает размер файла в байтах во время создания объекта раздела. Этот параметр является необязательным и может иметь значение NULL.
Возвращаемое значение
FltCreateSectionForDataScan возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS, например одно из следующих значений.
Возвращаемый код | Описание |
---|---|
STATUS_END_OF_FILE | Размер файла, указанного параметром FileObject, равен нулю. |
STATUS_FILE_LOCK_CONFLICT | Файл, указанный параметром FileObject |
STATUS_INSUFFICIENT_RESOURCES | FltCreateSectionForDataScan возникла ошибка выделения пула. |
STATUS_INVALID_FILE_FOR_SECTION | Файл, указанный параметром fileObject |
STATUS_INVALID_PARAMETER | Минифильтр не зарегистрирован. |
STATUS_INVALID_PARAMETER_8 | Значение, указанное для параметра SectionPageProtection, недопустимо. |
STATUS_INVALID_PARAMETER_9 | Вызывающий объект указал недопустимое значение для параметра AllocationAttributes. |
STATUS_NOT_SUPPORTED | Том, подключенный к этому экземпляру, не поддерживает контексты разделов. |
STATUS_PRIVILEGE_NOT_HELD | Вызывающий объект не имеет необходимых привилегий для создания объекта раздела с доступом, указанным в параметре DesiredAccess. |
STATUS_FILE_IS_A_DIRECTORY | Файл, указанный параметром FileObject |
STATUS_FLT_CONTEXT_ALREADY_DEFINED | Экземпляр фильтра, указанный экземпляром, уже имеет открытый раздел для потока. Поддерживается только один раздел на поток и, следовательно, для каждого экземпляра. |
Замечания
Перед вызовом FltCreateSectionForDataScanминифильтр должен сначала зарегистрировать его том для сканирования данных путем вызова FltRegisterForDataScan. Как и в случае с другими элементами контекста фильтра, SectionContext сначала выделяется FltAllocateContext.
FltCreateSectionForDataScan вставляет дескриптор в объект (SectionHandle) в таблицу обработки для потока, на который вызывается FltCreateSectionForDataScan.
Дескриптор может быть дескрипторами пользователей или дескрипторами ядра. Дескриптор, созданный с помощью OBJ_KERNEL_HANDLE заданной в структуре OBJECT_ATTRIBUTES, которая ObjectAttributes указывает на дескриптор ядра, и доступ к ним можно получить только в режиме ядра. Дескриптор, созданный без флага OBJ_KERNEL_HANDLE, — это дескриптор пользователя, к которому можно получить доступ из режима пользователя или ядра. Фильтр может создать дескриптор пользователя, а затем передать его в приложение пользовательского режима для обработки. Например, модуль сканирования вирусов может жить в приложении пользовательского режима и получать отфильтрованные пользовательские дескрипторы из фильтра файловой системы.
Некоторые ситуации могут возникать, когда открытие раздела несовместимо с текущим операцией ввода-вывода файла. В частности, операции ввода-вывода файлов, которые активируют очистку кэша, могут привести к несогласованности кэша, если очистка кэша запрещена из-за открытого раздела. Минифильтр может предоставить необязательный подпрограмму обратного вызова для уведомлений об этих событиях. Драйвер минифильтра реализует PFLT_SECTION_CONFLICT_NOTIFICATION_CALLBACK для получения этих уведомлений. Уведомления о конфликтах включены, если SectionNotificationCallback член FLT_REGISTRATION установлен в эту подпрограмму обратного вызова при регистрации минифильтра. При получении уведомления раздел можно закрыть, чтобы разрешить конфликтующую операцию ввода-вывода продолжить.
Заметка
Обратный вызов уведомлений раздела может возникнуть до возврата FltCreateSectionForDataScan. Мини-фильтр должен иметь возможность получать обратный вызов и обрабатывать ситуацию, когда SectionHandle и SectionObject еще не допустимы.
Если объект раздела, созданный этой подпрограммой, больше не нужен, не забудьте закрыть дескриптор объекта раздела (SectionHandle) путем вызова процедуры ZwClose и отмены ссылки на сам объект раздела (SectionObject), вызвав подпрограмму ObDereferenceObject.
Общие сведения о создании сопоставленных разделов и представлений памяти см. в разделах и представлениях. Кроме того, см. документацию по подпрограмме CreateFileMapping в пакете SDK для Microsoft Windows.
Важный
Минифильтры не должны явно удалять контекст раздела, переданный FltCreateSectionForDataScan. Не вызывайте FltDeleteContext после передачи контекста раздела в FltCreateSectionForDataScan. Контекст раздела освобожден и удален из потока путем вызова FltCloseSectionForDataScan в этом случае.
Как правило, разделы должны создаваться как доступные только для чтения. В частности, если файл только для чтения находится в транзакции, а мини-фильтр не создает раздел только для чтения, запись в раздел удаляется и не входит в состав транзакции.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows 8 |
целевая платформа | Всеобщий |
заголовка | fltkernel.h (include Fltkernel.h) |
библиотеки |
FltMgr.lib |
IRQL | <= APC_LEVEL |