欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 16:17:48
...

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

第一步:安装Visual stdio 2010

1.安装VS2010

第二步:安装WDK安装包

2.安装WindowsDriverKit7-GRMWDK_EN_7600_1.ISO

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

第三步:创建工程

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

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

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

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

第四步:创建新项目配置

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

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

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

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

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

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

第五步:配置项目配置

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

1.配置【常规】属性

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

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

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

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

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

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驱动开发环境搭建

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

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

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驱动开发环境搭建

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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驱动开发环境搭建

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在新建的文件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  
// ><作者     ><  
// ><出处     >< 《http://blog.csdn.net/zhiyuan_x/article/details/72852750》  
// ><出处     >< 《 寒江独钓-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驱动开发环境搭建

很是完美,哈哈

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

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

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

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

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

//////////////////////////////////基本信息///////////////////////////////////////////////////////  
// ><免责声明 ><  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  
// ><作者     ><  
// ><出处     >< 《http://blog.csdn.net/zhiyuan_x/article/details/72852750》  
// ><出处     >< 《 寒江独钓-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;
}