Freigeben über


Sortierung des Gerätefiltertreibers

Microsoft hat eine Methode zum deklarativen Hinzufügen von Filtern entwickelt, indem die Absicht des Filters und nicht die Stapelposition ausgedrückt wird, die als Gerätefiltertreiberreihenfolge bezeichnet wird.

Die Notwendigkeit der Gerätefiltertreiberbestellung

Vor Windows 10, Version 1903, wurde die einzige unterstützte Möglichkeit zum Registrieren eines Gerätefiltertreibers durch Hinzufügen eines Registrierungseintrags (mithilfe der AddReg-Direktive) unterstützt. Diese Methode der Registrierungsmanipulation bietet jedoch nicht die Flexibilität, genau anzugeben , an welcher Position ein bestimmter Filter registriert werden soll.

Die Filterregistrierung mithilfe der AddReg-Direktive fügt den Filter einfach am Ende der Filterliste an. Bei diesem Ansatz wird eine Liste von Werten verwendet, bei denen reihenfolge wichtig ist und bestimmt, wo der Filter im Stapel geladen wird.

Die Verwendung einer einzelnen Liste sortierter Werte ist weniger ideal als ideal, insbesondere wenn AddReg nur an das Ende anfügt, da es negative Folgen gibt, wenn mehr als ein Treiber Filter zum gleichen Gerät hinzufügt.

In dem Szenario, in dem mindestens eine Erweiterungs-INF beteiligt ist, könnten sie einen Filter löschen, der von einem anderen INF hinzugefügt wurde, wenn die INFs AddReg nicht ordnungsgemäß verwenden (d. h. nicht die Anfügekennzeichnung verwenden).

Darüber hinaus könnten mehrere Erweiterungs-INF-Elemente Filter hinzufügen, und die relative Reihenfolge dieser Filter kann wichtig sein; Die Plug & Play(PnP)-Plattform garantiert jedoch keinen Installationsauftrag für die Erweiterungen. Das Ergebnis ist, dass die Reihenfolge der "Anfüge" nicht garantiert ist.

Implementieren der Gerätefiltertreiber-Sortierung

Um eine flexible deklarative Methode zum Registrieren von Gerätefiltern bereitzustellen, hat Microsoft eine Methode zum deklarativen Hinzufügen von Filtern entwickelt, indem die Absicht des Filters und nicht die Stapelposition ausgedrückt wird. Die Lösung bietet Funktionstreiberautoren die Möglichkeit, in ihrem INF einen sortierten Satz von Positionen (als Ebenen bezeichnet) auszudrücken, gegen die sich ein Filter selbst registrieren kann.

Zusätzlich zu einer bestimmten Ebene kann ein Filter einfach als Filter auf oberer oder niedrigerer Ebene deklarativ registriert werden.

Die Infrastruktur basiert auf einer neuen Filterregistrierungsmethode, um zu bestimmen, welche Reihenfolge Treiber im Gerätestapel enthalten sein sollen. Mit der neuen Methode wird die Kompatibilität für die alte Methode zum Hinzufügen von Filtern nicht abgebrochen. Es ermöglicht jedoch neue Filter, um zu einem robusteren und flexibleren Registrierungsmechanismus zu wechseln.

Die Methode ist aktiviert, indem die Basis-INF eine sortierte Liste mit einer oder mehreren "Ebenen" definiert. Sowohl die Basis-INF als auch alle Erweiterungs-INFs können einen deklarativen Filter über eine neue INF-Direktive registrieren, die den Dienstnamen und die Ebene angibt, zu der der Filter gehört. Obere und untere Filter werden jeweils durch ihre eigene sortierte Liste der Ebenen dargestellt.

Diese oberen und unteren Filterlisten werden erstellt, indem alle Filtertreiber nach ihrer Ebene sortiert werden. Die Reihenfolge der Filter innerhalb jeder Ebene sollte als beliebig betrachtet werden, wobei keine Abhängigkeit von der Reihenfolge der Filter innerhalb einer bestimmten Ebene übernommen werden kann. In Szenarien, in denen die relative Reihenfolge von zwei Filtern garantiert werden muss, sollten sie auf unterschiedlichen Ebenen registriert werden.

Betrachten Sie das folgende Gerätetreiberbeispiel:

Installation von Gerätetreibern, die als Gerätestapelreihenfolge angezeigt werden, die die Listen der Filtertreiber zusammenführt, während die gewünschte Positionierung und Sortierung beachtet wird.

