devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
阅读:10607回复:34

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

楼主#
更多 发布于:2008-04-27 16:58
--------------------------------------------------------------------
循序渐进学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;
}

最新喜欢:

shawnhooshawnh... watertomawatert... linshierlinshi...
人总在矛盾中徘徊。。。
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
沙发#
发布于:2008-04-27 17:05
WDK6000中所有miniFilter Demo代码,我打了个包方便大家下载。
附件名称/大小 下载次数 最后更新
miniFilter.rar (133KB)  423 2008-04-27 17:05
人总在矛盾中徘徊。。。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-04-27 17:36
Legacy Filter 可以用FsRtlLookupPerStreamContext等函数跟踪上下文,这也是minifilter工作的基础。要支持2k sp4 urp以前的系统的话,才必须自己管理上下文。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2008-04-27 18:44
引用第2楼tooflat于2008-04-27 17:36发表的  :
Legacy Filter 可以用FsRtlLookupPerStreamContext等函数跟踪上下文,这也是minifilter工作的基础。要支持2k sp4 urp以前的系统的话,才必须自己管理上下文。



你说的这个办法不错,已经经过商业代码检验
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2008-04-27 21:07
用了太多别人封装的东西.有好的地方,不过出现问题也比较难解决,建议加上反汇编FLTMGR,的研究,来加深对MINIFILTER 的理解.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
eleqi
驱动小牛
驱动小牛
  • 注册日期2005-12-20
  • 最后登录2014-01-03
  • 粉丝4
  • 关注2
  • 积分172分
  • 威望1475点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-04-27 22:06
学习了
FigoY
驱动牛犊
驱动牛犊
  • 注册日期2007-01-14
  • 最后登录2010-06-05
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望19点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-04-27 23:09
期待后文,加油^_^
alwaysrun
驱动小牛
驱动小牛
  • 注册日期2006-06-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1059分
  • 威望752点
  • 贡献值1点
  • 好评度98点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-04-28 09:25
学习了,期待继续
一颗平常的心!
microbe
驱动小牛
驱动小牛
  • 注册日期2007-12-10
  • 最后登录2011-01-17
  • 粉丝1
  • 关注0
  • 积分914分
  • 威望420点
  • 贡献值1点
  • 好评度88点
  • 原创分0分
  • 专家分1分
8楼#
发布于:2008-04-28 14:53
非常感谢,学习ing!!
zjjmj2002
驱动小牛
驱动小牛
  • 注册日期2007-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望321点
  • 贡献值0点
  • 好评度224点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2008-04-29 10:23
很好,正准备学习就有人开教程了。
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2008-04-30 22:20
支持~~~~~~~~~~

现在俺是wdk6001的。。。。。。。。。
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
11楼#
发布于:2008-05-07 08:12
非常感谢,
最近在追踪自己的透明加密的bug的时候,总有一种感觉,觉得使用的内部数据结构不是很好。虽然使用了红黑树的技术对数据结构的查询做了优化。但由于开始开发的时候是遇到一个问题就增加一部分代码,开发到后期,由于销售部门的压力,导致对代码没有时间做优化。现在产品出去后,BUG不这么多的情况下终于有时间做数据结构优化。
优化过程中,仔细可虑了一些数据结构的优化方法,回过头来看,有些已经在FltMgr中实现了。
一切都是时间问题!
stpaladin
驱动牛犊
驱动牛犊
  • 注册日期2008-06-19
  • 最后登录2010-12-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望39点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-06-20 16:20

期盼楼主继续啊
ldljlzw
驱动中牛
驱动中牛
  • 注册日期2002-03-16
  • 最后登录2014-01-02
  • 粉丝1
  • 关注0
  • 积分1021分
  • 威望372点
  • 贡献值0点
  • 好评度187点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2008-06-21 11:05
这么好的文章没下篇了?
herryliq
驱动牛犊
驱动牛犊
  • 注册日期2008-01-03
  • 最后登录2009-08-21
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2008-06-21 11:05
期待下文啊~
dionysus77
驱动小牛
驱动小牛
  • 注册日期2006-11-15
  • 最后登录2011-12-18
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望392点
  • 贡献值0点
  • 好评度177点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2008-06-21 17:39
引用楼主devia于2008-04-27 16:58发表的 循序渐进学Minifilter(微过滤器) 之 一 (开篇) :
  2. 实现了用户态与核心态的双向通讯机制.....


好文,顶,顺便请教一下。内核态如何主动与用户态通信?好像只有用户态询问,内核态应答。没找到内核态主动发消息给用户态的接口。
dt1985324
驱动牛犊
驱动牛犊
  • 注册日期2008-05-06
  • 最后登录2009-02-10
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望106点
  • 贡献值1点
  • 好评度20点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2008-07-01 08:26
期待下文
p1b234
驱动牛犊
驱动牛犊
  • 注册日期2006-07-09
  • 最后登录2012-08-28
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望67点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2008-07-01 17:22
强烈期待下一篇
herryliq
驱动牛犊
驱动牛犊
  • 注册日期2008-01-03
  • 最后登录2009-08-21
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2008-07-05 12:03
期待楼主的下文啊~
hj212001
驱动牛犊
驱动牛犊
  • 注册日期2008-07-11
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望86点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2008-07-11 15:16
上一页
游客

返回顶部