Création de contextes
Une fois qu’un minifiltre a inscrit les types de contexte qu’il utilise, il peut créer un contexte en appelant FltAllocateContext. Cette routine sélectionne la définition de contexte appropriée à utiliser en fonction des critères décrits dans Inscription des types de contexte.
Avant d’allouer un contexte et de tenter de le définir, un minifiltre peut appeler les routines suivantes pour déterminer si le système de fichiers sous-jacent prend en charge les contextes de handle de fichier, de flux ou de flux :
- FltSupportsFileContexts ou FltSupportsFileContextsEx
- FltSupportsStreamContexts
- FltSupportsStreamHandleContexts
Dans l’exemple de code suivant, extrait de l’exemple de pilote minifilter CTX, la routine CtxInstanceSetup appelle FltAllocateContext pour créer un contexte instance :
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
Dans l’exemple CTX, la définition de contexte suivante est inscrite pour instance contextes :
{ FLT_INSTANCE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_INSTANCE_CONTEXT_SIZE, //Size
CTX_INSTANCE_CONTEXT_TAG }, //PoolTag
La définition de contexte est de taille fixe, car le membre Size est CTX_INSTANCE_CONTEXT_SIZE (par opposition à FLT_VARIABLE_SIZED_CONTEXTS, qui est utilisé pour indiquer une définition de contexte de taille variable). Notez que l’indicateur FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH n’est pas défini dans le membre Indicateurs . Dans ce cas, si la valeur du paramètre ContextSize de FltAllocateContext correspond à celle du membre Size de la définition de contexte, FltAllocateContext alloue le contexte instance de la liste de lookaside appropriée. Si les valeurs ne correspondent pas, FltAllocateContext échoue avec une valeur de retour de STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND.
En cas de réussite, FltAllocateContext initialise le nombre de références sur le nouveau contexte. Lorsque le contexte n’est plus nécessaire, le pilote minifilter doit libérer cette référence. Ainsi, chaque appel à FltAllocateContext doit être mis en correspondance par un appel ultérieur à FltReleaseContext.
Une fois qu’un contexte est créé, un minifiltre peut le définir pour un objet.