Sdílet prostřednictvím


Izolace ovladačového balíčku

Izolace balíčku ovladačů je požadavek na ovladače systému Windows , díky kterým jsou balíčky ovladačů odolnější vůči externím změnám, snadnější aktualizace a jednodušší instalace.

Poznámka:

I když je pro ovladače systému Windows vyžadována izolace balíčků ovladačů, desktopové ovladače systému Windows z něj stále těží díky lepší odolnosti a použitelnosti.

Následující tabulka uvádí některé příklady postupů starších verzí balíčků ovladačů, které už nejsou povolené pro ovladače systému Windows v levém sloupci spolu s požadovaným chováním ovladačů systému Windows ve správném sloupci.

Neizolovaný ovladač Izolovaný ovladač
Inf zkopíruje soubory do %windir%\System32 nebo %windir%\System32\drivers Soubory ovladačů se spouštějí z úložiště ovladačů.
Interakce se zásobníky/ovladači zařízení pomocí pevně definovaných cest Interaguje s zásobníky/ovladači zařízení pomocí systémem dodávaných funkcí nebo rozhraní zařízení.
Pevně zafixuje cestu k globálním umístěním registru Používá HKR a systémové funkce pro relativní umístění registru a stavu souboru.
Soubory runtime se zapisují do libovolného umístění. Soubory se zapisují vzhledem k umístěním poskytnutým operačním systémem.

Nápovědu k určení, jestli balíček ovladačů splňuje požadavky na izolaci balíčku ovladačů, najdete v tématu Ověřování ovladačů systému Windows. Příklady, jak aktualizovat INF tak, aby splňoval požadavky na izolaci balíčku ovladače, naleznete v tématu Portování INF pro sledování izolace balíčku ovladače.

Spustit z úložiště ovladačů

Všechny izolované balíčky ovladačů ponechávají své soubory balíčků v úložišti ovladačů. To znamená, že v souboru INF zadají DIRID 13 , aby určili umístění pro soubory balíčků ovladačů při instalaci. Další informace o tom, jak to použít v balíčku ovladače, naleznete v části Spuštění z úložiště ovladačů.

Stav čtení a zápisu

Poznámka:

Pokud vaše komponenta k ukládání stavu používá vlastnosti rozhraní zařízení nebo zařízení, pokračujte v používání této metody a příslušného rozhraní API operačního systému k ukládání a přístupu ke stavu. Následující pokyny pro registr a stav souboru jsou určené pro jiný stav, který musí být uložen komponentou.

Přístup k různým stavům registru a souboru by se měl provádět voláním funkcí, které poskytují volajícímu umístění stavu a stav se pak čte nebo zapisuje vzhledem k danému umístění. Nepoužívejte pevně zakódované absolutní cesty registru a cesty k souborům.

Tato část obsahuje následující pododdíly:

Stav registru

Tato část obsahuje následující pododdíly:

Stav registru zařízení PnP

Balíčky izolovaných ovladačů a komponenty uživatelského režimu obvykle používají jedno ze dvou umístění k uložení stavu zařízení v registru. Jedná se o hardwarový klíč (klíč zařízení) pro zařízení a softwarový klíč (klíč ovladače) zařízení. Hardwarový klíč je obvykle určený pro nastavení související s tím, jak jednotlivé instance zařízení interagují s hardwarem. Pokud chcete například povolit funkci hardwaru nebo umístit hardware do určitého režimu. Softwarový klíč je obvykle určený pro nastavení související s tím, jak jednotlivé instance zařízení komunikují se systémem a jiným softwarem. Pokud chcete například nakonfigurovat umístění datového souboru, pracovat s architekturou nebo přistupovat k nastavení aplikace pro zařízení. Pokud chcete načíst popisovač na tato umístění registru, použijte jednu z následujících možností:

[ExampleDDInstall.HW]
AddReg = Example_DDInstall.AddReg

[Example_DDInstall.AddReg] 
HKR,,ExampleValue,,%13%\ExampleFile.dll

Stav registru rozhraní zařízení

Pokud chcete číst a zapisovat stav registru rozhraní zařízení, použijte jednu z následujících možností:

Stav registru služby

Stav služby by měl být klasifikován do jedné ze 3 kategorií.

Neměnný stav registru služby

Neměnný stav služby je stav poskytovaný balíčkem ovladače, který službu nainstaluje. Tyto hodnoty registru nastavené INF pro ovladače a služby Win32 musí být uloženy v podklíči "Parameters" služby pomocí řádku HKR v oddílu AddReg a následným odkazem na tuto sekci v sekci instalace služby v souboru INF. Například:

