本文是对Win7(64)+VS2010+WDK7.1.0(WinDDK\7600.16385.1)开发驱动的小结。
一、系统工具
1、Win7(amd64位)系统
注:已装系统后,管理员身份运行cmd命令,查看bcdedit /set testsigning true、bcdedit /debug on 等命令是否运行成功。若失败,请将bcdedit命令所在文件夹boot对应的盘(一般C盘)设置为活动状态;若依然失败,请修复C盘下的Boot(系统引导文件所在),或重装系统。
2、VS2010
3、WDK7.1.0(WinDDK\7600.16385.1)
地址:https://msdn.microsoft.com/en-us/windows/hardware/hh852365 该地址还连接 Windbg 调试工具 和Windows Symbols ,可以下载下来备后续调试时用。
4、WinDbg
地址:http://www.microsoft.com/whdc/devtools/debugging/default.mspx
Symbols:
地址:https://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx
注:Symbol文件是从微软的网站上http://msdl.microsoft.com/download/symbols下载而来,这个网址是不可以用IE直接打开的,WinDbg->File->Symbol File Path界面中输入SRV*C:\WINDOWS\Symbols*http://msdl.microsoft.com/download/symbols; 并选择Reload,WinDbg会自动帮你下载,关键是勾选reload。
5、InstDrv软件(用于安装、启动、停止、卸载驱动)
注:srvinstw.exe 也可以安装、卸载sys文件,但需要在cmd命令窗口下执行net start 驱动名、net stop 驱动名来启动、停止服务。
6、64Signer-V1.2(Win7 64位 私有测试数字签名软件)
7、DbgWiew.exe (查看内核模块的输出信息)
地址:https://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
8、虚拟机(WMware10.0供双机调试)
地址:http://www.microsoft.com/zh-CN/download/confirmation.aspx?id=8002
9、其他软件: 虚拟光驱DAEMON Tools Lite、EasyBCD(系统引导文件修复工具)、PartitionManager(将C盘设置为活动分区)等
二、配置VS2010 64位开发环境
1、在VS中VisualC++下新建 空项目
添加Driver类,将头文件删除,将Driver.cpp文件修改为Driver.c文件,内容如下:
#include "ntddk.h"
// 提供一个Unload函数只是为了
VOID DriverUnload1(PDRIVER_OBJECT driver)
{
// 但是实际上我们什么都不做,只打印一句话:
DbgPrint("MyDriver: Our driver is unloading…\r\n");
}
NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
DbgPrint("MyDriver: Hello, my salary!");
DriverObject->DriverUnload = DriverUnload1;
return STATUS_UNSUCCESSFUL;
}
注:添加类后,在属性中显示出C/C++项,供配置属性。
2、点击VS中的解决方案配置的下按钮(即debug所处的下拉框按钮),点击配置管理器,点击活动方案配置,点击新建,输入DriverDebug64、默认空,解决方案平台:选X64。
建成后的效果
3、点击VS中视图->其他窗口->属性管理器
4、右击属性管理器中的DriverDebug64,选择属性,在弹出的窗体中进行必要的设置。
(此处的设置都是必须的, 对复杂些的驱动开发也许还要额外另加设置)
注:WDK7.1.0默认安装在C:\WinDDK\7600.16385.1文件夹下
1)常规
目标文件扩展名:.sys
2)VC++目录
可执行文件目录(编译器路径):C:\WinDDK\7600.16385.1\bin\amd64
注:Xp系统64位如下:
----------C:\WinDDK\7600.16385.1\bin\x86\amd64
----------C:\WinDDK\7600.16385.1\bin\x86
包含目录:C:\WinDDK\7600.16385.1\inc\api
C:\WinDDK\7600.16385.1\inc\crt
C:\WinDDK\7600.16385.1\inc\ddk
库目录:C:\WinDDK\7600.16385.1\lib\win7\amd64
3)C/C++
预处理器->预处理器定义:
_AMD64_=1,AMD64=1,STD_CALL=1,WINVER=0x0501,_DEBUG =1
高级->调用约定:__stdcall (/Gz)
代码生成-->运行库:选择多线程调试/MTd 或者 多线程调试DLL/MDd (主要解决_DEBUG未预定义的问题)
4)连接器
输入->附加依赖项:ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB;%(AdditionalDependencies)
输入->忽略所有连接库:是 (/NODEFAULTLIB)
清单文件->启用用户账户控制(UAC):否 (/MANIFESTUAC:NO)
系统->子系统:控制台 (/SUBSYSTEM:CONSOLE)
系统->驱动程序:驱动程序 (/Driver)
系统->堆栈保留大小:4194304(可修改)
系统->堆栈提交大小:4096 (可修改)
高级->入口点:DriverEntry
高级->基址:0x10000
高级->随机基址:(清空)
高级->数据执行保护(dep): (清空)
调试下:
解决_DEBUG未预定义的问题
C/C++
代码生成-->运行库:选择多线程调试/MTd 或者 多线程调试DLL/MDd
解决找不到符合问题(包含调试信息的未生成工程名.pdb文件)
C/C++
常规-->调试信息格式:用于“编辑并继续”的程序数据库 (/ZI)
优化:已禁用 (/Od)
连接器
生成调试信息:是 (/DEBUG)
注:参考C:\WinDDK\7600.16385.1文件夹的ia64、X86等路径,进行修改可以配置为ia64、32位系统。
5、编译若通过,则配置成功,并生产.sys等文件。
三、调试
配置调试机
1、将Win7设置为可调试状态
1)以管理员身份打开cmd命令窗口:Win + R 打开运行输入框,输入cmd;或鼠标点击系统开始图标,在输入框中输入cmd,右击上方搜索显示出的cmd.exe,以管理员身份运行。
2)依次输入:
bcdedit /?
Bcdedit /enum OSLOADER
Bcdedit /copy {current} /d “Windows 7 Copy”
Bcdedit /debug on
Bcdedit /bootdebug on
Bcdedit /dbgsettings
Bcdedit /timeout 7
2、将Win7设置为测试版
管理员身份运行cmd命令,bcdedit /set testsigning true
3、测试证书数字签名
以管理员身份运行64Signer V1.2.exe,点击浏览找到并双机.sys文件,点击签名。
4、查看内核输出信息
以管理员身份运行Dbgview.exe,点击Capture菜单,勾选上Captrue kernel项。
5、配置WinDbg
1)设置系统字符表路径:WinDbg->File->Symbol File Path界面中输入
SRV*C:\WINDOWS\Symbols*http://msdl.microsoft.com/download/symbols; 并选择
Reload,WinDbg会自动下载字符表,关键是勾选reload。
2)设置自己生成的.sys对应的字符(Symbol)路径:
E:\Project\TestDriver\TestDriver\x64\DriverDebug64
3)设置自己生成.sys的原代码路径:E:\Project\TestDriver\TestDriver
注:自己生成的.sys文件默认路径:E:\Project\TestDriver\x64\DriverDebug64
6、安装.sys文件
以管理员身份运行运行InstDrv.exe,选择.sys文件,进行安装、启动等操作
注:请不要在本地主机,测试含有断点的内核,否则卡机,无法进行任何操作,应该采用双机调试(即新建个虚拟机,本地机与虚拟机通过管道进行通信)。
配置虚拟机
1、安装虚拟机
注:主板默认没有开启虚拟化技术,一般方法是开机或重启时按F12键进入BIOS菜单,将虚拟化(Virtualization...
2、配置虚拟机
1)开始-->WMware Work Stations-->双击“我的电脑”下的一个虚拟机(Windows 7 x64)-->编辑虚拟机设置-->移除打印机-->添加窜行端口
2)选中刚添加的窜行端口,在右侧的对话框中,设置如下:
勾选 启动时连接
选择 使用命名的管道(N)
其下的两个下拉框分别选择:该端是服务器、另一端是应用程序
3)本人执行和未执行该步骤都能够调试成功。本步骤作为多余补偿,如果你未执行该步骤失败,请将主机目录C:\WINDOWS\Symbols下的拷贝到虚拟机的相同位置。并且把自己生成的驱动编译后生成的字符文件(E:\Project\TestDriver\TestDriver\x64\DriverDebug64
目录下)放到虚拟机的C:\WINDOWS\Symbols目录下。主要匹配主、客机上字符的一致性。
3、双机调试
给源代码添加调试时中断语句
#if _DEBUG //DBG
__debugbreak(); //64位
#endif
重新生成sys文件,重新执行以上步骤,然后以管理员身份打开主机上的WinDbg软件,再在客户机安装.sys文件及开启、关闭、卸载等操作。开启后即进入中断点,可以一步步进行调试。。。
注:汇编_asm int 3 中断,在xp上 正确,在64位Win7上报错。如果未能进入断点进行调试,请检查sys文件是否在客户机(虚拟Win7系统)安装成功,系统字符集(Symbols)、本人字符Symbols是否下载或设置正确,管道端口是否正确等
提示:在本地主机上不以管理员身份运行软件,也可能是管理员身份成功运行,而客户机(虚拟机上一般都要是以管理员身份运行软件)
若进行 Win7 + WDK8.0+Windbg 进行Driver Filter开发,请将WDK7卸载,否则运行时会报大堆离奇错误。。。。
Windows 7 驱动开发的更多相关文章
-
Windows Storage 驱动开发 葵花宝典 - 翻译
Roadmap for Developing Windows Storage Drivers Last Updated: 4/20/2017 To create a storage driver, ...
-
Windows内核驱动开发入门学习资料
声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处:本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任.(本 ...
-
Windows内核驱动开发:HelloWorld
测试信息 Dev Machine: Windows Version: 2004 (19041.264) WDK Version: 10.0.19041.1 SDK Version: 10.0.1904 ...
-
配置windows下驱动开发环境
1.下载安装Visual Studio 2008. 2.下载安装WDK 下载地址(点此下载) 建议完全安装,为了便于配置,作者安装到C盘.(C:/WinDDK) 3. ddkwizards(ddkwi ...
-
Windows内核安全与驱动开发
这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...
-
《Windows内核安全与驱动开发》阅读笔记 -- 索引目录
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 一.内核上机指导 二.内核编程环境及其特殊性 2.1 内核编程的环境 2.2 数据类型 2.3 重要的数据结构 2.4 函数调 ...
-
Linux和Windows设备驱动架构比较
毕业后一直在学操作系统, 有时候觉得什么都懂了,有时候又觉得好像什么都不懂,但总体来说自认为对操作系统实现机制的了解比周围的人还是要多一些.去年曾花了几个星期的晚上时间断断续续翻译了这篇对Linux和 ...
-
2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发
[序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...
-
Windows驱动开发(中间层)
Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...
随机推荐
-
RobotFrameWork接口报文测试-----(一)简单demo的实现
最近几个月的工作任务都是通过使用RF工具来搭建服务器端接口的自动化测试,使用python作为2次开发的语言,也是第一次去做这种项目,经验善浅,还是很有可能会走很多的弯路,为此,我希望自己能把每个阶段的 ...
-
Codeforces Gym 100002 E ";Evacuation Plan"; 费用流
"Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
-
【转】树莓派学习笔记——I2C Tools 学习笔记
原文网址:http://blog.csdn.net/xukai871105/article/details/15029843 1.安装 I2C驱动载入和速率修改请查看博文[树莓派学习笔记——I ...
-
JS 事件对象和事件冒泡
1.事件对象 js的事件对象中保存了当前被触发事件的一些相关的属性信息,如事件源.事件发生时的鼠标位置.事件按键等. 事件对象的获取方法: IE中可以window.event直接获取,而Firefox ...
-
C++,对象的 =赋值 以及 复制构造函数赋值
1. C++默认实现了 = 号赋值:operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可. 2. C++默认实现了复制构造函数:同样,只要将一个对象的内容的内容逐位复制给另外一个对象 ...
-
挂接命令(mount) 【转】
收藏些文章,以后可能有用,文章出自:http://tutu.spaces.eepw.com.cn/articles/article/item/70737 挂接命令(mount) 首先,介绍一下挂接(m ...
-
c# tolist() 浅析
在介绍tolist()的时候我先个大家介绍一下linq的延迟加载: var products = new List<Product> { , Category = "Electr ...
-
javascript放大镜效果
JS实现放大镜效果 首先我们先设想一下放大镜效果 1.当鼠标进入小盒子的时候,把大图片显示出来 2.当指定移动区域的时候,显示当前放大区域(放大效果) 3.鼠标移除我们让它消失 一.实现页面布局HTM ...
-
Kubernetes基本功能
说明 目前kubernetes的资料介绍很多也很深刻,本文只是做一个针对自己学习k8s过程的介绍,仅仅是学习笔记的记录. 一.基本使用 1. 命令行 集群信息 Namespace 信息 Control ...
-
Python爬虫实战一之爬取QQ音乐
一.前言 前段时间尝试爬取了网易云音乐的歌曲,这次打算爬取QQ音乐的歌曲信息.网易云音乐歌曲列表是通过iframe展示的,可以借助Selenium获取到iframe的页面元素, 而QQ音乐采用的是 ...