whs_ben
驱动牛犊
驱动牛犊
  • 注册日期2008-07-29
  • 最后登录2009-04-26
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2239回复:5

《文件过滤驱动开发教程》,读书笔记,请各位高手斧正

楼主#
更多 发布于:2009-01-06 15:07
本人刚开始接触IFS,最近拜读了ChuKuangRen 的第二版《文件过滤驱动开发教程》,刚看完前八章,有一些心得,也有一些疑问,烦请楚大侠指点一二。

一、名词解释


DriverObject,每一个驱动程序必有的对象,且唯一,由系统分配,可以认为是驱动对象,它的功能在于提供了处理IRP操作的所有回调函数,也就是所有与IRP相关的操作都由它来完成。


设备,在文件系统过滤驱动中,至少应该包含文件系统(FS),和卷(Volume)(从前八章来看)。


DeviceObject,设备对象,每一个设备至少有一个设备对象,即控制设备对象。控制设备对象用于设备绑定。


设备绑定,将我们定义的驱动对象绑定到设备对象上,用以执行过滤驱动的过程。当进行设备绑定后,IRP会先经过我们的处理后再发送给相关设备。


文件系统,包括FAT32NTFS


卷,包括C:,D:,E:等。


文件系统与卷的关系为一个文件系统里可能包含多个卷。如C:D:,E:同时属于NTFS的卷。但是在处理过程中,认为它们是和相互独立的,我们在文档过滤处理中,仅对卷进行处理(读,写,删除等)。


二、操作流程


第一步, DriverEntry为入口,保存全局对象

gSFilterDriverObject = DriverObject;

第二步,创建与DriverObject相关的控制设备(CDO),即我们的驱动对象也需要一个控制设备。这样的话,是否别的驱动程序还可以和我们的程序绑定,进行过滤处理呢?这个CDO还有什么用处(除了IS_MY_CONTROL_DEVICE_OBJECT)?

第三步,设置DriverObjec tDispatch 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内核编程》,非常不错,推荐给大家。

whs_ben
驱动牛犊
驱动牛犊
  • 注册日期2008-07-29
  • 最后登录2009-04-26
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-03-15 13:16
多谢各位指导!
游客

返回顶部