Windows驱动开发,vs+vm+wdk安装及hello,world

近期接手了一个关于Windows系统内核驱动的开发任务,首先需要的就是熟悉相关开发环境的配置与调试,这里采用了vs2013+vm2015+wdk8.1的组合,已经亲测完成(踩了无数的坑),在此做一下记录,下次需要配置环境的时候可以用作参考。

vm,wdk,vs等工具先下载安装好。

1.首先需要安装win7虚拟机,这里需要注意系统的镜像需要时虚拟机专用镜像,所以在此保存一个64位的win7镜像,可直接下载:

ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/

选择配置好虚拟机之后需要首先点击设置删除占用com1串口的打印机,然后添串行端口将管道命名为\.pipecom_1(如图所示)。

 2.虚拟机开机后以管理员权限运行cmd,输入如下命令开启相应串口并关闭64位驱动强制签名(64位驱动要求必须有数字签名才可运行,但是可以在测试中关闭)

  bcdedit /debug on
  bcdedit /dbgsettings serial debugport:n baudrate:115200
  bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS

3.将主机中已安装的wdk目录中找到驱动目标程序将其复制进虚拟机中安装

 

 3.运行vs,创建新的空wdm项目

新建first.c源程序

输入helloworld代码

#include <ntifs.h>  //<ntddk.h>
VOID DriverUnload(PDRIVER_OBJECT objDriver)
{
    // 避免编译器关于未引用参数的警告
    UNREFERENCED_PARAMETER(objDriver);
    // 什么也不做,只打印一行字符串
    DbgPrint("My Dirver is unloading...");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath)
{
    // 避免编译器关于未引用参数的警告
    UNREFERENCED_PARAMETER(strRegPath);
    // 如果编译方式为Debug,则插入一个INT 3指令,方便我们调试
    // 打印一行字符串,并注册驱动卸载函数,以便于驱动卸载
    DbgPrint("My First Dirver!
");//
    KdPrint(("KD My First Dirver!
"));
    objDriver->DriverUnload = DriverUnload;
    return STATUS_SUCCESS;
}

其中两个函数,DriverEntry是程序入口相当于main,DriverUnload是卸载驱动时执行的函数。

以下为使用dbgview进行调试

4.将程序选择win7debug以及x64环境,点击编译生成

将编译生成的sys文件复制进虚拟机中

 

5.虚拟机中安装dbgview,同时输入以下命令然后重新启动虚拟机,使其可抓取内核态信息,也就是咱们代码中的dbgprint输出的字符串

新建一个txt文件,复制进入如下信息

Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerDebug Print Filter]
 
"DEFAULT"=dword:00000008

然后将文件后缀名改为.reg,启动之后重启计算机即可

6.先运行dbgview用于查看输出的信息

 可以看到,在运行驱动之前,有一些其他的内核信息

7.运行InstDrv,将sys拖入其中点击安装,点击运行,可看到输出的helloworld

 

 

双机调试

首先需要认识到的是,上面debugview是在虚拟机中进行的测试,下面两种都将采用双机测试模式,也就是在主机端进行debug,虚拟机用作执行环境,输出的信息也全在主机端进行调试。

4.在进行双机测试之前,需要完成对虚拟机系统的改造,使其进入测试模式。

在虚拟机中以管理员权限运行cmd,运行以下命令

bcdedit /copy {current} /d Windows7-双机调试模式

bcdedit /timeout 10      

bcdedit /set testsigning on //开启测试模式

  bcdedit /debug ON               //开启debug

  bcdedit /bootdebug ON

bcdedit /dbgsettings              //查看刚才的设置信息,应该是使用com1串口,波特率为115200

bcdedit /dbgsettings serial debugport:1 baudrate:115200 //如果不是请输入下行命令进行调整

在开机时有选择启动方式,其中“Windows7-双机调试模式”是我们刚增加的启动方式,选择此方式进入虚拟机系统,这样就完成了双机测试中对虚拟机运行环境的配置。

以下为使用windbg进行双机调试

5.首先在主机安装windbg,将windbg文件创建快捷方式,这样我们刚才在虚拟机中设定的串口管道就要用到了。

首先完成如下信息

 -b -k com:pipe,port=\.pipecom_1,baud=115200,reconnect –y

其中port为管道名,baud为波特率,需要和虚拟机中设定好的信息一致,然后将该段字符串复制到快捷方式的目标最后

 6.运行windbg,会提示wait to connect,此时启动虚拟机选择双机调试模式,会遇到int 3中断,此时在windbg中输入g即可使虚拟机继续执行,直至开机。

以下为vs双机调试

5.vs双机模式与windbg相似,即通过vs将编写好的代码的直接在虚拟机环境中进行debug,首先需要将vs连接虚拟机。

安装好wdk后,vs栏上会多一个DRIVER的选项,选择DRIVER-TEST-Configure进入如下界面

 点击add new,选择第二个选项,可以在配置时测试是否能完成连接(此处有坑,如果选择第3项如果没有连接成功也会添加新计算机设备,后续会出现大问题)

 计算机名称一定要使用本机的名称,通过我的电脑属性中查看,如图所示我的电脑是Windows,那么就要填Windows,这样是通过寻找本机的对应通道进行连接。

 

 输入正确的计算机名称之后,点击下一步,连接类型选择Serial串口,同时勾选重连接与管道选项,波特率设定与虚拟机相同,将管道名设定为与虚拟机相同,点击下一步

如果状态为,则说明已经完成连接。

 

 然后在选项栏会多了一个此设备的选项

 然后我们打开刚才的helloworld程序,点击调试,附加到进程

选择传输方式为Windows Kernel Mode Debugger,选择核心进程点击附加,即可进入vs的dbg模式,与windbg显示相同

 在vs的双机调试中,可在点击暂停调试后增加断点,按F11进行单步调试。

ps:这个研究任务关系到毕业论文,所以还是重视一点点,这个基本都和内核及内存等有关系,能够加深对系统底层的理解,平时的学习也不要落下,就酱加油吧,新的学期开始了!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注