Поделиться через


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

После того как минифильтр зарегистрировал типы контекста, который он использует, он может создать контекст, вызвав 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.

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