whs_ben
驱动牛犊
驱动牛犊
  • 注册日期2008-07-29
  • 最后登录2009-04-26
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2228回复: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内核编程》,非常不错,推荐给大家。

jununfly
驱动牛犊
驱动牛犊
  • 注册日期2008-10-17
  • 最后登录2010-06-01
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望560点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-01-12 13:34
我觉得吧,你看的东西还是太少了
ai3000
驱动牛犊
驱动牛犊
  • 注册日期2007-01-08
  • 最后登录2011-01-18
  • 粉丝2
  • 关注1
  • 积分10分
  • 威望140点
  • 贡献值1点
  • 好评度75点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2009-01-23 21:25
本来有点清楚,一看你的有弧度了。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2009-01-24 23:37
是楼主还没有看明白,差把我整郁闷了。比如cdo,fdo作啥用的,没有搞明白。。。

我建议你还是多看看 nt文件系统内幕
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地下室#
发布于:2009-01-24 23:44
你先看一下 windows internals 4th,看一下文件系统的大概原理,再结合 nt 文件系统内幕看看
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
whs_ben
驱动牛犊
驱动牛犊
  • 注册日期2008-07-29
  • 最后登录2009-04-26
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-03-15 13:16
多谢各位指导!
游客

返回顶部