转载: 循序渐进学Minifilter(微过滤器) 之 一 (开篇)

来源:互联网 发布:淘宝网域名是什么 编辑:程序博客网 时间:2024/06/11 04:21

original url from : http://bbs3.driverdevelop.com/read.php?tid-110761.html


—本帖被 znsoft 设置为精华(2008-04-27)—
<a href="http://ads.zndev.com/adclick.php?n=acc8df86" _xhe_href="http://ads.zndev.com/adclick.php?n=acc8df86" target="_blank"><img src="http://ads.zndev.com/adview.php?what=zone:40&n=acc8df86" _xhe_src="http://ads.zndev.com/adview.php?what=zone:40&n=acc8df86" border="0" alt=""/></a>
--------------------------------------------------------------------
循序渐进学Minifilter(微过滤器) 之 一 (开篇)
--------------------------------------------------------------------

驱网的朋友大家好,我是devia,为了活跃论坛气氛,我打算把我的检验和大家分享,实在不愿意看到太多人走老路,问老题!所以,我打算分几个章节从实际应用的角度来讲述Minifilter模型,从开发环境搭建到最终形成一个小而可重用的Minifilter开发模型,并利用这个模型来开发一个简单的透明加解密的微型过滤器。今天就算是滥竽充数的第一章吧,找找手感,呵呵!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

在开始我们的学习之前我先分享下自己的学习方法:先搜后问,勤学多练!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

提起Minifilter大家可能都已经非常熟悉了,它是Microsoft极力推荐的一种新型
过滤器模型,不过谈及Minifilter模型我们就不得不提逻辑过滤器模型
(Logical Filter),逻辑过滤器模型是一种比较古老的模型,它经历过从FileMon
到Sfilter的漫长历程,直到今天它仍然在发挥着它的巨大作用,从两者的对比上来看,
我根据个人的经验总结出了以下特点:

-Minifilter模型相对Logical Filter模型具有更好的兼容性,我所谈的兼容性不单单指
  在和其它Filter共处时的兼容性,它更多的是对Windows后续版本的兼容性,毕竟它是
  Microsoft目前推广的过滤器模型,我想在很长一段时间不用担心它会被Microsoft遗弃!

  在谈到兼容性时我们不得不谈的一个话题是,在开发我们的过滤器时如何避免和其它产品的
  过滤器冲突呢?这确实是一个让人恼火的话题,我记得我刚用Sfilter框架时曾经被杀毒软件
  搞的很无奈!因为这是个综合的问题-不但和自己过滤器的实现细节有关,同时也和其它过滤器
  的实现细节也有很大的关系,比如重入所导致的堆栈溢出,杀毒软件产生的栈文件对象
  (栈文件对象:Stack File Object,顾名思义就是一种临时文件对象,本文后面附有栈文件对象判断的代码片段)
  所导致的下层过滤器访问对象无效等等!所以大家在面对兼容性问题时要摆正一种心态,多Review代码,多分析DUMP文件!

  再者从兼容性的另外一方面讲,Minifilter模型可以完全兼容Sfilter,并且你可以用Minifilter模型
  来写Logical Filter,关于这方面的最好例子就是WDK开发包中Minifilter目录下的cdo工程。

