对于U盘或模拟串口的设备,即用USB线接入这些设备后,会在设备管理器的USB组中出现USB Mass Storage Device或在Ports组中出现USB to Serial Comm Port等,同时系统模拟出了相应的U盘或串口。
问题是:单凭设备管理器中提供的信息,如何编程取得相应的U盘驱动器盘符或串口号?
例如:插入U盘后,设备管理器出现USB Mass Storage Device一个条目,同时生出一个U盘,盘符为F。该如何编程实现仅凭设备管理器中的条目就取得其对应的盘符F?不要用扫描盘符的方式,那样会有问题。因为假如同时插入两个U盘,出来2个盘符,就无法对应区分了。
问题是:单凭设备管理器中提供的信息,如何编程取得相应的U盘驱动器盘符或串口号?
例如:插入U盘后,设备管理器出现USB Mass Storage Device一个条目,同时生出一个U盘,盘符为F。该如何编程实现仅凭设备管理器中的条目就取得其对应的盘符F?不要用扫描盘符的方式,那样会有问题。因为假如同时插入两个U盘,出来2个盘符,就无法对应区分了。
获取盘符的PID/.VID等信息,这个也是不知道怎么编程实现,期望得到线索或提示。
从 DEV_BROADCAST_DEVICEINTERFACE::dbcc_name 得到的串可以分析到是那类的设备如U盘,会前后产生USB、USBSTOR、STORAGE三类设备的消息(需要注册~3个GUID_DEVINTERFACE_*,具体的目前我记不得了)这三个分别可以对照:
USB - “USB Mass Storage Device”这个东西
USBSTOR - 设备管理器中“磁盘驱动器”节点下显示的你的U盘的型号之类的那个东西
STORAGE - 存储卷,我使用的是已经分配盘符的那种。win2k3以前的系统 由 STORAGE 的设备实例句柄 调用CM_Get_Parent 可以得到 USBSTOR的,继续调用可以得到 USB 的,再继续调用就是 USBHUB的了(总线关系?)win vista之后只能根据 STORAGE_DEVICE_NUMBER 结构体的值来找到其“父”设备USBSTOR设备。之后就好办了。基本上用了很多 SetupDiXXX函数,我试了很久才发现的关系。如果你摸清关系了,我上面说的你应该能明白怎么回事,但说来就话长了PS:直接从"\\\\.\\X:"也是可以找到他所属的U盘的 设备实例ID什么的的