win7(X64)+wdk7驱动环境搭建
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!!
作者:mohist
----- 蓝 屏 警 告 ---
加载驱动的操作请在虚拟机中完成, 可以有效避免物理机蓝屏 或者其他情况出现 带来的损失。
1、准备
wdk7下载地址: https://www.microsoft.com/en-us/download/details.aspx?id=11800
vmware12: (我选择vmware12是因为 其对win7的支持,有些版本对操作系统的是有要求的)
win7: https://msdn.itellyou.cn/ 打开后,选择左侧的操作系统,找到合适你的需求版本下载(下载推荐选择 迅雷,下载链接是 edk2 哦)
DriverMonitor: (Google一下,自行下载)。 主要用来加载和卸载驱动。
DebugView: https://docs.microsoft.com/zh-cn/sysinternals/downloads/debugview (查看内核输出)
64signer: 驱动签名工具。 Google一下, 自行下载
2、环境搭建
A、安装 vmware12 , 再 创建 win7 X64的虚拟机。 (不会? 那就 Google一下)
B、安装win7 操作系统, 并激活。
C、安装 vmware install tool ( 不会? 那就 Google 一下)
3、安装 wdk
下载wdk后,使用 band 或者其他的解压缩工具 解压, 安装即可。(傻瓜式安装 , 下一步,下一步。。。。。)
安装结束后: 安装目录大概是这样的,
4、编写一个自己的第一个驱动程序
特别说明, 我使用的是X64 编译。
我再C盘根目录创建了一个文件夹,名为demo, 里面准备了下面的3个文件.
A、文件名: helloworld.c , 文件内容如下:
#include <ntddk.h> // unload my driver VOID DriverUnload(PDRIVER_OBJECT pDriverObject) { DbgPrint(" the driver unloaded successfully! \n"); } // the entry of driver NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING reg_path) { DbgPrint("ok, congratulation ,the driver has loaded successfully!\n"); if(NULL != pDriverObject) pDriverObject->DriverUnload = DriverUnload; return STATUS_SUCCESS; }
B、准备文件: makefile . 内容如下:
# 此文件 一般情况下只有一行 并且不需要修改 不能有前导空格 !INCLUDE $(NTMAKEENV)\makefile.def
C、准备文件: SOURCES, 内容如下:
#下边这行指定生成驱动名字HelloWorld.sys TARGETNAME=HelloWorld #下边这行指定生成文件的类型DRIVER指驱动 TARGETTYPE=DRIVER #下边这行指定生成驱动所在的路径\SYS\HelloWorld.sys TARGETPATH=SYS #下边这行指定相关头文件所在目录路径 INCLUDES=$(BASEDIR)\inc;\ $(BASEDIR)\inc\wxp;\ ##上边必空一行H:\WINDDK3790(DDK目录) 等价$(BASEDIR) #下边这行指定驱动源代码*.cpp或者*.c SOURCES=HelloWorld.c\
---- 上面的文件准备完毕后,大概是这样的--------
5、 编译
依次 点击 : 开始 -> 所有程序 -> windows driver kits -> WDK 7600.16385.1 -> Build Environments -> Windows 7 -> x64 Free Build Environment
A、 键入命令,使终端来到 上面 4 的所在文件夹: C:\demo
B、执行 构建命令: 键入 build , 回车执行构建。
构建结束后,demo目录下会大概是这样的:
6、执行文件 签名。
尽管我开启了 win7测试模式 (管理员控制台执行命令:bcdedit /set testsigning on, 再重启 ),没有签名的驱动是无法运行的。
A、找到 5 中生成的驱动文件: helloworld.sys。
B、使用 debugview工具查看内核输出 (请勾选: 菜单-> capture -> capture kernel 选项), 使用 DriverMonitor 加载驱动。
先来一张没有签名驱动的截图,发现驱动无法加载, 内核自然也没有输出。
同时查看驱动文件的属性,也无法找到关于签名的信息:
C、签名驱动
使用软件 64Signer 对驱动文件进行签名。 签名后,就会发现 驱动文件的属性页中出现了 关于签名的tab页。
7、驱动加载与卸载
驱动签名后,使用 driver monitor 和 debugview工具查看驱动内核输出。得到如下结果:
---------- 完结---------
附:
注意文件编码: