阅读:2306回复:19
!!!,看了很多帖子,没有明确的答复,各位老大应该回答这个问题了,免得大家走弯路,哪怕是给条路径也行啊!!!
USBVIEW里面只是得到的信息:
1、某个U盘插在Hub的哪个端口 2、Hub上USB设备的信息,如PID,VID等信息 这个USB设备如果是U盘,在系统里应该会分配一个盘符,USB View里没有去寻找盘符。 怎么找盘符????看了很多帖子,有些说的不清,有些根本没有理解怎么回事,真是觉得微软太恶心了,这种信息应该在注册表或什么地方能取到才对呀。 [编辑 - 10/25/04 by netskiff] [编辑 - 10/25/04 by netskiff] |
|
最新喜欢:![]() |
沙发#
发布于:2004-10-25 16:13
注册表里确实有相关信息,如果你得到的话也可以找到对应盘符,你在2000下还是98下?2000下可以通过GUID得到盘的名称信息,然后根据名称信息去得到盘符.98下我还没找到方法.虽然看见注册表也有类似盘的名称信息的东东,但是通过程序我得不到,打算直接枚举注册表,看能不能实现.
|
|
|
板凳#
发布于:2004-10-25 16:20
不好意思,刚刚看了你的另外一个帖子,发现你其实想得到的是同时兼有VID\PID和盘符信息,我现在只能单独得到VID\PID或者单独得到盘符,用不同的GUID,不过对应不起来某个VID\PID的盘符是什么,曾经有一个人在他的帖子中说他做到了,通过VID等信息去找到了对应的盘符,呵呵,我就只看到这么一个人说他做好了.不过据他说很复杂,通过了很多关联才找到的,可惜的是这位大哥不愿意共享代码和方法,说是公司机密.
|
|
|
地板#
发布于:2004-10-25 17:28
通过PID VID信息是不能找到对应盘符的,因为存在一种情况:
两个PID VID一样的U盘,插入系统,系统通过不同的盘符访问它们。 猜测:PID VID不能唯一标识一个U盘,还必须加上HUB的端口才行, 不知道系统是不是这样对应盘符的? 另外,一个U盘有可能有好几个分区,U盘与盘符是一对多的关系, 我想系统应该有相应的接口获取这些信息。 [编辑 - 10/25/04 by netskiff] |
|
地下室#
发布于:2004-10-25 17:37
cecily, 谢谢你。
|
|
5楼#
发布于:2004-10-25 17:41
MSDN特难看懂,又没有源代码,linux的文档也不好看,
但有源代码就好多了,大不了一步一步追下去啦。 [编辑 - 10/25/04 by netskiff] |
|
6楼#
发布于:2004-10-25 22:22
cecily姐姐往往能救人于危机之中,好人啊!!!
|
|
7楼#
发布于:2004-10-27 14:30
看书中。。。。。
|
|
8楼#
发布于:2004-10-27 16:21
vid和pid确实不是唯一标记,不过从U盘来说(我是做这个的,别的USB设备不知道),在硬件中一般会有一些支持信息,可以唯一标识一个U盘,如果硬件中没有的话,那么操作系统就不会同时识别这两个vid和pid相同的U盘了。呵呵……不过这个和我们要讨论的东东关系不大。
|
|
|
9楼#
发布于:2004-10-27 16:24
wozhuce,呵呵,你太过奖啦,其实我在这方面也是一个新手,到现在这家公司才开始接触U盘的东西的,我们要互相学习,呵呵……
|
|
|
10楼#
发布于:2004-10-27 17:24
我看可能是U盘的系列号,它是唯一的
|
|
11楼#
发布于:2004-10-27 20:49
cecily虽然看起来是新手,其实很厉害呀,刚上论坛就显得功力深厚啊,佩服!佩服!
|
|
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... |
|
13楼#
发布于:2004-11-02 20:35
呵呵,不用谢啦,大家都是互相交流而已,都希望能找到最终的解决方法。你说的这个我也是不太明白他说的得到所有卷是怎么做的,不是很清楚。
|
|
|
14楼#
发布于:2004-11-02 20:37
对了,zblaoshu,你在csdn上的名字叫zblaoshu(周博)是不?呵呵,你回过我的帖子。
|
|
|
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的程序员不至于留下这每一个“接口”来获取对应关系。 是不是有哪个文件系统放面的驱动程序有这类信息,并提供接口来获得呢? |
|
16楼#
发布于:2004-11-05 11:40
好几天没来,奇怪为什么我不能加分了(没有这个按钮),提示没有登陆,可我都重复登陆了好几次了,一进这个贴子就说没有登陆。
|
|
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] |
|
18楼#
发布于:2004-11-11 17:45
我也不太清楚了,只是ddk里有一个例子,spti,你去看看,又没有你要的东西。
|
|
19楼#
发布于:2004-11-11 22:50
这种信息应该在注册表或什么地方能取到才对呀?
在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USBSTOR/下面 实例名如果驱动作者不做修改的话(即系统默认创建)应该是VID+PID+USB端口三者来实现其名字的唯一性的 你用SetupDiGetDeviceInterfaceDetail做关键字到google上去搜,还是有不少文章讲这个的,不过大部分是英文,并且有部分提供源代码 欢迎批评指正! |
|
|