Routine del Registro di sistema Plug and Play
Il gestore Plug and Play associa determinate chiavi del Registro di sistema a un driver, ai relativi dispositivi e alle relative istanze dell'interfaccia del dispositivo. I driver possono usare queste chiavi per archiviare le proprietà persistenti associate al driver o a particolari dispositivi o istanze dell'interfaccia del dispositivo.
I driver non devono mai accedere direttamente a queste chiavi. Le versioni future di Windows possono archiviare le informazioni in un percorso diverso nel Registro di sistema o all'esterno del Registro di sistema completamente. I driver non devono accedere direttamente ad alcuna chiave negli alberi seguenti:
HKLM\SYSTEM\CurrentControlSet\Control\Class
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses
HKLM\SYSTEM\CurrentControlSet\Enum
HKLM\SYSTEM\CurrentControlSet\Hardware Profiles
I driver usano invece le routine IoOpenDeviceRegistryKey e IoOpenDeviceInterfaceRegistryKey per accedere alle chiavi PnP.
Il gestore PnP assegna una chiave per il driver, nota come chiave software del driver, e una chiave per ogni dispositivo, nota come chiave hardware del dispositivo. La routine IoOpenDeviceRegistryKey può essere usata per aprire una delle due chiavi. Il valore del parametro DevInstKeyType determina la chiave da aprire. Specificare PLUGPLAY_REGKEY_DRIVER per aprire una chiave software o PLUGPLAY_REGKEY_DEVICE a una chiave hardware. Il parametro DeviceObject specifica il dispositivo o il driver. Il driver può anche accedere alle chiavi hardware e software relative al profilo hardware corrente, da ANDing PLUGPLAY_REGKEY_CURRENT_HWPROFILE a DevInstKeyType.
IoOpenDeviceInterfaceRegistryKey apre la chiave associata a una particolare istanza dell'interfaccia del dispositivo. L'istanza viene identificata dal nome, ovvero un UNICODE_STRINGrestituito da IoGetDeviceInterfaces, IoGetDeviceInterfaceAlias o IoRegisterDeviceInterface. La stringa viene passata come parametro SymbolicLinkValue a IoOpenDeviceInterfaceRegistryKey.
Queste chiavi possono essere impostate anche in un file INF o usando le routine SetupDiXxx . Per altre informazioni, vedere Chiavi del Registro di sistema per i driver.
Sia IoOpenDeviceRegistryKey che IoOpenDeviceInterfaceRegistryKey forniscono un handle di chiave aperto, con diritti di accesso specificati dal parametro DesiredAccess . Il driver usa successivamente le routine del Registro di sistema ZwXxx , ad esempio ZwQueryValueKey e ZwSetValueKey, per accedere e modificare la chiave. Dopo che il driver non usa più l'handle, il driver chiude l'handle chiamando ZwClose. Per altre informazioni, vedere Uso di un handle per un oggetto Registry-Key.
L'esempio di codice seguente illustra l'uso di IoOpenDeviceRegistryKey e ZwSetValueKey per impostare i dati associati al valore denominato "Value" nella chiave hardware del dispositivo.
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.
}
Si noti che l'accesso a una chiave del Registro di sistema può essere limitato, quindi una chiamata a IoOpenDeviceRegistryKey e IoOpenDeviceInterfaceRegistryKey deve specificare i diritti minimi necessari per DesiredAccess. Se il driver richiede un diritto di accesso non consentito, la routine restituisce STATUS_ACCESS_DENIED. In particolare, i driver non devono specificare KEY_ALL_ACCESS.