Chargement et déchargement d’un minifiltre

Cet article explique comment les pilotes minifiltre du système de fichiers (minifiltres) peuvent être chargés et déchargés dynamiquement dans un environnement Windows. Il couvre le processus d’initialisation et d’enregistrement, la gestion des instances, et les procédures de démantèlement pour garantir un nettoyage et une gestion des ressources appropriés lors des opérations de déchargement du pilote.

Chargement d’un minifilter

Un minifiltre est chargé selon les définitions du groupe d’ordre de chargement existantes si le fichier INF du minifiltre spécifie un type de démarrage du pilote de type SERVICE_BOOT_START, SERVICE_SYSTEM_START ou SERVICE_AUTO_START. Cet ordre de chargement prend en charge l’interopérabilité avec les pilotes de filtres hérités.

Un minifilter peut être chargé à tout moment pendant l’exécution du système. Il peut être chargé de la manière suivante.

  • Via une demande de démarrage de service (sc start, net startou les API de service).

  • Via une demande de chargement explicite (fltmc load, FltLoadFilterou FilterLoad).

Le gestionnaire de filtre (FltMgr) appelle la routine DriverEntry du minifiltre une fois le pilote chargé. À ce stade, le minifilter peut effectuer une initialisation qui s’appliquera à toutes ses instances. Dans sa routine DriverEntry, le minifilter appelle les routines fltMgr suivantes :

  • FltRegisterFilter pour inscrire des routines de rappel avec FltMgr.
  • FltStartFiltering pour avertir FltMgr qu’il est prêt à commencer à s’attacher aux volumes et à filtrer les requêtes d’E/S.

Les instances de pilotes minifiltre sont définies dans le fichier INF utilisé pour installer le minifiltre. Le fichier INF d’un minifilter doit définir une instance par défaut. Il peut également définir davantage d’instances au-delà de la valeur par défaut. Ces définitions d’instance s’appliquent à tous les volumes et incluent les informations suivantes :

  • Nom de l’instance
  • Son altitude
  • Indicateurs qui indiquent si l’instance peut être attachée automatiquement, manuellement ou les deux.

L’instance par défaut est utilisée :

  • Pour configurer les minifiltres afin que FltMgr appelle les routines de rappel de montage et de configuration d'instance du minifiltre dans l'ordre correct.
  • Avec les demandes de pièces jointes explicites lorsque l’appelant ne spécifie pas de nom d’instance.

FltMgr notifie automatiquement un minifiltre à propos d’un volume disponible en appelant sa routine InstanceSetupCallback lors de la première opération de création après le montage du volume. Cet appel peut se produire :

  • Avant que FltStartFiltering ne retourne, lorsque FltMgr énumère les volumes existants au démarrage du système.

  • Lors de l'exécution, lorsqu'un volume est monté ou à la suite d'une demande d'attachement explicite (fltmc attach, FltAttachVolumeou FilterAttach).

Déchargement d’un mini-filtre

Une instance de minifiltre est démantelée lorsque :

  • Le minifiltre est déchargé.

  • Le volume auquel l’instance de minifiltre est attachée est en cours de démontage.

  • Une demande de détachement explicite est effectuée (fltmc detach, FltDetachVolume ou FilterDetach). Si le minifiltre enregistre une routine InstanceQueryTeardownCallback, il peut refuser une demande de détachement explicite en appelant FilterDetach ou FltDetachVolume.

Le démantèlement se déroule comme suit :

  • Si le minifiltre a enregistré une routine de rappel InstanceTeardownStartCallback, FltMgr l’appelle au début du processus de démantèlement. Dans cette routine, le minifiltre doit :

    • Terminer toutes les opérations en cours.
    • Annuler ou terminer d’autres tâches telles que les demandes d’E/S générées par le minifiltre.
    • Arrêter de mettre en file d’attente de nouveaux éléments de travail.
  • Pendant le démantèlement de l’instance :

    • Toute routine de rappel de préopération ou de post-opération actuellement en cours continue son traitement normal.
    • Toute demande d’E/S en attente d’une routine de rappel de post-opération peut être « vidée » ou annulée.
    • Toute demande d’E/S générée par le minifiltre continue son traitement normal jusqu’à son achèvement.
  • Si le minifiltre a enregistré une routine InstanceTeardownCompleteCallback, FltMgr appelle cette routine après que toutes les opérations d’E/S en attente ont été complétées. Dans cette routine, le minifiltre ferme tous les fichiers encore ouverts.

  • Une fois que toutes les références en attente à l’instance sont libérées, FltMgr supprime les contextes restants et l’instance est complètement démantelée.

Un minifiltre peut être déchargé de la manière suivante pendant que le système est en cours d’exécution :

  • Par une demande d’arrêt de service (sc stop, net stop, ou les API de service).

  • Via une demande de déchargement explicite (fltmc unload, FltUnloadFilterou FilterUnload). Le minifiltre sera déchargé, quelle que soit toute dépendance enregistrée auprès du gestionnaire de contrôle des services (SCM).

La routine FilterUnloadCallback d’un minifiltre est appelée lorsque le minifiltre est déchargé. Cette routine ferme tous les ports de serveur de communication ouverts, appelle FltUnregisterFilter, et effectue tout nettoyage nécessaire. L’enregistrement de cette routine est facultatif. Cependant, si le minifiltre n’enregistre pas de routine FilterUnloadCallback, le minifiltre ne peut pas être déchargé. Pour plus d’informations sur cette routine, veuillez consulter la section Écriture d’une routine FilterUnloadCallback.

Routines du gestionnaire de filtre pour le chargement et le déchargement des minifiltres

FltMgr fournit les routines de support suivantes pour les demandes de chargement et de déchargement explicites, qui peuvent être émises depuis le mode utilisateur ou le mode noyau :

Les routines suivantes sont utilisées pour enregistrer et désenregistrer les routines de rappel pour la configuration et le démontage d'une instance de minifilter :

Routines de rappel des pilotes minifiltre pour la configuration, le démantèlement et le déchargement d’instance

Les routines de rappel des pilotes minifiltre suivantes sont stockées en tant que membres de la structure FLT_REGISTRATION qui est passée en tant que paramètre à FltRegisterFilter :

Nom du membre de la routine de rappel Type de routine de rappel
InstanceSetupCallback PFLT_INSTANCE_SETUP_CALLBACK
InstanceQueryTeardownCallback PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK
InstanceTeardownStartCallback PFLT_INSTANCE_TEARDOWN_CALLBACK
InstanceTeardownCompleteCallback PFLT_INSTANCE_TEARDOWN_CALLBACK
FilterUnloadCallback PFLT_FILTER_UNLOAD_CALLBACK