Eliminazione di contesti
Ogni contesto impostato da una chiamata completata a FltSetXxxContext deve essere eliminato.
La gestione filtri elimina automaticamente i contesti quando si verificano le situazioni seguenti:
- Gli oggetti collegati ai contesti vengono eliminati
- Un'istanza di minifilter viene scollegata da un volume
- Il driver minifilter viene scaricato
Pertanto, è raramente necessario per un minifilter eliminare in modo esplicito un contesto.
Un minifilter può eliminare un contesto chiamando una delle routine di eliminazione del contesto seguenti:
- FltDeleteContext
- FltDeleteFileContext
- FltDeleteInstanceContext
- FltDeleteStreamContext
- FltDeleteStreamHandleContext
- FltDeleteTransactionContext
- FltDeleteVolumeContext
Un contesto può essere eliminato solo se è attualmente impostato per un oggetto. Non è possibile eliminare un contesto se non è ancora stato impostato o se è già stato sostituito da una chiamata completata a FltSetXxxContext.
Le routine FltDeleteXxxContext restituiscono un puntatore al contesto precedente nel parametro OldContext, se OldContext non è NULL e non punta a NULL_CONTEXT. Se OldContext è NULL, la gestione filtri decrementa il conteggio dei riferimenti nel contesto, che viene quindi liberato a meno che il minifilter non abbia un riferimento eccezionale su di esso.
Nell'esempio di codice seguente viene illustrato come eliminare un contesto di flusso:
status = FltDeleteStreamContext(
FltObjects->Instance, //Instance
FltObjects->FileObject, //FileObject
&oldContext); //OldContext
//
// Perform any needed processing
// ...
//
if (oldContext != NULL) {
FltReleaseContext(oldContext);
}
In questo esempio FltDeleteStreamContext:
- Rimuove il contesto di flusso dal flusso.
- Non decrementa il conteggio dei riferimenti del contesto, perché il parametro OldContext non è NULL.
- Restituisce l'indirizzo del contesto eliminato (il contesto rimosso dal flusso) nel parametro OldContext .
A causa del parametro OldContext non NULL, dopo aver eseguito qualsiasi elaborazione necessaria, il filtro deve rilasciare il contesto eliminato chiamando FltReleaseContext.