最近开始学写驱动,编译环境是找网上的“Windows 7 + Visual 2010 + WDK 7600驱动开发环境配置方法”来配置的,先前运行一些小NT/WDM驱动也正常,今天拿DDK的示例代码来玩,想想文件过滤驱动稍简单一点,不涉及硬件,又minifilter比较实用,可是打开一看好几个地方显示错误信息,以我的菜鸟水平看不出什么问题,只好放弃,再看一下DDK的说明,捡个最简单的Nullfilter先玩一下,打开后编译器还是提示有二处错误,在
NullQueryTeardown和NullUnload下面红红的波浪线,错误是类型不匹配,坑爹啊,这二个是回调函数,只好查回调函数类型定义,发现nullfilter文件的函数定义少了FLTAPI(其实就是__stdcall)修饰,增加相应的修饰符后总算没见报错,可是一运行生成,提示三个函数
FltUnregisterFilter、FltRegisterFilter、FltStartFiltering 错误,错误信息类似:"1>nullFilter.obj : error LNK2019: 无法解析的外部符号 _FltStartFiltering@4,该符号在函数 _DriverEntry@8 中被引用”,网上搜一下相关的错误的解决办法,试了几个也不行,后来一想打开WDK的文件夹,看了一下source文件,发现需要包含fltMgr.lib,于是在前面加上pragma comment(lib,"fltMgr.lib"),再生成还是一样的错误,真是一头的黑线,难道微软的文件有问题?于是打开WINDDK的命令行编译工具,转到相应目录,运行build,居然成功!问题出在哪里呢?晕了,后来打开项目属性查看,看到链接-输入-附加依赖时顿时想到是否这里有问题,于是在链接依赖那里加上fltMgr.lib试一下,再就生成成功了,此时取消刚才的pragma comment(lib,"fltMgr.lib")语句也能生成成功,平常写一般的程序加了这个语句应该就会包含指定的库,可能是是因为配置了“忽略所有默认库”的原因导致此语句不起作用了吧。
估计网上的配置方法作者很少玩文件过滤驱动,所以少了fltmgr.lib项,因此开发文件过滤驱动的时候要记得加上fltMgr.lib
ps:驱动比一般的程序要麻烦很多。