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