文件系统微型过滤驱动
一.简介
文件系统过滤是一种让驱动程序能够截获针对文件系统的调用的机制。这种机制对很多类型的软件都有用,比如反病毒软件,备份软件,加密软件等。
Windows支持叫做文件系统过滤驱动的过滤器模型已经很长时间了,现在这种模型被称作文件系统遗留过滤驱动。一种更新的模型——文件系统微型过滤驱动,被开发出来代替遗留过滤驱动,显著简化了开发过程。
在其内部,Windows提供了一个叫做过滤管理器(filter manager)的遗留过滤驱动,用来管理微型过滤驱动。
每个微型过滤驱动都有它自身的高度值(altitude),这个值决定了它在设备栈中的调用顺序。不同于注册表和对象回调中的高度值,微型过滤驱动的高度值非常关键。
以下例子可以很好地说明为什么微型过滤驱动的高度值非常关键。假设在高度10000处有一个加密微型过滤驱动,其作用是在写入时加密,读取时解密。再假设高度9000处有一个反病毒微型过滤驱动,其作用是检查数据是否有恶意行为。这样的设备栈的问题就很明显了,反微型病毒过滤驱动接受到的是加密数据,无法解密(即使可以,也是个浪费的行为),无法执行正常的功能。显然反病毒过滤驱动的高度应该在加密微型过滤驱动之上。
为了纠正以上情形,微软基于驱动程序的需要(最终取决与它们的任务)定义了驱动高度的范围。
加载订单组 | 海拔范围 | 组说明 |
---|---|---|
筛选器 | 420000-429999 | 与 Windows 2000 及更早版本上可用的筛选器加载顺序组相同。 此组加载最后一个,因此会从文件系统中附加最远的附加项。 |
FSFilter Top | 400000-409999 | 对于必须附加到所有其他 FSFilter 类型的筛选器驱动程序。 |
FSFilter 活动监视器 | 360000-389999 | 包括观察和报告文件 I/O 的筛选器驱动程序。 |
FSFilter Undelete | 340000-349999 | 包括恢复已删除文件的筛选器。 |
FSFilter 防病毒 | 320000-329999 | 包括检测和消毒文件 I/O 期间病毒的筛选器驱动程序。 |
FSFilter 复制 | 300000-309999 | 包括将文件数据复制到远程服务器的筛选器驱动程序。 |
FSFilter 连续备份 | 280000-289999 | 包括将文件数据复制到备份介质的筛选器驱动程序。 |
FSFilter 内容筛选器 | 260000-269999 | 包括阻止创建特定文件或文件内容的筛选器驱动程序。 |
FSFilter 配额管理 | 240000-249999 | 包括提供增强文件系统配额的筛选器驱动程序。 |
FSFilter 系统恢复 | 220000-229999 | 包括执行操作以维护操作系统完整性的筛选器驱动程序,例如系统还原 (SR) 筛选器。 |
FSFilter 群集文件系统 | 200000-209999 | 包括用于在跨网络提供文件服务器元数据的产品中使用的筛选器驱动程序。 |
FSFilter HSM | 180000-189999 | 包括执行分层存储管理的筛选器驱动程序。 |
FSFilter 图像处理 | 170000-175000 | 包括提供虚拟命名空间的类似 ZIP 的筛选器驱动程序。 |
FSFilter 压缩 | 160000-169999 | 包括执行文件数据压缩的筛选器驱动程序。 |
FSFilter 加密 | 140000-149999 | 包括筛选器驱动程序,用于在文件 I/O 期间加密和解密数据。 |
FSFilter Virtualization | 130000- 139999 | 包括虚拟化文件路径的筛选器驱动程序,例如在 Windows Vista 中添加的最小授权用户(LUA)筛选器驱动程序。 |
FSFilter 物理配额管理 | 120000-129999 | 包括使用物理块计数管理配额的筛选器驱动程序。 |
FSFilter 打开文件 | 100000-109999 | 包括提供已打开文件的快照的筛选器驱动程序。 |
FSFilter 安全增强程序 | 80000-89999 | 包括应用锁定和增强访问控制列表(ACL)的筛选器驱动程序。 |
FSFilter 复制保护 | 60000-69999 | 包括用于在媒体上检查带外数据的筛选器驱动程序。 |
FSFilter 底部 | 40000-49999 | 为必须附加到所有其他 FSFilter 类型的筛选器驱动程序提供。 |
FSFilter 系统 | 20000-29999 | 保留供内部使用。 |
FSFilter 基础结构 | <20000 | 保留供内部使用。 此组首先加载,因此附加到最接近文件系统。 |
二.初始化
文件吸引微型过滤驱动程序跟别的驱动程序一样,有一个DriverEntry例程。驱动程序必须用过滤驱动程序将自己注册为一个微型过滤驱动,指明各种设置,比如希望截取什么操作。驱动程序设置好适当的结构以后调用FltRegisterFilter进行注册。如果成功,驱动程序就可以按需进行进一步的初始化工作,最终调用FltStartFiletering实际开始过滤操作。注意,过滤驱动程序并不必自己设置分发例程(如IRP_MJ_READ, IRP_MJ_WRITE等),因为微型过滤驱动程序并不直接在I/O路径上,过滤管理器才是。
FltRegisterFilter 有如下原型
NTSTATUS FLTAPI FltRegisterFilter(
[in] PDRIVER_OBJECT Driver,
[in] const FLT_REGISTRATION *Registration,
[out] PFLT_FILTER *RetFilter
);
其中FLT_REGISTRATION 结构提供了注册必须的所有信息。其定义如下
typedef struct _FLT_REGISTRATION {
USHORT Size;
USHORT Version;
FLT_REGISTRATION_FLAGS Flags;
const FLT_CONTEXT_REGISTRATION *ContextRegistration;
const FLT_OPERATION_REGISTRATION *OperationRegistration;
PFLT_FILTER_UNLOAD_CALLBACK FilterUnloadCallback;
PFLT_INSTANCE_SETUP_CALLBACK InstanceSetupCallback;
PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK InstanceQueryTeardownCallback;
PFLT_INSTANCE_TEARDOWN_CALLBACK InstanceTeardownStartCallback;
PFLT_INSTANCE_TEARDOWN_CALLBACK InstanceTeardownCompleteCallback;
PFLT_GENERATE_FILE_NAME GenerateFileNameCallback;
PFLT_NORMALIZE_NAME_COMPONENT NormalizeNameComponentCallback;
PFLT_NORMALIZE_CONTEXT_CLEANUP NormalizeContextCleanupCallback;
PFLT_TRANSACTION_NOTIFICATION_CALLBACK TransactionNotificationCallback;
PFLT_NORMALIZE_NAME_COMPONENT_EX NormalizeNameComponentExCallback;
PFLT_SECTION_CONFLICT_NOTIFICATION_CALLBACK SectionNotificationCallback;
} FLT_REGISTRATION, *PFLT_REGISTRATION;
重要的字段描述如下
Size FLT_REGISTRATION结构的大小(以字节为单位)。 微筛选器驱动程序必须将此成员设置为 sizeof (FLT_REGISTRATION) 。
Version FLT_REGISTRATION 结构的修订级别。 微筛选器驱动程序必须将此成员设置为 FLT_REGISTRATION_VERSION。
Flags 微筛选器注册标志的位掩码。 此成员可以是 NULL ,也可以是以下各项的组合。
ContextRegistration FLT_CONTEXT_REGISTRATION结构的可变长度数组,适用于微筛选器使用的每个上下文类型。 数组中的最后一个元素必须是 {FLT_CONTEXT_END}。 此成员是可选的,可以为 NULL。
OperationRegistration 一个由FLT_OPERATION_REGISTRATION结构的可变长度数组,每种类型的 I/O 各有一个,微筛选器为其注册预操作 (PFLT_PRE_OPERATION_CALLBACK) 和后操作 (PFLT_POST_OPERATION_CALLBACK) 回调例程。 数组中的最后一个元素必须是 {IRP_MJ_OPERATION_END}。 此成员是可选的,可以为 NULL。也是我们最重点关注的参数
FilterUnloadCallback
指向类型的例程 的指针,PFLT_FILTER_UNLOAD_CALLBACK 要注册为微筛选器的 FilterUnloadCallback 例程。 此成员是可选的,可以为 NULL。 请注意,如果为此例程指定 NULL ,则永远无法卸载筛选器。
下面来看FLT_OPERATION_REGISTRATION结构体
typedef struct _FLT_OPERATION_REGISTRATION {
UCHAR MajorFunction;
FLT_OPERATION_REGISTRATION_FLAGS Flags;
PFLT_PRE_OPERATION_CALLBACK PreOperation;
PFLT_POST_OPERATION_CALLBACK PostOperation;
PVOID Reserved1;
} FLT_OPERATION_REGISTRATION, *PFLT_OPERATION_REGISTRATION;
MajorFunction
指定 I/O 操作类型的主要函数代码。
Flags
标志的位掩码,指定何时调用预操作 (PFLT_PRE_OPERATION_CALLBACK) 和操作后 (PFLT_POST_OPERATION_CALLBACK 缓存 I/O 或分页 I/O 操作的) 回调例程。 此成员是可选的,可以为零。
PreOperation
指向要注册为此类 I/O 操作的预操作回调例程的 PFLT_PRE_OPERATION_CALLBACK类型例程的指针。 此成员是可选的,可以为 NULL。
PostOperation
指向要注册为此类 I/O 操作的操作后回调例程的 PFLT_POST_OPERATION_CALLBACK类型例程的指针。 此成员是可选的,可以为 NULL。
三.安装
1.解析Inf文件
Version节
[Version]
Signature = "$Windows NT$"
Class = "ActivityMonitor" ;This is determined by the work this filter driver does
ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}
Provider = %ProviderString%
DriverVer = 01/01/2004,1.0.0.1
CatalogFile = simrep.cat
PnpLockdown = 1
Signature 必须设置为"$Windows NT$"。Class 和 Class都是必须的,它们知名了操作系统所属的类型