Recuperando um identificador de instância de dispositivo

No Windows Vista e versões posteriores do Windows, o modelo de propriedade do dispositivo unificado dá suporte a uma propriedade de dispositivo que representa o identificador de instância do dispositivo. O modelo de propriedade do dispositivo unificado usa a chave de propriedade DEVPKEY_Device_InstanceId para representar essa propriedade.

O Windows Server 2003, o Windows XP e o Windows 2000 também dão suporte a essa propriedade. No entanto, essas versões anteriores do Windows não dão suporte à chave de propriedade do modelo de propriedade do dispositivo unificado. Em vez disso, você pode recuperar um identificador de instância de dispositivo nessas versões anteriores do Windows chamando CM_Get_Device_ID ou SetupDiGetDeviceInstanceId. Para manter a compatibilidade com essas versões anteriores do Windows, o Windows Vista e versões posteriores também dão suporte a CM_Get_Device_ID e SetupDiGetDeviceInstanceId. No entanto, você deve usar a chave de propriedade correspondente para acessar essa propriedade no Windows Vista e posterior.

Para obter informações sobre como usar chaves de propriedade para acessar as propriedades do driver de dispositivo no Windows Vista e versões posteriores, consulte Acessando propriedades de instância de dispositivo (Windows Vista e posterior).

Para recuperar um identificador de instância de dispositivo no Windows Server 2003, Windows XP e Windows 2000, consulte os exemplos a seguir.

As cadeias de caracteres do identificador de instância do dispositivo devem ser menores que MAX_DEVICE_ID_LEN os caracteres (incluindo NULL), que é definido em cfgmgr32.h. Você pode usar essa suposição para consultar o identificador de instância do dispositivo com um código como:

WCHAR DeviceInstancePath[MAX_DEVICE_ID_LEN];

cr = CM_Get_Device_ID(DevInst,
                      DeviceInstancePath,
                      sizeof(DeviceInstancePath)/sizeof(DeviceInstancePath[0]),
                      0);

if (cr != CR_SUCCESS) {
    printf("Error 0x%08x retrieving device instance path.\n", cr);
} else {
    printf("Device instance path is %ws.\n", DeviceInstancePath);
}

ou, como alternativa, se você quiser que o buffer seja dimensionado dinamicamente:

ULONG DeviceInstancePathLength = 0;
PWSTR DeviceInstancePath = NULL;

cr = CM_Get_Device_ID_Size(&DeviceInstancePathLength,
                           DevInst,
                           0);

if (cr != CR_SUCCESS) {
    printf("Error 0x%08x retrieving device instance path size.\n", cr);
} else {
    DeviceInstancePath = (PWSTR)malloc(DeviceInstancePathLength * sizeof(WCHAR));

    if (DeviceInstancePath != NULL) {
        cr = CM_Get_Device_ID(DevInst,
                              DeviceInstancePath,
                              DeviceInstancePathLength,
                              0);

        if (cr != CR_SUCCESS) {
            printf("Error 0x%08x retrieving device instance path.\n", cr);
        } else {
            printf("Device instance path is %ws.\n", DeviceInstancePath);
        }
    }
}