Rutinas del Registro de Plug and Play

El administrador de Plug and Play asocia determinadas claves del Registro con un controlador, sus dispositivos y sus instancias de interfaz de dispositivo. Los controladores pueden usar estas claves para almacenar propiedades persistentes asociadas al controlador o con dispositivos o instancias de interfaz de dispositivo determinados.

Los controladores nunca deben acceder a estas claves directamente. Las versiones futuras de Windows pueden almacenar la información en una ubicación diferente en el registro o fuera del registro por completo. Los controladores no deben acceder directamente a las claves de los árboles siguientes:

  • HKLM\SYSTEM\CurrentControlSet\Control\Class

  • HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses

  • HKLM\SYSTEM\CurrentControlSet\Enum

  • HKLM\SYSTEM\CurrentControlSet\Perfiles de hardware

En su lugar, los controladores usan las rutinas IoOpenDeviceRegistryKey e IoOpenDeviceInterfaceRegistryKey para acceder a sus claves PnP.

El administrador de PnP asigna una clave para el controlador, conocida como clave de software del controlador, y una clave para cada dispositivo, conocida como clave de hardware del dispositivo. La rutina IoOpenDeviceRegistryKey se puede usar para abrir cualquiera de las claves. El valor del parámetro DevInstKeyType determina qué clave se va a abrir. Especifique PLUGPLAY_REGKEY_DRIVER para abrir una clave de software o PLUGPLAY_REGKEY_DEVICE en una clave de hardware. El parámetro DeviceObject especifica el dispositivo o controlador. (El controlador también puede acceder a sus claves de hardware y software en relación con el perfil de hardware actual, mediante anding PLUGPLAY_REGKEY_CURRENT_HWPROFILE a DevInstKeyType).

IoOpenDeviceInterfaceRegistryKey abre la clave asociada a una instancia de interfaz de dispositivo determinada. La instancia se identifica por su nombre, que es un UNICODE_STRING devuelto por IoGetDeviceInterfaces, IoGetDeviceInterfaceAlias o IoRegisterDeviceInterface. La cadena se pasa como el parámetro SymbolicLinkValue a IoOpenDeviceInterfaceRegistryKey.

Estas claves también se pueden establecer en un archivo INF o mediante las rutinas SetupDiXxx . Para obtener más información, consulte Claves del Registro para controladores.

Tanto IoOpenDeviceRegistryKey como IoOpenDeviceInterfaceRegistryKey proporcionan un identificador de clave abierto, con derechos de acceso según lo especificado por el parámetro DesiredAccess. Posteriormente, el controlador usa las rutinas del registro ZwXxx , como ZwQueryValueKey y ZwSetValueKey, para acceder a la clave y manipularla. Después de que el controlador ya no use el controlador, el controlador cierra el identificador llamando a ZwClose. Para obtener más información, vea Usar un identificador para un objeto Registry-Key.

En el ejemplo de código siguiente se muestra cómo usar IoOpenDeviceRegistryKey y ZwSetValueKey para establecer los datos asociados al valor denominado "Value" en la clave de 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.
}

Tenga en cuenta que se puede restringir el acceso a una clave del Registro, por lo que una llamada a IoOpenDeviceRegistryKey e IoOpenDeviceInterfaceRegistryKey debe especificar los derechos mínimos necesarios para DesiredAccess. Si el controlador solicita un derecho de acceso que no está permitido, cualquiera de las rutinas devuelve STATUS_ACCESS_DENIED. En concreto, los controladores no deben especificar KEY_ALL_ACCESS.