您的位置:首页 > 其它

驱动WDK7600在VC6.0下的编译开发配置环境

2011-12-21 09:26 525 查看
网上找了很多资料,都不好使。相信有很多像我一样偏好VC6.0的家伙,最新的WDK真的用不了么?必须可以!!!

开始之前要一定要明确一件事情,单独使用WDK+记事本就可以开发驱动,和VC的编译器耗无关系,而使用VC的唯一目的,就是把它当作超级记事本,这样可以省去自己维护Makefile的麻烦,并且拥有IDE的其他各种便捷。

1.安装好VC6和DWK,先后顺序无关。

从开始菜单找到WDK的程序目录,进入“Windows XP Checked Build Environment”,输入命令"build",此时WDK将会把自己进行编译,大约需要1分钟。

2.VC6设置Include/Lib/Executable目录。

设置为自己需要编译的平台的各个目录即可, Include要确保找到ntddk.h等,Lib与Include对应,Executable 要确保能找到cl.exe

例如XP平台下设置为:

include包含部分:

C:\WinDDK\7600.16385.1\inc\ddk

C:\WinDDK\7600.16385.1\inc\api

C:\WinDDK\7600.16385.1\inc\crt

lib连接库包含部分:

C:\WINDDK\7600.16385.1\LIB\WXP\I386

C:\WINDDK\7600.16385.1\LIB\WIN7\I386

执行文件包含:

C:\WINDDK\7600.16385.1\BIN

C:\WINDDK\7600.16385.1\BIN\X86

C:\WinDDK\7600.16385.1\bin\x86\x86

对于VC原有的路径,Include 和 Lib建议都删除掉,而Executable则将你新加的置顶,顺序不能错。其余建议保留(虽然编译驱动不会使用VC的Bin目录下的ml.exe、link.exe 等,但vc的代码提示等功能是需要bin目录下的一些程序来完成的,因此还是至少要保留VC原有的Bin目录,但必须在DDK的之后)。

3.建立一个空工程,Exe或者Dll都可以,然后直接修改工程属性:

要改的地方不少,描述各个选项还不如直接记录个文本的,清空C/C++和Link下面的Option文本框,按下面的填写。

C/C++ 选项填写:

/nologo /Gz /MLd /W3 /WX /Z7 /Od /D WIN32=100 /D _X86_=1 /D WINVER=0x500 /D DBG=1

/Fo"MyDriver_Check/" /Fd"MyDriver_Check/" /FD /c

如果是在程序中使用了 __try __except 链接的时候会报错 unresolved external symbol __except_handler4

所以在这里还要加上/GS- 参数 此参数可以参考帖子
http://topic.csdn.net/u/20111225/19/4d34fffb-f57c-4183-a07d-7169f661fb04.html
最终写成:

/nologo /Gz /MLd /W3 /WX /Z7 /Od /D WIN32=100 /D _X86_=1 /D WINVER=0x500 /D DBG=1

/Fo"MyDriver_Check/" /Fd"MyDriver_Check/" /FD /GS- /c

LINK 选项填写:

NT式驱动为

ntoskrnl.lib /nologo /base:"0x10000" /stack:0x400000,0x1000 /entry:"DriverEntry"

/subsystem:console /incremental:no /pdb:"MyDriver_Check/HelloDDK.pdb" /map:"MyDriver_Check/HelloDDK.map" /debug /machine:I386 /nodefaultlib /out:"MyDriver_Check/HelloDDK.sys"

/subsystem:native /driver /SECTION:INIT,D /RELEASE /IGNORE:4078

在引用一些函数的时候 比如KeLowerIrql还应该把相应的库hal.lib 加入其中

ntoskrnl.lib hal.lib /nologo /base:"0x10000" /stack:0x400000,0x1000 /entry:"DriverEntry"

/subsystem:console /incremental:no /pdb:"MyDriver_Check/HelloDDK.pdb" /map:"MyDriver_Check/HelloDDK.map" /debug /machine:I386 /nodefaultlib /out:"MyDriver_Check/HelloDDK.sys"

/subsystem:native /driver /SECTION:INIT,D /RELEASE /IGNORE:4078

WDM式驱动为

wdm.lib /nologo /base:"0x10000" /stack:0x400000,0x1000 /entry:"DriverEntry" /subsystem:console

/incremental:no /pdb:"SYS_Check/HelloWDM.pdb" /debug /machine:I386 /nodefaultlib

/out:"SYS_Check/HelloWDM.sys" /subsystem:native /driver /SECTION:INIT,D /RELEASE /IGNORE:4078

当然也不是一成不变的这样设置 比如在WDM驱动中用到ObReferenceObjectByName的时候就应该

加上ntoskrnl.lib 因为ObReferenceObjectByName是ntoskrnl.exe的导出函数 所以最终变成

wdm.lib ntoskrnl.lib /nologo /base:"0x10000" /stack:0x400000,0x1000 /entry:"DriverEntry" /subsystem:console

/incremental:no /pdb:"SYS_Check/HelloWDM.pdb" /debug /machine:I386 /nodefaultlib

/out:"SYS_Check/HelloWDM.sys" /subsystem:native /driver /SECTION:INIT,D /RELEASE /IGNORE:4078

4.保存配置,现在给这个空工程建一个c文件,复制以下内容:

#include <ntddk.h>

NTSTATUS DriverEntry(

IN PDRIVER_OBJECT DriverObject,

IN PUNICODE_STRING RegistryPath

)

{

NTSTATUS status = STATUS_UNSUCCESSFUL;

return status;

}

编译通过则配置成功!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: