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 :
Routine de création de contexte :
Routines d’obtention de contexte :
Routines de jeu de contexte :
Routine d’incrémentation de référence de contexte :
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.