Udostępnij przez


Izolacja pakietu sterowników

Izolacja pakietów sterowników jest wymagana w przypadku sterowników systemu Windows , które sprawiają, że pakiety sterowników są bardziej odporne na zmiany zewnętrzne, łatwiejsze do zaktualizowania i łatwiejsze do zainstalowania.

Uwaga / Notatka

Chociaż izolacja pakietów sterowników jest wymagana dla sterowników systemu Windows, sterowniki pulpitu systemu Windows nadal korzystają z niego dzięki ulepszonej odporności i możliwości obsługi.

W poniższej tabeli przedstawiono przykładowe starsze rozwiązania dotyczące pakietów sterowników, które nie są już dozwolone dla sterowników systemu Windows w kolumnie po lewej stronie wraz z wymaganym zachowaniem sterowników systemu Windows w prawej kolumnie.

Sterownik nieizolowany Sterownik izolowany
InF kopiuje pliki do %windir%\System32 lub %windir%\System32\drivers Pliki sterowników są uruchamiane z magazynu sterowników
Interakcja ze stosami/sterownikami urządzeń przy użyciu zakodowanych na stałe ścieżek Interakcja ze stosami/sterownikami urządzeń przy użyciu funkcji dostarczanych przez system lub interfejsów urządzeń
Koduje na stałe ścieżkę do lokalizacji globalnych rejestru Używa funkcji HKR oraz funkcji dostarczanych przez system do określania względnej lokalizacji rejestru i stanu pliku.
Plik wykonywalny zapisuje dane w dowolnej lokalizacji Pliki są zapisywane w stosunku do lokalizacji dostarczonych przez system operacyjny

Aby uzyskać pomoc dotyczącą określania, czy pakiet sterowników spełnia wymagania dotyczące izolacji pakietów sterowników, zobacz Weryfikowanie sterowników systemu Windows. Aby zapoznać się z przykładami aktualizowania plików INF w celu spełnienia wymagań dotyczących izolacji pakietu sterownika, zobacz Przenoszenie plików INF w celu spełnienia wymagań izolacji pakietu sterownika.

Uruchamianie z magazynu sterowników

Wszystkie izolowane pakiety sterowników pozostawiają pliki pakietów sterowników w magazynie sterowników. Oznacza to, że określają DIRID 13 w INF, aby określić lokalizację plików pakietów sterowników podczas instalacji. Aby uzyskać więcej informacji na temat używania tego elementu w pakiecie sterowników, zobacz Uruchamianie z magazynu sterowników.

Odczytywanie i zapisywanie stanu

Uwaga / Notatka

Jeśli składnik używa właściwości urządzenia lub interfejsu urządzenia do przechowywania stanu, kontynuuj korzystanie z tej metody i odpowiednich interfejsów API systemu operacyjnego do przechowywania i uzyskiwania dostępu. Poniższe wskazówki dotyczące stanu rejestru i pliku dotyczą innego stanu, który musi być przechowywany przez składnik.

Dostęp do różnych stanów rejestru i pliku należy wykonywać przez wywołanie funkcji, które zapewniają wywołującemu lokalizację stanu, a następnie stan jest odczytywany/zapisywany w tej lokalizacji. Nie używaj zakodowanych na stałe ścieżek rejestru bezwzględnych i ścieżek plików.

Ta sekcja zawiera następujące podsekcje:

Stan rejestru

Ta sekcja zawiera następujące podsekcje:

Stan rejestru urządzeń PnP

Izolowane pakiety sterowników i składniki trybu użytkownika zwykle używają jednej z dwóch lokalizacji do przechowywania stanu urządzenia w rejestrze. Są to klucz sprzętowy (klucz urządzenia) dla urządzenia i klucz oprogramowania (klucz sterownika) dla urządzenia. Klucz sprzętu zazwyczaj służy do ustawień związanych z interakcją poszczególnych wystąpień urządzenia ze sprzętem. Aby na przykład włączyć funkcję sprzętową lub umieścić sprzęt w określonym trybie. Klucz oprogramowania jest zazwyczaj przeznaczony dla ustawień związanych z interakcją poszczególnych wystąpień urządzenia z systemem i innym oprogramowaniem. Na przykład w celu skonfigurowania lokalizacji pliku danych, współdziałania z platformą lub uzyskiwania dostępu do ustawień aplikacji dla urządzenia. Aby pobrać dojście do tych lokalizacji rejestru, użyj jednej z następujących opcji:

[ExampleDDInstall.HW]
AddReg = Example_DDInstall.AddReg

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

Stan rejestru interfejsu urządzenia

Aby odczytać i zapisać stan rejestru interfejsu urządzenia, użyj jednej z następujących opcji:

