Функция FltAllocateContext (fltkernel.h)

Подпрограмма FltAllocateContext выделяет структуру контекста для указанного типа контекста.

Синтаксис

NTSTATUS FLTAPI FltAllocateContext(
  [in]  PFLT_FILTER      Filter,
  [in]  FLT_CONTEXT_TYPE ContextType,
  [in]  SIZE_T           ContextSize,
  [in]  POOL_TYPE        PoolType,
  [out] PFLT_CONTEXT     *ReturnedContext
);

Параметры

[in] Filter

Непрозрачный указатель фильтра для вызывающего объекта. Этот параметр является обязательным и не может иметь значение NULL.

[in] ContextType

Значение FLT_CONTEXT_TYPE , указывающее тип контекста для выделения. ContextType может иметь один из следующих вариантов:

Значение Значение
FLT_VOLUME_CONTEXT (0x0001) Выделение контекста тома.
FLT_INSTANCE_CONTEXT (0x0002) Выделение контекста экземпляра.
FLT_FILE_CONTEXT (0x0004) Выделение контекста файла.
FLT_STREAM_CONTEXT (0x0008) Выделение контекста потока.
FLT_STREAMHANDLE_CONTEXT (0x0010) Выделение контекста дескриптора потока.
FLT_TRANSACTION_CONTEXT (0x0020) Выделение контекста транзакции.
FLT_SECTION_CONTEXT (0x0040) Выделение контекста раздела. Доступно начиная с Windows 8.

[in] ContextSize

Размер (в байтах) части контекста, определенной драйвером минифильтра. Значение должно быть больше нуля и меньше или равно MAXUSHORT; Для контекстов фиксированного размера значение должно быть меньше или равно размеру , указанному в структуре FLT_CONTEXT_REGISTRATION . Минифильтр использует эту часть контекста для хранения сведений контекста, относящихся к самому себе. FltMgr рассматривает эту часть структуры контекста как непрозрачную. Этот параметр является обязательным и не может быть равен нулю.

[in] PoolType

Тип пула для выделения. Этот параметр является обязательным и должен иметь один из следующих значений. Подробное описание каждого типа см. в POOL_TYPE . Дополнительные сведения см. в разделе "Примечания".

Значение Значение
NonPagedPool Системная память, не доступная к страницам. Параметр PoolType должен иметь значение NonPagedPool, если contextType имеет FLT_VOLUME_CONTEXT.
PagedPool Страничной системной памяти.
NonPagedPoolNx Пул без выполнения (NX).

[out] ReturnedContext

Указатель на переменную, выделенную вызывающим объектом, которая получает адрес вновь выделенного контекста. Вызывающий объект отвечает за вызов FltReleaseContext , чтобы освободить этот контекст, когда он больше не нужен.

Возвращаемое значение

Функция FltAllocateContext возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS , например одно из следующих значений:

Код возврата Описание
STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND Сведения о выделении для контекста указанного типа не были предоставлены во время регистрации фильтра. Или для контекстов фиксированного размера запрошенный ContextSize больше размера , указанного в структуре FLT_CONTEXT_REGISTRATION для указанного ContextType.
STATUS_FLT_DELETING_OBJECT Драйвер минифильтра, указанный в параметре Filter , сносится. Это код ошибки.
STATUS_INSUFFICIENT_RESOURCES FltAllocateContext столкнулся с ошибкой выделения пула. Это код ошибки.
STATUS_INVALID_BUFFER_SIZE ContextSize не может быть больше MAXUSHORT. Это код ошибки.
STATUS_INVALID_PARAMETER Для параметра ContextType или ContextSize указано недопустимое значение. Это код ошибки.
STATUS_NOT_SUPPORTED Файловая система не поддерживает контексты каждого потока. Это код ошибки.

Комментарии

Дополнительные сведения о контекстах см. в разделе О контекстах минифильтра.

FltAllocateContext выделяет контекст указанного типа из указанного пула. Начиная с Windows 11, обнуляется ли память, на которую указывает ReturnedContext:

  • Память гарантированно будет обнуляться для контекстов переменного размера.
  • Содержимое памяти определяется реализацией для контекстов фиксированного размера, выделенных функцией обратного вызова, предоставляемой вызывающим объектом.
  • В противном случае нельзя предположить, что память будет обнуляться для контекстов фиксированного размера из-за поведения списка lookaside. То есть запись, возвращаемая из списка lookaside, может не быть обнуляема, если это память, которая ранее была освобождена для списка lookaside, а не для нового выделения.

