windows文件系统过滤驱动开发教程

上传人:xzh****18 文档编号:34631597 上传时间:2018-02-26 格式:DOC 页数:49 大小:160KB
返回 下载 相关 举报
windows文件系统过滤驱动开发教程_第1页
第1页 / 共49页
windows文件系统过滤驱动开发教程_第2页
第2页 / 共49页
windows文件系统过滤驱动开发教程_第3页
第3页 / 共49页
windows文件系统过滤驱动开发教程_第4页
第4页 / 共49页
windows文件系统过滤驱动开发教程_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《windows文件系统过滤驱动开发教程》由会员分享,可在线阅读,更多相关《windows文件系统过滤驱动开发教程(49页珍藏版)》请在金锄头文库上搜索。

1、Windows 文件系统过滤驱动开发教程0. 作者,楚狂人自述我感觉 Windows 文件系统驱动的开发能找到的资料比较少。为了让技术经验不至于遗忘和引起大家交流的兴趣我以我的工作经验撰写本教程。我的理解未必正确,有错误的地方望多多指教。有问题欢迎与我联系。我们也乐于接受各种驱动项目的开发。邮箱为 MFC_Tan_W,QQ 为 16191935。作者是杭州楚狂人, 首先在驱动开发网连载 .此版本比驱网连载版本稍有修改 .除了 0 外,已发1-8 节. 后继的章节将在不久后整理推出.您可以随时发邮件向我索取更新的版本.最后更新日期是 11 月 2 日.1. 概述,钻研目的和准备我经常在网上碰到同

2、行请求开发文件系统驱动。windows 的 pc 机上以过滤驱动居多。其目的不外乎有以下几种:一是用于防病毒引擎。希望在系统读写文件的时候,捕获读写的数据内容,然后检测其中是否含有病毒代码。二是用于加密文件系统,希望在文件写过程中对数据进行加密,在读的过程中进行解密。三是设计透明的文件系统加速。读写磁盘的时候,合适的 cache 算法是可以大大提高磁盘的工作效率。windows 本身的 cache 算法未必适合一些特殊的读写磁盘操作(如流媒体服务器上读流媒体文件)。设计自己的 cache 算法的效果,我已在工作中有所感受。如果你刚好有以上此类的要求,你可以阅读本教程。文件系统驱动是 windo

3、ws 系统中最复杂的驱动种类之一。不能对 ifsddk 中的帮助抱太多希望,以我的经验看来,文件系统相关的 ddk 帮助极其简略,很多重要的部分仅仅轻描淡写的带过。如果安装了 ifsddk,应该阅读 srcfilesysOSR_docs 下的文档。而不仅仅是 ddk 帮助。文件系统驱动开发方面的书籍很少。中文资料我仅仅见过侯捷翻译过的一本驱动开发的书上有两三章涉及,也仅仅是只能用于 9x 的 vxd 驱动。NT 文件系统我见过一本英文书。我都不记得这两本书的书名了。如果您打算开发 9x 或者 nt 文件系统驱动, 建议你去网上下载上文提及的书。那两本书都有免费的电子版本下载。如果你打算开发 W

4、indows2000WindowsXPWindow2003 的文件系统驱动,你可以阅读本教程。虽然本教程仅仅讲述文件系统过滤驱动。但是如果您要开发一个全新的文件系统驱动的话,本教程依然对你有很大的帮助。学习文件系统驱动开发之前,应该在机器上安装 ifsddk。ddk 版本越高级,其中头文件中提供的系统调用也越多。经常有人询问如 xpddk 编译的驱动能不能在 2000 上运行等等的问题。我想可以这样解释:高级版本的 ddk 应该总是可以编译低级驱动的代码,而且得到的二进制版本也总是可以在低级系统上运行。但是反过来就未必可以了。如果在高级系统上编写用于低级系统上的驱动,要非常认真的注意仅仅调用低

5、级系统上有的系统调用。ifsddk 可以在某些 ftp 上免费下载。我的使用的是 ifs ddk for xp,但是我实际用来开发的两台机器有一台是 windows 2000,另一台是 windows 2003.我尽量使我编译出来的驱动,可以在 2000xp2003 三种系统上都通过测试。安装配置 ddk 和在 vc 中开发驱动的方法网上有很多的介绍。ifsddk 安装之后,src 目录下的filesys 目录下有文件系统驱动的示例。阅读这些代码你就可以快速的学会文件系统驱动开发。filter 目录下的 sfilter 是一个文件系统过滤驱动的例子。另一个 filespy 完全是用这个例子的代

6、码加工得更复杂而已。如何用 ddk 编译这个例子请自己查看相关的资料。文件系统过滤驱动编译出来后你得到的是一个扩展名为 sys 的文件。同时你需要写一个.inf文件来实现这个驱动的安装。我这里不讨论.inf 文件的细节,你可以直接用 sfilter 目录下的 inf 文件修改。对 inf 文件点鼠标右键弹出菜单选择“安装”,即可安装这个过滤驱动。但是必须重新启动系统才生效。如果重启后蓝屏无法启动,可以用其他方式引导系统后到 system32drivers 目录下删除你的.sys 文件再重启即可。我尝试这种情况下用安全模式结果还是蓝屏。所以我后来不得不在机器上装了两个 2000 系统。双系统情况

