阅读:5859回复:32
在Sfilter的mount例程中识别USB 存储设备?
我基于Sfilter的例子进行调试,在SfFsControlMountVolume例程中能够捕获磁盘的mount的消息,根据DeviceObject->DeviceType可以区分开光驱设备和磁盘设备,但是不能分辨出本地磁盘和USB磁盘,因为它们的类型都是0x00000008,即disk类型,请教各位高手,如何才能分辨出是本地磁盘还是USB磁盘?谢谢
|
|
最新喜欢:likeps |
沙发#
发布于:2005-06-21 08:40
这个问题我也在关注。可以在应用层识别USB设备,可是怎么在驱动层识别呢?哪位大侠给个说法。
|
|
板凳#
发布于:2005-06-21 09:01
关注中
|
|
地板#
发布于:2007-02-02 20:51
强烈关注中 ......
|
|
|
地下室#
发布于:2007-02-04 00:57
我最近使用一種方法來解決這個問題,應為在應用層可以辯視USB的裝置,只要一檢查到是屬於這種裝置,即告知底層是那個磁碟機代碼如 F: or G: 等,然後再底層判斷只要是 F: or G:即不處理,這樣即可解決這個問題,目前使用這個方法可行度為 100% ,在 Vista 也試過是 OK 的加油各位,而不在 sfilter 中的mount 中去做這個,如果可以當然請分享一下謝謝~~~
|
|
5楼#
发布于:2007-02-04 14:58
我到是有个办法,不知道各位认可吗.
也就是在sfcreate中判断路径 如果是\device\handdiskvolume1\DP(1)0-0-8\a.txt之类的。。 DP(1)0-0-8类似这样的一定是一个USB设备。 但是问题在于可能存在这样一个文件夹 |
|
6楼#
发布于:2007-02-05 10:07
引用第4楼etjon于2007-02-04 00:57发表的“”: 这个方法不错! |
|
|
7楼#
发布于:2007-02-05 20:50
判断是
\device\handdiskvolume1 还是 \device\handdisk1 解析 \device\handdisk1\DP(1)0-0+8 如果是上面的. 则是usb设备 实践通过.可以认出手机设备.移动存储卷.等... 很好用的 |
|
8楼#
发布于:2007-02-05 22:29
引用第7楼liio于2007-02-05 20:50发表的“”: 我想请问一下, MP3, 手机, 移动硬盘, 设备名字分别是什么? |
|
|
9楼#
发布于:2007-02-06 09:38
我到是有个办法,不知道各位认可吗.
也就是在sfcreate中判断路径 如果是\device\handdiskvolume1\DP(1)0-0-8\a.txt之类的。。 DP(1)0-0-8类似这样的一定是一个USB设备。 --------------------------------------------------------------------- 这个方法有问题,不推荐。判断总线设备(bus type) |
|
10楼#
发布于:2007-02-06 17:37
devicehanddisk1是移动设备.
判断总线确实很爽。总得来说方法很多的 我认为devicehanddisk1这种可以用在要求不高但效率要求高的场合。 |
|
11楼#
发布于:2007-02-06 20:01
引用第9楼bladellz于2007-02-06 09:38发表的“”: 我怎么在读取U盘时得到的路径和硬盘路径一样的呢, 都是标准格式: \Device\HanddiskVolume4\1.txt |
|
|
12楼#
发布于:2007-02-11 10:56
哈哈.所以说这个方法不保险.
只能用于特定的设备. |
|
13楼#
发布于:2007-02-23 10:35
引用第12楼liio于2007-02-11 10:56发表的“”: 如何判断总线? |
|
|
14楼#
发布于:2007-02-28 11:06
各位老大, 说下判断总线类型的嘛??
|
|
|
15楼#
发布于:2007-03-02 10:34
我在应用层上用判断总线的方法搞定了,然后就进行了一次能信,写到了动里。没有在驱动里直接做,如果需要的话,我有代码,不过,不是原创的。。。。
|
|
|
16楼#
发布于:2007-03-02 10:51
我在本版帖过应用层的代码,判断总经理类型.
其实给设备发一个ioctl就可以知道总线类型 |
|
|
17楼#
发布于:2007-03-05 20:05
试了一下,用IoBuildDeviceIoControlRequest向下层存储设备的DeviceObject发送一个代码为IOCTL_STORAGE_QUERY_PROPERTY的IRP_MJ_DEVICE_IO_CONTROL的Irp能获取到。
代码示例: ULONG GetStorageDeviceBusType(IN PDEVICE_OBJECT DeviceObject) { PIRP NewIrp; PSTORAGE_DEVICE_DESCRIPTOR Descriptor; STORAGE_PROPERTY_QUERY Query; CHAR Buffer[BUFFER_SIZE]; KEVENT WaitEvent; NTSTATUS Status; IO_STATUS_BLOCK IoStatus; // first set the query properties Query.PropertyId = StorageDeviceProperty; Query.QueryType = PropertyStandardQuery; // initialize the waitable event KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE); // we should build the query irp ourselves NewIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, DeviceObject, (PVOID)&Query, sizeof(Query), (PVOID)Buffer, NAME_BUFFER_SIZE, FALSE, &WaitEvent, &IoStatus); if (NULL == NewIrp) // can't create new irp { DbgPrint("[%s] [%u] I can't create a new irp to query the property of device (%p)!\n", __FILE__, __LINE__, DeviceObject); return BusTypeUnknown; } // send this irp to the storage device Status = IoCallDriver(DeviceObject, NewIrp); if (Status == STATUS_PENDING) { Status = KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL); Status = IoStatus.Status; } if (!NT_SUCCESS(Status)) { DbgPrint("[%s] [%u] Query IOCTL_STORAGE_QUERY_PROPERTY of device (%p) failed, Status=0x%08X!\n", __FILE__, __LINE__, DeviceObject, Status); return BusTypeUnknown; } Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)Buffer; return Descriptor->BusType; } |
|
18楼#
发布于:2007-03-05 20:10
顺便说一下,BusType=3是一般硬盘,BusType=7是USB接口设备,不过在VMWare下测试的时候获得的U盘总线类型是很奇怪的大数,让我一度以为代码哪里出错了。
|
|
19楼#
发布于:2007-03-06 23:21
不错, 不错!
|
|
|
上一页
下一页