获取父设备

我有两个USB设备ID,例如USB\VID_E4F1&PID_0661\00000115FA9CE7750000000000000000USB\VID_E4F1&PID_0661&MI_00\7&B5A5DDF&0&0000

如何validation设备#2是设备#1的直接子设备(物理上它们是同一个USB组合设备的不同部分)?

在现实生活中,将会有许多连接到同一个USB控制器。 而且,他们可能是同一个制造商和模型。 这就是为什么我无法validationVID,PID,并使用Win32_USBControllerDevice WMI查询来validation它们插入到同一个USB控制器 – 我需要以某种方式validation父子关系,而不仅仅是事实他们被插入到相同的控制器。

如果重要,我只需要支持Windows 8 +。

Solutions Collecting From Web of "获取父设备"

PnP配置管理器API是你的朋友在这里:

  • CM_Locate_DevNode在给定设备ID的情况下打开设备句柄;

  • CM_Get_Parent找到父设备;

  • CM_Get_Device_ID_Size和CM_Get_Device_ID获取设备句柄并返回设备ID。

如果您能够使用新的WinRT API您应该查看一下PnpObject类和名称空间。

这是一个代码示例:

 var propertiesToQuery = new List<string>() { "System.ItemNameDisplay", "System.Devices.DeviceInstanceId", "System.Devices.Parent", "System.Devices.LocationPaths", "System.Devices.Children" }; var id1 = @"USB\VID_E4F1&PID_0661\00000115FA9CE7750000000000000000"; var device1 = await PnpObject.FindAllAsync(PnpObjectType.Device, propertiesToQuery, "System.Devices.DeviceInstanceId:=\"" + id1 + "\""); var id2 = @"USB\VID_E4F1&PID_0661&MI_00\7&B5A5DDF&0&0000"; var device2 = await PnpObject.FindAllAsync(PnpObjectType.Device, propertiesToQuery, "System.Devices.DeviceInstanceId:=\"" + id2 + "\""); var parent1 = device1.Properties["System.Devices.Parent"] as string; var parent2 = device2.Properties["System.Devices.Parent"] as string; if (parent1 && parent1 == id2) { WriteLine("Device 2 is parent of device 1"); } if (parent2 && parent2 == id1) { WriteLine("Device 11 is parent of device 2"); } var child_ids = device1.Properties["System.Devices.Children"] as string[]; if (child_ids != null){ foreach (var id in child_ids) { if (id == id2){ WriteLine("Device 2 is child of device 1") } } } child_ids = device2.Properties["System.Devices.Children"] as string[]; if (child_ids != null){ foreach (var id in child_ids) { if (id == id1){ WriteLine("Device 1 is child of device 2") } } } 

如果这还不够,你可以尝试向上或向下的父/子路径。

您也可以查看System.Devices.LocationPaths属性(它是一个字符串数组),并测试一个是另一个的前缀。