Udostępnij przez


Procedury rejestru Plug and Play

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.