Sdílet prostřednictvím


Řazení ovladačů filtru zařízení

Společnost Microsoft vyvinula metodu deklarativní přidávání filtrů popsáním účelu filtru namísto určení polohy ve stohu, známé jako řazení ovladačů filtru zařízení.

Potřeba řazení filtrovacích ovladačů zařízení

Před Windows 10 verze 1903 byl jediným podporovaným způsobem registrace ovladače filtru zařízení přidání položky registru (pomocí direktivy AddReg). Tato metoda manipulace s registrem však neposkytuje flexibilitu určit přesně, na které pozici se má konkrétní filtr zaregistrovat.

Registrace filtru pomocí direktivy AddReg jednoduše připojí filtr na konec seznamu filtrů. Tento přístup využívá seznam hodnot, v němž je pořadí důležité, a určuje, kde se ve stacku načte filtr.

Použití jednoho seznamu seřazených hodnot není ideální, zvláště když AddReg přidává pouze na konec, protože může mít negativní důsledky, když více než jeden ovladač přidává filtry do stejného zařízení.

Ve scénáři, kdy je zapojeno alespoň jedno rozšíření INF, pokud INFs nesprávně používají AddReg (jinými slovy nepoužívají příznak připojení), můžou vymazat filtr přidaný jiným INF.

Kromě toho mohou více rozšíření INF přidávat filtry a relativní pořadí těchto filtrů může být důležité; platforma Plug and Play (PnP) však nezaručuje pořadí instalace těchto rozšíření. Výsledkem je, že pořadí "přidání" není zaručeno.

Implementace pořadí filtračních ovladačů zařízení

Aby bylo možné poskytnout flexibilní deklarativní metodu pro registraci filtrů zařízení, společnost Microsoft vyvinula metodu deklarativního přidávání filtrů vyjádřením záměru filtru místo pozice zásobníku. Toto řešení poskytuje autorům funkcí možnost vyjádřit v souboru INF seřazenou sadu pozic (označovaných jako úrovně), vůči kterým se filtr může zaregistrovat.

Kromě konkrétní úrovně se filtr může deklarativně registrovat jednoduše jako filtr horní nebo dolní úrovně.

Infrastruktura je založená na nové metodě registrace filtrů, která určuje pořadí ovladačů, jež mají být zahrnuty do vrstvy zařízení. Nová metoda neporušuje kompatibilitu pro starý způsob přidávání filtrů. Nicméně umožňuje novým filtrům přejít na robustnější a flexibilnější registrační mechanismus.

Metoda je povolena tím, že základní INF definuje uspořádaný seznam jedné nebo více "úrovní". Základní inf i jakékoli rozšíření INF mohou zaregistrovat deklarativní filtr prostřednictvím nové direktivy INF, která určuje název služby a úroveň, do které filtr patří. Horní a dolní filtry jsou reprezentovány vlastním seřazeným seznamem úrovní.

Tyto horní a dolní seznamy filtrů se vytvářejí řazením všech ovladačů filtru podle jejich úrovně. Pořadí filtrů v rámci každé úrovně by mělo být považováno za libovolné, pokud není možné provádět žádnou závislost na pořadí filtrů v rámci konkrétní úrovně. Ve scénářích, ve kterých musí být zaručeno relativní pořadí dvou filtrů, by měly být registrovány na různé úrovně.

Představte si následující příklad ovladače zařízení:

Instalace ovladačů zařízení se zobrazuje jako řazení zařízení, které slučuje seznamy ovladačů filtrů s ohledem na požadované umístění a pořadí.

Základní inf ovladače zařízení deklaruje dvě horní úrovně filtru A a B (v daném pořadí). V hlavním INF souboru a souvisejícím rozšiřujícím INF souboru jsou na každé ze dvou úrovní přidány dva filtry.

Výsledkem instalace ovladače zařízení je pořadí zásobníku zařízení, které slučuje seznamy ovladačů filtru při zachování požadovaného umístění a řazení. Výsledné pořadí zásobníku zařízení zajišťuje, že filtry na úrovni "A" jsou řazeny před jakýmkoli filtrem na úrovni "B". V rámci každé úrovně je však pořadí libovolné.

Jak je znázorněno v příkladu, filtr 3 může pocházet před filtrem Filter5 nebo může pocházet po filtru5. V každém případě filtry Filter3 a Filter5 přijdou před filtry na další úrovni "B".

Při navrhování řady úrovní, proti kterým mohou být filtry registrovány, je důležité je pojmenovat a uspořádat tak, aby odpovídaly záměru filtru, spíše než vytvářet úrovně jen za účelem řazení. Například vstupně-výstupní zařízení může definovat úroveň šifrování, do které by se měl zaregistrovat jakýkoli filtr šifrování. Díky tomu je záměr filtru snadno srozumitelný a spravovatelný, což činí architekturu robustnější vůči významným změnám funkčního ovladače.

Poznámka:

I bez úrovní definovaných základní INF se může deklarativní filtr zaregistrovat jako jednoduše horní nebo dolní. Pokud nejsou definovány úrovně, je to logicky ekvivalentní připojení filtru na konec hodnoty registru UpperFilters/LowerFilters. Pokud jsou definovány úrovně, jedna z úrovní musí být označena jako výchozí úroveň základního ovladače a v tomto případě se filtr zaregistruje do této úrovně.

Scénáře

Vezměte v úvahu ovladač V/V zařízení, který šifruje data, která procházejí vrstvou. Typická implementace může k tomu použít ovladač nižšího filtru bezprostředně pod ovladačem funkce. Aby bylo zajištěno, že je filtr šifrování umístěn na přesné pozici, kterou autor ovladače chce, mohou použít deklarativní filtry, jak je znázorněno níže:

