阅读:6166回复:25
怎样根据U盘的设备路径得到盘符???
我使用a5dcbf10-6530-11d2-901f-00c04fb951ed这个GUID得到了U盘的设备路径,但是用这个设备路径作为CreateFile的参数得到一个HANDLE为0x0000077c,把这个HANDLE做参数给DeviceIOControl结果是不支持请求,但是通过盘符作为CreateFile的参数得到的HANDLE也为0x0000077c,做参数给DeviceIOControl可以得到正确结果。请问我现在想从设备路径得到对应的盘符该怎么得到????
[编辑 - 10/9/04 by cecily] |
|
最新喜欢:zxwits...
|
沙发#
发布于:2004-10-09 08:39
通过guid无法得到盘符,不过可以用其他的方法
for( TCHAR cLetter = _T('C'); cLetter <= _T('Z'); cLetter++ ) { CString sDrive (cLetter); sDrive += _T(":\\"); if(GetDriveType(sDrive)==DRIVE_REMOVABLE) { m_UDisk=sDrive; //MessageBox(m_UDisk,"udisk:",0); break; } } 前提是你没有移动硬盘存在. 问你一下,你通过盘符createfile,然后再DeviceIoControl是怎么成功的?能发代码发给我看看吗?谢谢 |
|
板凳#
发布于:2004-10-09 09:02
我想 应该用SetupDiGetDeviceInterfaceDetail函数得到
|
|
|
地板#
发布于:2004-10-09 09:08
1楼的谢谢,不过你说的这个方法我用过,但在将U盘格式化成硬盘形式时,就找不到了,因为你这个方法得到的盘会被判断成硬盘而不是U盘。所以必须用别的方法来实现。你想知道的是分两步,一步通过盘符来createfile得到一个句柄,二步把这个句柄传给DeviceIoControl就可以了,我这里就是这么实现的。
[编辑 - 10/10/04 by cecily] |
|
|
地下室#
发布于:2004-10-09 12:08
createfile打开盘符以后,再用DeviceIoControl进行I/O操作,DeviceIoControl的第二个参数你是用的Scsi指令吗?我用Scsi指令老是返回0.也就是老是失败:(
|
|
5楼#
发布于:2004-10-09 12:30
a5dcbf10-6530-11d2-901f-00c04fb951ed
u盘和硬盘的GUID一样吗? 符号连接名一样吗? 我想应该可以区分开来 |
|
|
6楼#
发布于:2004-10-09 15:53
我使用a5dcbf10-6530-11d2-901f-00c04fb951ed这个GUID得到了U盘的设备路径,但是用这个设备路径作为CreateFile的参数得到一个HANDLE为0x0000077c,把这个HANDLE做参数给DeviceIOControl结果是不支持请求,但是通过盘符作为CreateFile的参数得到的HANDLE也为0x0000077c,做参数给DeviceIOControl可以得到正确结果。请问我现在想从设备路径得到对应的盘符该怎么得到???? 用这个GUID:53f56307-b6bf-11d0-94f2-00a0c91efb8b,不要用a5dcbf10-6530-11d2-901f-00c04fb951ed,具体是为什么我也不知道,还请高手们指点。用前一个GUID会把你电脑中的所有物理硬盘都找出来,哪个是U盘还要自己想办法区分。 另外,我认为CreateFile得到的HANDLE是系统随机分配的一个数值,不同环境下同一设备的handle可能是不同的值,所以去看handle的值是否相同是没有意义的。 |
|
7楼#
发布于:2004-10-09 22:16
fgf1014兄,我用的是2k系统,你说的两个GUID我怎么都没找到阿,你能告诉我它怎么找吗?另外,我在注册表中看到{{36FC9E60-C465-11CF-8056-444553540000}很像U盘GUID,但是我用它时,SetupDiGetClassDevs返回错误87。希望能得到大虾的指点!非常感谢!
|
|
8楼#
发布于:2004-10-10 10:25
zxwitsme,我用的参数是IOCTL一类的。
snowStart,U盘的GUID应该和硬盘的不同的,不过我说的分不出来是说的用GetDriveType这个函数在我把U盘格式化成硬盘形式时,这个函数会把U盘判断成硬盘。 fgf1014,你说的这个GUID不能得到U盘的VID和PID,这个GUID得到的设备路径中不包括这个信息的。我现在麻烦的就是要同时得到VID和能打开设备的句柄(给DeviceIoControl用)。 wozhuce,fgf014说的这个GUID在系统中是有的,我也找到了,这个GUID可以得到盘的名称等等信息,fgf1014说的没错。你找到的这个{{36FC9E60-C465-11CF-8056-444553540000}GUID是表示USB一类设备的,要用来获得盘的信息好象是不行的,如果你要得到VID、PID就用我说的那个,如果你要得到盘的一些名称信息就用fgf1014的那个。你在注册表中搜索一下应该能找到的。我说的在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{a5dcbf10-6530-11d2-901f-00c04fb951ed},fgf1014说的在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b} |
|
|
9楼#
发布于:2004-10-10 10:28
目前我暂时用我说的GUID得到VID,用fgf1014提到的那个得到设备句柄,但是这样并不能保证能对应起来,如果电脑上不只一个U盘的话,就没办法确定谁是谁了,最好是能用一个GUID怎么获得这两种信息,才能保证取到的确实是同一个U盘的信息。
|
|
|
10楼#
发布于:2004-10-10 14:37
cecily兄,你好,非常感谢你的指点,刚才看来是我找错地方了。谢谢你的指点!
|
|
11楼#
发布于:2004-10-10 14:59
{a5dcbf10-6530-11d2-901f-00c04fb951ed}应该就是U盘的GUID,而{53f56307-b6bf-11d0-94f2-00a0c91efb8b}则是硬盘的GUID,之所以用后者也能找到U盘,是因为把U盘当做了普通的硬盘。用前一个GUID得到HANDLE后调用DeviceIOControl会出错,我想应该还是在打开USB时哪个地方不对,我还没有搞清楚。哪位仁兄搞定了请share一下,谢谢!!!
|
|
12楼#
发布于:2004-10-10 17:24
wozhuce,我不是“兄”,是姐,呵呵*^_^*
fgf1014,用{53f56307-b6bf-11d0-94f2-00a0c91efb8b}是可以得到硬盘和U盘的路径的,两者都可以得到,而且,如果你用这个GUID得到的路径,然后用createfile来得到设备句柄调用DeviceIOControl就不会出错。如果你要调用DeviceIOControl,可以用{53f56307-b6bf-11d0-94f2-00a0c91efb8b}来得到设备句柄。具体原因我不是特别清楚,但是猜想可能是因为{53f56307-b6bf-11d0-94f2-00a0c91efb8b}是针对磁盘的GUID,被系统作为盘符一类的东东,而{a5dcbf10-6530-11d2-901f-00c04fb951ed}更底层一点,用DeviceIOControl的参数是不能直接操作的。 |
|
|
13楼#
发布于:2004-10-10 17:33
现在又有新问题了,win98下得到的设备路径中没有vid信息,该怎么得到设备的vid???
|
|
|
14楼#
发布于:2004-10-10 18:00
楼主你好,你是用53f56307-b6bf-11d0-94f2-00a0c91efb8b得到U盘Handle然后操作的吗?
你所用的ioctl是指IOCTL_SCSI_PASS_THROUGH这类scsi指令吗? 搞了个把月和U盘通信了,还没搞好,准备采用其他的方式了,555 |
|
15楼#
发布于:2004-10-11 08:15
cecily姐,哈哈,罪过!罪过!。。。很是抱歉啊!你说的哪个GUID确实管用,非常感谢!
|
|
16楼#
发布于:2004-10-11 09:24
请问楼主姐姐,guid 是在哪里查询到的 ??我现在有个usb的modem已经安装了驱动,我怎么才能查到它属于的guid呢
|
|
17楼#
发布于:2004-10-11 10:23
zxwitsme,我是用的你说的这种方法,可以得到的,如果你单是要得到可以操作U盘的句柄的话,其实用盘符来得到最简单,而且管用,呵呵……我原来就是用盘符得到句柄的,不过现在因为要得到别的信息才用这些方法。
yuanyuan0101,你看我发的第三贴,GUID可以在注册表中找到,具体的GUID要看你需要什么样的信息,要用相应的GUID,不同的信息可能需要不同的GUID才能得到,我的第三帖中提到了两个GUID,里面包含了注册表中所在的路径,你到这些路径下去找就可以找到了,内容如下: [wozhuce,fgf014说的这个GUID在系统中是有的,我也找到了,这个GUID可以得到盘的名称等等信息,fgf1014说的没错。你找到的这个{{36FC9E60-C465-11CF-8056-444553540000}GUID是表示USB一类设备的,要用来获得盘的信息好象是不行的,如果你要得到VID、PID就用我说的那个,如果你要得到盘的一些名称信息就用fgf1014的那个。你在注册表中搜索一下应该能找到的。我说的在HKEY_LOCAL_MACHINESYSTEMControlSet001ControlDeviceClasses{a5dcbf10-6530-11d2-901f-00c04fb951ed},fgf1014说的在HKEY_LOCAL_MACHINESYSTEMControlSet001ControlDeviceClasses{53f56307-b6bf-11d0-94f2-00a0c91efb8b}] |
|
|
18楼#
发布于:2004-10-11 11:08
谢谢楼主,,我是找到我usb modem的 guid了,可是把它用在 SetupDiEnumDeviceInterfaces中的返回值是 0,错误是:因为找不到该设备,为什么呢》我查到的的guid是4D36E96D-E325-11CE-BFC1-08002BE10318
|
|
19楼#
发布于:2004-10-11 11:36
楼主姐姐,其实我是想用CreateFile来打开usb modem,可是它的第一个参数,我无法获取,,因为找不到它的路径,
|
|
上一页
下一页