netskiff
驱动牛犊
驱动牛犊
  • 注册日期2004-04-25
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2307回复:19

!!!,看了很多帖子,没有明确的答复,各位老大应该回答这个问题了,免得大家走弯路,哪怕是给条路径也行啊!!!

楼主#
更多 发布于:2004-10-25 15:54
USBVIEW里面只是得到的信息:
   1、某个U盘插在Hub的哪个端口
   2、Hub上USB设备的信息,如PID,VID等信息
   这个USB设备如果是U盘,在系统里应该会分配一个盘符,USB View里没有去寻找盘符。
   怎么找盘符????看了很多帖子,有些说的不清,有些根本没有理解怎么回事,真是觉得微软太恶心了,这种信息应该在注册表或什么地方能取到才对呀。

[编辑 -  10/25/04 by  netskiff]

[编辑 -  10/25/04 by  netskiff]

最新喜欢:

jinghuirenjinghu...
cecily
驱动牛犊
驱动牛犊
  • 注册日期2004-08-04
  • 最后登录2013-05-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望86点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-10-25 16:13
注册表里确实有相关信息,如果你得到的话也可以找到对应盘符,你在2000下还是98下?2000下可以通过GUID得到盘的名称信息,然后根据名称信息去得到盘符.98下我还没找到方法.虽然看见注册表也有类似盘的名称信息的东东,但是通过程序我得不到,打算直接枚举注册表,看能不能实现.
我不是你的天使,我不懂你的天堂
cecily
驱动牛犊
驱动牛犊
  • 注册日期2004-08-04
  • 最后登录2013-05-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望86点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-10-25 16:20
不好意思,刚刚看了你的另外一个帖子,发现你其实想得到的是同时兼有VID\PID和盘符信息,我现在只能单独得到VID\PID或者单独得到盘符,用不同的GUID,不过对应不起来某个VID\PID的盘符是什么,曾经有一个人在他的帖子中说他做到了,通过VID等信息去找到了对应的盘符,呵呵,我就只看到这么一个人说他做好了.不过据他说很复杂,通过了很多关联才找到的,可惜的是这位大哥不愿意共享代码和方法,说是公司机密.
我不是你的天使,我不懂你的天堂
netskiff
驱动牛犊
驱动牛犊
  • 注册日期2004-04-25
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-10-25 17:28
通过PID VID信息是不能找到对应盘符的,因为存在一种情况:
两个PID VID一样的U盘,插入系统,系统通过不同的盘符访问它们。

猜测:PID VID不能唯一标识一个U盘,还必须加上HUB的端口才行,
不知道系统是不是这样对应盘符的?
另外,一个U盘有可能有好几个分区,U盘与盘符是一对多的关系,
我想系统应该有相应的接口获取这些信息。

[编辑 -  10/25/04 by  netskiff]
netskiff
驱动牛犊
驱动牛犊
  • 注册日期2004-04-25
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-10-25 17:37
cecily, 谢谢你。
netskiff
驱动牛犊
驱动牛犊
  • 注册日期2004-04-25
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-10-25 17:41
MSDN特难看懂,又没有源代码,linux的文档也不好看,
但有源代码就好多了,大不了一步一步追下去啦。

[编辑 -  10/25/04 by  netskiff]
wozhuce
驱动小牛
驱动小牛
  • 注册日期2004-04-02
  • 最后登录2005-11-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-10-25 22:22
cecily姐姐往往能救人于危机之中,好人啊!!!
netskiff
驱动牛犊
驱动牛犊
  • 注册日期2004-04-25
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-10-27 14:30
看书中。。。。。
cecily
驱动牛犊
驱动牛犊
  • 注册日期2004-08-04
  • 最后登录2013-05-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望86点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-10-27 16:21
vid和pid确实不是唯一标记,不过从U盘来说(我是做这个的,别的USB设备不知道),在硬件中一般会有一些支持信息,可以唯一标识一个U盘,如果硬件中没有的话,那么操作系统就不会同时识别这两个vid和pid相同的U盘了。呵呵……不过这个和我们要讨论的东东关系不大。
我不是你的天使,我不懂你的天堂
cecily
驱动牛犊
驱动牛犊
  • 注册日期2004-08-04
  • 最后登录2013-05-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望86点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-10-27 16:24
wozhuce,呵呵,你太过奖啦,其实我在这方面也是一个新手,到现在这家公司才开始接触U盘的东西的,我们要互相学习,呵呵……
我不是你的天使,我不懂你的天堂
netskiff
驱动牛犊
驱动牛犊
  • 注册日期2004-04-25
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-10-27 17:24
我看可能是U盘的系列号,它是唯一的
wozhuce
驱动小牛
驱动小牛
  • 注册日期2004-04-02
  • 最后登录2005-11-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-10-27 20:49
