代码改变世界

用VC6来编译DDK NT驱动

2010-01-27 09:46 李玉宝 阅读(...) 评论(...) 编辑 收藏

用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)