找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2930|回复: 0
打印 上一主题 下一主题
收起左侧

查找 USB 设备连接树的方法

[复制链接]
跳转到指定楼层
楼主
ID:90014 发表于 2015-9-13 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
         由于 USB 只是一个设备接入到系统中的方式,对于大部分用户来说,只要设备接入系统后能够正常工作就可以了,不需要知道这个设备是连接在系统的哪一个端口上。但是如果一个系统中同时有多个具有相同的VID和PID的设备接入,要对其中的每一台设备进行单独的测试,就有必要研究这个设备的接入方式了。
一般的研究方法,应该是顺藤摸瓜,或者相反。我在查找了相关的介绍后,很少能够看到完整的例子,特别是对于U盘这样的设备,很少有人直接将最终系统中显示的文件卷与USB端口的连接关系做成树状的关系图显示出来。昨天看了那个设备的卸载过程示例后,觉得应该可以实现的。因为可以从一个文件卷查找到起对应的连接关系。即从 U 盘的文件卷找到其连接的HUB,然后从HUB的端口出发,找到其所有的连接点(在设备管理器的资源中,显示为总线关系)。后续应该可以继续逆向寻找,一直找到主控制器。这样就可以查清楚连接的脉络。
看了微软的 USB View 示例以及网友写的 USB Port 示例,可以看出,查找USB设备,不一定非要从 USB 的设备接口类开始检查,只要采用尝试的方式,用 CreateFile 尝试打开系统中名字为 HCD0, HCD1类似的名称,就可以直接知道是不是有USB主控制器存在。此后通过 DeviceIoControl 函数,给主控制器发送 IOCTL_USB_GET_ROOT_HUB_NAME 命令,获取 Root Hub 的名字。此后再次使用 CreateFile 的方式,打开 RootHub,用DeviceIoControl 给RootHub发送 IOCTL_USB_GET_NODE_INFORMATION 命令,取得该 Hub上端口信息。在端口信息的 HubDescriptors 中,包含了 NumOfPorts,即该 Hub 上的端口数量。同时,这个端口信息中包含了指向端口连接关系的指针数组。通过循环检查的方式,使用 DeviceIoControl 给端口发送 IOCTL_USB_GET_NODE_CONNECTION_INFORMATION 命令,获取该端口的连接关系信息表,其中的一个bConnected 即标识了是否有设备连接在该端口上。并且有一个 ConnectedIsHub的标志,反映该端口连接是下一级 Hub还是一般的设备。通过 GetDriverKeyName 函数,从 HubDevice 中获得所连接的设备的驱动信息,包括了设备类Guid,设备的 PID,VID,连接速度等描述内容。采用循环的方式可以逐一查找所有已连接的设备。
如果要进一步查找其中的Hub设备所连接的信息,必须采用递归方法逐步深入到每一个Hub的下层,才可以获得完整的设备连接信息。
知道了设备名称,并无法获取对应的映射文件卷的关系。此时还需要回头从文件系统着手,用循环的方法,检查系统中已经支持的文件卷多对应的设备,通过比对的方式与连接关系做对应。特别是对于一个连接口映射为多个文件卷的情形,可能有一部分是支持在文件系统中,而另一部分不一定显示(如未分配驱动器符号或作为一个现有文件卷的连接等),则比较难于显示了。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表