我需要U盘的VID\PID来进行一些操作,现在已经得到了一个U盘的设备路径,提取了它的VID\PID,但是之后通过设备路径用createfile得到的设备句柄,做参数给DeviceIoControl要出现不支持的请求的错误,而直接通过盘符用createfile得到的设备句柄,做参数给DeviceIoControl就可以正常执行,两个句柄都是0x0000077c,所以想将一个U盘的盘符和VID\PID都得到,但是现在出现只得到盘符得不到VID\PID的情况,换用另外一种方法又只能得到VID\PID得不到对应盘符,我目前得到了U盘的设备路径,不知道该怎么得到对应的盘符???或者,从盘符该怎么得到对应的VID\PID????
解决方案 »
- WaitForMultipleObjects的第一个参数可以是比数组小的数吗?
- directshow录制视频明明录了十分钟,为什么视频只有9.5分钟?
- 请问如何将BSTR类型转化为char[]类型的
- 透明Bitmap的实现
- 请教:VC的MDI中有多种子窗口,想在其中一种子窗口打开时,禁止任何方法切换到其它子窗口。有什么好办法?
- 请教:请各位大哥帮我看看下面几个(directx)问题,谢谢!
- 自己用VC写了一个多媒体播放软件,怎样发布啊?
- 如何在MFC的应用程序界面上添加验证码?
- 急,急,急 异步数据触发机制问题,没思路了,请大家提个醒,在线等.....
- 用属性可以看文件的创建时间和修改时间等,我一直认为这些信息是记录在文件头里的,可是我创建了一个空的文件他仍然可以看到这些信息,那么到底这些信息被写在那里了呢!??
- 安装程序
- EditBox里面的内容可以分段设置颜色吗?
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盘设备对象对应起来,不过我想可能会有问题,因为文件系统跟高速缓存直接挂钩,可能会出现操作不同步的问题...............
2 ObReferenceObjectByHandle通过步骤1得到的句柄得到设备对象
3 用SetupApi通过GUID得到USB设备连接名
4 ZwCreateFile打开设备
5 ObReferenceObjectByHandle通过步骤1得到的句柄得到设备对象
对比两次得到的设备对象是否相同
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=193595
要是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)就能得到该卷对应的盘符,进一步可以得到,一个物理磁盘所有卷的盘符。
[email protected]