routines de registre Plug-and-Play

Le gestionnaire de Plug-and-Play associe certaines clés de Registre à un pilote, à ses périphériques et à ses instances d’interface de périphérique. Les pilotes peuvent utiliser ces clés pour stocker les propriétés persistantes associées au pilote, ou avec des appareils ou des instances d’interface de périphérique spécifiques.

Les pilotes ne doivent jamais accéder directement à ces clés. Les versions ultérieures de Windows peuvent stocker les informations à un autre emplacement dans le Registre, ou en dehors du Registre entièrement. Les pilotes ne doivent pas accéder directement aux clés dans les arborescences suivantes :

  • HKLM\SYSTEM\CurrentControlSet\Control\Class

  • HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses

  • HKLM\SYSTEM\CurrentControlSet\Enum

  • HKLM\SYSTEM\CurrentControlSet\Hardware Profiles

Au lieu de cela, les pilotes utilisent les routines IoOpenDeviceRegistryKey et IoOpenDeviceInterfaceRegistryKey pour accéder à ses clés PnP.

Le gestionnaire PnP affecte une clé pour le pilote, appelée clé logicielle du pilote, et une clé pour chaque appareil, appelée clé matérielle de l’appareil. La routine IoOpenDeviceRegistryKey peut être utilisée pour ouvrir l’une ou l’autre clé. La valeur du paramètre DevInstKeyType détermine la clé à ouvrir. Spécifiez PLUGPLAY_REGKEY_DRIVER pour ouvrir une clé logicielle ou PLUGPLAY_REGKEY_DEVICE à une clé matérielle. Le paramètre DeviceObject spécifie le périphérique ou le pilote. (Le pilote peut également accéder à ses clés matérielles et logicielles par rapport au profil matériel actuel, en anding PLUGPLAY_REGKEY_CURRENT_HWPROFILE à DevInstKeyType.)

IoOpenDeviceInterfaceRegistryKey ouvre la clé associée à une interface d’appareil particulière instance. Le instance est identifié par son nom, qui est un UNICODE_STRING retourné par IoGetDeviceInterfaces, IoGetDeviceInterfaceAlias ou IoRegisterDeviceInterface. La chaîne est passée en tant que paramètre SymbolicLinkValue à IoOpenDeviceInterfaceRegistryKey.

Ces clés peuvent également être définies dans un fichier INF ou à l’aide des routines SetupDiXxx . Pour plus d’informations, consultez Clés de Registre pour les pilotes.

IoOpenDeviceRegistryKey et IoOpenDeviceInterfaceRegistryKey fournissent un handle de clé ouverte, avec des droits d’accès tels que spécifiés par le paramètre DesiredAccess. Le pilote utilise ensuite les routines de registre ZwXxx , telles que ZwQueryValueKey et ZwSetValueKey, pour accéder à la clé et la manipuler. Une fois que le pilote n’utilise plus la poignée, le pilote ferme la poignée en appelant ZwClose. Pour plus d’informations, consultez Utilisation d’un handle pour un objet Registry-Key.

L’exemple de code suivant illustre l’utilisation de IoOpenDeviceRegistryKey et ZwSetValueKey pour définir les données associées à la valeur nommée « Value » sous la clé matérielle de l’appareil.

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

Notez que l’accès à une clé de Registre peut être restreint. Par conséquent, un appel à IoOpenDeviceRegistryKey et IoOpenDeviceInterfaceRegistryKey doit spécifier les droits minimum nécessaires pour DesiredAccess. Si le pilote demande un droit d’accès non autorisé, l’une ou l’autre des routines retourne STATUS_ACCESS_DENIED. En particulier, les pilotes ne doivent pas spécifier KEY_ALL_ACCESS.