Stan rejestru usług

Stan usługi należy sklasyfikować w jednej z 3 kategorii

Niezmienny stan rejestru usługi

Niezmienny stan usługi to stan dostarczany przez pakiet sterowników, który instaluje usługę. Te wartości rejestru, które są ustawiane przez INF dla sterowników i usług Win32, muszą być przechowywane w podkluczu "Parameters" usługi, podając wiersz HKR w sekcji AddReg , a następnie odwołując się do tej sekcji w sekcji instalacji usługi w INF. Przykład:

[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

Aby uzyskać dostęp do lokalizacji tego stanu z usługi w czasie wykonywania, użyj jednej z następujących funkcji:

Te wartości rejestru dostarczone przez INF w podkluczu "Parametry" dla usługi powinny być odczytywane tylko w czasie wykonywania i nie modyfikowane. Powinny być traktowane jako tylko do odczytu.

Jeśli wartości rejestru dostarczone przez INF są ustawieniami domyślnymi, które można zastąpić w czasie działania, wartości przesłonięcia powinny być zapisywane w stanie rejestru usługi wewnętrznej lub stanie rejestru usługi udostępnionej dla usługi. Podczas pobierania ustawień można najpierw wyszukać ustawienie w pamięci zmiennej. Jeśli tam nie istnieje, można wyszukać to ustawienie w stanie niezmiennym. RtlQueryRegistryValueWithFallback może służyć do ułatwienia ustawień zapytań, takich jak te, które mają przesłonięcie i wartość domyślną.

Stan rejestru usług wewnętrznych

Stan usługi wewnętrznej to stan, który jest zapisywany w czasie pracy i jest własnością i jest zarządzany wyłącznie przez samą usługę, i jest dostępny tylko dla tej usługi. Aby uzyskać dostęp do lokalizacji stanu usługi wewnętrznej, użyj jednej z tych funkcji z usługi:

Jeśli usługa chce zezwolić innym składnikom na modyfikowanie tych ustawień, usługa musi uwidocznić interfejs, do którego może wywołać inny składnik, który informuje usługę, jak zmienić te ustawienia. Na przykład usługa Win32 może uwidocznić interfejs COM lub RPC, a usługa sterownika może uwidocznić interfejs IOCTL za pośrednictwem interfejsu urządzenia.

Stan rejestru usług udostępnionych

Stan usługi udostępnionej to stan, który jest zapisywany w czasie wykonywania i może być udostępniany innym składnikom trybu użytkownika, jeśli są one wystarczająco uprzywilejowane. Aby uzyskać dostęp do lokalizacji tego stanu usługi udostępnionej, użyj jednej z następujących funkcji:

Stan pliku

Ta sekcja zawiera następujące podsekcje:

Stan pliku urządzenia

Jeśli pliki związane z urządzeniem muszą być zapisywane w czasie wykonywania, te pliki powinny być przechowywane w odniesieniu do uchwytu lub ścieżki pliku dostarczonej za pośrednictwem API systemu operacyjnego. Pliki konfiguracji specyficzne dla tego urządzenia to jeden z przykładów typów plików, które mają być przechowywane w tym miejscu. Aby uzyskać dostęp do lokalizacji tego stanu, użyj jednej z tych funkcji z usługi:

Stan pliku usługi

Stan pliku usługi można sklasyfikować w jednej z 3 kategorii

Niezmienny stan pliku usługi

Niezmienny stan plików serwisowych to stan plików będących częścią pakietu sterowników. Aby uzyskać więcej informacji na temat uzyskiwania dostępu do tych plików, zobacz Run from Driver Store (Uruchamianie z magazynu sterowników).

Stan wewnętrznego pliku usługi

Stan wewnętrznego pliku usługi to stan, który jest zapisywany w czasie wykonywania i jest własnością i zarządzany tylko przez samą usługę i jest dostępny tylko dla tej usługi. Aby uzyskać dostęp do lokalizacji stanu usługi wewnętrznej, użyj jednej z tych funkcji z usługi:

Jeśli usługa chce zezwolić innym składnikom na modyfikowanie tych ustawień, usługa musi uwidocznić interfejs, do którego może wywołać inny składnik, który informuje usługę, jak zmienić te ustawienia. Na przykład usługa Win32 może uwidocznić interfejs COM lub RPC, a usługa sterownika może uwidocznić interfejs IOCTL za pośrednictwem interfejsu urządzenia.

Stan pliku usługi udostępnionej

Stan pliku usługi udostępnionej to stan zapisywany w czasie wykonywania i może być udostępniany innym składnikom trybu użytkownika, jeśli są one wystarczająco uprzywilejowane. Aby uzyskać dostęp do lokalizacji tego stanu usługi udostępnionej, użyj jednej z następujących funkcji:

DriverData i ProgramData

Pliki, które mogą być współużytkowane z innymi składnikami, ale nie należą do kategorii stanu pliku usługi udostępnionej, mogą być zapisywane w lokalizacjach DriverData lub ProgramData.

Te lokalizacje oferują komponentom miejsce do zapisu stanu tymczasowego lub stanu, który może być wykorzystywany przez inne komponenty i potencjalnie zebrane, skopiowane z systemu przez inny system do przetworzenia. Na przykład niestandardowe pliki dziennika lub zrzuty awaryjne pasują do tego opisu.

Unikaj zapisywania plików w katalogach głównych DriverData lub ProgramData. Zamiast tego utwórz podkatalog z nazwą firmy, a następnie zapisz pliki i dalsze podkatalogi w tym katalogu.

Na przykład w przypadku nazwy firmy Contoso sterownik trybu jądra może zapisywać dziennik niestandardowy do \DriverData\Contoso\Logs, a następnie aplikacja trybu użytkownika może zbierać lub analizować pliki dziennika z %DriverData%\Contoso\Logs.

DaneSterowników

Katalog DriverData jest dostępny w systemie Windows 10 w wersji 1803 lub nowszej oraz jest dostępny dla administratorów i sterowników UMDF.

Sterowniki trybu jądra uzyskują dostęp do DriverData katalogu przy użyciu linku symbolicznego dostarczonego przez system o nazwie \DriverData.

Programy w trybie użytkownika uzyskują dostęp do DriverData katalogu przy użyciu zmiennej środowiskowej %DriverData%.

ProgramData

Zmienna %ProgramData% środowiskowa trybu użytkownika jest dostępna dla składników trybu użytkownika do użycia podczas przechowywania danych.

Pliki tymczasowe

Pliki tymczasowe są zwykle używane w operacjach pośrednich. Można je zapisać w ścieżce podrzędnej związanej z zmiennymi środowiskowymi %TEMP% lub %TMP%. Ponieważ te lokalizacje są dostępne za pośrednictwem zmiennych środowiskowych, ta możliwość jest ograniczona do składników trybu użytkownika. Nie ma gwarancji na okres istnienia lub trwałość tych plików tymczasowych po ich zamknięciu. System operacyjny lub użytkownik może je usunąć w dowolnym momencie i mogą nie być zachowywane po ponownym uruchomieniu.

Unikaj zapisywania plików w katalogu głównym %TEMP% lub %TMP%. Zamiast tego utwórz podkatalog z nazwą firmy, a następnie zapisz pliki i dalsze podkatalogi w tym katalogu.

Stan właściwości

Zarówno urządzenia, jak i interfejsy urządzeń obsługują przechowywanie stanu za pośrednictwem modelu właściwości PnP. Model właściwości umożliwia przechowywanie danych właściwości strukturalnych względem urządzenia lub interfejsu urządzenia. Jest to przeznaczone dla mniejszych danych, które rozsądnie pasują do typów właściwości obsługiwanych przez model właściwości.

Aby uzyskać dostęp do właściwości urządzenia, można użyć następujących interfejsów API:

Aby uzyskać dostęp do właściwości interfejsu urządzenia, można użyć następujących interfejsów API:

Korzystanie z interfejsów urządzeń

Jeśli sterownik chce zezwolić innym składnikom na odczytywanie lub modyfikowanie swojego stanu wewnętrznego, powinien uwidocznić interfejs, który może zostać wywołany przez inny składnik, aby poinformować sterownik, jakie ustawienia mają zostać zwrócone lub jak zmodyfikować określone ustawienia. Na przykład usługa sterownika może uwidocznić interfejs IOCTL za pośrednictwem interfejsu urządzenia.

Zazwyczaj sterownik, który jest właścicielem stanu, uwidacznia interfejs urządzenia w niestandardowej klasie interfejsu urządzenia. Gdy sterownik jest gotowy do uzyskania dostępu do stanu przez inne składniki, włącza interfejs. Aby otrzymywać powiadomienia o włączeniu interfejsu urządzenia, składniki trybu użytkownika mogą rejestrować powiadomienia o przybyciu interfejsu urządzenia i składniki trybu jądra mogą używać funkcji IoRegisterPlugPlayNotification. Aby te składniki uzyskiwały dostęp do stanu, sterownik włączający interfejs musi zdefiniować kontrakt dla niestandardowej klasy interfejsu urządzenia. Ten kontrakt zazwyczaj jest jednym z dwóch rodzajów:

  • Kontrakt wejścia/wyjścia może być powiązany z tą klasą interfejsu urządzenia, która zapewnia mechanizm uzyskiwania dostępu do stanu. Inne składniki używają interfejsu urządzenia z włączoną obsługą do wysyłania żądań we/wy zgodnych z umową.

  • Interfejs wywołania bezpośredniego, który jest zwracany za pośrednictwem interfejsu zapytania. Inne sterowniki mogą wysyłać IRP_MN_QUERY_INTERFACE, aby pobrać wskaźniki funkcji do wywołania ze sterownika.

Alternatywnie, jeśli sterownik, który jest właścicielem stanu zezwala na bezpośredni dostęp do stanu, inne sterowniki mogą uzyskać dostęp do stanu przy użyciu funkcji dostarczonych przez system w celu programowego dostępu do stanu interfejsu urządzenia. Aby uzyskać więcej informacji, zobacz Stan rejestru interfejsu urządzenia .

Te interfejsy lub stan (w zależności od używanej metody udostępniania) muszą być prawidłowo wersjonowane, aby sterownik, który jest właścicielem stanu, można obsługiwać niezależnie od innych składników, które uzyskują dostęp do tego stanu. Dostawcy sterowników nie mogą polegać na innych składnikach, które są obsługiwane w tym samym czasie co sterownik i pozostają w tej samej wersji.

Ponieważ urządzenia i sterowniki kontrolujące interfejsy mogą się pojawiać i znikać, sterowniki i aplikacje powinny unikać wywoływania IoGetDeviceInterfaces podczas uruchamiania składnika, aby uzyskać listę włączonych interfejsów. Zamiast tego najlepszym rozwiązaniem jest zarejestrowanie powiadomień o nadejściu lub usunięciu interfejsu urządzenia, a następnie wywołanie odpowiedniej funkcji w celu uzyskania listy istniejących interfejsów z obsługą na maszynie.

Aby uzyskać więcej informacji na temat interfejsów urządzeń, zobacz:

Szybki przegląd obsługi systemów operacyjnych dla interfejsów API do zarządzania stanem.

Większość pakietów sterowników musi obsługiwać szereg wersji systemu operacyjnego. Aby uzyskać więcej informacji na temat sposobu osiągnięcia tego w pakiecie sterowników, zobacz Obsługa wielu wersji systemu operacyjnego . W poniższych tabelach przedstawiono szybki przegląd momentów dodania wsparcia dla systemu operacyjnego dla różnych interfejsów API zarządzania stanem.

Sterowniki WDM

System operacyjny Dodano obsługę
Windows 2000 IoOpenDeviceRegistryKey
IoOpenDeviceInterfaceRegistryKey
Windows Vista IoGetDevicePropertyData
IoSetDevicePropertyData
Windows 8 IoGetDeviceInterfacePropertyData
IoSetDeviceInterfacePropertyData
Windows 8.1 IoQueryFullDriverPath
Windows 10 1803 IoOpenDriverRegistryKey dla RegKeyTypeDriverRegKeyParameters i DriverRegKeyPersistentState
IoGetDeviceDirectory
IoGetDriverDirectory dla DirectoryType typu DriverDirectoryImage i DriverDirectoryData
Windows 10 1809 RtlQueryRegistryValueWithFallback
Windows 11 21H2 IoOpenDriverRegistryKey dla RegKeyTypeDriverRegKeySharedPersistentState
IoGetDriverDirectory dla typu kataloguDriverDirectorySharedData

Sterowniki KMDF

Wersja usługi KMDF Dodano obsługę
1.0 WdfDeviceOpenRegistryKey
WdfFdoInitOpenRegistryKey
WdfDriverOpenParametersRegistryKey
WdfDeviceQueryProperty
WdfDeviceAllocAndQueryProperty
WdfFdoInitQueryProperty
WdfFdoInitAllocAndQueryProperty
1.13 WdfDeviceQueryPropertyEx - funkcja/metoda służąca do zapytania o właściwości urządzenia
WdfDeviceAllocAndQueryPropertyEx
WdfDeviceAssignProperty
WdfFdoInitQueryPropertyEx
WdfFdoInitAllocAndQueryPropertyEx
1.25 WdfDriverOpenPersistentStateRegistryKey (Windows 10 1803)

Sterowniki UMDF

Wersja UMDF Dodano obsługę
2.0 WdfDeviceOpenRegistryKey
WdfFdoInitOpenRegistryKey
WdfDriverOpenParametersRegistryKey
WdfDeviceQueryProperty
WdfDeviceAllocAndQueryProperty
WdfDeviceQueryPropertyEx - funkcja/metoda służąca do zapytania o właściwości urządzenia
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

Kod trybu użytkownika

System operacyjny Dodano obsługę
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