Rilascio di contesti
Un minifiltro rilascia un contesto chiamando FltReleaseContext. Ogni chiamata riuscita a una delle routine seguenti deve essere trovata alla fine con una chiamata a FltReleaseContext:
Routine di creazione del contesto:
Routine get del contesto:
Routine del set di contesto:
Routine di incremento del riferimento al contesto:
Si noti che il puntatore OldContext restituito da FltSetXxxContext e il puntatore Context restituito da FltDeleteContext devono essere rilasciati anche quando non sono più necessari.
Nell'esempio di codice seguente, tratto dal minifilter di esempio CTX, la routine CtxInstanceSetup crea e imposta un contesto di istanza e quindi chiama FltReleaseContext:
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //Operation
instanceContext, //NewContext
NULL); //OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
Si noti che FltReleaseContext viene chiamato indipendentemente dal fatto che la chiamata a FltSetInstanceContext abbia esito positivo:
Se FltSetInstanceContext ha esito positivo, aggiunge il proprio riferimento al contesto dell'istanza, ovvero incrementa il conteggio dei riferimenti nel contesto dell'istanza. Pertanto, il riferimento impostato da FltAllocateContext non è più necessario e la chiamata a FltReleaseContext lo rimuove.
Se FltSetInstanceContext ha esito negativo, il contesto dell'istanza ha un solo riferimento, ovvero quello impostato da FltAllocateContext. Quando FltReleaseContext viene restituito, il contesto dell'istanza ha un conteggio dei riferimenti pari a zero e viene liberato dal gestore filtri.