Classement des pilotes de filtre de périphérique
Microsoft a développé une méthode d’ajout déclaratif de filtres en exprimant l’intention du filtre, plutôt que la position de la pile, appelée classement des pilotes de filtre de périphérique.
Besoin de l’ordre des pilotes de filtre de périphérique
Avant Windows 10 version 1903, la seule façon prise en charge d’inscrire un pilote de filtre de périphérique était d’ajouter une entrée de Registre (à l’aide de la directive AddReg). Toutefois, cette méthode de manipulation du Registre ne permet pas de spécifier exactement la position à laquelle inscrire un filtre particulier.
L’inscription de filtre à l’aide de la directive AddReg ajoute simplement le filtre à la fin de la liste de filtres. Cette approche utilise une liste de valeurs où l’ordre importe et détermine où, dans la pile, le filtre est chargé.
L’utilisation d’une seule liste de valeurs ordonnées est inférieure à l’idéal, en particulier lorsque AddReg ajoute uniquement à la fin, car il existe des conséquences négatives lorsque plusieurs pilotes ajoutent des filtres au même appareil.
Dans le scénario où il existe au moins un INF d’extension impliqué, si les inf utilisent incorrectement AddReg (en d’autres termes, n’utilisez pas l’indicateur d’ajout), ils peuvent effacer un filtre ajouté par un autre INF.
En outre, plusieurs inf d’extension peuvent ajouter des filtres et l’ordre relatif de ces filtres peut être important ; Toutefois, la plateforme Plug-and-Play (PnP) ne garantit pas un ordre d’installation pour les extensions. Le résultat est que l’ordre des « ajouts » n’est pas garanti.
Implémentation de l’ordre des pilotes de filtre d’appareil
Pour fournir une méthode déclarative flexible pour inscrire des filtres d’appareil, Microsoft a développé une méthode d’ajout déclaratif de filtres en exprimant l’intention du filtre, plutôt que la position de la pile. La solution fournit aux auteurs de pilotes de fonction la possibilité d’exprimer dans leur INF un ensemble ordonné de positions (appelées niveaux) auxquelles un filtre peut s’inscrire.
En plus d’un niveau spécifique, un filtre peut s’inscrire de façon déclarative en tant que filtre de niveau supérieur ou inférieur.
L’infrastructure est basée sur une nouvelle méthode d’inscription de filtre pour déterminer les pilotes d’ordre à inclure dans la pile d’appareils. La nouvelle méthode n’interrompt pas la compatibilité pour l’ancienne façon d’ajouter des filtres. Toutefois, cela permet aux nouveaux filtres de passer à un mécanisme d’inscription plus robuste et flexible.
La méthode est activée en faisant en sorte que l’INF de base définisse une liste ordonnée d’un ou plusieurs « niveaux ». L’INF de base et toutes les fonctions INF d’extension peuvent inscrire un filtre déclaratif via une nouvelle directive INF qui spécifie le nom et le niveau de service auxquels appartient le filtre. Les filtres supérieurs et inférieurs sont représentés par leur propre liste ordonnée de niveaux respectifs.
Ces listes de filtres supérieures et inférieures sont créées en triant tous les pilotes de filtre par leur niveau. L’ordre des filtres au sein de chaque niveau doit être considéré comme arbitraire, où aucune dépendance ne peut être prise sur l’ordre des filtres au sein d’un niveau particulier. Dans les scénarios où l’ordre relatif de deux filtres doit être garanti, ils doivent être inscrits à différents niveaux.
Prenons l’exemple de pilote de périphérique suivant :
L’INF de base du pilote de périphérique déclare deux niveaux de filtre supérieurs, A et B (dans cet ordre). Dans l’INF d’extension associée à l’INF de base, deux filtres sont ajoutés à chacun des deux niveaux.
Le résultat de l’installation du pilote de périphérique est un ordre de pile d’appareils qui fusionne les listes de pilotes de filtre tout en respectant le positionnement et l’ordre souhaités. L’ordre de pile de l’appareil résultant garantit que tout filtre placé au niveau « A » est fourni avant tout filtre au niveau « B ». Toutefois, dans chaque niveau, l’ordre est arbitraire.
Comme indiqué dans l’exemple, Filter3 peut venir avant Filter5 ou après Filter5. Dans tous les cas, Filter3 et Filter5 seront fournis avant les filtres au niveau suivant, « B ».
Lors de la conception de la série de niveaux sur lesquelles les filtres peuvent être inscrits, au lieu de créer une série de niveaux pour l’ordre, les niveaux doivent être nommés et ordonnés afin qu’ils correspondent à l’intention du filtre. Par exemple, un appareil d’E/S peut définir le chiffrement de niveau auquel tout filtre de chiffrement doit être inscrit. Cela permet à l’intention du filtre d’être facilement compris et géré, et rend la pile plus robuste par rapport aux modifications cassantes apportées au pilote de fonction.
Remarque
Même sans niveaux définis par l’INF de base, un filtre déclaratif peut s’inscrire comme étant simplement supérieur ou inférieur. Lorsque les niveaux ne sont pas définis, cela équivaut logiquement à ajouter le filtre à la fin de la valeur de Registre UpperFilters/LowerFilters. Lorsque les niveaux sont définis, l’un des niveaux doit être marqué comme niveau par défaut dans le pilote de base et, dans ce cas, le filtre est inscrit dans ce niveau.
Scénarios
Considérez un pilote de périphérique d’E/S qui chiffre les données qui transitent par la pile. Une implémentation classique peut utiliser un pilote de filtre inférieur immédiatement sous le pilote de fonction pour y parvenir. Pour vous assurer que le filtre de chiffrement est placé à la position exacte souhaitée par l’auteur du pilote, il peut utiliser des filtres déclaratifs, comme indiqué ci-dessous :
L’INF de base établit deux niveaux de filtres inférieurs, « Chiffrement » et « Surveillance » (par défaut). « Surveillance » (valeur par défaut) dans cet exemple sont les autres filtres inférieurs qui peuvent exister pour cet appareil particulier. En plaçant explicitement le pilote de filtre « Chiffrer » au niveau « Chiffrement », le pilote garantit que l’ordre de pile d’appareils résultant place le pilote de filtre « Chiffrer » avant tout autre filtre inférieur et suit immédiatement le pilote de fonction.
Prenons l’exemple d’une étape plus loin. Imaginez qu’une version plus récente du pilote sort et que l’auteur a intégré le chiffrement au pilote de fonction. Cela supprime la nécessité d’un pilote de filtre « Chiffrer » distinct. L’auteur doit simplement supprimer le niveau qui contenait le filtre « Chiffrer » de l’INF de base et lorsque le pilote est mis à jour, la pile est générée dynamiquement.
Si un filtre se déclare dans un niveau explicite qui n’existe pas, le filtre ne se retrouve pas dans la pile d’appareils. Dans l’exemple, l’inf de base a été mis à jour et même si l’extension INF reste identique, la pile d’appareils résultante exclut le filtre « Chiffrer » car il n’a pas été inclus dans la déclaration de niveau de l’INF de base.
Niveau de filtre par défaut
Pour générer la pile de filtres finale, toutes les sources d’informations de filtre sont fusionnées dans une seule liste. Il est important de noter que la logique de fusion est effectuée lors de la création de la pile d’appareils. Si un nouveau filtre est ajouté en installant un pilote de base ou d’extension nouveau/mis à jour, les appareils sont redémarrés lors de l’installation et récupèrent une nouvelle liste de filtres.
Certaines sources de filtres ne disposent pas d’informations de position, à savoir les filtres ajoutés via les valeurs de Registre UpperFilters/LowerFilters héritées ou via la syntaxe déclarative position seule (décrite ci-dessous).
Pour prendre en charge une fusion efficace lorsqu’il manque d’informations de position, une information supplémentaire doit être définie par l’inf de base : un niveau de filtre par défaut. Le niveau de filtre par défaut est une position où les filtres, sans informations de niveau ou de position, seront insérés.
Par exemple, les niveaux de filtre peuvent être définis dans l’inf de base comme suit :
Level Order: A, B, C
DefaultFilterLevel: C
La spécification du niveau par défaut comme niveau final indique que tout filtre qui ne contient pas d’informations de position sera ajouté à la liste de filtres. Sinon, l’auteur du pilote peut souhaiter que la pile se termine toujours par des filtres explicitement inscrits au niveau C :
Level Order: A, B, C
DefaultFilterLevel: B
En raison du niveau de filtre par défaut défini sur B, tout filtre supplémentaire sans informations de position sera inséré entre les filtres A et les filtres C.
Syntaxe
Inscription de filtres
Pour plus d’informations, consultez la section INF DDInstall.Filters et la documentation de la directive AddFilter.
[DDInstall.Filters]
AddFilter = <FilterName>, [Flags], FilterSection
FilterLevel OR FilterPosition peut être spécifié de l’une des deux manières suivantes :
Option 1 :
[FilterSection]
FilterLevel=<LevelName>
Option 2 :
[FilterSection]
FilterPosition=Upper/Lower
Cette opération peut être effectuée à la fois dans les inf de base et d’extension.
[DDInstall.Filters]
FilterName est le nom du service sur le système.
Les indicateurs sont actuellement inutilisés et doivent être laissés vides ou définis sur 0.
FilterSection est une section décrivant le filtre.
[Section Filtre]
Une section de filtre doit contenir exactement l’une des deux directives suivantes : FilterLevel ou FilterPosition.
Un FilterLevel est un emplacement spécifique pour insérer le filtre d’appareil sur la pile, défini par l’inf de base. Dans chaque niveau, l’ordre des filtres est arbitraire.
Un FilterPosition est utilisé dans le cas où la classe a un emplacement spécifique pour les filtres tiers à insérer.
Définition des niveaux de filtre
[DDInstall.HW]
AddReg = FilterLevel_Definition
[FilterLevel_Definition]
HKR,,UpperFilterLevels,%REG_MULTI_SZ%,"LevelA","LevelB","LevelC"
HKR,,UpperFilterDefaultLevel,,"LevelC"
HKR,,LowerFilterLevels,%REG_MULTI_SZ%,"LevelD","LevelE","LevelF"
HKR,,LowerFilterDefaultLevel,,"LevelE"
Cela peut uniquement être effectué par un pilote de base .
La liste déclarative complète des filtres pour un appareil spécifique peut être récupérée en interrogeant les propriétés suivantes :
DEVPKEY_Device_CompoundUpperFilters
DEVPKEY_Device_CompoundLowerFilters
Inscription de filtre équivalente héritée
Examinons comment accomplir l’approche héritée de la tentative d’ajout d’un filtre supérieur via INF :
[DDInstall.HW]
AddReg = Filters
[Filters]
HKR,,"UpperFilters", 0x00010008, "MyFilter"
Cette syntaxe ajoute « MyFilter » à la fin de la liste des filtres supérieurs.
Avec la nouvelle syntaxe introduite, la section ci-dessus est logiquement similaire à :
[DDInstall.Filters]
AddFilter = MyFilter,,MyUpperFilterInstall
[MyUpperFilterInstall]
FilterPosition = Upper
Cela spécifie que le filtre « MyFilter » doit être ajouté à la liste des filtres supérieurs. Si l’INF de base a spécifié des niveaux de filtre, l’utilisation de FilterPosition inscrit le filtre dans le niveau par défaut pour cette position.
Si les niveaux de filtre ne sont pas spécifiés, ce filtre est inscrit en tant que filtre supérieur dans un ordre arbitraire.