Compartir a través de


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:

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.