Gerätefiltertreiberreihenfolge

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ätefiltertreiberreihenfolge

Vor Windows 10 Version 1903 wurde die einzige Möglichkeit zum Registrieren eines Gerätefiltertreibers durch Hinzufügen eines Registrierungseintrags (mithilfe der AddReg-Direktive) unterstützt. Diese Methode zur Bearbeitung der Registrierung 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 die Reihenfolge von Bedeutung ist, und bestimmt, wo im Stapel der Filter geladen wird.

Die Verwendung einer einzelnen Liste von geordneten Werten ist weniger ideal als ideal, insbesondere wenn AddRegnuran das Endeanfügt, da es negative Konsequenzen gibt, wenn mehrere Treiber demselben Gerät Filter hinzufügen.

In dem Szenario, in dem mindestens ein Erweiterungs-INF beteiligt ist, könnten sie einen filter löschen, der von einem anderen INF hinzugefügt wurde, wenn die INFs AddReg falsch verwenden (d. h. das Anfügef-Flag nicht verwenden).

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

Implementieren der Gerätefiltertreiberreihenfolge

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 eine geordnete Gruppe von Positionen (als Ebenen bezeichnet) auszudrücken, für die sich ein Filter registrieren kann.

Zusätzlich zu einer bestimmten Ebene kann ein Filter deklarativ einfach als Filter der oberen oder unteren Ebene registriert werden.

Die Infrastruktur basiert auf einer neuen Filterregistrierungsmethode, um zu bestimmen, welche Reihenfolgentreiber in den Gerätestapel aufgenommen werden sollen. Die neue Methode beeinträchtigt nicht die Kompatibilität mit der alten Methode zum Hinzufügen von Filtern. Es ermöglicht jedoch, dass neue Filter zu einem robusteren und flexibleren Registrierungsmechanismus wechseln können.

Die -Methode wird aktiviert, indem vom Basis-INF eine sortierte Liste mit mindestens einem "Level" definiert wird. Sowohl das 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 eine eigene geordnete Liste von 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 willkürlich betrachtet werden, wobei keine Abhängigkeit von der Reihenfolge der Filter innerhalb einer bestimmten Ebene genommen werden darf. In Szenarien, in denen die relative Reihenfolge von zwei Filtern garantiert werden muss, sollten sie auf unterschiedlichen Ebenen registriert werden.

Sehen Sie sich das folgende Gerätetreiberbeispiel an:

Installation von Gerätetreibern, die als Gerätestapelreihenfolge angezeigt werden, bei der die Listen der Filtertreiber zusammengeführt werden, wobei die gewünschte Positionierung und Reihenfolge berücksichtigt wird.

Die Basis-INF des Gerätetreibers deklariert die beiden oberen Filterebenen A und B (in dieser Reihenfolge). In der zugehörigen Erweiterung INF des Basis-INF werden jeder der beiden Ebenen zwei Filter hinzugefügt.

Das Ergebnis der Installation des Gerätetreibers ist eine Gerätestapelreihenfolge, bei der die Listen der Filtertreiber zusammengeführt werden, wobei die gewünschte Positionierung und Reihenfolge berücksichtigt wird. Die resultierende Gerätestapelreihenfolge stellt sicher, dass jeder Filter, der auf der Ebene "A" platziert wird, vor jedem Filter in der Ebene "B" steht. Innerhalb jeder Ebene ist die Reihenfolge jedoch beliebig.

Wie im Beispiel gezeigt, kann Filter3 vor Filter5 oder nach Filter5 kommen. In jedem Fall werden Filter3 und Filter5 auf der nächsten Ebene, "B", vor die Filter gestellt.

Beim Entwerfen der Reihe von Ebenen, für die Filter registriert werden können, sollten die Ebenen so benannt und sortiert werden, dass sie der Absicht des Filters zugeordnet werden, anstatt eine Reihe von Ebenen zu erstellen. Für instance kann ein E/A-Gerät die Verschlüsselungsebene definieren, für die jeder Verschlüsselungsfilter registriert werden soll. Dies ermöglicht es, die Absicht des Filters leicht zu verstehen und zu verwalten, und macht den Stapel robuster gegen Breaking Changes am Funktionstreiber.

