Inscription de types de contextes

Un pilote de minifiltre doit d’abord inscrire chaque type de contexte qu’il utilise. Une fois qu’un minifiltre a inscrit les types de contexte qu’il utilise, il peut créer un contexte.

Étapes d’inscription d’un type de contexte

Un minifiltre appelle FltRegisterFilter à partir de sa routine DriverEntry pour inscrire chaque type de contexte qu’il utilise. Avant d’appeler FltRegisterFilter, le pilote minifilter effectue les opérations suivantes :

  • Crée un tableau de longueur variable de structures FLT_CONTEXT_REGISTRATION . L’ordre des éléments de ce tableau n’a pas d’importance ; toutefois, le dernier élément du tableau doit être {FLT_CONTEXT_END}.
  • Stocke un pointeur vers le tableau créé dans le membre ContextRegistration de la structure FLT_REGISTRATION . Le minifiltre transmet cette structure dans le paramètre Registration de FltRegisterFilter.

Pour chaque type de contexte utilisé par le pilote de minifiltre, il doit fournir au moins une définition de contexte. La définition se présente sous la forme d’une structure FLT_CONTEXT_REGISTRATION , où chaque structure définit le type, la taille et d’autres informations pour le contexte.

Lorsque le pilote de minifiltre appelle FltAllocateContext pour créer un nouveau contexte, le gestionnaire de filtres utilise le paramètre Size , ainsi que les membres Size et Flags de la structure FLT_CONTEXT_REGISTRATION, pour sélectionner la définition de contexte à utiliser :

  • Pour les contextes de taille fixe, le membre Size de la structure FLT_CONTEXT_REGISTRATION spécifie la taille, en octets, de la partie de la structure de contexte définie par le pilote de minifiltre. La taille maximale d’un contexte est MAXUSHORT (64 Ko). Zéro est une valeur de taille valide. Le gestionnaire de filtres implémente des contextes de taille fixe à l’aide de listes de recherche. Le gestionnaire de filtres crée deux listes de lookaside pour chaque valeur de taille : une paginée et une autre non paginée.

  • Pour les contextes de taille variable, le membre Size doit être défini sur FLT_VARIABLE_SIZED_CONTEXTS. Le gestionnaire de filtres alloue des contextes de taille variable directement à partir d’un pool paginé ou non paginé.

Dans le membre Indicateurs de la structure FLT_CONTEXT_REGISTRATION, l’indicateur FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH peut être spécifié. Si le pilote de minifiltre utilise des contextes de taille fixe et que cet indicateur est spécifié, le gestionnaire de filtres alloue un contexte à partir de la liste de recherche si la taille du contexte est supérieure ou égale à la taille demandée. Sinon, la taille du contexte doit être égale à la taille demandée.

Pour un type de contexte donné, le pilote de minifiltre peut fournir jusqu’à trois définitions de contexte de taille fixe, chacune avec une taille différente et une définition de taille variable. Pour plus d’informations, consultez FLT_CONTEXT_REGISTRATION.

Routines de rappel de minifiltre pour la gestion du contexte

Le pilote de minifiltre peut éventuellement fournir les routines de rappel liées au contexte suivantes, qui sont stockées dans la structure FLT_REGISTRATION passée en tant que paramètre à FltRegisterFilter :

Routine de rappel Description
PFLT_CONTEXT_ALLOCATE_CALLBACK Dans de très rares occasions, un minifiltre peut avoir besoin de définir sa propre routine de rappel pour allouer des contextes, plutôt que de s’appuyer sur le gestionnaire de filtres.
PFLT_CONTEXT_CLEANUP_CALLBACK La routine de nettoyage d’un minifiltre doit être appelée avant que le contexte ne soit libéré.
PFLT_CONTEXT_FREE_CALLBACK Dans de très rares occasions, un minifiltre peut avoir besoin de définir sa propre routine de rappel pour des contextes libres, plutôt que de s’appuyer sur le gestionnaire de filtres.

Exemple de code d’inscription de contexte

L’exemple de code suivant, qui est tiré de l’exemple de pilote de minifiltre CTX, montre un tableau de structures FLT_CONTEXT_REGISTRATION utilisées pour inscrire des contextes de instance, de fichier, de flux et d’objet de fichier (handle de flux).

const FLT_CONTEXT_REGISTRATION contextRegistration[] =
{
    { FLT_INSTANCE_CONTEXT,              //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_INSTANCE_CONTEXT_SIZE,         //Size
      CTX_INSTANCE_CONTEXT_TAG           //PoolTag
    },
    { FLT_FILE_CONTEXT,                  //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_FILE_CONTEXT_SIZE,             //Size
      CTX_FILE_CONTEXT_TAG               //PoolTag
    },
    { FLT_STREAM_CONTEXT,                //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAM_CONTEXT_SIZE,           //Size
      CTX_STREAM_CONTEXT_TAG             //PoolTag
    },
    { FLT_STREAMHANDLE_CONTEXT,          //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAMHANDLE_CONTEXT_SIZE,     //Size
      CTX_STREAMHANDLE_CONTEXT_TAG       //PoolTag
    },
    { FLT_CONTEXT_END }
};