[ExampleDDInstall.Services]
Addservice = ExampleService, 0x2, Example_Service_Inst

[Example_Service_Inst]
DisplayName    = %ExampleService.SvcDesc%
ServiceType    = 1
StartType      = 3
ErrorControl   = 1
ServiceBinary  = %13%\ExampleService.sys
AddReg=Example_Service_Inst.AddReg

[Example_Service_Inst.AddReg]
HKR, Parameters, ExampleValue, 0x00010001, 1

Pokud chcete získat přístup k umístění tohoto stavu ze služby během spuštění, použijte jednu z těchto funkcí:

Tyto hodnoty registru, které jsou zadány INF v podklíči "Parameters" pro službu, by měly být během běhu pouze ke čtení a neměly by být změněny. Měly by být zpracovány jako pouze pro čtení.

Pokud hodnoty registru zadané INF jsou výchozí nastavení, která lze přepsat za běhu, měly by být přepisované hodnoty zapsány do stavu registru interní služby nebo stavu registru sdílené služby pro danou službu. Při načítání nastavení lze nejprve vyhledat nastavení v proměnlivém stavu. Pokud tam neexistuje, můžete nastavení vyhledat v neměnném stavu. RtlQueryRegistryValueWithFallback lze použít k usnadnění nastavení dotazů, jako jsou ty, které mají přepsání a výchozí hodnotu.

Interní stav registru služeb

Stav interní služby je stav, který je napsaný za běhu a vlastněný a spravovaný pouze samotnou službou a je přístupný pouze pro tuto službu. Pokud chcete získat přístup k umístění pro interní stav služby, použijte jednu z těchto funkcí ze služby:

Pokud chce služba povolit jiným komponentám úpravu těchto nastavení, musí služba zveřejnit rozhraní, které může jiná komponenta volat, která službě říká, jak tato nastavení změnit. Například služba Win32 může vystavit rozhraní COM nebo RPC a služba ovladače může vystavit rozhraní IOCTL prostřednictvím rozhraní zařízení.

Stav registru sdílených služeb

Stav sdílené služby je stav, který je zapsán za běhu a lze ho sdílet s ostatními komponentami uživatelského režimu, pokud jsou dostatečně privilegované. Pokud chcete získat přístup k umístění pro tento stav sdílené služby, použijte jednu z těchto funkcí:

Stav souboru

Tato část obsahuje následující pododdíly:

Stav souboru zařízení

Pokud je potřeba za běhu zapsat soubory související se zařízením, měly by být tyto soubory uložené vzhledem k popisovači nebo cestě k souboru poskytnuté v rámci rozhraní API operačního systému. Konfigurační soubory specifické pro toto zařízení jsou jedním z příkladů typů souborů, které se sem mají uložit. Pokud chcete získat přístup k umístění tohoto stavu, použijte jednu z těchto funkcí ze služby:

Stav souboru služby

Stav souboru služby je možné klasifikovat do jedné ze 3 kategorií.

Neměnný stav souboru služby

Neměnný stav souboru služby jsou soubory, které jsou součástí balíčku ovladače. Další informace o přístupu k těmto souborům najdete v tématu Spuštění z úložiště ovladačů.

Stav interního souboru služby

Stav souboru interní služby je stav, který je zapsán za běhu a vlastněný a spravován pouze samotnou službou a je přístupný pouze pro tuto službu. Pokud chcete získat přístup k umístění pro interní stav služby, použijte jednu z těchto funkcí ze služby:

Pokud chce služba povolit jiným komponentám úpravu těchto nastavení, musí služba zveřejnit rozhraní, které může jiná komponenta volat, která službě říká, jak tato nastavení změnit. Například služba Win32 může vystavit rozhraní COM nebo RPC a služba ovladače může vystavit rozhraní IOCTL prostřednictvím rozhraní zařízení.

Stav souboru sdílené služby

Stav souboru sdílené služby je stav, který je zapsán za běhu a lze ho sdílet s ostatními komponentami uživatelského režimu, pokud jsou dostatečně privilegované. Pokud chcete získat přístup k umístění pro tento stav sdílené služby, použijte jednu z těchto funkcí:

DriverData a ProgramData

Soubory, které lze sdílet s jinými komponentami, ale které nespadají do kategorie stavu souborů sdílené služby, lze zapisovat do umístění DriverData nebo ProgramData.

