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驱动注册了 InstanceTeardownStartCallback 回调函数,则过滤管理器调用它作为卸载的开始。minifilter驱动在这个函数中应该完成所有挂起的操作、取消或完成由其发起的IO请求、停止排队新的工作项。
- 在实例卸载期间,任何正在执行的preoperation or postoperation继续其正常处理。任何等待postoperation的IO请求可以被抽干或者取消。
- 如果minifilter驱动注册了 InstanceTeardownCompleteCallback 例程,当所有未决的IO操作完成后,过滤管理器调用这个函数,minifilter驱动应该关闭那些打开的文件。
- 当实例的所有引用被释放,过滤管理器删除剩余的上下文,实例完全被卸载。
FilterLoad
FilterUnload
FltLoadFilter
FltUnloadFilter
FltRegisterFilter
FltStartFiltering
FltUnregisterFilter
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 |