文件系统微小过滤驱动之一初识MiniFilter

人的一生,就那么几十年,所有的人都无法知道下一刻会发生什么,我们活在当下,只能努力将自己目前的工作或生活过好。船到桥头自然直,况且,自己这么多年,经历了多多少少的风浪太多了,说到底还是不够自信,我应该慢慢改正这个缺点。不要事事都杞人忧天,一定的危机感是需要的,但是千万不要过了。 由于原始的文件系统过滤驱动有一些缺陷,它使用了一些非常规的方法,有些驱动微软都无法做到全部的控制,所以一旦这样,就极有可能让windows系统本身不稳定,或者造成其performance低下,所以微软极力的推出了下一带的文件系统小端口过滤驱动,这是新一代接口,微软使其全部在自己的可控制的范围内,我不想像之前介绍原始的文件系统过滤驱动一样,用10个篇章来阐述其原理,因为微软的极力推荐,所以文件系统微小过滤驱动,在WDK中有大量的例子。我将尽量从这些例子出发,从例子到理论的方式来阐述。 和微软之前推出的各种新的框架一样,它都会增加一些部件,以驱动的形式增加到内核中,从XP到WIN8所用的磁盘空间越来越大,从几百M到几十G,相信这些新推出的框架的贡献不小。这里对于文件系统小端口过滤驱动,微软增加了一种将过滤驱动管理器的部件,,它以内核模式驱动的形式增加到操作系统中。但是一般不会激活,也就是只是装载到系统中,但是不起任何作用,当文件系统小端口驱动加载的时候,它才被激活。 File System Minifilter Drivers 这个一直不知道怎么翻译,是叫微小,还是微了,最后还是叫微小吧。文件系统微小过滤驱动 Filter Manager and Minifilter Driver Architecture 过滤管理器是一个内核模式的驱动,符合原始的文件系统过滤驱动模式,暴露很多文件系统过滤驱动需要的很多公用的功能函数。通过这些函数,第三方的开发者可以开发出微小文件系统过滤驱动,它比原始的文件系统过滤驱动更加简单,既缩短了处理周期,有使程序更加健壮。 Filter Manager Concepts 过滤管理器被装到Windows 系统中,其激活是在微小文件系统过滤驱动加载以后。过滤管理器将其自己附加在目标卷的文件系统堆栈上。微小文件系统哦你过滤驱动通过一些过滤管理器的IO操作相过滤管理器进行注册,间接的附加在文件系统堆栈上。 原始的文件系统过滤驱动在文件系统IO堆栈的位置取决于其所在装载组。举例来说,病毒过滤驱动所在的组在堆栈中的位置应该比复制过滤驱动的高,因为病毒过滤驱动需要在文件发往复制过滤驱动之前,对文件进行检测和区分。因此,病毒过滤驱动所在的组肯定比复制过滤驱动所在的组先加载。每一个组都有一个与其相应的类和类GUID,这些都是在驱动的INF中定义的。 像原始的文件系统过滤驱动一样,微小文件系统驱动也有固定的顺序,不过它的加载的顺序是通过一个叫做高度值来唯一决定的。微小文件系统过滤驱动在特别卷上的的特别的高度值称为其的实例。 微小文件系统过滤驱动的高度值确保微小文件系统过滤驱动的实例相对于其他微小文件系统过滤驱动的实例总装载在合适的位置。这个位置也决定了过滤管理器调用其IO过滤操作的位置。高度值的分配和管理由微软控制。 微小文件系统过滤驱动可以过滤基于IO操作的IRP,快速IO和文件系统过滤的回调操作(FSFilter)。对于每一个驱动选择的过滤操作,微小文件系统过滤都可以注册一个预前操作的回调函数和一个延后操作的回调函数。举例来说,比如有3个微小文件系统过滤驱动,在文件系统堆栈中的位置从高到低依次是A,B,C,所以预前回调函数的调用顺序是A,B,C,而延后操作的回调函数的操作顺序是,C,B,A. 和原始文件系统过滤驱动一样,过滤过滤器可以附加其过滤设备在文件系统堆栈中的多个位置。每一个过滤管理器的过滤设备对象,我们叫做帧。从之前过滤管理器帧的观点看,每一个过滤管理器的帧就是另外一个原始过滤驱动。 每一个过滤管理器的帧代表一组的高度值。过滤管理器可以调整存在的帧或创建新的帧去允许微小文件系统过滤驱动附加在正确的位置。 过滤管理器不能够附加一个微小文件系统过滤驱动在两个原始的过滤驱动之间,除非,在他们之间有一个过滤管理器的帧存在。 如果微小过滤驱动被卸载后重新安装,它还是会从其卸载的同样的帧里面的同样的高度值进行重新安装。 Advantages of the Filter Manager Model Better control over filter load order 通过高度值,可以更好的控制其的加载顺序。 Ability to unload while system is running 系统运行时,可以动态卸载。 Ability to process only necessary operations 只用去处理,关心的操作。 More efficient use of kernel stack 更有效的使用内核堆栈。 Less redundant code 更少的冗余代码 Reduced complexity 更容易开发 Easier addition of new operations 更容易增加新的操作 Better support for multiple platforms 更容易适应新平台 Better support for user-mode applications 更好的支持用户模式应用程序 Filter Manager Support for Minifilter Drivers Loading and Unloading 微小过滤驱动可以在系统运行时的任何时候加载。如果其微小过滤驱动的INF文件中指定了驱动启动类型,比如( SERVICE_BOOT_START, SERVICE_SYSTEM_START, or SERVICE_AUTO_START)微小过滤驱动和原始过滤驱动一样可以支持通过文件系统过滤驱动定义的已经存在的组定义的顺序加载.当系统运行的时候,微小过滤驱动可以通过服务启动请求(sc start,net start,or服务的API进行),或通过明确的加载请求(fltmc load FltLoadFilter或FilterLoad) 微小过滤驱动的DriverEntry例程在其驱动加载的时候被调用。微小过滤驱动可以在其DriverEntry例程中执行一些实例初始化的动作,并调用FltRegisterFilter向过滤管理器注册回调函数,调用FltStartFiltering函数通知过滤管理器,微小过滤驱动已经对附加卷和过滤IO请求的操作做好了准备。 微小过滤驱动在其INF文件中定义的实例被用来安装微小过滤驱动。其INF文件中必须定义一个默认的实例,也可以增加一些额外的实例。这些定义适应于所有的卷每一个实例定义包含一个实例名字,高度值,一个标志指明实例是否可以被自动附加,或者手动附加,还是都可以。默认的实例被用来排序微小过滤驱动,保证过滤管理器调用微小过滤驱动的绑定和安装回调函数都按正确的顺序操作。默认的实例也被用来处理一些调用者没有指定实例名的请求操作。 过滤管理器在卷已经被绑定后,在卷上发生的第一个创建操作发生的时候,调用微小过滤驱动的InstanceSetupCallback例程,通知微小过滤驱动卷已经可用了。这也可以发生在FltStartFiltering函数返回之前,当过滤挂历器在系统启动阶段枚举已经存在的卷的时候。也可以实时发生在,一个已经被绑定,在一个明确附加请求之后(fltmc attach FltAttachVolume,FilterAttach). 当微小过滤驱动卸载的时候,其实例被卸载。已经附加在卷上的实例被解绑定,或者通过明确的卸载请求(fltmc detach FltDetachVolume,FilterDetach).如果微小过滤驱动注册了InstanceQueryTeardownCallback例程,它可以通过调用FilterDetach或FltDetachVolume,明确对一个卸载请求失败。 实例的卸载例程如下: 如果微小过滤驱动注册了InstanceTeardownStartCallback回调函数,过滤过滤器在卸载流程的开始,就会调用这个函数,这个函数内部,微小过滤驱动应该结束所有暂停的操作,取消或完成所有由微小过滤驱动产生的IO请求。停止其对列,接受新的工作请求。 在实例卸载的过程中,所有的当前处理的预前和延后操作的回调函数都按正常的流程进行,任何等待延后回调函数操作的IO请求,可以被清到或者取消。任何由微小过滤驱动产生的IO请求可以正常处理,知道它们被结束。 如果微小过滤驱动注册了InstanceTeardownCompleteCallback回调函数,过滤管理器在发送的IO请求都被完成的时候,调用这个函数,在这个函数中,微小过滤驱动关闭所有还被打开的文件。 在所有的实例的引用被释放,过滤管理器删除保留的上下文,实例卸载被结束。 当系统在运行的时候,微小过滤驱动可以通过服务停止请求(sc stop net stop,or服务的API)或者通过明确的卸载请求(fltmc unload FltUnloadFilter,FilterUnload)被卸载。 微小过滤驱动的FilterUnloadCallback例程在其驱动卸载的时候被调用,这个例程中,需要关闭所有的打开的交流服务端口,调用FltUnRegisterFilter,执行需要的清除操作,这个驱动的卸载例程的注册不是强制的。但是如果没有注册这个例程,微小过滤驱动不能被卸载。 Filter Manager Routines for Loading and Unloading Minifilter Drivers 过滤管理器提供如下的明确的加载和卸载请求例程,这些请求可以通过用户模式或内核模式发出。 FilterLoad FilterUnload FltLoadFilter FltUnloadFilter 下面这些函数,被用来注册或者卸载实例安装和卸载的回调函数。 FltRegisterFilter FltStartFiltering FltUnregisterFilter Minifilter Driver Callback Routines for Instance Setup, Teardown, and Unload 下面这些回调函数被装载在FLT_REGISTRATION结构体体中,传递给FltRegisterFilter函数: Callback Routine Name Callback Routine Type InstanceSetupCallback PFLT_INSTANCE_SETUP_CALLBACK InstanceQueryTeardownCallback PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK InstanceTeardownStartCallback PFLT_INSTANCE_TEARDOWN_CALLBACK InstanceTeardownCompleteCallback PFLT_INSTANCE_TEARDOWN_CALLBACK

FilterUnloadCallback PFLT_FILTER_UNLOAD_CALLBACK

我躺下来,以一张报纸当枕头。高高在我上方的,

文件系统微小过滤驱动之一初识MiniFilter

相关文章:

你感兴趣的文章:

标签云: