Как получить GUID интерфейса устройства для устройства? - PullRequest
0 голосов
/ 19 октября 2018

Я перечисляю все устройства на машине следующим образом:

HDEVINFO hDevList = SetupDiGetClassDevs( NULL, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT | DIGCF_ALLCLASSES /*| DIGCF_PROFILE*/ );
for ( int i = 0; true; ++i )
{
    SP_DEVINFO_DATA devinfo_data = {0};
    devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA);
    if ( !SetupDiEnumDeviceInfo( hDevList, i, &devinfo_data ) )
        break;
    //TODO: get device interface GUID
    //...
}
SetupDiDestroyDeviceInfoList( hDevList );

Как получить GUID интерфейса устройства для каждого элемента?

Я пытался

SP_DEVICE_INTERFACE_DATA interface_data = {0};
interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
SetupDiEnumDeviceInterfaces( hDevList, &devinfo_data, ???, 0, &interface_data );

но для третьего параметра требуется фактический идентификатор GUID.Что на самом деле то, что я хочу получить!NULL там не вариант.

1 Ответ

0 голосов
/ 31 марта 2019

Вы можете получить много информации, используя Модель свойств унифицированного устройства , доступную в Vista и выше.Он имеет свойства DEVPKEY_Device_Class и DEVPKEY_Device_ClassGuid :

HDEVINFO list = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT | DIGCF_ALLCLASSES /*| DIGCF_PROFILE*/);
for (int i = 0; true; ++i)
{
  SP_DEVINFO_DATA data = { 0 };
  data.cbSize = sizeof(SP_DEVINFO_DATA);
  if (!SetupDiEnumDeviceInfo(list, i, &data))
    break;

  // get name property
  DEVPROPTYPE type;
  DWORD size = 0;
  SetupDiGetDeviceProperty(list, &data, &DEVPKEY_NAME, &type, NULL, 0, &size, 0);
  if (size > 0)
  {
    LPWSTR name = (LPWSTR)malloc(size);
    SetupDiGetDeviceProperty(list, &data, &DEVPKEY_NAME, &type, (PBYTE)name, size, &size, 0);
    wprintf(L"name: %s\n", name);
    free(name);
  }

  // get class name
  SetupDiGetDeviceProperty(list, &data, &DEVPKEY_Device_Class, &type, NULL, 0, &size, 0);
  if (size > 0)
  {
    LPWSTR name = (LPWSTR)malloc(size);
    SetupDiGetDeviceProperty(list, &data, &DEVPKEY_Device_Class, &type, (PBYTE)name, size, &size, 0);
    wprintf(L" class: %s\n", name);
    free(name);
  }

  // get class guid
  SetupDiGetDeviceProperty(list, &data, &DEVPKEY_Device_ClassGuid, &type, NULL, 0, &size, 0);
  if (size > 0)
  {
    GUID* guid = (GUID*)malloc(size);
    SetupDiGetDeviceProperty(list, &data, &DEVPKEY_Device_ClassGuid, &type, (PBYTE)guid, size, &size, 0);
    wchar_t name[64];
    StringFromGUID2(*guid, (LPOLESTR)name, ARRAYSIZE(name));
    wprintf(L" class guid: %s\n", name);
    free(guid);
  }
}
SetupDiDestroyDeviceInfoList(list);

Это выведет что-то вроде этого:

name: ACPI Fan                                      
 class: System                                      
 class guid: {4D36E97D-E325-11CE-BFC1-08002BE10318} 
name: ACPI Fan                                      
 class: System                                      
 class guid: {4D36E97D-E325-11CE-BFC1-08002BE10318} 
name: ACPI Fan                                      
 class: System                                      
 class guid: {4D36E97D-E325-11CE-BFC1-08002BE10318} 
name: ACPI Fan                                      
 class: System                                      
 class guid: {4D36E97D-E325-11CE-BFC1-08002BE10318} 
name: ACPI Fan                                      
 class: System                                      
 class guid: {4D36E97D-E325-11CE-BFC1-08002BE10318} 
name: Microsoft Hyper-V Virtual Machine Bus Provider
 class: System                                      
 class guid: {4D36E97D-E325-11CE-BFC1-08002BE10318} 
name: Plug and Play Software Device Enumerator      
 class: System                                      
 class guid: {4D36E97D-E325-11CE-BFC1-08002BE10318} 
etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...