Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í:
IoOpenDeviceRegistryKey (WDM)
CM_Open_DevNode_Key (kód uživatelského režimu)
Direktiva INF AddReg pomocí položek reg-root HKR v oddílu add-registry odkazovaném z oddílu INF DDInstall nebo DDInstall.HW, jak je znázorněno níže:
[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í:
CM_Open_Device_Interface_Key (kód uživatelského režimu)
Direktiva INF AddReg pomocí položek reg-root HKR v oddílu add-registry-section odkazovaném z oddílu add-interface-section
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í:
IoOpenDriverRegistryKey (WDM) s DRIVER_REGKEY_TYPE DriverRegKeyParameters
GetServiceRegistryStateKey (Služby Win32) s typem stavu registru služby ParametryStavuRejstříkuSlužby
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:
IoOpenDriverRegistryKey (WDM) s hodnotou DRIVER_REGKEY_TYPE DriverRegKeyPersistentState
GetServiceRegistryStateKey (Služby Win32) s SERVICE_REGISTRY_STATE_TYPE ServiceRegistryStatePersistent
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í:
IoOpenDriverRegistryKey (WDM) s DRIVER_REGKEY_TYPE DriverRegKeySharedPersistentState
GetSharedServiceRegistryStateKey (Služby Win32) s typem SERVICE_SHARED_REGISTRY_STATE_TYPE ServiceSharedRegistryPersistentState
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:
IoGetDeviceDirectory (WDM) s parametrem DirectoryType nastaveným na DeviceDirectoryData
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:
IoGetDriverDirectory (WDM, KMDF) s parametrem DirectoryType nastaveným na DriverDirectoryData
GetServiceDirectory (Win32 Services) s parametrem eDirectoryType nastaveným na ServiceDirectoryPersistentState
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í:
IoGetDriverDirectory (WDM, KMDF) s parametrem DirectoryType nastaveným na DriverDirectorySharedData
GetSharedServiceDirectory (Win32 Services) s parametrem DirectoryType nastaveným na ServiceSharedDirectoryPersistentState
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:
Ovladače WDM
Ovladače WDF
Kód uživatelského režimu
Pro přístup k vlastnostem rozhraní zařízení je možné použít tato rozhraní API:
Ovladače WDM
Ovladače WDF
Kód uživatelského režimu
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 |