Diagram, který ukazuje, že explicitním umístěním ovladače filtru Encrypt na úrovni šifrování ovladač zajistí, že výsledné pořadí v zásobníku zařízení umístí ovladač filtru Encrypt před všechny ostatní nižší filtry a bezprostředně po ovladači funkce.

Základní INF zavádí dvě úrovně nižších filtrů: "Encryption" a "Monitoring" (výchozí). "„Monitorování“ („výchozí“) je v tomto příkladu označení pro zbývající dolní filtry, které mohou být na tomto konkrétním zařízení." Když je ovladač filtru "Encrypt" explicitně umístěn na úroveň Šifrování, tento ovladač zajistí, že výsledné pořadí zásobníku zařízení umístí filtr "Encrypt" před všechny ostatní nižší filtry a hned za ovladač funkcí.

Vezměme si příklad o krok dál. Představte si, že se objeví novější verze ovladače a autor má integrované šifrování ovladače funkce. To odstraňuje nutnost samostatného ovladače filtrování šifrování. Autor jednoduše potřebuje odebrat úroveň, která obsahovala filtr "Encrypt" ze základní INF, a při aktualizaci ovladače se zásobník dynamicky znovu sestaví.

Pokud filtr deklaruje, že je na explicitní úrovni, která neexistuje, filtr se nezařadí do zařízení stacku. V tomto příkladu byl základní INF aktualizován a i když rozšíření INF zůstává stejné, výsledný zásobník zařízení vylučuje filtr "Encrypt", protože nebyl zahrnut do deklarace úrovní základního INF.

Diagram, který odebere úroveň, která obsahovala filtr

Výchozí úroveň filtru

Chcete-li vygenerovat konečný filtr ve vrstvách, všechny zdroje informací filtru se sloučí do jednoho seznamu. Je důležité si uvědomit, že logika sloučení se provádí při vytváření zásobníku zařízení. Pokud se přidá nový filtr instalací nového nebo aktualizovaného základního ovladače nebo ovladače rozšíření, zařízení se během instalace restartují a vyberou nový seznam filtrů.

Některé zdroje filtrů nemají žádné informace o poloze, konkrétně filtry přidané prostřednictvím starších hodnot registru UpperFilters/LowerFilters nebo prostřednictvím deklarativní syntaxe pouze pozice (popsáno níže).

Aby bylo možné podpořit efektivní sloučení při chybějících informacích o poloze, musí být další informace definována základním INFem: výchozí úroveň filtru. Výchozí úroveň filtru je pozice, kde se vloží filtry, které nemají informace o úrovni nebo pozici.

Například úrovně filtru mohou být definovány v základní INF jako:

Level Order: A, B, C
DefaultFilterLevel: C

Určení výchozí úrovně jako konečné úrovně označuje, že všechny filtry, které neobsahují informace o poloze, budou připojeny k seznamu filtrů. Autor ovladače může také chtít mít vždy konec zásobníku s filtry explicitně registrovanými na úrovni C:

Level Order: A, B, C
DefaultFilterLevel: B

Z důvodu výchozí úrovně filtru nastavené na B se všechny další filtry bez informací o poloze vloží mezi filtry A a filtry jazyka C.

Syntaxe

Registrace filtrů

Další informace najdete v části INF DDInstall.Filters a dokumentaci k direktivě AddFilter .

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

FilterLevel OR FilterPosition může být zadán jedním ze dvou způsobů:

Možnost 1:

[FilterSection]
FilterLevel=<LevelName>

Možnost 2:

[FilterSection]
FilterPosition=Upper/Lower

To lze provést v souboru INF základního i rozšíření.

[DDInstall.Filters]

FilterName je název služby v systému.

Příznaky jsou aktuálně nepoužívané a měly by být prázdné nebo nastavené na 0.

FilterSection je část popisující filtr.

[Oddíl filtru]

Oddíl filtru musí obsahovat přesně jednu z následujících dvou direktiv: FilterLevel nebo FilterPosition.

FilterLevel je konkrétní místo pro vložení filtru zařízení do stacku, definované základním souborem INF.  V rámci každé úrovně je pořadí filtrů libovolné.

Funkce FilterPosition se používá v případě, že třída má jedno konkrétní místo pro vložení filtrů třetích stran.

Definování úrovní filtru

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

To může provést pouze základní ovladač.

Úplný deklarativní seznam filtrů pro konkrétní zařízení lze načíst dotazem na následující vlastnosti:

DEVPKEY_Device_CompoundUpperFilters
DEVPKEY_Device_CompoundLowerFilters

Registrace filtru ekvivalentního starším systémům

Pojďme se podívat, jak použít tradiční přístup při pokusu o přidání horního filtru prostřednictvím INF:

[DDInstall.HW]
AddReg = Filters

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

Tato syntaxe přidá "MyFilter" na konec seznamu horních filtrů.

S novou syntaxí, která byla zavedena, je výše uvedená část logicky podobná:

[DDInstall.Filters]
AddFilter = MyFilter,,MyUpperFilterInstall

[MyUpperFilterInstall]
FilterPosition = Upper

Určuje, že filtr MyFilter by se měl přidat do seznamu horních filtrů. Pokud základní soubor INF zadal úrovně filtru, použijete-li FilterPosition, zaregistruje filtr ve výchozí úrovni pro danou pozici.

Pokud nejsou zadané úrovně filtru, bude tento filtr registrován jako horní filtr v libovolném pořadí.

Viz také

Oddíl INF DDInstall.Filters

AddFilter – direktiva