Die Basis-INF des Gerätetreibers deklariert zwei obere Filterebenen A und B (in dieser Reihenfolge). Im zugeordneten Erweiterungs-INF des Basis-INF werden zwei Filter zu den beiden Ebenen hinzugefügt.

Das Ergebnis der Installation des Gerätetreibers ist eine Gerätestapelreihenfolge, die die Listen der Filtertreiber zusammenführt, während die gewünschte Positionierung und Sortierung beachtet wird. Die resultierende Gerätestapelreihenfolge stellt sicher, dass alle Filter, die auf der Ebene "A" platziert sind, vor einem Filter auf der Ebene "B" stehen. Innerhalb jeder Ebene ist die Reihenfolge jedoch beliebig.

Wie im Beispiel gezeigt, könnte Filter3 vor Filter5 kommen oder nach Filter5 kommen. In jedem Fall kommt Filter3 und Filter5 vor den Filtern auf der nächsten Ebene, "B".

Beim Entwerfen der Reihe von Ebenen, für die Filter registriert werden können, anstatt eine Reihe von Ebenen für die Sortierung zu erstellen, sollten die Ebenen benannt und sortiert werden, sodass sie dem Zweck des Filters zugeordnet werden. Beispielsweise kann ein E/A-Gerät die Verschlüsselungsebene definieren, für die jeder Verschlüsselungsfilter registriert werden soll. Auf diese Weise kann der Filter leicht verständlich und verwaltet werden und macht den Stapel robuster, um Änderungen am Funktionstreiber zu unterbrechen.

Hinweis

Auch ohne vom Basis-INF definierte Ebenen kann ein deklarativer Filter einfach oben oder unten registriert werden. Wenn Ebenen nicht definiert sind, entspricht dies logisch dem Anfügen des Filters an das Ende des Registrierungswerts UpperFilters/LowerFilters. Wenn Ebenen definiert sind, muss eine der Ebenen als Standardebene im Basistreiber gekennzeichnet werden, und in diesem Fall wird der Filter in dieser Ebene registriert.

Szenarien

Erwägen Sie einen E/A-Gerätetreiber, der die Daten verschlüsselt, die durch den Stapel gelangen. Eine typische Implementierung kann einen niedrigeren Filtertreiber direkt unterhalb des Funktionstreibers verwenden, um dies zu erreichen. Um sicherzustellen, dass der Verschlüsselungsfilter an der genauen Position platziert wird, die der Autor des Treibers wünscht, können sie deklarative Filter wie unten dargestellt verwenden:

Diagramm, das zeigt, dass der Treiber durch explizites Platzieren des

Die Basis-INF richtet zwei Ebenen niedrigerer Filter ein: "Verschlüsselung" und "Überwachung" (Standard). "Monitoring" (Standard) in diesem Beispiel sind die restlichen niedrigeren Filter, die für dieses bestimmte Gerät vorhanden sein können. Durch explizites Platzieren des "Verschlüsseln"-Filtertreibers auf der Stufe "Verschlüsselung" stellt der Treiber sicher, dass die resultierende Gerätestapelreihenfolge den Filtertreiber "Verschlüsseln" vor anderen niedrigeren Filtern platziert und unmittelbar auf den Funktionstreiber folgt.

Lassen Sie uns das Beispiel einen Schritt weitergehen. Stellen Sie sich vor, eine neuere Version des Treibers kommt heraus, und der Autor hat die Verschlüsselung für den Funktionstreiber integriert. Dadurch wird die Notwendigkeit eines separaten "Encrypt"-Filtertreibers entfernt. Der Autor muss einfach die Ebene entfernen, die den Filter "Verschlüsseln" aus dem Basis-INF enthält, und wenn der Treiber aktualisiert wird, wird der Stapel dynamisch wieder erstellt.

Wenn ein Filter sich selbst als explizite Ebene deklariert, die nicht vorhanden ist, endet der Filter nicht im Gerätestapel. Im Beispiel wurde die Basis-INF aktualisiert und obwohl die ErweiterungS-INF unverändert bleibt, schließt der resultierende Gerätestapel den Filter "Verschlüsseln" aus, da er nicht in der Deklaration der Basis-INF-Ebenen enthalten war.

Diagramm, das die Ebene entfernt, die den Filter

Standardfilterebene

