【发布时间】:2011-10-13 19:52:34
【问题描述】:
在早期版本的 windows 中,我如何识别哪些 devnodes 属于单个物理设备?
编辑:
我想这样做的原因是因为实现一个在设备被移除时广播移除事件的事件系统,否则将需要所述系统产生比 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. "USB\VID_045E&PID_028E\00E102A")
output: The corresponding HID device ID string
HKEY usb_keys <- open_key("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB")
HKEY hid_keys <- open_key("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID")
HKEY device_key <- open_key("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\"+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。欢迎批评,因为我不确定这是否真的像我认为的那样强大。
【问题讨论】: