Coder
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2011-03-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望34点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:5859回复:32

在Sfilter的mount例程中识别USB 存储设备?

楼主#
更多 发布于:2005-06-20 22:41
  我基于Sfilter的例子进行调试,在SfFsControlMountVolume例程中能够捕获磁盘的mount的消息,根据DeviceObject->DeviceType可以区分开光驱设备和磁盘设备,但是不能分辨出本地磁盘和USB磁盘,因为它们的类型都是0x00000008,即disk类型,请教各位高手,如何才能分辨出是本地磁盘还是USB磁盘?谢谢

最新喜欢:

likepslikeps
joshua_yu
驱动小牛
驱动小牛
  • 注册日期2004-12-06
  • 最后登录2010-12-01
  • 粉丝0
  • 关注0
  • 积分428分
  • 威望54点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-21 08:40
这个问题我也在关注。可以在应用层识别USB设备,可是怎么在驱动层识别呢?哪位大侠给个说法。
neusoftrhl
驱动牛犊
驱动牛犊
  • 注册日期2005-03-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-21 09:01
关注中
classfree
驱动小牛
驱动小牛
  • 注册日期2004-05-23
  • 最后登录2019-01-06
  • 粉丝1
  • 关注1
  • 积分873分
  • 威望276点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-02-02 20:51
强烈关注中 ......
低调点!
etjon
驱动牛犊
驱动牛犊
  • 注册日期2004-09-19
  • 最后登录2008-04-22
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望11点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-02-04 00:57
我最近使用一種方法來解決這個問題,應為在應用層可以辯視USB的裝置,只要一檢查到是屬於這種裝置,即告知底層是那個磁碟機代碼如 F: or G: 等,然後再底層判斷只要是 F: or G:即不處理,這樣即可解決這個問題,目前使用這個方法可行度為 100% ,在 Vista 也試過是 OK 的加油各位,而不在 sfilter 中的mount 中去做這個,如果可以當然請分享一下謝謝~~~
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-02-04 14:58
我到是有个办法,不知道各位认可吗.

也就是在sfcreate中判断路径

如果是\device\handdiskvolume1\DP(1)0-0-8\a.txt之类的。。
DP(1)0-0-8类似这样的一定是一个USB设备。

但是问题在于可能存在这样一个文件夹
classfree
驱动小牛
驱动小牛
  • 注册日期2004-05-23
  • 最后登录2019-01-06
  • 粉丝1
  • 关注1
  • 积分873分
  • 威望276点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-02-05 10:07
引用第4楼etjon2007-02-04 00:57发表的“”:
我最近使用一種方法來解決這個問題,應為在應用層可以辯視USB的裝置,只要一檢查到是屬於這種裝置,即告知底層是那個磁碟機代碼如 F: or G: 等,然後再底層判斷只要是 F: or G:即不處理,這樣即可解決這個問題,目前使用這個方法可行度為 100% ,在 Vista 也試過是 OK 的加油各位,而不在 sfilter 中的mount 中去做這個,如果可以當然請分享一下謝謝~~~



这个方法不错!
低调点!
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2007-02-05 20:50
判断是
\device\handdiskvolume1
还是
\device\handdisk1

解析
\device\handdisk1\DP(1)0-0+8

如果是上面的.

则是usb设备

实践通过.可以认出手机设备.移动存储卷.等...

很好用的
classfree
驱动小牛
驱动小牛
  • 注册日期2004-05-23
  • 最后登录2019-01-06
  • 粉丝1
  • 关注1
  • 积分873分
  • 威望276点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2007-02-05 22:29
引用第7楼liio2007-02-05 20:50发表的“”:
判断是
devicehanddiskvolume1
还是
devicehanddisk1

.......



我想请问一下, MP3, 手机, 移动硬盘, 设备名字分别是什么?
低调点!
bladellz
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望121点
  • 贡献值0点
  • 好评度120点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-02-06 09:38
我到是有个办法,不知道各位认可吗.

也就是在sfcreate中判断路径

如果是\device\handdiskvolume1\DP(1)0-0-8\a.txt之类的。。
DP(1)0-0-8类似这样的一定是一个USB设备。

---------------------------------------------------------------------

这个方法有问题,不推荐。判断总线设备(bus type)
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2007-02-06 17:37
devicehanddisk1是移动设备.

判断总线确实很爽。总得来说方法很多的

我认为devicehanddisk1这种可以用在要求不高但效率要求高的场合。
classfree
驱动小牛
驱动小牛
  • 注册日期2004-05-23
  • 最后登录2019-01-06
  • 粉丝1
  • 关注1
  • 积分873分
  • 威望276点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2007-02-06 20:01
引用第9楼bladellz2007-02-06 09:38发表的“”:
我到是有个办法,不知道各位认可吗.

也就是在sfcreate中判断路径

如果是devicehanddiskvolume1DP(1)0-0-8a.txt之类的。。
.......



我怎么在读取U盘时得到的路径和硬盘路径一样的呢, 都是标准格式:
\Device\HanddiskVolume4\1.txt
低调点!
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
12楼#
发布于:2007-02-11 10:56
哈哈.所以说这个方法不保险.
只能用于特定的设备.
classfree
驱动小牛
驱动小牛
  • 注册日期2004-05-23
  • 最后登录2019-01-06
  • 粉丝1
  • 关注1
  • 积分873分
  • 威望276点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2007-02-23 10:35
引用第12楼liio2007-02-11 10:56发表的“”:
哈哈.所以说这个方法不保险.
只能用于特定的设备.



如何判断总线?
低调点!
classfree
驱动小牛
驱动小牛
  • 注册日期2004-05-23
  • 最后登录2019-01-06
  • 粉丝1
  • 关注1
  • 积分873分
  • 威望276点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2007-02-28 11:06
各位老大, 说下判断总线类型的嘛??
低调点!
highlandear
驱动牛犊
驱动牛犊
  • 注册日期2006-11-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分140分
  • 威望15点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-03-02 10:34
我在应用层上用判断总线的方法搞定了,然后就进行了一次能信,写到了动里。没有在驱动里直接做,如果需要的话,我有代码,不过,不是原创的。。。。
乘风破浪会有时,直挂云帆济沧海
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
16楼#
发布于:2007-03-02 10:51
我在本版帖过应用层的代码,判断总经理类型.

其实给设备发一个ioctl就可以知道总线类型
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
youngwinter
驱动牛犊
驱动牛犊
  • 注册日期2004-08-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分363分
  • 威望39点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
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;
}
youngwinter
驱动牛犊
驱动牛犊
  • 注册日期2004-08-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分363分
  • 威望39点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-03-05 20:10
顺便说一下,BusType=3是一般硬盘,BusType=7是USB接口设备,不过在VMWare下测试的时候获得的U盘总线类型是很奇怪的大数,让我一度以为代码哪里出错了。
classfree
驱动小牛
驱动小牛
  • 注册日期2004-05-23
  • 最后登录2019-01-06
  • 粉丝1
  • 关注1
  • 积分873分
  • 威望276点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2007-03-06 23:21
不错, 不错!
   
低调点!
上一页
游客

返回顶部