对于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个盘符,就无法对应区分了。

解决方案 »

  1.   

    获取盘符的PID/.VID等信息,然后跟你设备管理器中的这些信息对比.
      

  2.   


    获取盘符的PID/.VID等信息,这个也是不知道怎么编程实现,期望得到线索或提示。
      

  3.   

    WM_DEVICECHANGE消息会得到插入的硬件产生的一系列设备消息。
    从 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什么的的
      

  4.   

    这个确实说来话长 ...1  SetupDiXXX 这套 API 可以找到 各种 Device,获得 DevInst。2  更据 DevInst 动用 CM_GetParent 之类 寻找 拓扑关系。3  更据 拓扑树上的节点信息 确认寻找的目标。