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:
- FltDeleteContext
- FltDeleteFileContext
- FltDeleteInstanceContext
- FltDeleteStreamContext
- FltDeleteStreamHandleContext
- FltDeleteTransactionContext
- FltDeleteVolumeContext
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.