Создание контекстов

После регистрации типов контекста, которые он использует, минифильтр может создать контекст, вызвав FltAllocateContext. Эта подпрограмма выбирает соответствующее определение контекста для использования в соответствии с критериями, описанными в разделе "Регистрирование типов контекста".

Перед выделением контекста и попыткой задать его мини-фильтр может вызвать следующие подпрограммы, чтобы определить, поддерживает ли базовая файловая система контексты файлов, потоков или потоковых дескрипторов:

В следующем примере кода, взятом из примера драйвера минифильтра 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.

После создания контекста мини-фильтр может задать его для объекта.