Создание контекстов
После того как минифильтр зарегистрировал типы контекста, который он использует, он может создать контекст, вызвав FltAllocateContext. Эта подпрограмма выбирает подходящее определение контекста для использования в соответствии с критериями, описанными в разделе Регистрация типов контекста.
Перед выделением контекста и его настройкой минифильтр может вызвать следующие подпрограммы, чтобы определить, поддерживает ли базовая файловая система контексты обработки файлов, потоков или потоков:
- FltSupportsFileContexts или FltSupportsFileContextsEx
- FltSupportsStreamContexts
- FltSupportsStreamHandleContexts
В следующем примере кода, взятом из примера драйвера минифильтра CTX , подпрограмма CtxInstanceSetup вызывает FltAllocateContext для создания контекста экземпляра:
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
В примере CTX для контекстов экземпляров регистрируется следующее определение контекста:
{ FLT_INSTANCE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_INSTANCE_CONTEXT_SIZE, //Size
CTX_INSTANCE_CONTEXT_TAG }, //PoolTag
Определение контекста имеет фиксированный размер, так как элемент Size CTX_INSTANCE_CONTEXT_SIZE (по сравнению с FLT_VARIABLE_SIZED_CONTEXTS, который используется для обозначения определения контекста переменной величины). Обратите внимание, что флаг FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH не установлен в элементе Flags . В этом случае, если значение параметра ContextSizeобъекта FltAllocateContext совпадает со значением элемента Size определения контекста, FltAllocateContext выделяет контекст экземпляра из соответствующего несгнутого списка lookaside. Если значения не совпадают, функция FltAllocateContext завершается ошибкой с возвращаемым значением STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND.
При успешном выполнении FltAllocateContext инициализирует количество ссылок в новом контексте в один. Если контекст больше не нужен, драйвер минифильтра должен освободить эту ссылку. Таким образом, каждый вызов FltAllocateContext должен соответствовать последующему вызову FltReleaseContext.
После создания контекста минифильтр может задать его для объекта .