Liberando contextos

Um minifiltro libera um contexto chamando FltReleaseContext. Cada chamada bem-sucedida para uma das seguintes rotinas deve eventualmente ser correspondida por uma chamada para FltReleaseContext:

Observe que o ponteiro OldContext retornado pelo ContextoXxx de FltSet e o ponteiro Context retornado por FltDeleteContext também devem ser liberados quando não forem mais necessários.

No exemplo de código a seguir, obtido do minifiltro de exemplo CTX, a rotina CtxInstanceSetup cria e define um contexto de instância e chama 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;

Observe que FltReleaseContext é chamado independentemente de a chamada para FltSetInstanceContext ser bem-sucedida:

  • Se FltSetInstanceContext for bem-sucedido, ele adicionará sua própria referência ao contexto da instância (ou seja, ele incrementa a contagem de referência no contexto da instância). Portanto, a referência definida por FltAllocateContext não é mais necessária e a chamada para FltReleaseContext a remove.

  • Se FltSetInstanceContext falhar, o contexto da instância terá apenas uma referência, ou seja, a definida por FltAllocateContext. Quando FltReleaseContext retorna, o contexto da instância tem uma contagem de referência de zero e é liberado pelo gerenciador de filtros.