Plug & Play Registrierungsroutinen
Der Plug & 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 oder bestimmten Geräten oder Geräteschnittstelleninstanzen zugeordnet sind.
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 Strukturen zugreifen:
HKLM\SYSTEM\CurrentControlSet\Control\Class
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses
HKLM\SYSTEM\CurrentControlSet\Enum
HKLM\SYSTEM\CurrentControlSet\Hardwareprofile
Stattdessen verwenden Treiber die Routinen IoOpenDeviceRegistryKey und IoOpenDeviceInterfaceRegistryKey , um auf die PnP-Schlüssel zuzugreifen.
Der PnP-Manager weist einen Schlüssel für den Treiber, den sogenannten Softwareschlüssel des Treibers, und einen Schlüssel für jedes Gerät zu, 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 zu einem Hardwareschlüssel. 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 zu DevInstKeyType angibt.)
IoOpenDeviceInterfaceRegistryKey öffnet den Schlüssel, der einer bestimmten Geräteschnittstelle instance zugeordnet ist. Der instance wird durch seinen Namen identifiziert, der eine UNICODE_STRING ist, 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 auchIoOpenDeviceInterfaceRegistryKey stellen ein Offenes Schlüsselhandle mit Zugriffsrechten bereit, wie durch den DesiredAccess-Parameter angegeben. Der Treiber verwendet anschließend die Zw Xxx-Registrierungsroutinen wie ZwQueryValueKey und ZwSetValueKey, um auf den Schlüssel zuzugreifen und diesen zu bearbeiten. Nachdem der Treiber das Handle nicht mehr verwendet, schließt der Treiber das Handle, indem er ZwClose aufruft. Weitere Informationen finden Sie unter Verwenden eines Handles für ein Registry-Key-Objekt.
Das folgende Codebeispiel veranschaulicht die Verwendung von IoOpenDeviceRegistryKey und ZwSetValueKey , 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, sodass ein Aufruf von IoOpenDeviceRegistryKey und IoOpenDeviceInterfaceRegistryKey die für DesiredAccess erforderlichen Mindestrechte angeben sollte. Wenn der Treiber ein nicht zulässiges Zugriffsrecht anfordert, gibt beide Routine STATUS_ACCESS_DENIED zurück. Insbesondere sollten Treiber keine KEY_ALL_ACCESS angeben.