Condividi tramite


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:

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.