Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Menedżer Plug and Play kojarzy niektóre klucze rejestru ze sterownikiem, jego urządzeniami i wystąpieniami interfejsu urządzenia. Sterowniki mogą używać tych kluczy do przechowywania trwałych właściwości skojarzonych z nimi samymi, a także z konkretnymi urządzeniami lub instancjami interfejsów urządzeń.
Sterowniki nigdy nie muszą uzyskiwać bezpośredniego dostępu do tych kluczy. Przyszłe wersje systemu Windows mogą przechowywać informacje w innej lokalizacji w rejestrze lub poza rejestrem w całości. Sterowniki nie mogą bezpośrednio uzyskiwać dostępu do żadnych kluczy w następujących drzewach:
HKLM\SYSTEM\CurrentControlSet\Control\Class
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses
HKLM\SYSTEM\CurrentControlSet\Enum
HKLM\SYSTEM\CurrentControlSet\Hardware Profiles
Zamiast tego sterowniki używają procedur IoOpenDepenDeviceRegistryKey i IoOpenDepenDeviceInterfaceRegistryKey , aby uzyskać dostęp do kluczy PnP.
Menedżer PnP przypisuje jeden klucz dla sterownika, znany jako klucz oprogramowania sterownika, i klucz dla każdego urządzenia, znany jako klucz sprzętowy urządzenia. Procedurę IoOpenDeviceRegistryKey można użyć do otwarcia każdego z kluczy. Wartość parametru DevInstKeyType określa klucz do otwarcia. Określ PLUGPLAY_REGKEY_DRIVER, aby otworzyć klucz oprogramowania, lub PLUGPLAY_REGKEY_DEVICE, aby otworzyć klucz sprzętowy. Parametr DeviceObject określa urządzenie lub sterownik. (Sterownik może również uzyskać dostęp do swoich kluczy sprzętowych i programowych względem bieżącego profilu sprzętu, stosując operację AND na PLUGPLAY_REGKEY_CURRENT_HWPROFILE z DevInstKeyType.)
IoOpenDeviceInterfaceRegistryKey otwiera klucz skojarzony z określonym wystąpieniem interfejsu urządzenia. Wystąpienie jest identyfikowane przez jego nazwę, która jest UNICODE_STRING zwracana przez IoGetDeviceInterfaces, IoGetDeviceInterfaceAlias lub IoRegisterDeviceInterface. Ciąg jest przekazywany jako parametr SymbolicLinkValue do IoOpenDeviceInterfaceRegistryKey.
Te klucze można również ustawić w pliku INF lub za pomocą procedur SetupDiXxx . Aby uzyskać więcej informacji, zobacz Klucze rejestru dla sterowników.
Zarówno IoOpenDeviceRegistryKey, jak i IoOpenDeviceInterfaceRegistryKey zapewniają otwarte dojście klucza z prawami dostępu określonymi przez parametr DesiredAccess. Następnie sterownik używa procedur rejestru ZwXxx , takich jak ZwQueryValueKey i ZwSetValueKey, do uzyskiwania dostępu do klucza i manipulowania nim. Gdy sterownik nie korzysta już z uchwytu, zamyka go, wywołując funkcję ZwClose. Aby uzyskać więcej informacji, zobacz Using a Handle to a Registry-Key Object (Używanie uchwytu do obiektu Registry-Key).
W poniższym przykładzie kodu pokazano użycie funkcji IoOpenDeviceRegistryKey i ZwSetValueKey do ustawienia danych skojarzonych z wartością o nazwie „Value” w kluczu rejestru urządzenia.
PDEVICE_OBJECT pDeviceObject; // A pointer to the PDO for the device.
HANDLE handle;
UNICODE_STRING ValueName;
ULONG Value = 109; // This is the value we're setting the key to.
NTSTATUS status;
RtlInitUnicodeString(&ValueName, L"Value");
status = IoOpenDeviceRegistryKey(pDeviceObject, PLUGPLAY_REGKEY_DEVICE, KEY_READ, &handle);
if (NTSUCCESS(status)) {
status = ZwSetValueKey(handle, ValueName, 0, REG_DWORD, &Value, sizeof(ULONG));
if (NTSUCCESS(status) {
ZwClose(handle);
} else {
// Handle error.
}
// Handle error.
}
Należy pamiętać, że dostęp do klucza rejestru może być ograniczony, dlatego wywołanie metody IoOpenDepenDeviceRegistryKey i IoOpenDeviceInterfaceRegistryKey powinno określać minimalne prawa niezbędne dla funkcji DesiredAccess. Jeśli sterownik żąda prawa dostępu, które nie jest dozwolone, wówczas odpowiednia procedura zwraca STATUS_ACCESS_DENIED. W szczególności sterowniki nie powinny określać KEY_ALL_ACCESS.