- Minifilter模型相对Logical Filter更易上手。为什么这么说呢?这要从如下几个方面来说明:

  1. 它解决了重入的问题,这是非常重要的(这类接口有:FltCreateFile(Ex),FltReadFile 和 FltWriteFile)。
    有人会说IFS开发包中已经有IoCreateFileSpecifyDeviceObjectHint接口可以解决头痛的重入问题了!我先前也
    曾一度庆幸自己不用再去用复杂的影子设备来解决重入问题了,直到有一天我在Microsoft的网站上发现了这个接口
    原来不支持网络FS,具体现在这个接口如何我已没有兴趣!

  2. 实现了用户态与核心态的双向通讯机制(同步或异步),打破了传统的CDO,共享内存等通讯方式,
    这对需要核心态与用户态交互完成任务的过滤器来说是莫大的好处。

  3. 实现了对上下文(包括Stream,Stream Handle,File,Instance和Volume的上下文)的安全管理。为什么说是安全呢?
    大家对tooflat兄的那个基于Sfilter模型的透明加解密的Demo还记忆犹新吧,其中代码里有一大部分内容是关于文件
    的上下文的跟踪与管理,但是经过我后来在一些商业软件上的尝试才发现这种方式存在不少的问题,比如说:Stream
    的创建并非触发IRP_MJ_CREATE请求,往往会先触发IRP_MJ_CLEANUP、IRP_MJ_CLOSE请求,还有何时释放上下文等
    这些问题是困扰已久的问题,漏过了某些Stream的创建则可能导致计数不正确,过早的释放上下文有可能导致遗漏
    某些请求,释放的过晚则有可能导致大量内存被消耗。虽然目前网络上有人提出了一定的解决方案,但总是不能令人满意!

    对于初学Minifilter模型的朋友可能需要解释下各种不同上下文类型所代表的意思:
    Context - 上下文,其实就是附着在某个对象上的一段数据;
    Stream Context - 流上下文,也就是大家常用的FCB(File Control Block)的上下文,文件和FCB是一对一的关系;
    Stream Handle Context - 流句柄上下文,也就是大家常见的FO(File Object)的上下文,一个文件可以对应多个FO,属一对多关系;
    Instance Context - 实例上下文,也就是过滤驱动在文件系统的设备堆栈上创建的一个过滤器实例;
    Volume Context - 卷上下文,卷就是大家通常看到的C,D,E盘以及网络重定向器,一般情况下一个卷对应一个过滤器实例对象,
                      所以,在实际应用上经常用Instance Context来代替Volume Context;

  5. 简化后的开发接口更加清晰,这一点体现在实例的挂接通知,文件名的获取与分析,上下文的清除通知,屏蔽FASTIO接口以及
    IRP的前、后处理,同步、异步处理机制等上面;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  讲完了Minifilter的特点后,我们再来看看都有哪些Minifilter资料可供参考:

  1. Windows Driver Kits(简称WDK,推荐使用WDK6000版本):http://connect.microsoft.com/
    前提是你得先注册一个Hotmail帐户,这其实就是驱动开发的MSDN。
    我希望以后不要有人再无休止的询问哪里有IFS,哪里有DDK等无聊的问题了!

  2. Minifilter的中文帮助,我认为狂人兄翻译的《Windows文件过滤驱动开发教程(第二版)》是难得一见的中文帮助,
    大家可以在这里下载:http://bbs.driverdevelop.com/htm_data/39/0701/97921.html

  3. Minifilter的官方的参考:http://www.microsoft.com/whdc/driver/filterdrv/default.mspx
    这是官方制作的一些非常好的演讲稿,尤其是它对Minifilter模型开发过程中的重点进行逐一讲述,建议大家详读!

  4. WDK中的Demo代码是再好不过的第一手材料,一定要仔细研究,如果没有这些代码的朋友,可以在下面附件中获得。

  5. 我收集的一些比较好的开发网站:
            OSR(http://www.osronlne.com)
            Codeproject(http://www.codeproject.com)
            RootKit(http://www.rootkit.com)
            看雪(http://bbs.pediy.com)
            驱网^_^(http://bbs.driverdevelop.com)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  好了,今天学习就到这里,如果有错误的地方欢迎大家指正,如果有什么好的建议也可以提出来!在下一节里我打算把开发环境、
Makefile和Minifilter过滤器驱动的安装等相关的东西单独列出一章来进行讲解,谢谢!

//
// 功能: 判断是否是栈文件对象
// FileObject : 文件对象地址
// Return: TRUE - FileObject是栈文件对象;
//        FALSE - 不是栈文件对象;
//
BOOLEAN
MFIsStackFileObject (
    __in PFILE_OBJECT FileObject )
{
    ULONG LowLimit, HighLimit;
    IoGetStackLimits(&LowLimit, &HighLimit);

    if( ( (ULONG)FileObject >= LowLimit ) &&
        ( (ULONG)FileObject <= HighLimit ) )
    {
        return TRUE;
    }
    return FALSE;
}


原创粉丝点击