Liberar contextos
Un minifiltro libera un contexto llamando a FltReleaseContext. Cada llamada correcta a una de las siguientes rutinas debe coincidir finalmente mediante una llamada a FltReleaseContext:
Rutina de creación de contexto:
Rutinas de obtención de contexto:
Rutinas del conjunto de contextos:
Rutina de incremento de referencia de contexto:
Tenga en cuenta que el puntero OldContext devuelto por FltSetXxxContext y el puntero Context devuelto por FltDeleteContext también deben liberarse cuando ya no sean necesarios.
En el ejemplo de código siguiente, tomado del minifiltro de ejemplo CTX, la rutina CtxInstanceSetup crea y establece un contexto de instancia y, a continuación, llama a 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;
Tenga en cuenta que se llama a FltReleaseContext independientemente de si la llamada a FltSetInstanceContext se realiza correctamente:
Si FltSetInstanceContext se realiza correctamente, agrega su propia referencia al contexto de instancia (es decir, incrementa el recuento de referencias en el contexto de la instancia). Por lo tanto, la referencia establecida por FltAllocateContext ya no es necesaria y la llamada a FltReleaseContext la quita.
Si se produce un error en FltSetInstanceContext , el contexto de instancia solo tiene una referencia, es decir, la establecida por FltAllocateContext. Cuando FltReleaseContext devuelve, el contexto de instancia tiene un recuento de referencias de cero y el administrador de filtros libera.