cecily虽然看起来是新手,其实很厉害呀,刚上论坛就显得功力深厚啊,佩服!佩服!
zblaoshu
驱动牛犊
驱动牛犊
  • 注册日期2004-08-13
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-11-02 15:22
我也正为这个问题发愁呢,现在只要能找到设备路径对应的盘符就行了。设备路径:\\?\usbstor#disk&ven_oti&prod_flash_disk&rev_1.11#264d16d625194744&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b},这里面的264d16d625194744就是U盘的唯一序列号,能标识U盘的。

我看CSDN上有一个人这么写的:
转载:
____________________________________________________
NT下这样做:
首先通过指定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)就能得到该卷对应的盘符,进一步可以得到,一个物理磁盘所有卷的盘符。
____________________________________________________________
我按他的方法得到了device instance ID ,但是他下一步说的"所以用上面类似的方法取得所有卷的信息"不明确,我也不知道怎么做了,现在也处于迷茫中。
我做这个东西cecily姐给了不少帮忙,在这里谢谢cecily姐。
不过这个我还是没做出来,郁闷ing...
cecily
驱动牛犊
驱动牛犊
  • 注册日期2004-08-04
  • 最后登录2013-05-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望86点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-11-02 20:35
呵呵,不用谢啦,大家都是互相交流而已,都希望能找到最终的解决方法。你说的这个我也是不太明白他说的得到所有卷是怎么做的,不是很清楚。
我不是你的天使,我不懂你的天堂
cecily
驱动牛犊
驱动牛犊
  • 注册日期2004-08-04
  • 最后登录2013-05-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望86点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-11-02 20:37
对了,zblaoshu,你在csdn上的名字叫zblaoshu(周博)是不?呵呵,你回过我的帖子。
我不是你的天使,我不懂你的天堂
netskiff
驱动牛犊
驱动牛犊
  • 注册日期2004-04-25
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-11-05 11:27
多谢zblaoshu、cecily。
我看了一下zblaoshu的回答,意思好像是通过device instance ID这个东西来对应的。

    但有一点不明,就是上面说的device instance ID与设备号是不是同一个东西,如果是那么对应关系应该是这样的:
    1、 通过PID、VID之类的信息取得USB设备device instance ID。
    2、 通过枚举取得所有卷信息,然后看那些卷的设备号(device instance ID???)等于1种取得的值。
    3、 取得相应的卷信息后,通过QueryDosDevice获得盘符。

    枚举所有的信息是不是太费了? MicroSoft的程序员不至于留下这每一个“接口”来获取对应关系。
    是不是有哪个文件系统放面的驱动程序有这类信息,并提供接口来获得呢?
netskiff
驱动牛犊
驱动牛犊
  • 注册日期2004-04-25
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-11-05 11:40
好几天没来,奇怪为什么我不能加分了(没有这个按钮),提示没有登陆,可我都重复登陆了好几次了,一进这个贴子就说没有登陆。
Zhongyh
驱动牛犊
驱动牛犊
  • 注册日期2001-09-04
  • 最后登录2012-04-09
  • 粉丝1
  • 关注1
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-11-05 13:17
如果你有pidname和vidname,可以这样取得已插入u盘的盘符:
1.枚举系统所有的硬盘
2.使用DeviceIoControl取得每个硬盘的信息.在这里就有pidname,vidname等信息.

ps:
 netskiff:我想自己发送scsi命令来直接读U盘,应该怎样做呢?windows的api好像没有直接的scsi api.你能给个思路我吗?


[编辑 -  11/5/04 by  Zhongyh]
netskiff
驱动牛犊
驱动牛犊
  • 注册日期2004-04-25
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-11-11 17:45
我也不太清楚了,只是ddk里有一个例子,spti,你去看看,又没有你要的东西。
abanwjc
驱动小牛
驱动小牛
  • 注册日期2003-12-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分29分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-11-11 22:50
这种信息应该在注册表或什么地方能取到才对呀?
在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USBSTOR/下面
实例名如果驱动作者不做修改的话(即系统默认创建)应该是VID+PID+USB端口三者来实现其名字的唯一性的
你用SetupDiGetDeviceInterfaceDetail做关键字到google上去搜,还是有不少文章讲这个的,不过大部分是英文,并且有部分提供源代码
欢迎批评指正!
“老婆,快搬个凳子出来,一起看火星来的楼主升天啦!”
游客

返回顶部