Riferimenti ai contesti

Filter Manager usa il conteggio dei riferimenti per gestire la durata di un contesto minifilter. Un conteggio dei riferimenti è un numero che indica lo stato di un contesto.

Ogni volta che viene creato un contesto, FltMgr inizializza il conteggio dei riferimenti del contesto a uno. Viene chiamato il riferimento iniziale al contesto.

Ogni volta che viene fatto riferimento a un contesto, ad esempio da un set di contesto o da get, FltMgr incrementa il numero di riferimenti del contesto per uno.

Quando un contesto non è più necessario, il conteggio dei riferimenti deve essere decretato. Un conteggio di riferimenti positivi significa che il contesto è utilizzabile. Quando il conteggio dei riferimenti diventa zero, il contesto non è utilizzabile e FltMgr la libera.

FltMgr rilascia il riferimento iniziale al contesto (decrementa il conteggio dei riferimenti a zero) quando l'oggetto viene eliminato e quindi chiama il callback di pulizia del contesto facoltativo del filtro. Sebbene questo si verifichi raramente, se un minifilter deve rimuovere un contesto da un oggetto prima del teardown, il minifilter deve rilasciare in modo sicuro tale riferimento iniziale al contesto chiamando FltDeleteContext.

Un minifilter può aggiungere un riferimento a un contesto chiamando FltReferenceContext per incrementare il conteggio dei riferimenti del contesto. Il minifilter deve infine rimuovere questo riferimento aggiunto chiamando FltReleaseContext.

Di seguito è riportato un breve esempio di cronologia dei conteggi dei riferimenti per un oggetto tipico. Si supponga che tutte le chiamate API Flt abbiano esito positivo.

Callback filtro API Flt denominata Conteggio dei riferimenti al contesto Descrizione
PreCreare FltAllocateContext 1 Il filtro sta elaborando una pre-creazione e decide che potrebbe voler tenere traccia del file. Alloca un contesto di flusso, che causa l'inizializzazione del conteggio dei riferimenti a 1. Il filtro passa il contesto al callback PostCreate tramite il parametro CompletionContext .
PostCreare FltSetStreamContext 2 Il filtro ha passato il contesto allocato durante PreCreate al callback PostCreate . La creazione ha avuto esito positivo, quindi il filtro associa il contesto, che causa l'incremento del conteggio dei riferimenti da parte di FltMgr.
PostCreare FltReleaseContext 1 Poiché FltSetStreamContext ha incrementato il conteggio dei riferimenti, il filtro deve rimuovere il conteggio aggiuntivo. Il conteggio dei riferimenti è 1 dopo che il filtro rilascia il contesto, quindi il contesto rimane attivo. Se il filtro aveva deciso che non si preoccupava di questo file dopo tutto, potrebbe aver ignorato la chiamata di FltSetStreamContext e semplicemente chiamato FltReleaseContext. In questo caso il conteggio sarebbe andato a 0 e il contesto sarebbe stato deallocato.
PreRead FltGetStreamContext 2 Il filtro visualizza una lettura di I/O e vuole sapere se sta rilevando questo file. Richiede il contesto di flusso e lo ottiene, quindi sa che vuole tenere traccia di questo file. FltMgr incrementa il conteggio dei riferimenti.
PreRead FltReleaseContext 1 Il filtro viene eseguito usando il relativo contesto, quindi lo rilascia, causando la deremente del conteggio dei riferimenti. Ogni FltGet*Context deve essere bilanciato con un fltReleaseContext.
PreCleanup FltGetStreamContext 2 Il filtro richiede e ottiene il relativo contesto, che incrementa il conteggio dei riferimenti.
PreCleanup FltReleaseContext 1 Il filtro viene eseguito usando il contesto in modo da rilasciarlo, che decresce il conteggio dei riferimenti.
Callback di pulizia del contesto 0 Il file system elimina l'oggetto flusso sottostante. (Nel caso specifico di un oggetto di flusso, il teardown viene attivato da IRP_MJ_CLOSE). FltMgr decrementa il conteggio dei riferimenti a 0 e quindi chiama il callback di pulizia del contesto del filtro. Il filtro ora ha l'opportunità di pulire il proprio contesto.