Condividi tramite


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:

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.