文件系统的过滤与监控
文件系统过来吧的目标,是捕获Windows系统对文件的种种操作行为,比如文件的创建、打开、读写、目录的创建、打开、枚举、改名、删除等。捕获这些操作,能够实现许多强大的功能,比如检查病毒、数据加密、数据备份、安全监控等。
不要把文件系统驱动和存储驱动和混淆。硬盘是典型的存储设备,只负责数据的读与写;而文件系统则不管数据是如何读写到硬盘或其他设备上的,它只负责数据是如何在硬盘的平坦空间内组织成文件和目录的。
文件和目录都是很复杂的信息集合。比如一个文件至少有文件名、内容、大小、各种属性等,这些信息在硬盘实际空间中的保存结构和组织方式极其复杂。此外还有目录,目录是可以嵌套的。一个目录的删除移动都涉及其下的所有子目录和文件的删除移动。因此文件系统本身是极为复杂的系统,文件系统的过滤也同样县的复杂。
一般来说,能在存储设备的层次上完成的功能就不在文件系统上完成。但是一旦涉及区分目录,比如要求对指定的某个目录下的文件可以加密,这时就需要文件系统过滤了。文件系统过滤最典型的应用是防毒软件。这类软件一般都代有文件过滤驱动,当Windows上任何软件试图写一个文件的时候,防毒软件都会过滤其写入的内容,检查其中是否有病毒的特征码。
11.1 文件系统的设备对象
11.1.1 控制设备与卷对象
首先介绍文件系统的驱动会生成哪些设备对象。像FAST\NTFS这样的文件系统(FS)主要生成两类设备。首先文件系统驱动往往本身生成一个控制设备(COD),这个设备的主要任务是修改整个驱动的内部配置。因此一般的说,一个文件系统只对应一个COD。
而另一类设备是这个文件系统的卷设备。一般一个卷对应一个逻辑盘。一个FS可能有多个加载的卷,也可能一个都没有。例如,如果计算机上有C、D、E、F四个逻辑盘,则有四个卷设备。实际上,“C:”是设备的符号链接名,而不是真正的设备名。我们可以使用专门查看符号链接的工具来查看,比如“C:”的设备名为“\Device\HarddiskVolume1”。
注意,这个卷设备本身并不是文件系统驱动生成的,而是卷管理器生成的。但是当有一个卷使用了某种文件系统时,则该文件系统会对应地为该设备生成一个没有名字的设备对象,本章将它叫做文件系统的卷设备。即本章中所说的“卷设备”都特质文件系统的卷设备,并常用的卷设备的符号链接或者它们的名字。比如,如果C:、D: 是NTFS,则C:、D: 为NTFS的两个卷设备对象。
但是这只是一种称呼。实际上我们在打开设备的时候,并不会去打开设备的真正的名字,因为那样打开的是一个真正的卷设备。所以我们绑定文件系统的卷设备,并不适用名字来解决的。
这里可以看出,文件系统驱动是针对每个卷来生成一个设备对象的,而不是针对每个文件的。实际上,对文件的读写IRP都发送到卷设备对象上了。
本章,我们需要关心的两类设备:控制设备和卷设备。发送给控制设备的请求一般都是文件系统控制IRP(IRP_MJ_FILE_SYSTEM_CONTROL);而发送给卷设备的IRP一般则是文件操作IRP。过滤的目标最终是为了得到文件操作IRP,但是控制设备的IRP一般用来捕获卷设备的生成信息。换句话说,最终目标是为了绑定文件系统的卷设备,但是前提是先绑定文件系控制设备。
11.1.2 生成自己的一个控制设备
首先还是DriverEntry,进入的第一步是生成这个驱动自己使用的CDO。这非常重要!因为文件系统过滤驱动往往必须和外界的应用程序通信。而通信的主要接口就是这个控制设备。
控制设备生成在路径“Fi了System\Filters”下。
NTSTATUS DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_string RegistryPath
)
{
//顶一个Unicode字符串
UNICODE_STRING nameString;
RtlInitUnicodeString(&nameString,L"\\FileSystem\\Fileters\\SFilter");
//生成控制设备
status = IoCreateDevice(
DriverObject,
0, //没有设备拓展
&nameString,
FILE_DEVICE_DISK_FILE_SYSTEM, //设备类型
FILE_DEVICE_SECURE_OPEN,
FALSE,
&gSFilterControDeviceObject
)
//如果生成失败
if(!NT_SUCCESS(status)){
KdPrint(("生成控制设备失败,status = %08x\n",status))
return status;
}
return status;
}
这段代码目前只能生成一个控制涉笔,还没有对文件系统已经有的设备对象进行绑定。下回继续讲解文件系统过滤所需要注意的分发函数。
总结
本节主要讲了文件系统中的两类重要的设备对象:控制设备与卷设备。尤其要注意的是这里的卷设备与平常的卷设备并不是一个意义的卷设备,而是单独属于文件系统的一类卷设备。而控制设备主要作用为文件系统过滤驱动与外界通信的接口。
明日计划
11.2 文件系统的分发函数