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


Освобождение контекстов

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

Обратите внимание, что указатель OldContext , возвращаемый FltSetXxxContext , и указатель контекста , возвращенный FltDeleteContext , также должны быть освобождены, если они больше не нужны.

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

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

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

Обратите внимание, что метод FltReleaseContext вызывается независимо от того, выполняется ли вызов FltSetInstanceContext :

  • Если fltSetInstanceContext завершается успешно, он добавляет собственную ссылку на контекст экземпляра (то есть увеличивает число ссылок в контексте экземпляра). Таким образом, набор ссылок fltAllocateContext больше не требуется, и вызов FltReleaseContext удаляет его.

  • Если FltSetInstanceContext завершается сбоем, контекст экземпляра имеет только одну ссылку, а именно ту, которая задана fltAllocateContext. Когда функция FltReleaseContext возвращает , контекст экземпляра имеет нулевое число ссылок и освобождается диспетчером фильтров.