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:
Rotina de criação de contexto:
Rotinas de obtenção de contexto:
Rotinas de conjunto de contexto:
Rotina de incremento de referência de contexto:
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.