Перед Windows 11 содержимое возвращаемого контекста не обнуляется.

Установка параметра PoolType для недопустимого значения может привести к непредвиденному поведению, например к обходу списков lookaside, что приведет к потере преимуществ производительности списков lookaside. Для контекстов, имеющих функцию обратного вызова ContextAllocateCallback , поведение из-за недопустимого poolType зависит от реализации.

После выделения контекста его можно задать для объекта , передав указатель ReturnedContext в соответствующую подпрограмму set-context из следующей таблицы.

Тип контекста Подпрограмма Set-Context
FLT_FILE_CONTEXT FltSetFileContext (начиная с Windows Vista)
FLT_INSTANCE_CONTEXT FltSetInstanceContext
FLT_SECTION_CONTEXT FltCreateSectionForDataScan (начиная с Windows 8)
FLT_STREAM_CONTEXT FltSetStreamContext
FLT_STREAMHANDLE_CONTEXT FltSetStreamHandleContext
FLT_TRANSACTION_CONTEXT FltSetTransactionContext (начиная с Windows Vista)
FLT_VOLUME_CONTEXT FltSetVolumeContext

Когда драйвер минифильтра вызывает FltRegisterFilter из своей подпрограммы DriverEntry , он должен зарегистрировать каждый тип контекста, который он использует. Дополнительные сведения см. в справочнике по структуре FLT_CONTEXT_REGISTRATION и в разделе Регистрация типов контекста.

FltAllocateContext не инициализирует содержимое части структуры контекста, относящаяся к драйверу минифильтра.

Чтобы получить контекст для объекта, вызовите FltGetContexts или соответствующую подпрограмму get-context из следующей таблицы.

Тип контекста Подпрограмма Get-Context
FLT_FILE_CONTEXT FltGetFileContext (начиная с Windows Vista)
FLT_INSTANCE_CONTEXT FltGetInstanceContext
FLT_SECTION_CONTEXT FltGetSectionContext (начиная с Windows 8)
FLT_STREAM_CONTEXT FltGetStreamContext
FLT_STREAMHANDLE_CONTEXT FltGetStreamHandleContext
FLT_TRANSACTION_CONTEXT FltGetTransactionContext (начиная с Windows Vista )
FLT_VOLUME_CONTEXT FltGetVolumeContext

Контексты считаются ссылочными, и при успешном возвращении из FltAllocateContext контекст, на который указывает ReturnedContext , инициализирован с числом ссылок 1. Контекст освобождается автоматически, когда его количество ссылок достигает нуля. Чтобы увеличить количество ссылок в контексте, вызовите FltReferenceContext.

Чтобы уменьшать количество ссылок в контексте, вызовите FltReleaseContext.

Так как контексты считаются ссылочными, удалять их обычно не требуется. Чтобы явно удалить контекст, вызовите FltDeleteContext или соответствующую процедуру delete-context из следующей таблицы.

Тип контекста Подпрограмма Delete-Context
FLT_FILE_CONTEXT FltDeleteFileContext (начиная с Windows Vista)
FLT_INSTANCE_CONTEXT FltDeleteInstanceContext
FLT_SECTION_CONTEXT FltCloseSectionForDataScan (начиная с Windows 8)
FLT_STREAM_CONTEXT FltDeleteStreamContext
FLT_STREAMHANDLE_CONTEXT FltDeleteStreamHandleContext
FLT_TRANSACTION_CONTEXT FltDeleteTransactionContext (начиная с Windows Vista)
FLT_VOLUME_CONTEXT FltDeleteVolumeContext

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть fltkernel.h (включая Fltkernel.h)
Библиотека FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

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

FLT_CONTEXT_REGISTRATION

FltCloseSectionForDataScan

FltCreateSectionForDataScan

FltDeleteContext

FltDeleteFileContext

FltDeleteInstanceContext

FltDeleteStreamContext

FltDeleteStreamHandleContext

FltDeleteTransactionContext

FltDeleteVolumeContext

FltGetContexts

FltGetFileContext

FltGetInstanceContext

FltGetSectionContext

FltGetStreamContext

FltGetStreamHandleContext

FltGetTransactionContext

FltGetVolumeContext

FltReferenceContext

FltRegisterFilter

FltReleaseContext

FltSetFileContext

FltSetInstanceContext

FltSetStreamContext

FltSetStreamHandleContext

FltSetTransactionContext

FltSetVolumeContext