zoukankan      html  css  js  c++  java
  • Windows 7 驱动开发

    本文是对Win7(64)+VS2010+WDK7.1.0WinDDK7600.16385.1)开发驱动的小结。 

    一、系统工具

    1Win7(amd64)系统

    注:已装系统后,管理员身份运行cmd命令,查看bcdedit /set testsigning truebcdedit  /debug on 等命令是否运行成功。若失败,请将bcdedit命令所在文件夹boot对应的盘(一般C盘)设置为活动状态;若依然失败,请修复C盘下的Boot(系统引导文件所在),或重装系统。

    2、VS2010

    3、WDK7.1.0WinDDK7600.16385.1

    地址:https://msdn.microsoft.com/en-us/windows/hardware/hh852365 该地址还连接 Windbg 调试工具 和Windows Symbols ,可以下载下来备后续调试时用。

    4WinDbg

    地址: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:WINDOWSSymbols*http://msdl.microsoft.com/download/symbols; 并选择ReloadWinDbg会自动帮你下载,关键是勾选reload

    5InstDrv软件(用于安装、启动、停止、卸载驱动)

    注:srvinstw.exe 也可以安装、卸载sys文件,但需要在cmd命令窗口下执行net start 驱动名、net stop 驱动名来启动、停止服务。

    664Signer-V1.2Win7 64位 私有测试数字签名软件)

    7DbgWiew.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 LiteEasyBCD(系统引导文件修复工具)PartitionManager(将C盘设置为活动分区)等

    二、配置VS2010 64位开发环境

    1、在VSVisualC++下新建 空项目

    添加Driver类,将头文件删除,将Driver.cpp文件修改为Driver.c文件,内容如下:

    #include "ntddk.h"

    // 提供一个Unload函数只是为了

    VOID DriverUnload1(PDRIVER_OBJECT driver)

    {

    // 但是实际上我们什么都不做,只打印一句话:

    DbgPrint("MyDriver: Our driver is unloading ");

    }

    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:WinDDK7600.16385.1文件夹下

    1)常规

    目标文件扩展名:.sys

    2)VC++目录

    可执行文件目录(编译器路径):C:WinDDK7600.16385.1inamd64

    注:Xp系统64位如下:

    ----------C:WinDDK7600.16385.1inx86amd64

           ----------C:WinDDK7600.16385.1inx86

    包含目录:C:WinDDK7600.16385.1incapi

    C:WinDDK7600.16385.1inccrt

    C:WinDDK7600.16385.1incddk

    库目录:C:WinDDK7600.16385.1libwin7amd64

    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:WinDDK7600.16385.1文件夹的ia64X86等路径,进行修改可以配置为ia6432位系统。

    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:WINDOWSSymbols*http://msdl.microsoft.com/download/symbols; 并选择

    ReloadWinDbg会自动下载字符表,关键是勾选reload

    2)设置自己生成的.sys对应的字符(Symbol)路径:

    E:ProjectTestDriverTestDriverx64DriverDebug64

    3)设置自己生成.sys的原代码路径:E:ProjectTestDriverTestDriver

    注:自己生成的.sys文件默认路径:E:ProjectTestDriverx64DriverDebug64

    6、安装.sys文件

    以管理员身份运行运行InstDrv.exe,选择.sys文件,进行安装、启动等操作

    注:请不要在本地主机,测试含有断点的内核,否则卡机,无法进行任何操作,应该采用双机调试(即新建个虚拟机,本地机与虚拟机通过管道进行通信)。

    配置虚拟机

    1、安装虚拟机

    注:主板默认没有开启虚拟化技术,一般方法是开机或重启时按F12键进入BIOS菜单,将虚拟化(Virtualization...

    2、配置虚拟机

    1)开始-->WMware Work Stations-->双击“我的电脑”下的一个虚拟机(Windows 7 x64-->编辑虚拟机设置-->移除打印机-->添加窜行端口

    2)选中刚添加的窜行端口,在右侧的对话框中,设置如下:

    勾选 启动时连接

    选择 使用命名的管道(N

    其下的两个下拉框分别选择:该端是服务器、另一端是应用程序

    3)本人执行和未执行该步骤都能够调试成功。本步骤作为多余补偿,如果你未执行该步骤失败,请将主机目录C:WINDOWSSymbols下的拷贝到虚拟机的相同位置。并且把自己生成的驱动编译后生成的字符文件(E:ProjectTestDriverTestDriverx64DriverDebug64

    目录下)放到虚拟机的C:WINDOWSSymbols目录下。主要匹配主、客机上字符的一致性。

    3、双机调试

    给源代码添加调试时中断语句

    #if _DEBUG   //DBG

         __debugbreak(); //64

    #endif

    重新生成sys文件,重新执行以上步骤,然后以管理员身份打开主机上的WinDbg软件,再在客户机安装.sys文件及开启、关闭、卸载等操作。开启后即进入中断点,可以一步步进行调试。。。

    注:汇编_asm int 3 中断,在xp上 正确,在64Win7上报错。如果未能进入断点进行调试,请检查sys文件是否在客户机(虚拟Win7系统)安装成功,系统字符集(Symbols)、本人字符Symbols是否下载或设置正确,管道端口是否正确等

    提示:在本地主机上不以管理员身份运行软件,也可能是管理员身份成功运行,而客户机(虚拟机上一般都要是以管理员身份运行软件)

    若进行 Win7 + WDK8.0+Windbg 进行Driver Filter开发,请将WDK7卸载,否则运行时会报大堆离奇错误。。。。

  • 相关阅读:
    重要:VC DLL编程
    VC++程序员如何做好界面
    复习二叉搜索树作的几道题
    eclipse JAVA反编译
    秒,毫秒,微秒,纳秒,皮秒,飞秒
    redis实现tomcat集群session共享
    redis启用持久化
    Spring
    Spring scope
    FastJSON 使用
  • 原文地址:https://www.cnblogs.com/shenchao/p/4832843.html
Copyright © 2011-2022 走看看