Tato umístění nabízejí komponentám místo pro zápis dočasného stavu nebo stavu, který má být spotřebován jinými komponentami a potenciálně shromážděn a zkopírován ze systému, aby ho zpracoval jiný systém. Například vlastní soubory protokolů nebo výpisy stavu systému odpovídají tomuto popisu.

Vyhněte se zápisu souborů do kořenového DriverData adresáře nebo ProgramData adresářů. Místo toho vytvořte podadresář s názvem vaší společnosti a pak do něj zapište soubory a další podadresáře.

Například pro společnost Contoso může ovladač v režimu jádra napsat vlastní záznam do \DriverData\Contoso\Logs a aplikace v uživatelském režimu může shromažďovat nebo analyzovat soubory záznamů z %DriverData%\Contoso\Logs.

DriverData

Adresář DriverData je dostupný ve Windows 10 verze 1803 a novější a je přístupný správcům a ovladačům UMDF.

Ovladače režimu jádra přistupují k DriverData adresáři pomocí systémového symbolického odkazu s názvem \DriverData.

Programy v uživatelském režimu přistupují k adresáři DriverData pomocí proměnné %DriverData% prostředí.

ProgramData

Proměnná %ProgramData% prostředí v uživatelském režimu je k dispozici pro součásti uživatelského režimu, které se mají použít při ukládání dat.

Dočasné soubory

Dočasné soubory se obvykle používají v přechodných operacích. Ty mohou být zapsány jako dílčí cesta s využitím proměnných prostředí %TEMP% nebo %TMP%. Vzhledem k tomu, že k těmto umístěním se přistupuje prostřednictvím proměnných prostředí, je tato schopnost omezena na komponenty uživatelského režimu. Po zavření popisovačů neexistují žádné záruky životnosti nebo trvalosti těchto dočasných souborů. Operační systém nebo uživatel je může kdykoli odebrat a nemusí se v rámci restartování zachovat.

Vyhněte se zápisu souborů do kořenového %TEMP% adresáře nebo %TMP% adresářů. Místo toho vytvořte podadresář s názvem vaší společnosti a pak do něj zapište soubory a další podadresáře.

Stav vlastnosti

Zařízení i rozhraní zařízení podporují ukládání stavu prostřednictvím modelu vlastností PnP. Model vlastností umožňuje ukládat strukturovaná data vlastností proti zařízení nebo rozhraní zařízení. To je určeno pro menší data, která přiměřeně zapadá do typů vlastností podporovaných modelem vlastností.

Pro přístup k vlastnostem zařízení je možné použít tato rozhraní API:

Pro přístup k vlastnostem rozhraní zařízení je možné použít tato rozhraní API:

Použití rozhraní zařízení

Pokud chce ovladač povolit jiným komponentám čtení nebo úpravu interního stavu ovladače, měl by ovladač zveřejnit rozhraní, které může jiná komponenta volat, aby ovladač řekl, jaká nastavení se mají vrátit nebo jak změnit konkrétní nastavení. Služba ovladačů může například vystavit rozhraní IOCTL prostřednictvím rozhraní zařízení.

Ovladač, který vlastní stav, obvykle zveřejňuje rozhraní zařízení ve vlastní třídě rozhraní zařízení. Jakmile je ovladač připravený pro další komponenty, aby měl přístup ke stavu, povolí rozhraní. Pokud chcete dostávat oznámení, když je povolené rozhraní zařízení, můžou se komponenty uživatelského režimu registrovat pro oznámení o přijetí rozhraní zařízení a komponenty režimu jádra můžou používat IoRegisterPlugPlayNotification. Aby tyto komponenty přistupovaly ke stavu, musí ovladač, který rozhraní povolí, definovat kontrakt pro vlastní třídu rozhraní zařízení. Tento kontrakt je obvykle jedním ze dvou typů:

  • K této třídě rozhraní zařízení lze přidružit vstupně-výstupní kontrakt , který poskytuje mechanismus pro přístup ke stavu. Ostatní komponenty používají povolené rozhraní zařízení k odesílání vstupně-výstupních požadavků, které odpovídají smlouvě.

  • Rozhraní přímého volání, které se vrátí prostřednictvím rozhraní dotazu. Ostatní ovladače můžou odesílat IRP_MN_QUERY_INTERFACE k načtení ukazatelů na funkce z ovladače, který se má volat.

Případně pokud ovladač, který vlastní stav, umožňuje přímý přístup ke stavu, můžou ostatní ovladače přistupovat ke stavu pomocí funkcí zadaných systémem pro programový přístup ke stavu rozhraní zařízení. Další informace najdete v tématu Stav registru rozhraní zařízení .

