我需要U盘的VID\PID来进行一些操作,现在已经得到了一个U盘的设备路径,提取了它的VID\PID,但是之后通过设备路径用createfile得到的设备句柄,做参数给DeviceIoControl要出现不支持的请求的错误,而直接通过盘符用createfile得到的设备句柄,做参数给DeviceIoControl就可以正常执行,两个句柄都是0x0000077c,所以想将一个U盘的盘符和VID\PID都得到,但是现在出现只得到盘符得不到VID\PID的情况,换用另外一种方法又只能得到VID\PID得不到对应盘符,我目前得到了U盘的设备路径,不知道该怎么得到对应的盘符???或者,从盘符该怎么得到对应的VID\PID????

解决方案 »

  1.   

    兄弟,这个问题我困扰很半年多也没有解决。。而且在这也问过2个帖子了,除了是用DDK看来单独用API是很难解决这个问题了。不过我和你的情况还不太一样,你的情况似乎比我要简单一些。我想你是不是能这样,你用2中方式得到的句柄不都是0x0000077c,你就以这个作为比较的桥梁,使用盘符来打开UDISK呢。
      

  2.   

    我认为,VID/PID指示的那个USB设备,与U盘这个设备,这两者并不是一个设备.但是它们应该存在某种联系,也许在注册表中,也许要用DDK的系统支持.不太懂,帮你顶.
      

  3.   

    用DDK支持是可以找到他们的对应关系的
      

  4.   

    再问一下,在win98下,我得到的设备路径里没有包含任何有用的U盘信息,请问在98下怎么得到U盘的各种信息???比如VID?比如盘的名称???
      

  5.   

    98下USB设备的名称和NT实不一样的,他采用的方式也不太一样,具体我也没有太多的研究。我也是用相关的GUID在98上取得的设备名称中找不到VID/PID。我想这个和98的驱动有关系。我认为如果UDISK是你们自己做的,那就用一个比较特殊的GUID吧。这样找出来的设备一定是你们的UDISK了
      

  6.   

    55555555,UDISK是公司自己做的,但是驱动不是公司自己写的,说具体一点是,我到这家公司的时候他们已经在用这个通用的驱动了,所以我接手后对这个问题也觉得有点麻烦,如果是公司自己写的驱动,就很好办了,现在98下只有另外想办法了.
      

  7.   

    哈哈!大哥的姐姐,我该怎么叫?昨天刚有人问了我同样的问题,我也很困惑,他们做明基的新的MP3产品,我原来也想的可以通过盘符得到USB设备对象,
    http://community.csdn.net/Expert/topic/3239/3239776.xml?temp=.4452326当我了解文件系统过滤驱动后,我认为通过VID\PID应该不可能得到盘符,因为驱动是分层的,这样你就不好把盘符和U盘设备对应起来,(除非你的U盘本来就是标卷设备,如果这样你可以用上面帖子中的方法.)你可以用WinObj devView这些软件察看到驱动调用栈不过可能还有其他方法,以下是我的想法1 .我记得以前看了些资料好像有方法得到驱动程序的调用堆栈,大概是通过IRP堆栈,察看每个卷设备的设备堆栈,这其中肯定有你的U盘设备,这样就能将盘符与U盘设备对应起来了,不过我有一段时间没玩驱动开发了,具体方法我也忘了2 .作U盘设备驱动的过滤驱动,监控U盘数据传输,应用端分别对每个盘作文件写操作(写专有数据),过滤驱动中应该能监控到到专有数据,这样可以将盘符与U盘设备对象对应起来,不过我想可能会有问题,因为文件系统跟高速缓存直接挂钩,可能会出现操作不同步的问题...............
      

  8.   

    1  ZwCreateFile打开标卷设备得到句柄。  
    2  ObReferenceObjectByHandle通过步骤1得到的句柄得到设备对象  
    3  用SetupApi通过GUID得到USB设备连接名  
    4  ZwCreateFile打开设备  
    5  ObReferenceObjectByHandle通过步骤1得到的句柄得到设备对象  
    对比两次得到的设备对象是否相同  
      

  9.   

    注册表里写是写有,但是凡是用过的U盘注册表中都有信息,哪个是当前使用的,不知道。还有就是注册表中的信息也没办法对应起来,VID是VID,好象看到有盘的名称,但是没办法用程序得到,也联系不起来。zblaoshu1979(周博)的方法我去试试看行不行。
      

  10.   

    看看这个
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=193595
      

  11.   

    98下和2000下实现的方法不一样,你是想在98下还是在2000下
    要是2000看看这个首先通过指定GUID,用SetupDiGetClassDevs,得到Harddisk类和Volume两大类设备的所有设备信息。
    DEFINE_GUID \
    (HARDDISK_GUID, 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
    DEFINE_GUID \
    VOLUME_GUID, 0x53f5630d, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);hDevInfoSet = SetupDiGetClassDevsW(lpGuid, NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);接着用SetupDiEnumDeviceInterfaces依次枚举设备信息集中各个设备的接口信息。
    如果成功,进一步调用SetupDiGetDeviceInterfaceDetail得到每个设备的详细信息。
    然后依次用CM_Get_Parent、CM_Get_Device_ID取得该设备实例的device instance ID 这个东西是类似下面这样的串:PCIIDE\IDECHANNEL\4&E3EC092&0&0、USB\VID_0D7D&PID_0150\4D3B190303C0。
    想必你已经注意到USB设备都以USB开头,同时包含了该设备的PID和VID,这样就可以判断是否是特定厂商的设备。接着要取得该USB设备对应的盘符,因为每个设备可能包含多个卷,所以用上面类似的方法取得所有卷的信息,通过比对设备号可以判断多个卷是否属于同一个设备,接着用卷设备的物理设备名称反查符号连接(QueryDosDevice)就能得到该卷对应的盘符,进一步可以得到,一个物理磁盘所有卷的盘符。
      

  12.   

    实现了发过来给我看看
    [email protected]