Publication de contextes

Un minifiltre libère un contexte en appelant FltReleaseContext. Chaque appel réussi à l’une des routines suivantes doit finalement être mis en correspondance par un appel à FltReleaseContext :

Notez que le pointeur OldContext retourné par FltSetXxxContext et le pointeur context retourné par FltDeleteContext doivent également être libérés lorsqu’ils ne sont plus nécessaires.

Dans l’exemple de code suivant, extrait de l’exemple de minifiltre CTX, la routine CtxInstanceSetup crée et définit un contexte instance, puis appelle 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;

Notez que FltReleaseContext est appelé, que l’appel à FltSetInstanceContext réussisse ou non :

  • Si FltSetInstanceContext réussit, il ajoute sa propre référence au contexte instance (autrement dit, il incrémente le nombre de références sur le contexte instance). Ainsi, la référence définie par FltAllocateContext n’est plus nécessaire et l’appel à FltReleaseContext la supprime.

  • Si FltSetInstanceContext échoue, le contexte instance n’a qu’une seule référence, à savoir celle définie par FltAllocateContext. Lorsque FltReleaseContext est retourné, le contexte instance a un nombre de références égal à zéro et il est libéré par le gestionnaire de filtres.