Поделиться через


Получение идентификатора экземпляра устройства

В Windows Vista и более поздних версиях Windows модель унифицированных свойств устройства поддерживает свойство устройства, представляющее идентификатор экземпляра устройства. Унифицированная модель свойств устройства использует ключ свойстваDEVPKEY_Device_InstanceId для представления этого свойства.

Windows Server 2003, Windows XP и Windows 2000 также поддерживают это свойство. Однако эти более ранние версии Windows не поддерживают ключ свойств унифицированной модели свойств устройства. Вместо этого можно получить идентификатор экземпляра устройства в этих более ранних версиях Windows, вызвав CM_Get_Device_ID или SetupDiGetDeviceInstanceId. Для обеспечения совместимости с этими более ранними версиями Windows, Windows Vista и более поздние версии также поддерживают CM_Get_Device_ID и SetupDiGetDeviceInstanceId. Однако для доступа к этому свойству в Windows Vista и более поздних версиях следует использовать соответствующий ключ свойства.

Сведения об использовании ключей свойств для доступа к свойствам драйвера устройства в Windows Vista и более поздних версиях см. в разделе Доступ к свойствам экземпляра устройства (Windows Vista и более поздних версий).

Чтобы получить идентификатор экземпляра устройства в Windows Server 2003, Windows XP и Windows 2000, см. следующие примеры.

Строки идентификатора экземпляра устройства должны быть меньше MAX_DEVICE_ID_LEN символов (включая NULL), определенных в cfgmgr32.h. Это предположение можно использовать для запроса идентификатора экземпляра устройства с помощью следующего кода:

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);
}

Или же, если требуется динамический размер буфера:

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);
        }
    }
}