Tato rozhraní nebo stav (v závislosti na použité metodě sdílení) musí mít správnou verzi, aby ovladač, který vlastní stav, mohl být obsluhován nezávisle na ostatních komponentách, které k ho přistupují. Dodavatelé ovladačů se nemohou spolehnout na to, že jiné komponenty budou aktualizovány současně s ovladačem a zůstanou ve stejné verzi.

Vzhledem k tomu, že zařízení a ovladače, které řídí rozhraní, přicházejí a odcházejí, ovladače a aplikace by se měly vyhnout volání IoGetDeviceInterfaces při spuštění komponenty, aby se získal seznam povolených rozhraní. Osvědčeným postupem je místo toho registrovat oznámení o doručení nebo odebrání rozhraní zařízení a potom zavolat příslušnou funkci, která na počítači získá seznam existujících povolených rozhraní.

Další informace o rozhraních zařízení najdete tady:

Stručný přehled podpory operačního systému pro rozhraní API pro správu stavu

Většina balíčků ovladačů musí podporovat řadu verzí operačního systému. Další informace o tom, jak toho dosáhnout v balíčku ovladačů, najdete v části Podpora více verzí operačního systému . Následující tabulky poskytují stručný přehled o tom, kdy byla přidána podpora operačního systému pro různá rozhraní API pro správu stavu.

Ovladače WDM

Operační systém Podpora přidána
Windows 2000 IoOpenDeviceRegistryKey
IoOpenDeviceInterfaceRegistryKey
Windows Vista IoGetDevicePropertyData
IoSetDevicePropertyData
Windows 8 IoGetDeviceInterfacePropertyData
IoSetDeviceInterfacePropertyData
Windows 8.1 IoQueryFullDriverPath
Windows 10 1803 IoOpenDriverRegistryKey pro RegKeyTypeDriverRegKeyParameters a DriverRegKeyPersistentState
IoGetDeviceDirectory
IoGetDriverDirectory pro DirectoryType pro DriverDirectoryImage a DriverDirectoryData
Windows 10 1809 RtlQueryRegistryValueWithFallback
Windows 11 21H2 IoOpenDriverRegistryKey pro RegKeyType z DriverRegKeySharedPersistentState
IoGetDriverDirectory for DirectoryType of DriverDirectorySharedData

Ovladače KMDF

Verze KMDF Podpora přidána
1.0 WdfDeviceOpenRegistryKey
WdfFdoInitOpenRegistryKey
WdfDriverOpenParametersRegistryKey
WdfDeviceQueryProperty
WdfDeviceAllocAndQueryProperty
WdfFdoInitQueryProperty
WdfFdoInitAllocAndQueryProperty
1.13 WdfDeviceQueryPropertyEx
WdfDeviceAllocAndQueryPropertyEx
WdfDeviceAssignProperty
WdfFdoInitQueryPropertyEx
WdfFdoInitAllocAndQueryPropertyEx
1.25 WdfDriverOpenPersistentStateRegistryKey (Windows 10 1803)

Ovladače UMDF

Verze UMDF Podpora přidána
2.0 WdfDeviceOpenRegistryKey
WdfFdoInitOpenRegistryKey
WdfDriverOpenParametersRegistryKey
WdfDeviceQueryProperty
WdfDeviceAllocAndQueryProperty
WdfDeviceQueryPropertyEx
WdfDeviceAllocAndQueryPropertyEx
WdfDeviceAssignProperty
WdfFdoInitQueryProperty
WdfFdoInitAllocAndQueryProperty
WdfFdoInitQueryPropertyEx
WdfFdoInitAllocAndQueryPropertyEx
WdfDeviceQueryInterfaceProperty (Windows 8.1)
WdfDeviceAllocAndQueryInterfaceProperty (Windows 8.1)
WdfDeviceAssignInterfaceProperty (Windows 8.1)
2,25 WdfDeviceRetrieveDeviceDirectoryString
WdfDriverOpenPersistentStateRegistryKey (Windows 10 1803)
2,27 WdfDriverRetrieveDriverDataDirectoryString

Kód uživatelského režimu

Operační systém Podpora přidána
Windows 2000 CM_Open_DevNode_Key
Windows Vista CM_Open_Device_Interface_Key
CM_Get_DevNode_Property
CM_Set_DevNode_Property
CM_Get_Device_Interface_Property
CM_Set_Device_Interface_Property
Windows 10 2004 GetServiceRegistryStateKey
GetServiceDirectory
Windows 11 21H2 GetSharedServiceRegistryStateKey
GetSharedServiceDirectory