Libusb添加盘符,hub设备port个数功能(windows)
来源:互联网 发布:淘宝三大苹果店 编辑:程序博客网 时间:2024/06/09 18:18
请尊重原创作品,转载请保留原文链接(转来转去,搜索到的都一样,非常不利于资料搜索,可能原文有错误更新了,转载的又没同步).
原文链接: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的作者们.
- Libusb添加盘符,hub设备port个数功能(windows)
- Windows下的Java访问USB设备解决之道(翻译Java libusb / libusb-win32 wrapper)收
- USB设备开发---- usb描述符概述(libusb库使用)
- libusb in windows
- windows install libusb driver
- 向VMWare虚拟机添加一个串口设备(serial port)
- 向VMWare虚拟机添加一个串口设备(serial port)
- 向VMWare虚拟机添加一个串口设备(serial port)
- libusb枚举设备的过程
- Linux设备驱动---hub驱动
- Windows Azure功能更新:SQL Server AlwaysOn和Notification Hub 正式商用
- App hub功能改进详解
- windows 7 添加dns功能
- android设备添加F1-F12按键功能
- android设备添加F1-F12按键功能
- android设备添加F1-F12按键功能
- libusb usb设备访问接口库
- libusb无驱设计(USB设备开发)
- leetCode No.268 Missing Number
- 字符串指针与字符数组的区别
- selector的使用及执行流程
- Java-servlet-01
- Java设计模式之策略模式
- Libusb添加盘符,hub设备port个数功能(windows)
- 编程思想-解耦
- 三维数组使用单变量访问,类的大小
- android常见面试模块
- 20位活跃在Github上的国内技术大牛
- C语言内存管理
- Java-TCP/IP 编程-01 主线程:从控制台录入消息,发送到服务器 子线程:接收服务器转发来的消息
- 2 json与json字符串
- PAT 1011. World Cup Betting (20)(浮点数乘法)