【问题标题】:How to get device interface GUID for a device?如何获取设备的设备接口 GUID?
【发布时间】:2018-10-19 12:25:45
【问题描述】:

我列举了一台机器上的所有设备如下:

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 不是一个选项。

【问题讨论】:

  • 我也有同样的问题,但只对 USB 设备感兴趣。它是所有非集线器或控制器的 USB 设备的指南。在某个地方的 ddk 标头中有一个定义,但您也会看到它在您正在使用的 2 个 setupapi 函数的示例中被大量使用。如果我找到指南或标题,我将尝试更新我的答案。但我想你会先找到它。我希望有人知道如何在每台设备上获取信息,我想这样做只是为了好玩。但是我真的只需要USB进行一些固件调试。
  • 我也有同样的问题,但只对 USB 设备感兴趣。它是所有非集线器或控制器的 USB 设备的指南。在某个地方的 ddk 标头中有一个定义,但您也会看到它在您正在使用的 2 个 setupapi 函数的示例中被大量使用。如果我找到指南或标题,我将尝试更新我的答案。但我想你会先找到它。我希望有人知道如何在每台设备上获取信息,我想这样做只是为了好玩。但我真的只需要USB进行一些固件调试。哦,顺便说一句,该函数不会返回 DeviceInterfaceGUID 或给你一个
  • 第三个参数是设备接口 class GUID,而不是设备接口 GUID。您必须说明您正在关注哪类接口。您无法获得所有类的所有接口。没有固定的类列表,但 Windows 已经定义了很多。例如 GUID_DEVINTERFACE_USB_DEVICE 将为您提供 USB 设备的设备接口。 docs.microsoft.com/en-us/windows-hardware/drivers/install/…
  • 没有。至少我们可以得到所有device interface classdocs.microsoft.com/en-us/windows-hardware/drivers/install/…
    是的,这些词可能会产生误导,API可能会被滥用。但目的很明确。 如何为给定设备获取所有支持的device interface class API/方法是什么? @SimonMourier
  • @CodeDoggo:说“设备接口类 GUID”正确的......就像你在上一句中所做的那样。

标签: windows setupapi


【解决方案1】:

您可以使用 Vista 及更高版本中的Unified Device Property Model 获取大量信息。它具有DEVPKEY_Device_ClassDEVPKEY_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...

【讨论】:

  • OP 要求的是“设备接口 GUID”不是“设备类 GUID”。两者之间存在细微差别,但实际上它们是不同的。确实存在DEVPKEY_DeviceInterface_ClassGuid,但我一直面临与 OP 相同的问题。所有接口函数(例如SetupDiGetDeviceInterfaceProperty)都需要预先指定“设备接口GUID”
  • @CodeDoggo - OP 不屈尊评论/否决/赞成。他的问题对我来说仍然不清楚,并且表明缺乏任何知识。他明确提到了 SetupDiEnumDeviceInterfaces 方法的“InterfaceClassGuid”参数。我在评论中明确表示“没有固定的类列表,但 Windows 已经定义了很多。例如 GUID_DEVINTERFACE_USB_DEVICE 将为您提供 USB 设备的设备接口。”我提供的答案确实不允许枚举设备 Interface 类 Guid,但期待某种讨论/跟进...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2013-05-29
  • 2018-04-03
  • 2015-09-19
  • 1970-01-01
相关资源
最近更新 更多