阅读:1764回复:9
请教下关于U盘控制的两个关键性问题(看了老贴,头晕中~~~)
请教下关于U盘控制的两个关键性问题(看了老贴,头晕中~~~)
翻阅了大部分老贴,关于U盘控制(禁用,只读等控制)依然没有什么清晰的解决思路,因此某些描述也可能不对,希望不要误导新人,XD。 首先第一个问题,在哪里过滤? 通过我翻阅老贴得知成功的例子有 “驱动小妹” 的 “U盘只读可控制 驱动程序实例” http://bbs.driverdevelop.com/read.php?tid-104501-keyword-%D6%BB%B6%C1.html 已经其关键代码 更早的 “zhjie374” 的 “共享我写的一个USB过滤驱动,实现U盘只读控制” http://bbs.driverdevelop.com/read.php?tid-90057-keyword-%D6%BB%B6%C1.html 这两位前辈都是用的 ddk中toaster/filter程序为原形 原理就是过滤相应的IRP_MJ_SCSI。 最后的结果就是一个 加载到USBSTOR的LowerFilters 。 给我的感觉这样做貌似已经不属于文件系统过滤驱动了吧,个人觉得这属于设备过滤驱动了,都已经是在和SCSI总线驱动交换数据了。 所以我在想能否使用 DDK中的filesys\filter\sfilter为原形开发呢?因为这个比较熟悉点 呵呵 可以通过过滤拦截 IRP_MJ_CREATE等IRP 来实现禁用呢?还可以把禁用分为“不可浏览目录”与“可浏览目录但无法读写” (笑) 以上两种方法都涉及到第二个问题,怎么判断过滤的是U盘(或者称为移动存储设备) “zhjie374”前辈貌似没有说明这个问题,按照我对“zhjie374”前辈描述的猜测,如果驱动成功加载到USBSTOR的LowerFilters下,那么就只有U盘会加载这个驱动 但是按照“驱动小妹”前辈的例子,根据本人的测试,以及参照其余一些前辈的帖子后发现,挂接到USBSTOR的LowerFilters会引起重启系统时BSOD,因为我也是菜鸟,无法理解其原因,但是看见有前辈提出,这样做即便本地磁盘也会加载这个驱动,于是BSOD 如果是在 filesys\filter\sfilter为原形下开发,那么怎么判断是U盘呢? 想了两条路: 1.笨笨的方法:将驱动加载到所有卷上,然后判断是U盘加载卷的时候(准确的说应该是加载完成后),记录下对应的“盘符”(或者说“卷名”)。过滤IRP时判断是否是相应卷上的操作,如果是则拦截,不是则放行。 2.理想的方法:在驱动加载到卷上的时候,就判断这个卷对应的物理设备是否是U盘,是则加载,否则不加载。 关于这两个思路,对于第一个,我觉得可以在应用层得到U盘的插入事件,但是有两个问题:首先就是效率问题,明明不用过滤本地磁盘,还加载到本地磁盘的卷上显得太笨笨了。然后就是安全问题,因为应用层收到U盘插入设备的时候,卷已经加载完毕,可以正常读写,那么在这其中就可能造成本来应该禁用的U盘有段时间是可访问的。 于是提出第二的思路,但是可惜没有找到相应的示例,当然也考虑其实这是个错误的方法,因为既然是文件系统,那就应该屏蔽了下层的硬件介质,不过是否有更好的办法呢? 比如围绕USBSTOR编写驱动,在U盘加载设备驱动的时候就开始跟踪,做好标示,然后在加载文件系统的时候识别标示,再决定是否加载过滤驱动? 希望有前辈能指点一二,最希望的是能说明下应该查阅IFS Kit Documentation的哪个部分?因为平时都不知道怎么用IFS Kit Documentation,觉得不知如何下手查阅,有种身在宝山空手归的感觉 T_T。 |
|
沙发#
发布于:2008-06-29 21:13
简化下问题吧 =。=
请教各位前辈,如何在文件系统过滤驱动绑定到“卷”的时候检测该卷对应的物理设备时候为“移动存储设备”? |
|
板凳#
发布于:2008-07-01 09:17
为什么不用磁盘过滤驱动?
|
|
地板#
发布于:2008-07-01 12:09
|
|
|
地下室#
发布于:2008-07-01 16:11
引用第2楼pandaforum于2008-07-01 09:17发表的 : 感谢前辈的回复 磁盘过滤驱动? er... 我属于菜鸟啊,不知道前辈说的是哪一层的驱动,在DDK里面的示例是哪个? ![]() 我只知道有 文件系统过滤驱动 和 设备过滤驱动 当然还有 总线过滤驱动 ![]() |
|
5楼#
发布于:2008-07-01 16:18
引用第3楼emissary于2008-07-01 12:09发表的 : 非常非常感谢前辈的指导 我昨天搜索到这两个页面的 ^_^ 目前使用的是判断 StorageDeviceobject-> NextDeviceObject->Characteristics 的方法 但是不知道会不会有错判的情况 因为据说某些移动硬盘上的分区,会识别为本地磁盘分区,不知道这个方法有没有问题。(貌似叫 fix 模式?) 然后第二个发送IRP查询的方法。。。 BOSD中。。。。 同样也想请问下前辈有没有错判的可能? 比如SD卡(这个一般都是USB读卡器,但是也见过PCMCIA借口的) PCMCIA硬盘(貌似PCMCIA不是USB总线吧) 什么的应该也需要考虑到吧 搞定这个问题也好写篇总结贴 帮助下比我还菜的菜鸟 哈哈 |
|
6楼#
发布于:2008-07-02 09:13
我用的是diskperf.我觉得既然是要过滤U盘,应该往底层过滤一下,文件系统里面要考虑的东西太多.给你一篇文章参考一下,我无意中搜索到的,希望对你有帮助,http://www.xllw.cn/n1685c51.aspx
|
|
7楼#
发布于:2008-07-02 12:10
引用第6楼pandaforum于2008-07-02 09:13发表的 : en 感谢前辈提供的资料 我在文件系统过滤驱动层次过滤,是考虑到基于文件系统可以降低开发某些功能的难度(比如日志,更多的权限划分)。 在usbstor的下层,事实上我们处理的是发往USB总线(不知道这里说错没有)的SCSI指令。如果只是处理SCSI指令,将与我们常见的文件系统有很大程度上区别。比如在SCSI指令中,我们只能知道去读的簇,而不知道是读的具体文件是哪个(这里也是推测,不知道说错没有)。 当然如果仅仅是单向控制,在设备过滤器驱动中完成肯定要简单不少。 关于这篇帖子一开始提出的问题已经解决,具体的代码在 http://bbs.driverdevelop.com/htm_data/39/0807/112042.html 中 |
|
8楼#
发布于:2008-07-02 13:00
|
|
|
9楼#
发布于:2008-07-02 13:28
呵呵
目前正在研究 filespy 框架 学习用户态和内核态的通信方式 |
|