​​本帖通过Augusdi的一篇博文进行重新总结​​

第一步:安装Visual stdio 2010

1.安装VS2010

第二步:安装WDK安装包

2.安装WindowsDriverKit7-GRMWDK_EN_7600_1.ISO

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_VS2010

第三步:创建工程

1.这两个安装好以后,新建项目--VC ++控制台项目(选择为空项目)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_环境搭建_02

2.新建完项目各个栏的状态是这个样子

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_环境搭建_03

第四步:创建新项目配置

1.新建项目配置WDKConfig(这个名字自己随便起)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_WDK_04

2.创建完成就是这个样子的

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_环境搭建_05

3.属性管理器中,多了一个属性

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_工程配置_06

第五步:配置项目配置

核心问题来了<__>配置新建项目属性WDKConfig

1.配置【常规】属性

将目标文件扩展名.exe改成.sys

配置属性<__>常规(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_驱动_07

配置属性<__>常规(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_环境搭建_08

2.配置【VC++目录】属性

//VC++目录
//
1.可执行文件目录 C:\WinDDK\7600.16385.1\bin\x86
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\win7\i386


配置属性<__>VC++ 目录(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_驱动_09

配置属性<__>VC++ 目录(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_VS2010_10

3.配置【C、C十十】属性

// 设置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) //建议选 <本人选择的是多线程调试(/MTd)>
4.缓冲区安全检查 : 否 //可选
//(可避免出现 LINK : error LNK2001: 无法解析外部符号 __security_cookie)

高级选项卡
调用约定 : __stdcall(/Gz) //必选



在工程中添加一个ConfigDrvierApp.c文件(否则配置属性时是没有C/C++ 属性这一条目栏的)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_环境搭建_11

配置属性<__>C/C++ <__>常规(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_工程配置_12

配置属性<__>C/C++ <__>常规(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_工程配置_13

配置属性<__>C/C++ <__>优化(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_环境搭建_14

配置属性<__>C/C++ <__>优化(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_WDK_15

配置属性<__>C/C++ <__>预处理(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_工程配置_16

配置属性<__>C/C++ <__>预处理(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_WDK_17

配置属性<__>C/C++ <__>代码生成(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_WDK_18

配置属性<__>C/C++ <__>代码生成(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_环境搭建_19

配置属性<__>C/C++ <__>高级(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_工程配置_20

配置属性<__>C/C++ <__>高级(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_工程配置_21

4.配置【链接器】属性

// 链接器设置 
//
常规选项卡
1.启用增量链接 : 否(/INCREMENTAL:NO) //建议 选上
2.忽略导入库 : 是 // 可选
//( 设置为此值时,必须在附加库目录中加: E:\WinDDK\7600.16385.1\lib\win7\i3865 这样项目就不会依赖 IDE 环境的设 置)
//如果否 ( 设置为此值时,将依赖 IDE 的环境的相关设置 )

输入选项卡
1.附加依赖项 : 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.LIBIBCMTD.LIB(调试库) )
//( 如果源码中有 source 文件,那么该文件的 TARGETLIBS 字段会列出该项 目需要的库 )
2.忽略所有默认库: 是 (/NODEFAULTLIB) //必选

清单文件选项卡
1.启用用户账户控制(UAC) : 否 //必选
//不然会出现 >LINK : fatal error LNK1295: “/MANIFESTUAC”与“/DRIVER”规范不兼容;链接时不使用“/MANIFESTUAC”

调试选项卡
1.生成调试信息 : 是(/DEBUG) //可选
2.生成映像文件 : 是(/MAP) //可选
3.映像文件名 : $(TargetDir)$(TargetName).map //可选

系统(System)选项卡
子系统 : 控制台(/SUBSYSTEM:CONSOLE) //必选
堆栈保留大小 : 4194304 //可选
堆栈提交大小 : 4096 //可选
驱动程序 : 驱动程序(/DRIVER) //必选

高级选项卡
1.入口点 : DriverEntry //必选
2.随机基址 : 清空 //把框里的数据删掉。(yes也不是no也不是就是要一个干干净净的文本框) //必选
//不然会出现 e:\xxx.sys : fatal error LNK1295: “/DYNAMICBASE”与“/DRIVER”规范不兼容;链接时不使用“/DYNAMICBASE”
3.数据执行保护(DEP) : 清空 //把框里的数据删掉。(yes也不是no也不是就是要一个干干净净的文本框) //必选
//不然会出现 e:\xxx.sys : fatal error LNK1295: “/NXCOMPAT:NO”与“/DRIVER”规范不兼容;链接时不使用“/NXCOMPAT:NO”
4.设置效应和 : 是(/RELEASE) //可选
5.基址 : 0x10000 //建议选上
命令行选项卡
1./SECTION:INIT,D /IGNORE:4078 //(建议不要写进去,会报错!)



配置属性<__>链接器<__>常规(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_驱动_22

配置属性<__>链接器<__>常规(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_驱动_23

配置属性<__>链接器<__>输入(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_WDK_24

配置属性<__>链接器<__>输入(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_驱动_25

配置属性<__>链接器<__>清单(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_工程配置_26

配置属性<__>链接器<__>清单(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_工程配置_27

配置属性<__>链接器<__>调试(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_工程配置_27

配置属性<__>链接器<__>调试(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_驱动_29

配置属性<__>链接器<__>系统(配置之前)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_环境搭建_30

配置属性<__>链接器<__>系统(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_驱动_31

配置属性<__>链接器<__>高级(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_驱动_32

配置属性<__>链接器<__>高级(配置之后)

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_WDK_33

第六步 编译一个简单的程序,测试驱动开发配置

在新建的文件ConfigDrvierApp.c中写上如下代码一共编译测试

//基本信息///  
// ><免责声明 >< Copyright (c) 2017-2017 by Xie Zhimin All Rights Reserved
// ><创建日期 >< 2017/06/04
// ><创建时间 >< 2017年:06月:04日 03时:11分:18秒
// ><文件 >< comcap.c
// ><文件路径 >< D:\newSvnCode\WindowsDriver\branches\VS2010WDKEmptyProject\VS2010WDKEmptyProject
// ><隶属工程><
// ><当前用户 >< Administrator
// ><作者 ><
<出处 >< 《 寒江独钓-Windows内核安全编程(完整版)的30页例子》
// ><目的 >< Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 1. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 2. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 3. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 4. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// ><设计技术 >< Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 1. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 2. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 3. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 4. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
//迭代修改///
// ><作者 >< xzm
// ><修改日期 >< 2017年:06月:04日 03时:11分:18秒
// ><原因 ><
// >< >< 1.
// >< >< 2.
// >< >< 3.
/
#include "ntddk.h"

//
//
VOID DriverUnload(PDRIVER_OBJECT driver){
// 打印一句话
DbgPrint("first: our driver is unloading...\r\n");
}

//
// 这是内核模块的入口,可以在这里写下我们想要的东西
//
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
// 打印first:Hello,my salary!
DbgPrint("first:Hello,my salary!");

// 设置一个卸载函数,便于这个函数退出
DriverObject->DriverUnload = DriverUnload;

return STATUS_UNSUCCESSFUL;
}





编译,生成,如下图

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_驱动_34

很是完美,哈哈

但是在安装完驱动时发现出现了问题,启动驱动程序出现以下错误,

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_WDK_35

命令行 eventvwr 调用windows事件查看器,查看最近日志信息如下,并未发现问题的原因

Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建_WDK_36

最后,我修改了源代码,在编译,安装驱动,启动就正常了,所以说驱动的入口参数的变量名没事别瞎改

//基本信息///  
// ><免责声明 >< Copyright (c) 2017-2017 by Xie Zhimin All Rights Reserved
// ><创建日期 >< 2017/06/04
// ><创建时间 >< 2017年:06月:04日 03时:11分:18秒
// ><文件 >< comcap.c
// ><文件路径 >< D:\newSvnCode\WindowsDriver\branches\VS2010WDKEmptyProject\VS2010WDKEmptyProject
// ><隶属工程><
// ><当前用户 >< Administrator
// ><作者 ><
// ><出处 >< 《 寒江独钓-Windows内核安全编程(完整版)的30页例子》
// ><目的 >< Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 1. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 2. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 3. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 4. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// ><设计技术 >< Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 1. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 2. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 3. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
// >< >< 4. Windows Server 2012 +WDK7600.16385.1+VS2010驱动开发环境搭建
//迭代修改///
// ><作者 >< xzm
// ><修改日期 >< 2017年:06月:04日 03时:11分:18秒
// ><原因 ><
// >< >< 1.
// >< >< 2.
// >< >< 3.
/
#include "ntddk.h"

//
//
VOID DriverUnload(PDRIVER_OBJECT driver){
// 打印一句话
DbgPrint("first: our driver is unloading...\r\n");
}

//
// 这是内核模块的入口,可以在这里写下我们想要的东西
//
/*
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
// 打印first:Hello,my salary!
DbgPrint("first:Hello,my salary!");

// 设置一个卸载函数,便于这个函数退出
DriverObject->DriverUnload = DriverUnload;

return STATUS_UNSUCCESSFUL;
}
*/
NTSTATUS DriverEntry(PDRIVER_OBJECT driver/*这个变量的名称不要随便乱改*/, PUNICODE_STRING reg_path/**/)
{
// 这是我们的内核模块的入口,可以在这里写入我们想写的东西。
// 我在这里打印一句话。因为”Hello,world” 常常被高手耻笑,所以
// 我们打印一点别的。
DbgPrint("first: Hello, my salary!");

// 设置一个卸载函数便于这个函数能退出。
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}