rotinas do Registro Plug and Play

O gerenciador de Plug and Play associa determinadas chaves do Registro a um driver, seus dispositivos e suas instâncias de interface do dispositivo. Os drivers podem usar essas chaves para armazenar propriedades persistentes associadas ao driver ou com dispositivos específicos ou instâncias de interface do dispositivo.

Os drivers nunca devem acessar essas chaves diretamente. Versões futuras do Windows podem armazenar as informações em um local diferente no registro ou fora do registro inteiramente. Os drivers não devem acessar diretamente nenhuma chave nas seguintes árvores:

  • HKLM\SYSTEM\CurrentControlSet\Control\Class

  • HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses

  • HKLM\SYSTEM\CurrentControlSet\Enum

  • HKLM\SYSTEM\CurrentControlSet\Hardware Profiles

Em vez disso, os drivers usam as rotinas IoOpenDeviceRegistryKey e IoOpenDeviceInterfaceRegistryKey para acessar suas chaves PnP.

O gerenciador PnP atribui uma chave para o driver, conhecida como chave de software do driver e uma chave para cada dispositivo, conhecida como chave de hardware do dispositivo. A rotina IoOpenDeviceRegistryKey pode ser usada para abrir qualquer chave. O valor do parâmetro DevInstKeyType determina qual chave abrir. Especifique PLUGPLAY_REGKEY_DRIVER para abrir uma chave de software ou PLUGPLAY_REGKEY_DEVICE a uma chave de hardware. O parâmetro DeviceObject especifica o dispositivo ou driver. (O driver também pode acessar suas chaves de hardware e software em relação ao perfil de hardware atual, anando PLUGPLAY_REGKEY_CURRENT_HWPROFILE para DevInstKeyType.)

IoOpenDeviceInterfaceRegistryKey abre a chave associada a uma instância de interface de dispositivo específica. A instância é identificada pelo nome, que é um UNICODE_STRING retornado por IoGetDeviceInterfaces, IoGetDeviceInterfaceAlias ou IoRegisterDeviceInterface. A cadeia de caracteres é passada como o parâmetro SymbolicLinkValue para IoOpenDeviceInterfaceRegistryKey.

Essas chaves também podem ser definidas em um arquivo INF ou usando as rotinas SetupDiXxx . Para obter mais informações, consulte Chaves do Registro para Drivers.

IoOpenDeviceRegistryKey e IoOpenDeviceInterfaceRegistryKey fornecem um identificador de chave aberta, com direitos de acesso conforme especificado pelo parâmetro DesiredAccess. Posteriormente, o driver usa as rotinas do registro ZwXxx , como ZwQueryValueKey e ZwSetValueKey, para acessar e manipular a chave. Depois que o driver não estiver mais usando o identificador, o driver fechará o identificador chamando ZwClose. Para obter mais informações, consulte Usando um identificador para um objeto Registry-Key.

O exemplo de código a seguir demonstra o uso de IoOpenDeviceRegistryKey e ZwSetValueKey para definir os dados associados ao valor chamado "Value" na chave de hardware do 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.
}

Observe que o acesso a uma chave do Registro pode ser restrito, portanto, uma chamada para IoOpenDeviceRegistryKey e IoOpenDeviceInterfaceRegistryKey deve especificar os direitos mínimos necessários para DesiredAccess. Se o driver solicitar um direito de acesso que não é permitido, qualquer rotina retornará STATUS_ACCESS_DENIED. Em particular, os drivers não devem especificar KEY_ALL_ACCESS.