Windows 7设备containterid的替代方案

Alternatives to Windows 7 device ContainterIDs

本文关键字:方案 containterid 设备 Windows      更新时间:2023-10-16

如何在早期版本的windows中识别哪些devnode属于单个物理设备?

编辑:

我想这样做的原因是,当设备被移除时,执行一个广播移除事件的事件系统将需要该系统产生比xbox控制器(它有3个接口和2个开发节点)所需的更多事件。除了ContainerID之外,我找不到任何可以用来在组成单个实体的部分之间建立对应关系的东西。

我正在寻找一种替代方案,使我能够确定这种对应关系,并允许我的程序在旧版本的windows上运行。

另一个编辑:

ContainerID属性不可靠。我已经找到了2个具有相同ContainerID的xbox 360控制器条目,但它们对应于不同的物理控制器。

我已经用以下方法解决了这个问题,它适用于提供序列号的设备(例如xbox 360控制器)以及那些不提供序列号的设备(例如廉价,假冒PS3有线USB控制器):

Algorithm:
Find a matching HID device ID for a given USB device ID
input: usb_device_id as a string (e.g. "USBVID_045E&PID_028E0E102A")
output: The corresponding HID device ID string
HKEY usb_keys <- open_key("HKEY_LOCAL_MACHINESYSTEMCurrentControlSetEnumUSB")
HKEY hid_keys <- open_key("HKEY_LOCAL_MACHINESYSTEMCurrentControlSetEnumHID")
HKEY device_key <- open_key("HKEY_LOCAL_MACHINESYSTEMCurrentControlSetEnum"+usb_device_id)
string prefix <- device_key.ParentIdPrefix
retry
for each key in usb_keys
    for each subkey in key
        if prefix occurrs in subkey.name
            prefix <- subkey.ParentIdPrefix
            goto retry
        endif
    endfor
endfor
for each key in hid_keys
    for each subkey in key
        if prefix occurrs in subkey.name
            return "HID"+key.name+""+subkey.name
        endif
    endfor
endfor
return null
为了简洁,我用伪代码写了这个,因为c++版本相当长(尽管它只使用一个循环而不是两个循环,并且不涉及goto)。注意,key.name表示键的名称,而subkey.ParentIdPrefix表示使用RegGetValue来获得该属性。生成的设备ID可以传递给CM_Locate_DevNode。批评是受欢迎的,因为我不确定这是否真的像我想象的那样健壮。

您可以使用CM_Get_Parent函数发现这种关系。