7、下,一个系统崩溃了用另一个系统启动,删除原来的驱动即可。如果要调试代码,请安装 softice.打开 sfilter 目录下的文件 sources(这个文件没有扩展名),加入一行BROWSER_INFO=1然后打开 Symbol Loader,File-Open 选中你编译出来的 xxx.sys,Modul-Load,Modul-Translate,然后就可以调试了。打开 softice,输入 file *就可以看见代码。如果准备好了,我们就可以开始琢磨 windows 文件系统过滤驱动的开发了。2.hello world,驱动对象与设备对象这里所说的驱动对象是一种数据结构,在 DDK 中名为

8、 DRIVER_OBJECT。任何驱动程序都对应一个 DRIVER_OBJECT.如何获得本人所写的驱动对应的 DRIVER_OBJECT 呢?驱动程序的入口函数为DriverEntry,因此,当你写一个驱动的开始,你会写下如下的代码:NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )这个函数就相当与喜欢 c 语言的你所常用的 main().IN 是无意义的宏,仅仅表明后边的参数是一种输入,而对应的 OUT 则代表这个参数是一种返回。这里没有使用引用,因此如果想在参数中返回

9、结果,一律传入指针。DriverObject 就是你所写的驱动对应的 DRIVER_OBJECT,是系统在加载你的驱动时候所分配的。RegisteryPath 是专用于你记录你的驱动相关参数的注册表路径。DriverObject 重要之处,在于它拥有一组函数指针,称为 dispatch functions.开发驱动的主要任务就是亲手撰写这些 dispatch functions.当系统用到你的驱动,会向你的DO 发送 IRP(这是 windows 所有驱动的共同工作方式)。你的任务是在 dispatch function 中处理这些请求。你可以让 irp 失败,也可以成功返回,也可以修改这些

10、irp,甚至可以自己发出 irp。设备对象则是指 DEVICE_OBJECT.下边简称 DO.但是实际上每个 irp 都是针对 DO 发出的。只有针对由该驱动所生成的 DO 的 IRP,才会发给该驱动来处理。当一个应用程序打开文件并读写文件的时候,windows 系统将这些请求变成 irp 发送给文件系统驱动。文件系统过滤驱动将可以过滤这些 irp.这样,你就拥有了捕获和改变文件系统操作的能力。象 Fat32,NTFS 这样的文件系统(File System,简称 FS),可能生成好几种设备。首先文件系统驱动本身往往生成一个控制设备(CDO).这个设备的主要任务是修改整个驱动的内部配置。因此一

11、个Driver 只对应一个 CDO.另一种设备是被这个文件系统 Mount 的 Volume。一个 FS 可能有多个 Volume,也可能一个都没有。解释一下,如果你有 C:,D:,E:,F:四个分区。C:,D:为 NTFS,E:,F:为 Fat32.那么 C:,D:则是 NTFS 的两个 Volume 设备对象 .实际上C: 是该设备的符号连接( Symbolic Link)名。而不是真正的设备名。可以打开Symbolic Links Viewer,能看到:C: “DeviceHarddiskVolume1”因此该设备的设备名为“DeviceHarddiskVolume1”.这里也看出来,文

12、件系统驱动是针对每个 Volume 来生成一个 DeviceObject,而不是针对每个文件的。实际上对文件的读写的 irp,都发到 Volume 设备对象上去了。并不会生成一个“文件设备对象”。掌握了这些概念的话,我们现在用简单的代码来生成我们的 CDO,作为我们开发文件系统驱动的第一步牛刀小试。我不喜欢用微软风格的代码。太长而且难看。我对大部分数据结构和函数进行了重定义。为此我写了一个名为 wdf.h 的头文件帮助我转换。有兴趣的读者可以发邮件向索取这个文件。没有也没有关系,我总是会写出 wd_xxx 系列的东西在 DDK 中的原形。/ -wdf_filter.c 中的内容-#includ

13、e wdf.hwd_stat wdff_cdo_create(in wd_drv *driver,in wd_size exten_len,in wd_ustr *name,out wd_dev *device)return wd_dev_create(driver,exten_len, name,wd_dev_disk_fs,wdf_dev_secure_open,wd_false,device);wd_stat wd_main(in wd_drv* driver,in wd_ustr* reg_path)wd_ustr name;wd_stat status = wd_stat_suc;/

14、 然后我生成控制设备, 虽然现在我的控制设备什么都不干wd_ustr_init(status = wdff_cdo_create(driver,0,if(!wd_suc(status)if(status = wd_stat_path_not_found)/ 这种情况发生于FileSystemFilters 路径不存在。这个路径是/ 在 xp 上才加上的。所以 2000 下会运行到这里wd_ustr_init(status = wdff_cdo_create(driver,0,;if(!wd_suc(status)wd_printf0(error: create cdo failed.rn);r

15、eturn status;wd_printf0(success: create cdo ok.rn);return status;为了让代码看起来象上边的那样,我不得不做了很多转换。如#define wd_main DriverEntry 一种爽的感觉,终于可以在写看起来更象是 main()的函数中工作了。 wd_dev_create 这个函数内部调用的是 IoCreateDevice.而 wd_suc 实际上是 SUCCESS()这样的宏。/ -wdf.h 中的内容-#include ntifs.h#define in IN#define out OUT#define optional OPTIONAL#define wd_ustr UNICODE_STRING#define wdp_ustr PUNICODE_STRING#define wd_main DriverEntry/ 设备、驱动对象类型typedef DRIVER_OBJECT wd_drv;typedef DEVICE_OBJECT wd_dev;typedef PDRIVER_OBJECT wd_pdrv;typedef PDEVICE_OBJECT wd_pdev;enum wd_dev_disk_fs = FILE_DEVICE_DISK_FILE_SYSTEM,wd_dev_cdrom_fs = FI

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号