我的环境: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