阅读:2361回复:5
《文件过滤驱动开发教程》,读书笔记,请各位高手斧正
本人刚开始接触IFS,最近拜读了ChuKuangRen 的第二版《文件过滤驱动开发教程》,刚看完前八章,有一些心得,也有一些疑问,烦请楚大侠指点一二。
一、名词解释 DriverObject,每一个驱动程序必有的对象,且唯一,由系统分配,可以认为是驱动对象,它的功能在于提供了处理IRP操作的所有回调函数,也就是所有与IRP相关的操作都由它来完成。 设备,在文件系统过滤驱动中,至少应该包含文件系统(FS),和卷(Volume)(从前八章来看)。 DeviceObject,设备对象,每一个设备至少有一个设备对象,即控制设备对象。控制设备对象用于设备绑定。 设备绑定,将我们定义的驱动对象绑定到设备对象上,用以执行过滤驱动的过程。当进行设备绑定后,IRP会先经过我们的处理后再发送给相关设备。 文件系统,包括FAT32,NTFS等 卷,包括C:,D:,E:等。 文件系统与卷的关系为一个文件系统里可能包含多个卷。如C:,D:,E:同时属于NTFS的卷。但是在处理过程中,认为它们是和相互独立的,我们在文档过滤处理中,仅对卷进行处理(读,写,删除等)。 二、操作流程 第一步, 以DriverEntry为入口,保存全局对象 gSFilterDriverObject = DriverObject; 第二步,创建与DriverObject相关的控制设备(CDO),即我们的驱动对象也需要一个控制设备。这样的话,是否别的驱动程序还可以和我们的程序绑定,进行过滤处理呢?这个CDO还有什么用处(除了IS_MY_CONTROL_DEVICE_OBJECT)? 第三步,设置DriverObjec t的Dispatch Functions和Fast Io Functions. 第四步,用IoRegisterFsRegistrationChange注册文件系统(FS)修改,即添加一个回调函数(FilsSystemNotify),当操作系统中的文件系统增加时,将文件系统与过滤驱动绑定在一起。 在该函数中,需要传入DriverObject,原因何在?请楚大侠解释。 第五步,在FileSystemNotify(实际函数名称为SfFsNotification)中,调用SfAttachToFileSystemDevice()。函数原型为: NTSTATUS SfAttachToFileSystemDevice( IN PDEVICE_OBJECT DeviceObject,//The device to attach to IN PUNICODE_STRING DeviceName); 这里的DeviceObject为文件系统的CDO,在该函数中,创建新的设备: status = IoCreateDevice( gSFilterDriverObject, sizeof( SFILTER_DEVICE_EXTENSION ), NULL, DeviceObject->DeviceType, 0, FALSE, &newDeviceObject ); 这里的gSFilterDriverObject是保存的DriveEntry传入的驱动对象。这一点在教程中没有说明,在开始理解的时候有些困难。 status = SfAttachDeviceToDeviceStack( newDeviceObject, DeviceObject,&devExt->AttachedToDeviceObject ); 完成设备绑定。这样,当向文件系统(FS)发出的IRP,就会被我们的程序先截获。与文件系统的绑定主要用来获取系统中的卷设备(我的理解,可能不够深入)。 第六步,实现dispatch functions中的IPR_MJ_FILE_SYSTEM_CONTROL(SfFsControl())。由于文件系统与驱动对象进行了绑定,当卷设备Mount或Dismount时,产生的IRP会预先经过过滤程序的处理。 当卷设备Mount时,再次 status = IoCreateDevice( gSFilterDriverObject, sizeof( SFILTER_DEVICE_EXTENSION ), NULL, DeviceObject->DeviceType, 0, FALSE, &newDeviceObject ); 和status = SfAttachDeviceToDeviceStack( newDeviceObject,DeviceObject, &devExt->AttachedToDeviceObject );实现卷设备的绑定。 三、总结 (1) 在刚开始的时候,文件系统与卷容易混淆在一起,必须要区分这两者。 (2) 文件系统由回调函数动态处理,不是由过滤IRP来绑定。 (3) 卷设备由过滤文件系统中的IRP来绑定。 (4) 文件系统,卷等设备的IRP都通过DriveObject的分发例程来处理。 四、问题 在该教程中,有一全局变量gSfDynamicFunctions没有解释,烦请楚大侠解释一下。 五、广告 最近刚买了本楚狂人与wowocock合著的《天书夜读:从汇编语言到Windows内核编程》,非常不错,推荐给大家。 |
|
沙发#
发布于:2009-03-15 13:16
多谢各位指导!
|
|
板凳#
发布于:2009-01-24 23:44
你先看一下 windows internals 4th,看一下文件系统的大概原理,再结合 nt 文件系统内幕看看
|
|
|
地板#
发布于:2009-01-24 23:37
是楼主还没有看明白,差把我整郁闷了。比如cdo,fdo作啥用的,没有搞明白。。。
我建议你还是多看看 nt文件系统内幕 |
|
|
地下室#
发布于:2009-01-23 21:25
本来有点清楚,一看你的有弧度了。
|
|
5楼#
发布于:2009-01-12 13:34
我觉得吧,你看的东西还是太少了
|
|