用VC6来编译DDK NT驱动
用VC6编译驱动的方法,有的XP DDK自带的编译器版本高于VC6的,也就是_MSC_VER要求大于1300,而VC6的是1200,所以我基本用VC6编译2000 DDK驱动,之所以用VC编译,无非是可以用VC助手,还可以快速定位到编译出错位置。做Release版本(Free版本)的时候,还是用build工 具生成吧。关于安装和下载请看我的另外一篇文章:http://www.cnblogs.com/DotCpp/archive/2010/02/02/1661555.html,其中包括了XP和2000的DDK。
1.用VC建立一个空工程,我是用Win32 Console Application开始的。
2.把源程序添加进工程里面来。
3.在Tool-> Options设置Include和Lib目录,注意是2000 DDK的。
我的设置是Include目录:
C:\WINDDK\2600.1106\INC\W2K
C:\WINDDK\2600.1106\INC\DDK\W2K
C:\WINDDK\2600.1106\INC\DDK\WDM\W2K
(注意:这几个目录最好放在VC缺省目录的前面,否则容易出错)
Lib目录:
C:\WINDDK\2600.1106\LIB\W2K\I386
注意设置 Source文件夹和Excute文件夹
4.开始C/C++选项卡里的设置。
1)Preprocessor definitions中设置为:WIN32=100,_X86_=1,WINVER=0x500,DBG=1
WIN32=100:不是很清楚。
_X86_=1:这个最重要,否则无法编译通过。代表CPU类型为X86
WINVER=0x500,是因为你是for 2K的。XP的是0x501。
DGB=1表示调试版本。
2)C++ Language里面去掉Enable exeception handling,否则会出现error LNK2001: unresolved external symbol ___CxxFrameHandler。
3)Code Generation调用习俗设置成__stdcall。
4)Project Options中去掉/GZ【注意是大写的GZ】,目的是编译的时候不会自动加入__chkesp。
5)Precompiled Headers里面选Not using Precompiled headers,毕竟驱动程序都不会太大,不在乎节省那点时间。
5.设置Link选项卡
1)输出改成*.sys
2)lib是wdm.lib (DDK的应该加ntoskrnl.lib )
3)勾上Ignore all default libraries,否则会链接libc,报告没有main函数。
4)Base address:0x10000
Entry-point sysmbol:DriverEntry
Statck Reverse:0x400000,缺省是1MB,但为什么要设成4MB?
Commit:0x1000
5)Customize去掉Link incrementally,否则会和/RELEASE冲突。
6)link的 Project Options:加入/subsystem:native /driver /SECTION:INIT,D /RELEASE /IGNORE:4078
/subsystem:native:PE格式文件其中有个地方要填写这个。
/driver是对驱动做一些优化。
/SECTION:INIT,D:对INIT section进行discard
/RELEASE (Set the Checksum)
/IGNORE:4078 忽略4078错误,否则会出现LINK : warning LNK4078: multiple "INIT" sections found with different attributes (E2000020)
出处:http://www.cnblogs.com/yubaolee/
开源框架:最好用的的权限工作流框架OpenAuth.Net
本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
如您有任何疑问或者授权方面的协商,请给我留言。