Eliminar contextos

Cada contexto establecido por una llamada correcta a FltSetXxxContext debe eliminarse finalmente.

El administrador de filtros elimina automáticamente los contextos cuando se producen las situaciones siguientes:

  • Se eliminan los objetos a los que se adjuntan los contextos.
  • Una instancia de minifiltro se desasocia de un volumen
  • El controlador de minifiltro se descarga

Por lo tanto, rara vez es necesario que un minifiltro elimine explícitamente un contexto.

Un minifiltro puede eliminar un contexto llamando a una de las siguientes rutinas de eliminación de contexto:

Un contexto solo se puede eliminar si está establecido actualmente para un objeto . No se puede eliminar un contexto si aún no se ha establecido o si ya se ha reemplazado por una llamada correcta a FltSetXxxContext.

Las rutinas FltDeleteXxxContext devuelven un puntero al contexto anterior en el parámetro OldContext , si OldContext no es NULL y no apunta a NULL_CONTEXT. Si OldContext es NULL, el administrador de filtros disminuye el recuento de referencias en el contexto, que luego se libera a menos que el minifiltro tenga una referencia pendiente en él.

En el ejemplo de código siguiente se muestra cómo eliminar un contexto de secuencia:

status = FltDeleteStreamContext(
 FltObjects->Instance,      //Instance
 FltObjects->FileObject,    //FileObject
           &oldContext);              //OldContext
//
// Perform any needed processing
// ...
//
if (oldContext != NULL) {
 FltReleaseContext(oldContext);
}

En este ejemplo, FltDeleteStreamContext:

  • Quita el contexto de secuencia de la secuencia.
  • No disminuye el recuento de referencias del contexto, porque el parámetro OldContext no es NULL.
  • Devuelve la dirección del contexto eliminado (el contexto quitado de la secuencia) en el parámetro OldContext .

Debido al parámetro OldContext no NULL, después de realizar cualquier procesamiento necesario, el filtro debe liberar el contexto eliminado llamando a FltReleaseContext.