Windows 如何获取设备的设备接口GUID?

Windows 如何获取设备的设备接口GUID?,windows,setupapi,Windows,Setupapi,我列举了机器上的所有设备,如下所示: 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.cbSi

我列举了机器上的所有设备,如下所示:

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

您可以使用Vista和更高版本中提供的获取大量信息。它具有以下特性:

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

您可以使用Vista和更高版本中提供的工具获取大量信息。它具有以下特性:

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

我有同样的问题,但只对usb设备感兴趣。是非集线器或控制器的所有USB设备的guid。ddk头中的某个地方有一个define,但您也会在正在使用的2个setupapi函数的示例中看到它被大量使用。如果我找到guid或标题,我将尝试更新我的答案。但我想你会先找到的。我希望有人知道如何在每台设备上获取信息,我想这样做只是为了fum。但我真的只需要USB进行一些固件调试。我有同样的问题,但只对USB设备感兴趣。是非集线器或控制器的所有USB设备的guid。ddk头中的某个地方有一个define,但您也会在正在使用的2个setupapi函数的示例中看到它被大量使用。如果我找到guid或标题,我将尝试更新我的答案。但我想你会先找到的。我希望有人知道如何在每台设备上获取信息,我想这样做只是为了fum。但我真的只需要USB进行一些固件调试。哦,顺便说一句,该函数不返回DeviceInterfaceGUID或为您提供第三个参数是设备接口类GUID,而不是设备接口GUID。您必须说明您所关注的接口类别。无法获取所有类的所有接口。没有固定的类列表,但Windows已经定义了很多。例如,GUID\u DeviceInterface\u USB\u设备将为USB设备提供设备接口。不,至少我们可以得到所有的设备接口类。是的,这些词可能会误导,API可能会被误用。但目的是明确的。如何为给定设备获取所有受支持的设备接口类?什么是API/方法@SimonMourier@CodeDoggo:说设备接口类GUID是正确的。。。正如你在上一句中所做的。我有同样的问题,但只对usb设备感兴趣。是非集线器或控制器的所有USB设备的guid。ddk头中的某个地方有一个define,但您也会在正在使用的2个setupapi函数的示例中看到它被大量使用。如果我找到guid或标题,我将尝试更新我的答案。但我想你会先找到的。我希望有人知道如何在每台设备上获取信息,我想这样做只是为了fum。但我真的只需要USB进行一些固件调试。我有同样的问题,但只对USB设备感兴趣。是非集线器或控制器的所有USB设备的guid。ddk头中的某个地方有一个define,但您也会在正在使用的2个setupapi函数的示例中看到它被大量使用。如果我找到guid或标题,我将尝试更新我的答案。但我想你会先找到的。我希望有人知道如何在每台设备上获取信息,我想这样做只是为了fum。但我真的只需要USB进行一些固件调试。哦,顺便说一句,该函数不返回DeviceInterfaceGUID或为您提供第三个参数是设备接口类GUID,而不是设备接口GUID。您必须说明您所关注的接口类别。无法获取所有类的所有接口。没有固定的类列表,但Windows已经定义了很多。例如,GUID\u DeviceInterface\u USB\u设备将为USB设备提供设备接口。不,至少我们可以得到所有的设备接口类。是的,这些词可能会误导,API可能会被误用。但目的是明确的。如何为给定设备获取所有受支持的设备接口类?什么是API/方法@SimonMourier@CodeDoggo:说设备接口类GUID是正确的。。。正如您在上一句中所做的。OP要求的是设备接口GUID,而不是设备类GUID。两者之间有细微的差别,但事实上是不同的。确实存在DEVPKEY_DeviceInterface_ClassGuid,但我一直面临着与OP相同的问题。所有接口函数(如SetupDiGetDeviceInterface属性)都需要预先指定设备接口GUID。@CodeDoggo-OP没有设计注释/向下投票/向上投票。他的问题对我来说仍然不清楚,并且显示出缺乏任何知识。他明确地引用了SetupDiEnumDeviceInterfaces方法的InterfaceClassGuid参数。我在评论中明确表示,没有固定的类列表,但Windows已经定义了很多类。例如GUID\u DeviceInterface\u USB\u DEV
ICE将为您的USB设备提供设备接口。我提供的答案确实不允许枚举设备接口类GUID,但希望进行某种讨论/跟进…OP要求的是设备接口GUID,而不是设备类GUID。两者之间有细微的差别,但事实上是不同的。确实存在DEVPKEY_DeviceInterface_ClassGuid,但我一直面临着与OP相同的问题。所有接口函数(如SetupDiGetDeviceInterface属性)都需要预先指定设备接口GUID。@CodeDoggo-OP没有设计注释/向下投票/向上投票。他的问题对我来说仍然不清楚,并且显示出缺乏任何知识。他明确地引用了SetupDiEnumDeviceInterfaces方法的InterfaceClassGuid参数。我在评论中明确表示,没有固定的类列表,但Windows已经定义了很多类。例如,GUID\u DeviceInterface\u USB\u设备将为USB设备提供设备接口。我提供了一个答案,确实不允许枚举设备接口类GUID,但希望进行某种讨论/跟进。。。