Filter Manager and Minifilter Driver Architecture

来源:互联网 发布:淘宝追加评论怎么写 编辑:程序博客网 时间:2024/06/07 01:31

The filter manager is a kernel-mode driver that conforms to the legacy file system filter model and exposes functionality commonly required in file system filter drivers. By taking advantage of this functionality, third-party developers can write minifilter drivers, which are simpler to develop than legacy file system filter drivers, thus shortening the development process while producing higher-quality, more robust drivers.

驱动管理器是一个内核驱动,它遵循老的文件系统过滤驱动模型,并暴露出文件系统过滤驱动通常需要的功能,利用这些功能,第三方开发人员可以书写minifilter驱动,它比传统的文件过滤驱动简单,但是质量高,更健壮。


Filter Manager Concepts

过滤管理器安装在window中,但是只有当minifilter过滤驱动被加载,过滤管理器才变成活动的。过滤管理器为了一个目标卷而附加载文件系统栈上。而minifilter驱动通过在驱动管理器注册间接的附加载文件系统栈上。

传统文件系统过滤驱动在文件系统栈中相对其他传统文件系统过滤驱动的位置是有启动加载组决定的。

minifilter驱动在过滤管理器中的顺序位置是由一个唯一的标识符altitude决定的。为一个具体的卷在某个特定高度(altitude)加载的minifilter驱动称为minifilter驱动的一个实例。

一个minifilter驱动可以过滤IRP-based I/O操作和Fast I/O操作,还有文件系统过滤回调操作(应该指的是FsRtlRegisterFileSystemFilterCallbacks注册的回调函数)。

minifilter驱动处理pre操作安装altitude从高到底的顺序处理,而post操作则从低到高处理。

Advantages of the Filter Manager Model

  • 更好的控制过滤驱动的加载顺序
  • 系统运行时可以卸载。传统的过滤驱动在系统运行时是不可以卸载的,而minifilter驱动可以在任何时间卸载,并且如果有需要的话,阻止自己被卸载。
  • 可以只处理自己感兴趣的操作。
  • 更高效的利用内核栈。过滤管理器优化的自己使用的内核栈,并且通过支持过滤器发起IO(这些IO只会被下层的驱动看到)来减少递归IO。
  • 过滤管理器在很多地方减少了minifilter驱动的代码。例如提供名字生成、缓存文件名供多于一个的minifilter驱动使用。过滤管理器设备附加到卷设备并通知minifilter驱动,并支持多核心系统。
  • 减少复杂性。
  • 更容易添加新的操作。如果过滤管理器支持了新的操作,对已存在的minifilter驱动没有影响。
  • 更好的支持多个平台。
  • 更好的支持用户模式程序。过滤管理器用户模式库FilterLib.dll支持minifilter驱动和程序通信,还提供了管理工具接口

Filter Manager Support for Minifilter Drivers

Loading and Unloading

minifilter驱动可以在系统运行的任何时刻加载。如果minifilter驱动INF文件指定了启动类型为SERVICE_BOOT_START, SERVICE_SYSTEM_START, or SERVICE_AUTO_START,系统会依照已存在的加载顺序组加载minifilter驱动。系统运行时,也可以通过sc start、net start、Api或者显式的请求驱动加载(fltmc load、FltLoadFilter、FilterLoad)。

minifilter驱动实例定义在INF文件中,INF文件必须包含一个默认的实例,也可以定义其它的实例。这些定义应用在所有的卷上。每一个实例定义包含名称、高度以及表明实例是自动附加还是手工附加还是两种方式均可的标志。默认实例用来排序minifilter驱动,使驱动管理器在正确的位置调用minifilter驱动的挂载及实例安装回调函数。另外显式的附加时,如果没有指定实例名称,使用默认实例。

当minifilter驱动卸载、实例附加的卷被卸载、或者显式的分离请求(fltmc detach、FltDetachVolume、FilterDetach),如果一个过滤驱动注册了InstanceQueryTeardownCallback回调函数,它可以使显式的分离请求失败。
实例卸载过程如下:
  • 如果minifilter驱动注册了 InstanceTeardownStartCallback 回调函数,则过滤管理器调用它作为卸载的开始。minifilter驱动在这个函数中应该完成所有挂起的操作、取消或完成由其发起的IO请求、停止排队新的工作项。
  • 在实例卸载期间,任何正在执行的preoperation or postoperation继续其正常处理。任何等待postoperation的IO请求可以被抽干或者取消。
  • 如果minifilter驱动注册了 InstanceTeardownCompleteCallback 例程,当所有未决的IO操作完成后,过滤管理器调用这个函数,minifilter驱动应该关闭那些打开的文件。
  • 当实例的所有引用被释放,过滤管理器删除剩余的上下文,实例完全被卸载。
minifilter过滤驱动可以通过以下方式卸载(sc stop、net stop、Apis、fltmc unload、FltUnloadFilter、FilterUnload)。
minifilter驱动被卸载时,FilterUnloadCallback 函数被调用。啊还是你好应该关闭通信端口、调用FltUnregisterFilter反注册驱动。注册FilterUnloadCallback 不是必须的,但是如果不注册的话,minifilter驱动无法卸载。

内核通过以下函数函数minifilter驱动的加载、卸载。

FilterLoad

FilterUnload

FltLoadFilter

FltUnloadFilter


以下的函数提供注册、启动、反注册minifilter驱动:

FltRegisterFilter

FltStartFiltering

FltUnregisterFilter


以下函数相关实例安装、卸载、及驱动卸载:

Callback Routine NameCallback Routine TypeInstanceSetupCallbackPFLT_INSTANCE_SETUP_CALLBACKInstanceQueryTeardownCallbackPFLT_INSTANCE_QUERY_TEARDOWN_CALLBACKInstanceTeardownStartCallbackPFLT_INSTANCE_TEARDOWN_CALLBACKInstanceTeardownCompleteCallbackPFLT_INSTANCE_TEARDOWN_CALLBACKFilterUnloadCallbackPFLT_FILTER_UNLOAD_CALLBACK


0 0