【问题标题】:Alternatives to Windows 7 device ContainterIDsWindows 7 设备 ContainerID 的替代品
【发布时间】: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。欢迎批评,因为我不确定这是否真的像我认为的那样强大。

【问题讨论】:

    标签: c++ windows wdk


    【解决方案1】:

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

    【讨论】:

    • 这适用于我测试过的大多数游戏手柄和键盘。不幸的是,它仅在插入时才有效,并且对于像 xbox 360 控制器这样的设备会失败,因为它们在注册表中的排列方式不同。我注意到,对于提供序列号的设备,它也失败了,这些设备似乎具有相同的密钥组织。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多