Hinweis

Auch ohne Ebenen, die vom Basis-INF definiert sind, kann ein deklarativer Filter einfach als oberer oder niedrigerer Filter registriert werden. Wenn keine Ebenen definiert sind, entspricht dies logisch dem Anfügen des Filters am Ende des Registrierungswerts UpperFilters/LowerFilters. Wenn Ebenen definiert sind, muss eine der Ebenen als Standardebene im Basistreiber markiert werden, und in diesem Fall wird der Filter in dieser Ebene registriert.

Szenarien

Stellen Sie sich einen E/A-Gerätetreiber vor, der die Daten verschlüsselt, die den Stapel durchlaufen. Eine typische Implementierung kann einen niedrigeren Filtertreiber direkt unterhalb des Funktionstreibers verwenden, um dies zu erreichen. Um sicherzustellen, dass der Verschlüsselungsfilter genau an der position platziert wird, die der Treiberautor wünscht, kann er wie unten gezeigt deklarative Filter verwenden:

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

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

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

Wenn ein Filter selbst deklariert, dass er sich in einer expliziten Ebene befindet, die nicht vorhanden ist, endet der Filter nicht im Gerätestapel. Im Beispiel wurde das Basis-INF aktualisiert, und obwohl die Erweiterung INF gleich bleibt, schließt der resultierende Gerätestapel den Filter "Encrypt" aus, da er nicht in der Deklaration der Ebenen des Basis-INF 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. Es ist wichtig zu beachten, dass die Mergelogik 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 angezeigt.

Bei einigen Quellen von Filtern fehlen Positionsinformationen, z. B. Filter, die über die älteren Registrierungswerte UpperFilters/LowerFilters hinzugefügt wurden, oder durch deklarative Syntax für nur Position (siehe unten).

Um eine effektive Zusammenführung bei fehlenden Positionsinformationen zu unterstützen, muss vom Basis-INF eine zusätzliche Information definiert werden: eine Standardfilterebene. Die Standardfilterebene ist eine Position, an der Filter ohne Ebenen- oder Positionsinformationen eingefügt werden.

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

Level Order: A, B, C
DefaultFilterLevel: C

Wenn Sie die Standardebene als endgültige Ebene angeben, wird jeder Filter, der keine Positionsinformationen enthält, an die Filterliste angefügt . Alternativ kann der Treiberautor wünschen, dass der Stapel immer mit Filtern endet, die explizit auf Ebene C registriert sind:

Level Order: A, B, C
DefaultFilterLevel: B

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

Syntax

Registrieren von Filtern

Weitere Informationen finden Sie im Abschnitt INF DDInstall.Filters und in der Dokumentation zur AddFilter-Direktive .

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

FilterLevel ODER FilterPosition kann auf zwei Arten angegeben werden:

Option 1:

[FilterSection]
FilterLevel=<LevelName>

Option 2:

[FilterSection]
FilterPosition=Upper/Lower

Dies kann sowohl in Basis - als auch Erweiterungs-INF-Dateien erfolgen.

[DDInstall.Filters]

FilterName ist der Name des Diensts im System.

Flags sind derzeit nicht verwendet und sollten leer bleiben oder auf 0 festgelegt werden.

FilterSection ist ein Abschnitt, der den Filter beschreibt.

[Abschnitt Filter]

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

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

Eine FilterPosition wird in dem Fall verwendet, in dem die Klasse über einen bestimmten Ort verfügt, an dem Filter von Drittanbietern eingefügt werden können.

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 durchgefü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, indem Sie versuchen, 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, ähnelt der obige Abschnitt logisch folgendem:

[DDInstall.Filters]
AddFilter = MyFilter,,MyUpperFilterInstall

[MyUpperFilterInstall]
FilterPosition = Upper

Dies gibt an, dass der Filter "MyFilter" der Liste der oberen Filter hinzugefügt werden soll. Wenn die Basis-INF Filterebenen angegeben hat, registriert FilterPosition den Filter in der Standardebene für diese Position.

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

Weitere Informationen

ABSCHNITT "INF DDInstall.Filters"

AddFilter-Direktive