Um den endgültigen Filterstapel zu generieren, werden alle Quellen von Filterinformationen in einer einzigen Liste zusammengeführt. Beachten Sie, dass die Zusammenführungslogik beim Erstellen des Gerätestapels ausgeführt wird. Wenn ein neuer Filter hinzugefügt wird, indem ein neuer/aktualisierter Basis- oder Erweiterungstreiber installiert wird, werden die Geräte während der Installation neu gestartet und eine neue Filterliste aufgenommen.

Einige Quellen von Filtern weisen keine Positionsinformationen auf, d. a. Filter, die über die älteren UpperFilters/LowerFilters-Registrierungswerte hinzugefügt werden, oder über eine deklarative Syntax von Position (siehe unten).

Um einen effektiven Zusammenführungsvorgang zu unterstützen, wenn keine Positionsinformationen vorhanden sind, muss eine zusätzliche Information durch die Basis-INF definiert werden: eine Standardfilterebene. Die Standardfilterebene ist eine Position, an der Filter, fehlende Ebenen- oder Positionsinformationen eingefügt werden.

Beispielsweise können Filterebenen in der Basis-INF wie folgt definiert werden:

Level Order: A, B, C
DefaultFilterLevel: C

Wenn Sie die Standardebene als letzte Ebene angeben, wird angegeben, dass alle Filter, für die keine Positionsinformationen vorhanden sind, an die Filterliste angefügt werden. Alternativ kann der Treiberautor den Stapel immer mit Filtern enden lassen, die explizit auf Ebene C registriert sind:

Level Order: A, B, C
DefaultFilterLevel: B

Aufgrund der Standardfilterebene, die auf B festgelegt wird, werden alle zusätzlichen Filter ohne Positionsinformationen zwischen den Filtern von A und den C-Filtern eingefügt.

Syntax

Registrieren von Filtern

Weitere Informationen finden Sie im Abschnitt INF DDInstall.Filters und in der AddFilter-Direktivedokumentation.

[DDInstall.Filters]
AddFilter = <FilterName>, [Flags], FilterSection

FilterLevel OR FilterPosition kann auf eine von zwei Arten angegeben werden:

Option 1:

[FilterSection]
FilterLevel=<LevelName>

Option 2:

[FilterSection]
FilterPosition=Upper/Lower

Dies kann sowohl in Base- als auch extension INF erfolgen.

[DDInstall.Filters]

FilterName ist der Name des Diensts im System.

Flags sind zurzeit nicht verwendet und sollten leer bleiben oder auf 0 festgelegt sein.

FilterSection ist ein Abschnitt, der den Filter beschreibt.

[Filter Section]

Ein Filterabschnitt muss genau eine der folgenden beiden Direktiven enthalten: FilterLevel oder FilterPosition.

Ein FilterLevel ist ein bestimmter Ort zum Einfügen des Gerätefilters auf dem Stapel, der durch die Basis-INF definiert wird.  Innerhalb jeder Ebene ist die Reihenfolge der Filter beliebig.

Eine FilterPosition wird verwendet, wenn die Klasse an einer bestimmten Stelle für Filter von Drittanbietern eingefügt werden soll.

Definieren von Filterebenen

[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"

Dies kann nur von einem Basistreiber ausgeführt werden.

Die vollständige deklarative Liste der Filter für ein bestimmtes Gerät kann durch Abfragen der folgenden Eigenschaften abgerufen werden:

DEVPKEY_Device_CompoundUpperFilters
DEVPKEY_Device_CompoundLowerFilters

Legacyäquivalente Filterregistrierung

Sehen wir uns an, wie Sie den legacy-Ansatz erreichen können, um einen oberen Filter über INF hinzuzufügen:

[DDInstall.HW]
AddReg = Filters

[Filters]
HKR,,"UpperFilters", 0x00010008, "MyFilter"

Diese Syntax fügt "MyFilter" am Ende der Liste der oberen Filter hinzu.

Mit der neuen syntax, die eingeführt wurde, ist der obige Abschnitt logisch ähnlich wie folgt:

[DDInstall.Filters]
AddFilter = MyFilter,,MyUpperFilterInstall

[MyUpperFilterInstall]
FilterPosition = Upper

Dadurch wird angegeben, dass der Filter "MyFilter" der Liste der oberen Filter hinzugefügt werden soll. Wenn die Basis-INF Filterebenen angegeben hat, registriert Die Verwendung von FilterPosition den Filter in der Standardebene für diese Position.

Wenn Filterebenen nicht angegeben werden, wird dieser Filter in beliebiger Reihenfolge als oberer Filter registriert.

Weitere Informationen

ABSCHNITT "INF DDInstall.Filters"

AddFilter-Direktive