我的环境:win7x64+wdk7.6+vs2012速成版
安装流程:先安装vs2012或其他微软的ide,再安装wdk7.6的所有内容
安装好wdk之后,先简单测试一下安装是否正常。
首先打开wdk的任意一个编译器,例如我打开了windows xp 目录下的x86 free编译器
在wdk安装目录下的src文件夹下有很多源码实例,很有参考价值,选择一个实例,进入到这个实例所在的目录,例如我输入 cd src\general\event\wdm进入得到其中一个目录下。输入编译命令 build -c
运行编译命令,如果编译器安装正常应当显示
并且在选定的目录下,会有驱动被生成
确认wdk安装完好后,写好源码之后,就可以用wdk编译成驱动文件了,编译的方法有3种,
1:手动编译。
手动编译要手工写两个配置文件
分别为文件makefile
# 此文件 一般情况下只有一行 并且不需要修改 不能有前导空格
!INCLUDE $(NTMAKEENV)\makefile.def
文件Sources,更多更具体的格式,参照实例源码的Sources文件
#下边这行指定生成驱动名字DDK_HelloWorld.sys
TARGETNAME=DDK_HelloWorld
#下边这行指定生成文件的类型DRIVER指驱动
TARGETTYPE=DRIVER
#下边这行指定生成驱动所在的路径\SYS\DDK_HelloWorld.sys,如果TARGETPATH没有指定,就取默认值
TARGETPATH=SYS
#下边这行指定相关头文件所在目录路径
INCLUDES=$(BASEDIR)\inc\ddk;\
$(BASEDIR)\inc\crt;\ $(BASEDIR)\inc\api;\
##上边必空一行,wdk的目录 等价$(BASEDIR)
#下边这行指定驱动源代码*.cpp或者*.c
SOURCES=myddk.cpp\
一个不规范的例子:
#include "ntddk.h"
//如果是c++源码,应当以extern "C"修饰函数声明,或者ide编译时指定函数的调用约定为stdcall,
//或者手动编译时sources内指定函数的调用约定为stdcall
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath) {
return STATUS_UNSUCCESSFUL;
}
接下来就可以像测试wdk是否完好安装时一样,在编译器内进入到Sources文件和makefile文件所在的路径,编译
2:手工配置ide,ide自动编译
创建一个空的win32控制台程序
添加一个c或c++的源码文件
源码为
#include "ntddk.h"
//如果是c++源码,应当以extern "C"修饰函数声明,或者ide编译时指定函数的调用约定为stdcall,
或者手动编译时sources内指定函数的调用约定为stdcall,
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath) {
return STATUS_UNSUCCESSFUL;
}
新建一个解决方案
配置相关属性:
常规
目标文件扩展名:.sys //必选
VC++目录
可执行文件目录: D:\WinDDK\7600.16385.1\bin\x86;
包含目录: D:\WinDDK\7600.16385.1\inc\ddk;D:\WinDDK\7600.16385.1\inc\crt;D:\WinDDK\7600.16385.1\inc\api;
库目录: D:\WinDDK\7600.16385.1\lib\win7\i386;
C/C++|常规
调试信息格式(C7 兼容(/Z7)//可选
警告等级 (2 级(/W2)//可选
将警告视为错误 (是(/wx)//可选
C/C++|优化
优化(禁用/Od) //可选
C/C++|预处理器
预处理器定义:WIN32=100;_X86_=1;WINVER=0x501;DBG=1//必选
C/C++|代码生成
启用最小重新生成:否 //可选
基本运行时检查:默认值 //可选
运行库:多线程调试(/MTd) 或 多线程(/MT) //建议选 <本人选择的是多线程调试(/MTd)>
安全检查:否 //可选(可避免出现 LINK : error LNK2001: 无法解析外部符号 __security_cookie)
C/C++|高级
调用约定 __stdcall(/Gz) //必选
链接器|常规
启用增量链接:否(/INCREMENTAL:NO) //建议选上
忽略导入库: 是// 可选 ( 设置为此值时,必须在附加库目录中加:D:\WinDDK\7600.16385.1\lib\win7\i386 这样项目就不会依赖 IDE 环境的设置)
否 ( 设置为此值时,将依赖 IDE 的环境的相关设置 )
链接器|输入
附加依赖项:ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB//必选
//NT式驱动 ntoskrnl.lib WDM式驱动 wdm.lib
( HalXXX 函数在Hal.lib, WmiXXX 函数在 wmilib.lib , NdisXXX函数在 ndis.lib )
(必要时需要增加微软的标准库MSVCRT.LIB MSVCRTD.LIB(调试库)LIBCMT.LIB IBCMTD.LIB(调试库))
(如果源码中有source文件,那么该文件的TARGETLIBS字段会列出该项目需要的库)
忽略所有默认库: 是 (/NODEFAULTLIB)//必选
链接器|清单文件:
生成清单:否 //必选
不然会出现 >error LNK1295: “/MANIFEST”与“/DRIVER”规范不兼容;链接时不使用“/MANIFEST”
启用用户账户控制(UAC):否 //必选
不然会出现 >LINK : fatal error LNK1295: “/MANIFESTUAC”与“/DRIVER”规范不兼容;链接时不使用“/MANIFESTUAC”
链接器|调试:
生成调试信息 是(/DEBUG)//可选
生成映像文件:是(/MAP)//可选
映像文件名:$(TargetDir)$(TargetName).map//可选
链接器|系统(System)
子系统: 控制台(/SUBSYSTEM:CONSOLE)//必选
堆栈保留大小:4194304//可选
堆栈提交大小: 4096//可选
驱动程序: 驱动程序(/DRIVER)//必选
链接器|高级:
入口点:DriverEntry//必选
设置效应和:是(/RELEASE)//可选
随机基址:清空 //把框里的数据删掉。(不是yes也不是no,就是要一个干干净净的文本框) //必选
不然会出现 e:\xxx.sys : fatal error LNK1295: “/DYNAMICBASE”与“/DRIVER”规范不兼容;链接时不使用“/DYNAMICBASE”
数据执行保护(DEP):清空 //把框里的数据删掉。(yes也不是no也不是就是要一个干干净净的文本框) //必选
不然会出现e:\xxx.sys:fatal error LNK1295:“/NXCOMPAT:NO”与“/DRIVER”规范不兼容;链接时不使用“/NXCOMPAT:NO”
基址:0x10000 //建议选上
至此为止,就配置好了。
据说vs2012的收费版集成了驱动开发的模板,可惜我只有免费版的2012。
抄录一段关于vs2012+WDK 8.0开发XP系统驱动的方法:
需要把VS2012或VS2013使用的KMDF版本,改成较老的1.9(或更老)。
在工程的项目属性设置中,在Driver Model Setting项中设置驱动框架类型。Type of driver选择的应是KMDF,另两种可选项是WDM和export driver(WDM)。我们这里讨论的当然是KMDF项。关键在下面的两项,原来KMDF的版本可以在这里修改。下图截自一个VS2012驱动项目,它默认使用的是主版本1,次版本11。只要把次版本改成9,保存后重新编译,编译出来的驱动程序就是KMDF 1.9版本,从而可以安装运行于XP系统上了。
---------------------
作者:lxqq0000