VS2012环境编译驱动
准备:安装VS2012 "G:\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe"
安装WINDDK C:\WinDDK
VS2012驱动编译配置
VS2012集成环境下编译驱动
1)打开VS新建一个空的 win32控制台程序
1、选(文件→新建→项目→Visual C++项目→win32→win32控制台项目)创建一个
填写上名称event然后按确定
在弹出的win32应用程序向导里 选应用程序设置 →附加选项 勾选空项目→完成。
2)选项目菜单→添加现有项→添加所有驱动相关的*.h,*.c,*.cpp,*.rc之类的文件:
在安装好的winddk中C:\WinDDK\7600.16385.1\src\general\event\wdm下找到相关文件(其中的MAKEFILE和SOURCES不要)复制到D:\file\Cxuexi\VS2012project\event\(新建的项目下,下图中文件名为Driver,实际根据自己项目的文件名为准)
3)选项目(P)→属性→配置属性→VC++目录→
1、在可执行文件目录中添加:(注意添加自己安装WINDDK的文件路径,左上角配置选择所有配置)
C:\WINDDK\7600.16385.1\bin\x86(此处可以不改,因为VS2012兼容此本版的DDK)
2、在包含文件目录添加如下路径
C:\WINDDK\7600.16385.1\inc\ddk
C:\WINDDK\7600.16385.1\inc\crt(可选)
C:\WINDDK\7600.16385.1\inc\api
3、在库文件目录中添加:
C:\WinDDK\7600.16385.1\lib\wxp\i386
4)项目event属性设置
新建项目配置 check //必选
注意左上角配置选项选check,查看VC++目录里的各个目录是否包含上面添加的路径,不包含再添加一次
配置属性
(一) 常规属性设置
目标文件扩展名:.sys
(二) C/C++属性设置
常规选项卡
1调试信息格式(C7兼容(/Z7) //可选
2警告等级 (2级(/W2) //可选
3将警告视为错误 (是(/wx) //可选
优化选项卡
1优化(禁用/Od) //可选
预处理器选项卡
1预处理器定义:WIN32=100;_X86_=1;WINVER=0x501;DBG=1//必选
代码生成选项卡
1启用最小重新生成:否 //可选
2基本运行时检查:默认值 //可选
3运行库:多线程调试(/MTd)或 多线程(/MT) //建议选
4安全检查:否 //可选:
(可避免出现 LINK :error LNK2001: 无法解析外部符号 __security_cookie)
高级选项卡
1调用约定__stdcall(/Gz) //必选
(三) 链接器属性设置
常规选项卡
1输出文件:$(OutDir)\$(ProjectName).sys//必选(配置属性常规中设置了目标文件扩展名此处也要设置)
2启用增量链接:否(/INCREMENTAL:NO)//建议选上
3忽略导入库:是 //可选 ( 设置为此值时,必须在附加库目录中加:D:\WINDDK\3790.1830\lib\wxp\i386,这样项目就不会依赖IDE环境的设置 ) 否 ( 设置为此值时,将依赖 IDE 的环境的相关设置 )
输入选项卡
1附加依赖项ntoskrnl.lib
Hal.lib
wdm.lib
wdmsec.lib
wmilib.lib
ndis.lib
MSVCRT.LIB
LIBCMT.LIB //必选其12 //NT式驱动 ntoskrnl.lib WDM式驱动 wdm.lib
(HalXXX函数在Hal.lib,WmiXXX函数在 wmilib.lib ,NdisXXX函数在 ndis.lib )
(必要时需要增加微软的标准库 MSVCRT.LIB MSVCRTD.LIB(调试库)LIBCMT.LIBIBCMTD.LIB(调试库) ) ( 如果源码中有 source 文件,那么该文件的 TARGETLIBS 字段会列出该项目需要的库 )
2忽略所有默认库:是(/NODEFAULTLIB)
调试选项卡
1生成调试信息 是(/DEBUG)//可选
2生成映像文件:是(/MAP)//可选
3映像文件名:$(TargetDir)$(TargetName).map//可选
系统(System)选项卡
1子系统:控制台(/SUBSYSTEM:CONSOLE) //必选
2堆栈保留大小:4194304//可选
3堆栈提交大小:4096 //可选
高级选项卡
1入口点:DriverEntry//必选
2设置效应和:是(/RELEASE)//可选
3基址:0x10000 //建议选上
命令行选项卡”->其他选项(D)
1添加开关:/SECTION:INIT,D/IGNORE:4078 //建议填上 可以避免以下错误提示:
LINK : warning LNK4078: 找到多个“INIT”节,它们具有不同的属性(E2000020)
LINK : error LNK2001: 无法解析的外部符号__load_config_used
5).生成->重新生成
一些要修改DDK例子源码方能成功的问题,目前不知道什么选项可以不改: 源码中的关键字 try 要改为 __try , except 要改为 __except .
流程回顾:
在VS2012下新建项目WIN32控制台,应用程序设置里选空项目
在目录 Winddk\ 7600.16385.1\src\general\event\wdm里,将所有文件复制出来,到新建项目下
在项目->添加现有项,将4个文件导入进来,如果资源文件.rc在代码里,寻到用鼠标拖下来就行了现在要配置编译环境
在生成->配置管理器,点配置中的下拉箭头中选新建建一个check项目
在项目->属性->配置属性->VC++目录中(左上角配置中选要修改的对应项)
包含目录添加:
C:\WINDDK\7600.16385.1\inc\ddk
C:\WINDDK\7600.16385.1\inc\crt(可选)
C:\WINDDK\7600.16385.1\inc\api
还有一个库文件需要添加
C:\WINDDK\7600.16385.1\LIB\WXP\I386
可执行文件也要添加
C:\WINDDK\7600.16385.1\BIN\X86
再看一下C/C++里有几个可选项,在预处理器->预处理器定义设置为WIN32=100;_X86_=1;WINVER=0x501;DBG=1
运行时库选为多线程
缓冲区安全检查 否
高级中的调用约定要选择__stdcall 因为在驱动中都是这样的调用约定 然后是在链接器中 输出文件添加.sys增量链接 否
调试中都是可选项
System中子系统选 控制台
在高级中入口点必选 DriverEntry
项目可选0x10000
在输入中附加依赖项选 wdm.lib 如果是DDK驱动则是ntoskrnl.lib
运行一下成功了,再将刚才那个编译器的选项删除,
C:\WINDDK\7600.16385.1\BIN\X86
正常运行了,这是因为VC7自带的编译器已经支持DDK来进行编译了生成了驱动文件event.sys 8KB
常见错误:
无法打开包括文件:ntddk。h:没有这样的文件或目录:没有对VC++目录中包含目录设置
参考视频郁金香驱动视频51CTO下载-VC郁金香驱动008_VS2008环境下编译驱动