Freigeben über


Plug and Play Registry-Routinen

Der Plug and Play-Manager ordnet bestimmte Registrierungsschlüssel einem Treiber, seinen Geräten und seinen Geräteschnittstelleninstanzen zu. Treiber können diese Schlüssel verwenden, um persistente Eigenschaften zu speichern, die dem Treiber zugeordnet sind, oder mit bestimmten Geräten oder Geräteschnittstelleninstanzen.

Treiber dürfen niemals direkt auf diese Schlüssel zugreifen. Zukünftige Versionen von Windows können die Informationen an einem anderen Speicherort in der Registrierung oder vollständig außerhalb der Registrierung speichern. Treiber dürfen nicht direkt auf Schlüssel in den folgenden Baumstrukturen zugreifen:

  • HKLM\SYSTEM\CurrentControlSet\Control\Class

  • HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses

  • HKLM\SYSTEM\CurrentControlSet\Enum

  • HKLM\SYSTEM\CurrentControlSet\Hardware Profiles

Stattdessen verwenden Treiber die IoOpenDeviceRegistryKey - und IoOpenDeviceInterfaceRegistryKey-Routinen , um auf die PnP-Schlüssel zuzugreifen.

Der PnP-Manager weist dem Treiber einen Schlüssel zu, der als Softwareschlüssel des Treibers bezeichnet wird, und einen Schlüssel für jedes Gerät, der als Hardwareschlüssel des Geräts bezeichnet wird. Die IoOpenDeviceRegistryKey-Routine kann verwendet werden, um beide Schlüssel zu öffnen. Der Wert des DevInstKeyType-Parameters bestimmt, welcher Schlüssel geöffnet werden soll. Geben Sie PLUGPLAY_REGKEY_DRIVER an, um einen Softwareschlüssel zu öffnen, oder PLUGPLAY_REGKEY_DEVICE, um einen Hardwareschlüssel zu öffnen. Der DeviceObject-Parameter gibt das Gerät oder den Treiber an. (Der Treiber kann auch auf seine Hardware- und Softwareschlüssel relativ zum aktuellen Hardwareprofil zugreifen, indem er PLUGPLAY_REGKEY_CURRENT_HWPROFILE per logischer UND-Verknüpfung mit DevInstKeyType kombiniert.)

IoOpenDeviceInterfaceRegistryKey öffnet den Schlüssel, der einer bestimmten Geräteschnittstelleninstanz zugeordnet ist. Die Instanz wird durch ihren Namen identifiziert, bei dem es sich um eine UNICODE_STRING handelt, die von IoGetDeviceInterfaces, IoGetDeviceInterfaceAlias oder IoRegisterDeviceInterface zurückgegeben wird. Die Zeichenfolge wird als SymbolicLinkValue-Parameter an IoOpenDeviceInterfaceRegistryKey übergeben.

Diese Schlüssel können auch in einer INF-Datei oder mithilfe der SetupDiXxx-Routinen festgelegt werden. Weitere Informationen finden Sie unter Registrierungsschlüssel für Treiber.

Sowohl IoOpenDeviceRegistryKey als auch IoOpenDeviceInterfaceRegistryKey bieten ein Offenes Schlüsselhandle mit Zugriffsrechten, wie durch den Parameter DesiredAccess angegeben. Der Treiber verwendet anschließend die ZwXxx-Registrierungsroutinen, z. B. ZwQueryValueKey und ZwSetValueKey, um auf den Schlüssel zuzugreifen und ihn zu bearbeiten. Nachdem der Treiber das Handle nicht mehr verwendet hat, schließt der Treiber das Handle durch Aufrufen von ZwClose. Weitere Informationen finden Sie unter Ein Handle für ein Registry-Key-Objekt verwenden.

Im folgenden Codebeispiel wird die Verwendung von IoOpenDeviceRegistryKey und ZwSetValueKey veranschaulicht, um die Daten festzulegen, die dem Wert "Value" unter dem Hardwareschlüssel des Geräts zugeordnet sind.

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.
}

Beachten Sie, dass der Zugriff auf einen Registrierungsschlüssel eingeschränkt werden kann. Daher sollte ein Aufruf von IoOpenDeviceRegistryKey und IoOpenDeviceInterfaceRegistryKey die für DesiredAccess erforderlichen Mindestrechte angeben. Wenn der Treiber ein nicht zulässiges Zugriffsrecht anfordert, gibt eine der Routinen STATUS_ACCESS_DENIED zurück. Insbesondere sollten Treiber keine KEY_ALL_ACCESS angeben.