zoukankan      html  css  js  c++  java
  • 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:这个研究任务关系到毕业论文,所以还是重视一点点,这个基本都和内核及内存等有关系,能够加深对系统底层的理解,平时的学习也不要落下,就酱加油吧,新的学期开始了!

  • 相关阅读:
    获取最近一周
    git设置个人信息
    ajax的content-download时间过慢问题的解决与思考
    element UI table中字符太多
    git 合并代码冲突最终解决办法
    thinkphp swoole 的使用
    vue elemnet 二进制文件上传
    Python+Selenium+Chrome 笔记(2)Selenium的Hello World
    chrome 自动测试插件
    php-fpm 错误日志 与 php 错误日志的用法
  • 原文地址:https://www.cnblogs.com/PPGwo/p/13615965.html
Copyright © 2011-2022 走看看