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


Настройка контекстов

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

Подпрограмма set выполняет следующие действия в зависимости от значения параметра Operation :

  • Если операция == FLT_SET_CONTEXT_KEEP_IF_EXISTS:

    • Если мини-фильтр еще не задал контекст того же типа для объекта, подпрограмма set:
      • Присоединяет к объекту только что выделенный контекст.
      • Увеличивает число ссылок.
    • В противном случае, если мини-фильтр уже задал контекст, подпрограмма set:
      • Возвращает STATUS_FLT_CONTEXT_ALREADY_DEFINED (код ошибки NTSTATUS).
      • Не заменяет существующий контекст.
      • Не увеличивает число ссылок.
      • Сохраняет указатель на существующий контекст в параметре OldContext , если он не равен NULL. Если этот указатель больше не нужен, драйвер мини-фильтра должен освободить его, вызвав FltReleaseContext.
  • Если операция == FLT_SET_CONTEXT_REPLACE_IF_EXISTS:

    • Подпрограмма set всегда присоединяет новый контекст к объекту .
    • Если драйвер минифильтра уже задал контекст, процедура задания:
      • Удаляет существующий контекст, задает новый контекст и увеличивает количество ссылок для нового контекста.
      • Если параметр OldContext не равен NULL, он получает указатель на удаленный контекст. Если этот указатель больше не нужен, драйвер мини-фильтра должен освободить его, вызвав FltReleaseContext.

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

Каждый успешный набор контекста в конечном итоге должен быть удален.

В следующем примере кода, взятом из примера мини-фильтра CTX, подпрограмма CtxInstanceSetup создает и задает контекст экземпляра:

status = FltAllocateContext(
           FltObjects->Filter,              //in: Filter
           FLT_INSTANCE_CONTEXT,            //in: ContextType
           CTX_INSTANCE_CONTEXT_SIZE,       //in: ContextSize
           NonPagedPool,                    //in: PoolType
           &instanceContext);               //out: ReturnedContext
...
status = FltSetInstanceContext(
           FltObjects->Instance,            //in: Instance
           FLT_SET_CONTEXT_KEEP_IF_EXISTS,  //in: Operation
           instanceContext,                 //in: NewContext
           NULL);                           //out: OldContext

if (instanceContext != NULL) {
  FltReleaseContext(instanceContext);
}
return status;

Обратите внимание, что после вызова FltSetInstanceContext выполняется вызов FltReleaseContext , чтобы освободить счетчик ссылок, заданный fltAllocateContext (а неFltSetInstanceContext). Это объясняется в разделе Освобождение контекстов.