您的位置:首页 > 其它

Libusb添加盘符,hub设备port个数功能(windows)

2016-09-02 00:43 260 查看
请尊重原创作品,转载请保留原文链接(转来转去,搜索到的都一样,非常不利于资料搜索,可能原文有错误更新了,转载的又没同步).

原文链接:http://blog.csdn.net/lookfuyao/article/details/52405554

         最近接触到windows的USB设备管理的功能需求.

         对于USB设备管理,就不得不提到强大的libusb,我也是基于此项目的基础上修改,扩展,来满足我的业务需求.

          我的需求有两个,这两个暂时libusb不能满足我的需求,那就只能定制libusb了.

          1, 管理指定hub设备(一个或者多个),获取到每个hub设备的端口连接信息,并且要对应到hub的哪个口,hub口没连设备时,也要管理.

          2, 如果连在hub上的设备是U盘等存储设备,我要知道这个设备在windows上枚举出的盘符是什么.

           第一个需求,hub口的设备管理很简单,根据每个设备的path就可以知道了.但是如果hub口没连设备,我就无法知道hub口的连接信息了.所以我要知道hub设备有几个口.

           网上搜索各种资料,得知,获取hub端口个数用IOCTL_USB_GET_NODE_INFORMATION命令,取回的hubInfo.u.HubInformation.HubDescriptor.bNumberOfPorts就是hub的端口数啦.所以只需要在init_device函数里面,判断当前连接的设备是hub设备的话,使用CreateFileA函数,priv->path作为参数,获取设备句柄,在用刚提到的命令使用DeviceIoControl函数去获取就可以了.

           第二个需求,这里特别提到要感谢Uwe Sieber,我是发现了他写的UsbTreeView(在windows driver sample里面的usbview基础上扩展的)里面枚举了我想要的信息,储存设备的Mountpoint.我发邮件问他后,他告诉了我办法.

          贴上他给我的回复:

First you need to find the USB device in the Windows device management.

The link between USB API and the device manager is the driver key name of the

USB device.

USB-API: IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME

DevMan: SPDRP_DRIVER or CM_DRP_DRIVER

The USB device's child is the disk or CDROM device (CM_GetChild / CM_GetSibling).

The storage volume (the thing with the drive letter) is somtimes the child device

of the disk/CDROM. But since Vista this is the case only for CDROM drives.

The universal approach is to match disk/CDROM and volume's device number.

I've shown here how to do that:
How-to-Prepare-a-USB-Drive-for-Safe-Removal

Enumerating devices and get parent/child relation is demonstrated here:
http://www.codeproject.com/Articles/14412/Enumerating-windows-devices

           我也主要是在他的How-to-Prepare-a-USB-Drive-for-Safe-Removal这个基础上,跟libusb里面枚举的设备关联.关联是使用CM_Get_Device_IDA来获取设备的ID来匹配的.

           How-to-Prepare-a-USB-Drive-for-Safe-Removal里面会告诉我们怎么关联盘符和所有的GUID_DEVINTERFACE_DISK设备.然后libusb里面设备ID已经有了,就是dev_id_path.将CM_Get_Device_IDA获取的id用sanitize_path转换下,再跟dev_id_path比较,是一致就可以关联了.

再次感谢Uwe Sieber和libusb的作者们.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息