• ① 张帆编写的《Windows驱动开发技术详解》中的示例,都是针对VC6.0+ WDK3790.1830+目标为WinXP,环境而准备的,因此: (VC6.0不能将上述设置为wxp目录,因为VC6不能引用wxp目录的文件,不过使用w2k目录下的...

    ① 张帆编写的《Windows驱动开发技术详解》中的示例,都是针对VC6.0+ WDK3790.1830+目标为WinXP,环境而准备的,因此:


    (VC6.0不能将上述设置为wxp目录,因为VC6不能引用wxp目录的文件,不过使用w2k目录下的头文件和库文件的生成sys和WinXP是兼容的);


    ② 在VS2005中,可以将上述的目录“w2k”替换为“wxp”,



    也可以使用“WDK7600.16385”的头、库文件:


    选择VC6还是高版本的VS2005,我推荐高版本的VS2005。一是VC6只能链接W2K目录,有些使用没有,如“RTL_CONSTANT_STRING”宏定义就未在w2k下实现定义;二是VC6编译一些工程时,总会有一些错误(编译OpenGL一些有关的程序,程序__ftol2错误,不得不放弃VC6)。

    另外,对WDK3790.1830和WDK7600.16385版本的选择,我推荐还是选择高版本。一是高版本可以方便的编译64位驱动,二是不会出现一些莫名其妙的低版本错误。


    ③ 只推荐使用VC6或者VS2005浏览驱动工程,不推荐使用它们编译驱动工程。因为在链接时,驱动lib目录下的文件(如:C:\WINDDK\3790.1830\lib\w2k\i386、C:\WINDDK\3790.1830\lib\crt\i386)和应用程序目录下的文件(如:C:\Program Files\Microsoft Visual Studio\VC98\LIB等)有冲突,这和链接的先后顺序有关,每次调整这些链接顺序很繁琐,容易忘记且容易出错(曾经出过.rdata错误)。

    编译驱动工程,还是推荐使用DDK自带的CMD环境。


    ④ 一旦驱动目录里有一个Sources文件,就可以使用DriverStudio的Source to DSP Converter工具,将Sources文件转换为VC6的Dsp工程,配合VC助手很方便的浏览工程。下图就是将Plx库转换为Dsp工程文件:


    2015-01-20编辑:使用DS3.2.1吧,上面的Sources转换工具,还能直接转换为VS2005的工程,直接到这里下载DS3.2.1完整版:http://download.csdn.net/detail/dijkstar/8380783


    2015-04-12编辑:高版本的VS2013直接支持将Sources转换为VS工程项目文件,《Windows驱动开发详解》里的示例能编译通过。但VS2013需和WDK8.1一块配合使用,WDK8.1里没有的命令行编译环境,和以前的WDK环境有了很大的区别;并且VS2013编译出的驱动仅支持Win7、Win8、Win8.1三个系统。

    展开全文
  • 这篇博客主要帮助大家实现驱动程序的开发环境搭建以及双机调试的环境搭建。因为我需要面对的操作系统比较广,所以需要两个开发环境才可以基本覆盖(如果你不需要面对很多操作系统,可以把主机作为开发机以及调试机,...

    工作将近三个月了,做了几个项目,想在这里总结一下,方便以后自己或者大家借鉴。最近一个项目里需要做一个文件过滤驱动,我打算把整个过程中遇到的坑和解决方法,总结一下。这篇博客主要帮助大家实现驱动程序的开发环境搭建以及双机调试的环境搭建。

    因为我需要面对的操作系统比较广,所以需要两个开发环境才可以基本覆盖(如果你不需要面对很多操作系统,可以把主机作为开发机以及调试机,虚拟机作为测试机)
    这里使用vs2015+WDK10+win10 和vs2008+wdk7+ddk+win7
    这两个都是开发环境,vs2015+WDK10+win10 配置很简单,安装完成就可以使用,如果找不到头文件就在VC++目录里添加一下
    这里详细说vs2008+wdk7+dd7+win7

    这里说明一下相关名词(我这里本机是win10,虚拟机装了win7)
    开发机:win10(本机)涉及到比较老的操作系统会用win7开发,但是还是将驱动安装在 虚拟机,在调试机调试
    调试机:win10(本机)
    虚拟机:vm
    测试机:虚拟机中的操作系统(这里安装win7)

    因为驱动是在内核运行的,所以我们调试驱动需要用调试机去hook测试机的OS,然后运行测试机的驱动进行调试
    我们要做的是在开发机开发驱动,生成.sys .pbd .cer(证书)然后编写.inf安装文本(VS2013以后会自动生成,修改个别部分就好了),把这些东西拿到测试机去安装,在调试机(一般是开发机)调试测试机

    • 环境搭建分为以下几个步骤
      一.虚拟机OS安装
      二.在开发机开发环境vs2008+wdk7+ddk
      三.在测试机配置调试环境(添加启动项,串口,改为dbg模式)
      四.在测试安装驱动demo(使用sc query 驱动名 来查看驱动是否成功安装并运行)
      五.给测试机添加串口
      六.在调试机机使用windbg工具hook测试机的操作系统

    一.虚拟机OS的安装
    (如果ISO不是官方的,虚拟机检测不到,无法使用以下步骤,可以根据这个教程安装http://jingyan.baidu.com/article/cd4c29791fcf1b756e6e6034.html
    1.安装VMware Workstation
    下载安装程序安装,如果主机操作系统开启了光驱自动运行功能,安装向导弹出提示框提示光驱的自动运行功能将影响虚拟机的使用询问是否要关闭此项功能,选择“是”关闭掉主机的此项功能。
    安装完成后使用序列号激活
    5A02H-AU243-TZJ49-GTC7K-3C61N
    VF5XA-FNDDJ-085GZ-4NXZ9-N20E6
    UC5MR-8NE16-H81WY-R7QGV-QG2D8
    ZG1WH-ATY96-H80QP-X7PEX-Y30V4
    AA3E0-0VDE1-0893Z-KGZ59-QGAVF
    2.在虚拟机搭建OS(使用自定义方便设置虚拟机相关配置,没有特别要求可以选择典型,根据默认创建)
    这里写图片描述
    处理器和内存根据需要设置
    这里写图片描述
    这里附上激活序列号,如果安装完成后发现未能成功激活,去驱动开发目录里找到激活工具microKMS_v17.09.15激活
    win10秘钥专业版:W269N-WFGWX-YVC9B-4J6C9-T83GX
    win7通用序列号:MVBCQ-B3VPW-CT369-VM9TB-YFGBP
       GPRG6-H3WBB-WJK6G-XX2C7-QGWQ9
       MM7DF-G8XWM-J2VRG-4M3C4-GR27X

    网络类型选NAT比较容易设置,和主机使用同一个IP地址拨号
    这里写图片描述

    二.在开发机开发环境vs2008+wdk7+ddk
    1.首先在开发机安装VS2008,并配置环境变量
    2.然后下载WDK7600和DDK的资源
    3.安装WDK7600,在选择组件的时候全部勾选,有可能会弹出一个信息框(do you want to continue),点OK
    4.打开DDK的资源文件夹,安装ddkwizard_setup,全部默认,将另外的cmd文件和bat文件复制到WDK的安装目录下,如图
    这里写图片描述
    5.接下来设置WDK的环境变量,将WDK的安装目录C:\WinDDK添加到Path变量中,然后新建一个系统变量 变量名:WLHBASE变量值:C:\WinDDK\7600.16385.1
    或者变量名:W7BASE变量值:C:\WinDDK\7600.16385.1
    需要注意如果设置第一个新建项目的时候选择Windows Vista/2008 Server WDK
    如果设置第二个变量名新建项目的时候选择Windows 7/2008 Server R2 WDK
    这里写图片描述
    因为在编译的时候,是根据不同的变量名寻找资源的,如图
    这里写图片描述
    6.进入VS2008配置
    点击菜单栏的工具,选项
    添加可执行文件路径
    这里写图片描述
    添加库文件路径
    这里写图片描述
    添加包含文件路径
    这里写图片描述
    6.验证是否成功配置
    这里写图片描述
    根据你设置的环境变量选择要用的WDK
    这里写图片描述
    创建好了项目直接编译,如果出现编译成功,那就说明配置完成了。

    三.在测试机配置调试环境(添加启动项,串口,改为dbg模式)
    设置 Windows 符号服务器本地缓存路径
    设置环境变量:_NT_SYMBOL_PATH
    srv*D:\symbolFilePath*http://msdl.microsoft.com/download/symbols;cache*D:\symbolFilePath
    打开cmd(需要注意登陆的用户必须是管理员)
    C:\Users\Administrator>bcdedit
    显示如下信息

    Windows 启动管理器

    标识符 {bootmgr}
    device partition=C:
    description Windows Boot Manager
    locale zh-CN
    inherit {globalsettings}
    default {current}
    resumeobject {3efd3a30-a452-11de-ba3a-870b5a0c554f}
    displayorder {current}
    {3efd3a36-a452-11de-ba3a-870b5a0c554f}
    toolsdisplayorder {memdiag}
    timeout 30

    Windows 启动加载器

    标识符 {current}
    device partition=C:
    path \Windows\system32\winload.exe
    description Windows 7
    locale zh-CN
    inherit {bootloadersettings}
    recoverysequence {3efd3a37-a452-11de-ba3a-870b5a0c554f}
    recoveryenabled Yes
    osdevice partition=C:
    systemroot \Windows
    resumeobject {3efd3a30-a452-11de-ba3a-870b5a0c554f}
    nx OptIn

    实模式启动扇区

    标识符 {3efd3a36-a452-11de-ba3a-870b5a0c554f}
    device partition=C:
    path \ghldr.mbr
    description DOS

    把timeout 30改为0,修改方法如下:
    通过命令BCDEDIT /set {bootmgr} timeout 1 来配置停留时间,前面的1就是时间值,单位为秒。
    BCDEDIT /set {current} description 1
    创建新的系统启动项(xp upper)
    bcdedit /copy {current} /d “Windows 7 Kernel Debug”
    bcdedit /debug {f44707ab-f03c-11e2-8930-aeaa10f372b7} on //这几行命令可以通过msconfig去开启
    设置COM口波特率
    打开msconfig,如果成功执行了之前的操作,会发现默认os的名称被改成了1,然后下面新建了一个OS,点击下面的OS然后将它设为默认启动项
    这里写图片描述
    然后点击高级选项,进行如下设置,开启调试模式
    这里写图片描述

    四.在测试安装驱动demo
    (使用sc query 驱动名 来查看驱动是否成功安装并运行)(这一步仅仅是为了简单的测试我们刚才的第三步操作是否成功了)
    如果是用VS2013以上开发的,自动生成INF文件,那么可以用INF文件来安装。如果编译器没有自动生成INF文件,就下载DriverMonitor
    在虚拟机用DriverMonitor来加载一个驱动,首先把开发机生成的相关文件拿到测试机,使用DriverMonitor打开 .sys文件,如果出现下图输出,则说明配置成功。
    这里写图片描述

    五.添加端口,使用主机hook虚拟机OS
    如果你的虚拟机设备里存在打印机,将它删除,为了让新配置的Serial Port 为1(如果不删除Printer,后面配出来的会是SerialPort =2,这还需要在虚拟机中再命令设置)
    这里写图片描述
    然后添加一个串行端口
    这里写图片描述
    输出到命名管道

    这里写图片描述
    这里写图片描述

    记得勾选轮询时主动放弃CPU
    这里写图片描述
    六.在调试机使用windbg工具hook虚拟机操作系统
    关于使用windbg工具来调试我们的驱动的步骤,我会在另外一篇博客总结,写在这里感觉太乱了。这篇博客主要帮助大家实现驱动程序的开发环境搭建以及双机调试的环境搭建。
    这里我们写一个批处理脚本,需要修改的地方是windbg的位置,还有你的端口号名称,其实就是为了每次打开windbg不用重新设置参数
    这里写图片描述
    然后运行批处理脚本,如果windbg出现如下显示,说明已经hook住了虚拟机os,这时虚拟机的OS是停止的
    这里写图片描述
    注意:这里可能出现连接有问题,可能是因为虚拟机OS调试端口没设置好,如果新建端口之前删除了之前的所有串行端口
    那么你新建的端口是第一个,所以调试端口这里选择COM1,以此类推
    这里写图片描述
    到这里我们就实现了开发环境的搭建和双机调试环境的搭建,接下来可以开发一些简单的驱动了,关于使用windbg使用符号文件调试驱动的步骤我会在另一篇博客总结。

    展开全文
  • 驱动开发环境搭建

    转载请注明来源:
    enjoy5512的博客 : http://blog.csdn.net/enjoy5512
    GitHub : https://github.com/whu-enjoy


    本系列教程采用VMware+本机进行双机调试,本机是Win10,虚拟机使用XP SP3进行运行调试


    一. 虚拟机端配置


    1.1 安装VMware并安装XP SP3系统

    这个网上教程很多,就不详述了
    这里找了一篇百度的教程
    

    http://jingyan.baidu.com/article/7f41ececd3be66593d095ca2.html


    1.2 配置虚拟机XP系统

    这里写图片描述
    需要用到的软件:
    SRVINSTW.exe : 驱动安装软件
    Dbgview.exe : 驱动输出查看程序
    VMwareTool : 方便在本机和虚拟机之间移动文件,直接在VMware的菜单栏虚拟机->安装VMwareTool便可以自动安装

    其他配置:
    1. 在C盘下建立一个Driver文件夹,用于存放测试的驱动,并建立一个快捷方式在桌面
    2. 添加一个命令行启动的快捷方式,用于手动启动/关闭服务
    3. 去掉系统隐藏文件隐藏的功能,编辑c:\boot.ini文件,添加系统调试启动项

    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200

    资源管理器->工具->文件夹选项->查看->显示所有文件和文件夹
    这里写图片描述


    1.3 测试驱动安装与卸载(可以搭建好后面的环境后再测试)

    1. 复制测试驱动到c:\Driver文件夹下
    2. 安装服务.
      打开SRVINSTW.exe,选择安装服务
      这里写图片描述

    选择本地机器
    这里写图片描述

    填写服务名,用于后面启动/关闭服务
    这里写图片描述

    填写驱动路径,这里要手动输入
    这里写图片描述

    选择设备驱动
    这里写图片描述

    驱动器目标名可为空
    这里写图片描述

    设置启动方式为手动,如果设置为自动的话,驱动出现问题蓝屏,开启自启动后又蓝屏
    这里写图片描述

    1. 启动服务
      打开DebugView.exe,勾选Capture->Capture Kernel
      这里写图片描述

    打开命令行,启动服务,可以看到DebugView中获取到了驱动的输出
    这里写图片描述

    1. 关闭服务
      命令行关闭服务,DebugView中获取到服务被卸载
      这里写图片描述

    2. 卸载驱动
      打开SRVINSTW.exe,选择移除服务
      这里写图片描述

    选择本地机器
    这里写图片描述

    勾选包括设备驱动器,选择我们要卸载的服务
    这里写图片描述

    1. 添加虚拟机输出命名管道
      1). VMware菜单->编辑->首选项->设备->启动虚拟打印服务
      2). 编辑虚拟机设置->移除打印机
      3). 编辑虚拟机设置->添加->串行端口->输出到命名管道->一端是服务器,一端是应用程序
      这里写图片描述

    二. 配置主机


    需要用到的软件:
    这里写图片描述
    WDK
    WDK程序下载链接 :
    https://developer.microsoft.com/zh-cn/windows/hardware/windows-driver-kit

    WinDbg : 调试工具

    其他配置:
    1. 如上图,添加x86 Checked Build Environment快捷方式到桌面
    2. 添加WinDbg快捷方式,右键快捷方式->属性->目标.修改启动属性
    3. 这里写图片描述

    "C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe" -b -k com:port=\\.\pipe\com_1,pipe

    三. 调试虚拟机

    打开虚拟机,选择第二个启动项,启动调试程序
    这里写图片描述

    打开WinDbg,可以看到虚拟机中断了,在命令输入窗口输入g,让系统正常运行
    这里写图片描述

    自此环境搭建好了………

    展开全文
  • 本文讲述在Win7 SP1 x64系统中,如何搭建基于WDK7600的驱动开发环境

    驱动开发入门 - 之一
    Win7 SP1 x64 驱动开发环境搭建
    *—— By EXP 2017-10-04*

    完整原文下载(转载请注明出处,仅供分享学习,严禁用于商业用途)


    1. 概述

    1.1. 前言

    适读人群:具备良好的C/C++开发经验,一定的逆向工程基础。

    本文仅讲述在Win7 SP1 x64系统中,搭建基于WDK7600的驱动开发环境,不会解析任何驱动开发的代码。

    之所以撰写本文,是因为网上充斥着大量已经过时的基于WinXP(x86)-DDK的驱动开发教程、或针对Win(x64)-WDK但不成体系的驱动开发教程,导致新同学在搭建开发环境时遇到的各种问题难以被解决。

    所谓工欲善其事、必先利其器,特此记录并整理了在64位系统中,从搭建驱动环境到安装调试驱动程序的每个步骤、可能遇到的问题以及解决方案,以供其他同学做入门参考,降低学习成本。

    另外驱动程序是不存在兼容一说的(即x86的驱动只能运行在x86系统、x64的驱动只能运行在x64的系统),但是x86已经被逐步淘汰了,因此本文只会针对x64进行说明(其实x86也是大同小异)。


    1.2. 名词解析

    名词 英文原文 解析
    VxD Virtual Device Driver 虚拟设备驱动程序
    DDK Device Development Kit 设备驱动程序开发工具包,广泛应用于XP-x86年代,已淘汰
    WDM Windows Driver Model Windows驱动模型
    WDK Windows Driver Kit Windows驱动开发工具
    WDF Windows Driver Foundation Windows驱动开发框架
    MSDN Microsoft Developer Network 微软以 Visual Studio 和 Windows 平台为核心整合的开发虚拟社区
    提供面向软件开发者的信息服务(包括技术文档、产品下载、Blog等)
    KMDF Kernel-Mode DriverFramework 内核模式驱动程序
    UMDF User-Mode DriverFramework 用户模式驱动程序
    chk Checked(debug) 调试版本标识
    fre Free(retail,或release) 发布版本标识

    1.3 WDK简史

    ——部分内容摘于博文:http://lib.csdn.net/article/dotnet/41373

    早期的Windows 95/98的设备驱动是VxD,其中x表示某一类设备。从Windows 2000开始,开发驱动程序必以WDM为基础的,但如果使用DDK来开发WDM,其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易。
      为改善这种局面,从Vista开始,微软推出了新的驱动程序开发环境WDF。WDF是微软提出的下一代全新的驱动程序模型,它是在WDM的基础上发展而来的,支持面向对象、事件驱动的驱动程序开发,提供了比WDM更高层次抽象的高度灵活、可扩展、可诊断的驱动程序框架。WDF框架管理了大多数与操作系统相关的交互,实现了公共的驱动程序功能(如电源管理、PnP支持),隔离了设备驱动程序与操作系统内核,降低了驱动程序对内核的影响。
      在众多WDK版本之中,WDK7600算是承上启下的一个版本。因为在此之前的驱动开发主要都是基于XP的DDK,难度过大且已过时。
      微软在Win7/Vista时期对DDK做了集成优化衍生出WDK,且适用于之后的Win8/Win10。
      但是微软在WDK7600以后就不再提供独立的内核驱动开发包了,并以Win8/Win10+WDK10 为主提供了集成度更高的WDF(使得Visual Studio可以集开发、编译、安装、部署和调试于一身),但是环境配置差异变化较大,且由于本人不喜欢Win8/Win10系统,有兴趣的同学可以自行研究,本文仅以WDK7600为核心搭建驱动环境


    2. 操作系统与预装组件

    ① 系统版本: Win7 SP1 x64 (必须升级到SP1版本)
      ② C/C++ x64 .NET 库:需安装四个版本 [v2.0.50727] [v3.0] [v3.5] [v4.0.30319]
      ③ Microsoft Office 2007:安装 Visual Studio IDE(VS2008 / VS2010)前置组件


    3. 相关工具安装

    3.1. 安装清单

    部分工具的功能是重复的,请根据下文所建议的两种开发环境选择性安装。

    表 1 安装清单(安装顺序建议与清单保持一致)
    工具 版本 用途 备注 下载
    Visual Studio 2008 x64 C/C++程序开发IDE
    用于驱动程序编码
    需先安装前置程序/库:
    .NET x64 v2.0.50727
    .NET x64 v3.0
    .NET x64 v3.5
    .NET x64 v4.0.30319
    Microsoft Office 2007
    Visual Studio 2010 x64 C/C++程序开发IDE
    用于驱动程序编码
    需先安装前置程序/库:
    .NET x64 v2.0.50727
    .NET x64 v3.0
    .NET x64 v3.5
    .NET x64 v4.0.30319
    Microsoft Office 2007
    Visual Assist X 10.8.2007 VS IDE 辅助插件 可选安装,提供编码提示、补全等辅助功能 CSDN
    WDK 7600 微软提供的Win驱动开发工具包 提供驱动开发的API(头文件)、库文件等 官方地址
    DDKWizard 1.3a VS2008驱动模板生成插件 可在VS2008中直接创建驱动程序开发模板 官方地址
    CSDN
    ddkbuild.bat
    ddkbuild.cmd
    1.3a VS2008驱动程序生成脚本 需配合WDK与DDKWizard使用 官方地址
    CSDN
    EasySYS 0.3.2.7 VS2010驱动模板生成工具 生成可被VS2010导入的驱动程序开发模板 CSDN
    64Signer 1.2 内核驱动程序数字签名工具 Win7之后的64位系统的内核驱动程序必须具备数字签名,此工具可伪造测试用的数字签名 CSDN
    DriverMonitor 3.2.0 内核驱动程序调试器 XP x86用于安装、启动内核程序的调试工具,Win7 x64可能不兼容 CSDN
    InstDrv 1.3.0 内核驱动程序调试器 Win7用于安装、启动内核程序的调试工具 CSDN
    DebugView 4.81 内核驱动消息捕获器 配合DriverMonitor或InstDrv使用,用于调试内核程序断点打印消息 CSDN
    VMWare 11.1.2 虚拟机 用于搭建隔离环境调试驱动程序
    WinDbg Windows平台下的用户态和内核态调试工具 用于配合虚拟机双机调试驱动程序 官方地址
    CSDN

    3.2. WDK的安装与配置

    下载WDK的安装镜像GRMWDK_EN_7600_1.ISO,安装到任意目录即可。
      本文的安装目录为:E:\04_work\re\WDK
      环境变量配置:
      ① 右击【计算机】–>【属性】–>【高级系统设置】–>【高级选项卡】–>【环境变量】
      ② 在【系统变量】中新建四个变量:

    变量名 变量值 备注
    W7BASE E:\04_work\re\WDK Win7用, Win7 必须配置
    WLHBASE E:\04_work\re\WDK Win Vista\2008 用,Win7 必须配置
    WNETBASE E:\04_work\re\WDK Win 2003 用,Win7可选配置
    WXPBASE E:\04_work\re\WDK Win XP 用,Win7可选配置

    注:建议添加所有环境变量


    4. 驱动开发环境配置

    VS2008 与 VS2010 两种开发环境 任选其一即可
      若只是开发简单的驱动程序且不涉及到汇编指令,VS2008环境更便捷。但若驱动程序需要嵌入汇编语言,则推荐使用VS2010。
      两种开发环境的差异比较如下:

    - VS2008 + DDKWizard VS2010 + EasySYS
    自动生成WDK开发模板 支持(IDE内生成) 支持(IDE外生成,需导入)
    需修改的开发配置项 WDK环境依赖
    WDK配置参数(source文件)
    编译平台位数
    编译命令参数
    WDK环境依赖
    WDK配置参数(source文件)
    支持编译位数 x86(默认)
    x64(需修改平台和命令参数)
    x86(需修改平台)
    x64 (默认)
    驱动程序签名方式 手动关闭系统签名校验
    手动对驱动签名
    手动关闭系统签名校验
    手动对驱动签名
    混合汇编 x86:支持(__asm{}内联汇编)
    x64:兼容性差(DDK工程无法自动编译*.asm文件)
    x86:支持(__asm{}内联汇编)
    x64:支持(WDK工程可自动链接到*.asm文件混合编译)

    4.1. 环境1(不推荐):VS2008 + DDKWizard

    4.1.1. VS2008的安装与配置

    ① 安装VS2008(任意位置即可)
      ② 打开VS2008 ,设置WDK环境依赖: 【工具】–>【选项】–>【项目和解决方案】–>【VC++目录】 --> 右侧【平台】选择【x64】 ,按下表添加WDK目录(需置顶并确保顺序):

    - x64平台(即64位编译环境) Win32平台(不必配置,仅参考)
    可执行文件 &(W7BASE)\bin\x86\amd64
    &(W7BASE)\bin\x86
    &(W7BASE)\bin\x86
    &(W7BASE)\bin\x86\x86
    &(W7BASE)\tools\pfd\bin\bin\x86
    包含文件 &(W7BASE)\inc\api
    &(W7BASE)\inc\crt
    &(W7BASE)\inc\ddk
    &(W7BASE)\inc\wdf
    &(W7BASE)\inc\wdf\kmdf\1.9
    &W7BASE)\inc
    &(W7BASE)\inc\api
    &(W7BASE)\inc\crt
    &(W7BASE)\inc\ddk
    &(W7BASE)\inc\wdf
    &(W7BASE)\inc\wdf\kmdf\1.9
    &(W7BASE)\inc
    库文件 &(W7BASE)\lib\win7\amd64 &(W7BASE)\lib
    &(W7BASE)\lib\wdf\kmdf\i386\1.9
    &(W7BASE)\lib\wxp\i386
    源文件 &(W7BASE)\src &(W7BASE)\src

    备:经测试第②步不论是否在x64平台配置WDK目录也可成功编译DDK(前提是配置了上文的环境变量),而且一旦配置了这些目录,会导致x64平台只能编译DDK项目,无法在编译普通的控制台程序(VS2008的解决方案平台是所有项目共用的,VS2010则是独立的)。所以建议只有在不配置就无法编译DDK的情况下才执行第②步


    4.1.2. DDKWizard的安装与配置

    ① 安装DDKWizard(任意位置即可)
      ② 在WDK根目录下新建文件夹script,把 ddkbuild.batddkbuild.cmd 复制进去。
      ③ 修改【系统变量】中【Path】变量值,末尾添加 ;%W7BASE%\script;
      ④ 安装成功后,在VS2008中新建项目时会增加一个 DDK Project 的模板,利用该模板创建WDK项目,会自动调用ddkbuild.cmd 脚本编译驱动程序。


    4.1.3. WDK项目创建、配置与发布

    ① 打开VS2008 , 【文件】–>【新建】–>【项目】–>【DDK Project】 ,如图 1。
    在这里插入图片描述

    图 1 创建WDK项目

    ② 此处选择【Driver】模板(会自动创建默认接口代码),然后填写WDK项目名称(本文样例项目为VS2008_WDK_Demo),点击【确定】后,如图 2配置即可。

    在这里插入图片描述

    图 2 配置WDK项目环境参数

    ③ 为项目添加64位编译器(前面已设置好WDK环境依赖):点击上方【Win32】 --> 【配置管理器】 --> 【活动解决方案平台】 --> 【新建】 --> 【x64】 --> 【确定】 , 如图 3。

    在这里插入图片描述

    图 3 添加64位编译器

    ④ 配置sources文件:sources文件为ddkbuild脚本用于编译驱动程序的配置文件,如图 4。
      一般情况下,只需关注【TARGETTYPE】和【SOURCES】属性即可:

    属性 取值 备注
    TARGETTYPE DRIVER 固定值,声明所编译的类型为“驱动”
    SOURCES 项目中【Source Files】(*.cpp)
    和【Resource Files】(*.rc)中所有文件名称集合
    值格式如下(其中\表示断行):
    SOURCES=A.cpp \
         B.cpp \
         …
         Z.cpp

    在这里插入图片描述

    图 4 sources文件设置

    ⑤ 修改ddkbuild.cmd 脚本入参:【项目】–>【属性】–>【配置属性】–>【NMake】,如图 5,把【“生成”命令行】和【“全部重新生成”命令行】的值修改为:

    &(DDKBUILD_PATH) -W7X64 checked . -cZ -prefast

    在这里插入图片描述

    图 5 修改ddkbuild.cmd 脚本入参

    ⑥ 编译项目:【生成】–>【(重新)生成解决方案】
      若上述配置均正确,则编译成功。默认情况下会在项目根路径下生成目录objchk_win7_amd64(注意目录名称带有64位标识才表示该驱动是64位的)。
      编译得到的【objchk_win7_amd64\amd64<font color=“red”>VS2008_WDK_Demo.sys】即为内核驱动程序

    在这里插入图片描述

    图 6 打开驱动程序位置

    在这里插入图片描述

    图 7 内核驱动程序文件

    4.2. 环境2(推荐):VS2010 + EasySYS

    4.2.1. VS2010的安装与配置

    ① 安装VS2010(任意位置即可)
      ② 暂不需要任何配置。
      之所以不需要类似于VS2008配置WDK环境依赖,是因为使用EasySYS生成的项目会默认配置好这些值。如图 8 查看WDK环境依赖配置,导入EasySYS生成的项目后,可以通过 右键项目 --> 【属性】–>【配置属性】–>【VC++目录】 查看这些环境配置(注意使用的环境变量是WLHBASE,而非W7BASE,这也是为什么【3.3.2 WDK的安装与配置】需要配置这两个环境变量)。

    在这里插入图片描述

    图 8 查看WDK环境依赖配置

    4.2.2. EasySYS的安装与配置

    VS2010 暂无类似于DDKWizard的内置插件辅助创建WDK项目,因此需要EasySYS在外部直接生成WDK项目模板,再由VS2010导入项目(此工具也适用于VS2008)。
      ① EasySYS无需安装,在任意位置运行均可
      ② 填写【工程名称】(即WDK项目名称,本文样例项目为VS2010_WDK_Demo
      ③ 选择【保存路径】(本文样例路径为D:\01_workspace\c\vs2010\re\VS2010_WDK_Demo
      ④ 【编译环境】选择【VS 2010】, 【DDK版本】选择【WDK 7600.16385.1】,【目标系统】勾选【Windows 7】,其他任意即可,如图 9。
      ⑤ 点击【确定】后则会自动生成VS2010项目,如图 10。

    在这里插入图片描述

    图 9 EasySYS配置WDK项目模板

    在这里插入图片描述

    图 10 VS2010 WDK项目模板

    4.2.3. WDK项目导入、配置与发布

    ① 打开VS2010 , 【文件】–>【打开】–>【项目/解决方案】,选择EasySYS所生成的项目配置文件D:\01_workspace\c\vs2010\re\VS2010_WDK_Demo<font color=“red”>VS2010_WDK_Demo.sln,打开项目。
      ② 为项目添加64位编译器(前面已设置好WDK环境依赖):点击上方【Win32】 --> 【配置管理器】 --> 【活动解决方案平台】 --> 【新建】 --> 【x64】 --> 【确定】 , 如图 11。

    在这里插入图片描述

    图 11 添加64位编译器

    ③ 添加WDK相关文件:右键项目 --> 【添加】 --> 【新建过滤器】 --> 填写【WDK文件】(名称任意即可)。
      右键【WDK文件】 --> 【添加】 --> 【现有项】 ,选择【sources】【makefile】【BuildDrv.bat】【clean.bat】四个文件,如图 12(其实只需添加sources文件即可)。

    在这里插入图片描述

    图 12 添加WDK相关文件

    ④ 配置sources文件:sources文件为ddkbuild脚本用于编译驱动程序的配置文件,如图 13。
      一般情况下,只需关注【TARGETTYPE】和【SOURCES】属性即可:

    属性 取值 备注
    TARGETTYPE DRIVER 固定值,声明所编译的类型为“驱动”
    SOURCES 项目中【Source Files】(*.cpp)
    和【Resource Files】(*.rc)中所有文件名称集合
    值格式如下(其中\表示断行):
    SOURCES=A.cpp \
         B.cpp \
         …
         Z.cpp

    在这里插入图片描述

    图 13 sources文件设置

    ⑤ 编译项目:【生成】–>【(重新)生成解决方案】
      若上述配置均正确,则编译成功。默认情况下会在项目根路径下生成目录objchk_win7_amd64(注意目录名称带有64位标识才表示该驱动是64位的)。
      编译得到的【objchk_win7_amd64\amd64<font color=“red”>VS2010_WDK_Demo.sys】即为内核驱动程序

    在这里插入图片描述

    图 14 打开驱动程序位置

    在这里插入图片描述

    图 15 内核驱动程序文件

    5. 驱动程序签名

    5.1. 背景

    ——摘于博文:http://www.yiiyee.cn/Blog/64signer/

    微软对于自Vista开始的64位OS有新的数字签名策略,即所有内核驱动都必须是经过可信机构签发过数字证书的,否则系统拒绝加载,其目的是为了加强系统安全防护,使得XP时代来历不明的内核模块无法在系统中容身。
      但它却也给正经的内核开发人员带去了一个麻烦:开发过程中会不断生成新的驱动镜像文件,开发者不可能将每一个内部版本都拿去申请数字签名,一来不是所有开发者都可以负担起签证费用,二来签名过程麻烦,会大大延长开发周期。

    因此在本文中,无论【环境1】所生成的内核驱动程序【VS2008_WDK_Demo.sys】,抑或是【环境2】所生成的内核驱动程序【VS2010_WDK_Demo.sys】,在签名前均无法被系统加载


    5.2. 自签名工具 - 64Signer的安装与使用

    在这里插入图片描述

    图 16 64Signer界面

    64Signer可以对内核驱动程序签名(未通过MS认证的自签名,仅可用于测试)。
      此工具无需安装,直接把【环境1】或【环境2】所生成的内核驱动文件拖拽到64Signer,点击【签名】。若签名成功,右击内核驱动文件 --> 【属性】,会出现【数字签名】选项卡,如图 17所示:

    在这里插入图片描述

    图 17 内核驱动程序签名成功

    6. 驱动程序的加载与调试

    6.1在虚拟机搭建测试环境

    前文所编译生成的【VS2008_WDK_Demo.sys】或【VS2010_WDK_Demo.sys】驱动程序是无法直接在VS2008/VS2010中运行的(即使可以也不建议直接在开发机上运行),因为驱动程序运行在系统内核,稍有不慎就会导致蓝屏
      为此建议转移到虚拟机中执行驱动的装载和调试

    以VMWare虚拟机为例(先预装Win7 x64 SP1系统),先把虚拟机中的操作系统切换到测试模式,具体步骤如下:
      ① 在虚拟机中以管理员身份通过【win+R】 --> 【cmd】 打开DOS控制台。
      ② 输入命令【bcdedit /set testsigning on】 开启系统测试模式。
      ③ 输入命令【bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS】,关闭系统的强制校验驱动签名功能。
      ④ 重启系统使得②③设置生效。若设置成功,重启后在桌面右下角会出现当前系统为测试模式的水印,如图 18所示(某些系统会屏蔽这个水印,此时可以通过命令【bcdedit /enum】确认testsigning的值是否为Yes以判断系统当前是否处于测试模式,如图 19)。

    在这里插入图片描述

    图 18 系统测试模式

    在这里插入图片描述

    图 19 查看bcdedit当前配置值

    注:
     上述 ②③ 步骤中的两个bcdedit命令只需执行一次,永久生效
     若不执行这两个命令,驱动程序即使签名了也无法被系统加载。
     这两个bcdedit命令对应的恢复命令为:
     bcdedit -set loadoptions DENABLE_INTEGRITY_CHECKS
     bcdedit /set testsigning off


    6.2. 驱动加载

    常用的加载驱动程序的工具有两个:
      ① DriverMonitor:若加载失败会提示错误原因,但对部分Win7x64系统兼容性不好。
      ② InstDrv:若加载失败无错误原因提示,可运行于x64位系统。
      这两个工具的使用比较简单,参照图 20和图 21即可,此处就不再详细说明了。

    在这里插入图片描述

    图 20 驱动加载工具DriverMonitor

    在这里插入图片描述

    图 21 驱动加载工具InstDrv

    6.3. 驱动调试

    6.3.1. DebugView调试

    在驱动程序被DriverMonitor / InstDrv加载、并启动成功后,若驱动程序中有使用了DbgPrint / KdPrint 输出消息(这两个语句的作用类似于开发应用程序时的控制台输出语句),则可同时启动 DebugView 对 dbgPrint / kdPrint 输出的消息进行实时捕获
      由于DebugView是实时捕获消息,因此需要在驱动程序被加载前启动。启动DebugView后,如图 22配置,勾选【监视】下的【监视核心】、【启用详细核心输出】、【全部通过】、【监视事件】,捕获的消息如图 23所示。

    在这里插入图片描述

    图 22 DebugView配置

    在这里插入图片描述

    图 23 DebugView捕获消息样例

    6.3.2. VMWare + WinDbg双机调试

    此部分扩展内容较多,以后再另建文档作为独立教程详细说明。


    7. 附录1:环境搭建常见异常解决方案

    7.1. VS2008 / VS2010安装失败

    99%的原因都是因为缺失 .NET库 或 .NET的相关配置文件。
      尤其是非官方原版的GHOST系统,经常会被第三方出于某些目的修改、移动、删除.NET的库文件。
      更为致命的是 VS2008 / VS2010 安装过程中若出错,除了给出异常编码,不会有任何原因提示,目前通过百度找的办法也并非适合普罗大众,这里根据我个人的经验做一个总结:
      ① Win7下建议安装VS2010,这是微软专门为win7开发的版本
      ② 确保Microsoft Office 2007已安装成功
      ③ 确保.NET库文件已全部安装成功,需要同时安装4个版本:

    .NET x64 v2.0.50727
    .NET x64 v3.0
    .NET x64 v3.5
    .NET x64 v4.0.30319

    ④ 若.NET库安装失败,可从其他Win7机器拷贝(或者网上下载).NET的安装目录到以下两个对应目录:

    C:\Windows\Microsoft.NET\Framework
    C:\Windows\Microsoft.NET\Framework64

    上述4步均执行成功后,再安装 VS2008 / VS2010 一般来说可以畅通无阻了。
    但VS有些内置组件在安装过程可能报错,只能独立安装,这里也总结一下:


    7.1.1. VS2008 安装过程报错:ISetupComponent::Pre/Post/Install() failed in ISetupManager::InternalInstallManager() with HRESULT -2147023293.

    异常原因:
        安装 Microsoft Office 2007失败。

    解决方案:
        先尝试重装 Microsoft Office 2007, 若依旧出现此错误,则按如下步骤处理:
        ① 把vs2008镜像文件下的 \WCU\WebDesignerCore\WebDesignerCore.EXE 右键解压到(注意解压出来的文件夹里面有个Office.zh-cn)。
        ② 把 Microsoft Office 2007 光盘或光盘镜像中的Office.zh-cn文件夹 覆盖到 VS2008 的Office.zh-cn。
        ③ 运行第一步解压出来的文件中的setup.exe安装 Microsoft Office 2007


    7.1.2. VS2008 安装过程报错:X64 远程调试器未成功安装

    异常原因:
        缺失 .NET 相关库文件(但是具体缺失了什么缺没有提示)。

    解决方案:
        ① 手动解压 VS2008 的安装光盘,运行安装目录下的这个内置组件:

    \Remote Debugger\x64\rdbgsetup.exe

    ② 此时若内置组件安装失败,就会提示具体失败原因了(一般都是缺失.NET4.0库下的 \CONFIG\machine.config 文件)
        ③ 在网上下载对应文件放到报错目录,或者重装对应版本 .NET 库应该可以解决。


    7.1.3. VS2010 安装过程报错:Error: Installation failed for component Microsoft Visual Studio 2010 64bit Prerequisites (x64). MSI returned error code 1603

    异常原因:
        缺失 .NET 相关库文件(但是具体缺失了什么缺没有提示)。

    解决方案:
        ① 手动解压 VS2010 的安装光盘,依次运行安装目录下的几个内置组件:

    \WCU\64bitPrereq\x64\VS_Prerequisites_x64_chs.msi
    \WCU\SSCE\SSCERuntime_x64-chs.msi
    \WCU\SSCE\SSCERuntime_x86-chs.msi
    \WCU\SSCE\SSCEVSTools-chs.msi

    ② 此时若内置组件安装失败,就会提示具体失败原因了(一般都是缺失.NET2.0库下的 \CONFIG\machine.config 文件)
        ③ 在网上下载对应文件放到报错目录,或者重装对应版本 .NET 库应该可以解决。


    7.2. [Error 1275] - 此驱动程序被阻止加载

    使用DriverMonitor / InstDrv加载驱动程序成功,但启动时报错(如图 24):

    Error (1275):此驱动程序被阻止加载

    异常原因:
        在64位系统加载32位驱动程序、或者在32位系统加载64位驱动程序。

    解决方案:
        根据用于加载驱动的操作系统的位数,使用对应的平台重新编译驱动程序即可。
        
    在这里插入图片描述

    图 24 Error (1275)

    7.3. [Error 577] - Windows无法验证此文件的数字签名 某些软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明

    使用DriverMonitor / InstDrv加载驱动程序成功,但启动时报错(如图 25):

    Error (577):Windows无法验证此文件的数字签名 某些软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明

    异常原因:
        以下三个条件任意一条不满足:
        ① 驱动程序已进行数字签名
        ② 操作系统已进入测试模式
        ③ 操作系统已关闭数字签名校验

    解决方案:
        确保以下四个操作已全部执行:
        ① 使用64Signer对驱动程序进行数字签名
        ② 在DOS下执行bcdedit /set testsigning on命令进入测试模式
        ③ 在DOS下执行bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS命令关闭系统的强制校验驱动签名功能
        ④ 重启电脑(使得②③命令生效)
        
    在这里插入图片描述

    图 25 Error (577)

    8. 附录2:DDKWizard - ddkbuild脚本参数解析

    默认情况下,ddkbuild.cmd 脚本所编译的驱动程序是32位的(即使在VS2008选择了x64编译平台),此情况可从编译驱动程序后的输出目录名称得到验证(如objchk_win7_x86)。
      要使得所编译的驱动程序为64位,则需把脚本入参中的平台参数修正为对应的X64平台。命令格式可通过编辑ddkbuild.bat查看,如图 26。平台参数枚举可通过编辑ddkbuild.cmd查看,如图 27。修改后重新编译驱动程序,输出目录名称默认会包含64位标识(如objchk_win7_amd64)。
      例如本文【环境1】中默认的脚本命令如下,其中平台参数为 -W7(即win7x86):

    $(DDKBUILD_PATH) -W7 checked . -cZ -prefast

    修改为对应的64位平台参数 -W7X64 即可编译出64位驱动:

    $(DDKBUILD_PATH) -W7X64 checked . -cZ -prefast

    在这里插入图片描述

    图 26 ddkbuild命令格式

    在这里插入图片描述

    图 27 ddkbuild脚本参数

    9. 附录3:相关知识科普

    9.1. Windows程序的运行层级

    ——摘于博文:http://www.cnblogs.com/findumars/p/5557283.html

    在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃,如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么系统一天死机N回就不足为奇了。所以CPU将指令分为特权指令非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。
      Intel的CPU将特权级别分为4个级别:RING0、RING1、RING2、RING3(简称R0、R1、R2、R3)。R0层拥有最高的权限,R3层拥有最低的权限。按照Intel原有的构想,应用程序工作在R3层,只能访问R3层的数据;操作系统工作在R0层,可以访问所有层的数据;而其他驱动程序位于R1、R2层,每一层只能访问本层以及权限更低层的数据。
      这应该是很好的设计,这样操作系统工作在最核心层,没有其他代码可以修改它;其他驱动程序工作在R1、R2层,有要求则向R0层调用,这样可以有效保障操作系统的安全性。
      但现在的OS,包括Windows和Linux都没有采用4层权限,而只是使用2层:R0层和R3层,分别来存放操作系统数据和应用程序数据,从而导致一旦驱动加载了,就运行在R0层,即拥有了和操作系统同样的权限,可以做任何事情,而所谓的RootKit(拥有“根权限”的工具)也就随之而生了。


    9.2. 驱动模式

    ——摘于博文:http://lib.csdn.net/article/dotnet/41373

    运行 Windows 的计算机中的处理器有两个不同模式:“用户模式”“内核模式”。根据处理器上运行的代码的类型,处理器在两个模式之间切换。应用程序在用户模式下运行,核心操作系统组件在内核模式下运行。多个驱动程序在内核模式下运行时,某些驱动程序可能在用户模式下运行。
      当启动用户模式的应用程序时,Windows 会为该应用程序创建“进程”。进程为应用程序提供专用的“虚拟地址空间”和专用的“句柄表格”。由于应用程序的虚拟地址空间为专用空间,一个应用程序无法更改属于其他应用程序的数据。每个应用程序都孤立运行,如果一个应用程序损坏,则损坏会限制到该应用程序。其他应用程序和操作系统不会受该损坏的影响。
      用户模式应用程序的虚拟地址空间除了为专用空间以外,还会受到限制。在用户模式下运行的处理器无法访问为该操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改并且可能损坏关键的操作系统数据。
      在内核模式下运行的所有代码都共享单个虚拟地址空间。这表示内核模式驱动程序未从其他驱动程序和操作系统自身独立开来。如果内核模式驱动程序意外写入错误的虚拟地址,则属于操作系统或其他驱动程序的数据可能会受到损坏。如果内核模式驱动程序损坏,则整个操作系统会损坏。


    9.3. 驱动程序类型

    ——摘于博文:http://lib.csdn.net/article/dotnet/41373

    WDF提供了两个框架:
      ① 内核模式驱动程序KMDF(Kernel-Mode DriverFramework):
      这类驱动程序作为内核模式操作系统组件的一部分执行,它们管理I/O、即插即用、内存、进程和线程、安全等。内核模式驱动程序通常为分层结构。KMDF是Windows系统底层驱动,文件名为:*.SYS。关于KMDF更多的内容,可参阅 MSDN中“Getting Started with Kernel-ModeDriver Framework ”。

    ② 用户模式驱动程序 UMDF(User-Mode DriverFramework):
      这类驱动程序通常提供 Win32 应用程序与内核模式驱动程序或其他操作系统组件之间的接口。用户模式驱动程序支持基于协议或基于串行总线(如摄像机和便携音乐播放器)的设备。UMDF是用户层驱动,文件名为:*.DLL。关于KMDF更多的内容,可参阅 MSDN中“Introduction to UMDF”。

    无论内核模式的驱动程序或者用户模式的驱动程序,都使用同一环境进行构建,这一环境称为WDK;都采用同一套对象模型构建,采用同一个基础承载,这个基础就是WDF。由于WDF驱动模型提供了面向对象和事件驱动的驱动程序开发框架,大大降低了开发难度。使得像WinDriver、DriverStudio之类的第三方工具也随之退出历史舞台。更重要的,也是微软反复炫耀的是封装了驱动程序中的某些共同行为:例如即插即用和电源管理就属于这种共同行为。因为大多数驱动程序中都需要处理即插即用和电源管理问题(据说这大概要上千行的代码,况且没有相当水平还不一定能处理好)。为了一劳永逸,WDF干脆将即插即用和电源管理封装了进了对象之内,成了对象的缺省行为。
      WDF将驱动程序与操作系统内核之间进行了分离,驱动程序与操作系统交互工作交给框架内封装的方法(函数)完成,这样驱动开发者只需专注处理硬件的行为即可。这不仅避免了顾此失彼两面不周的弊端,也由于双方的分离,对操作系统内的某些改动,硬件制造商配套驱动程序的开发都有莫大的好处。


    9.4. 驱动的签名与认证

    从Win Vista/7 x64 系统开始,微软就要求用户必须使用经过数字签署过的驱动。换言之,没有经过数字签名的驱动是不允许安装到x64系统的。
      默认情况下,新编译的驱动程序都是没有数字签署的,若要对其进行数字签署,又可以分为两种形式:
      ① 自签名:包括从正规渠道付费获得的各种EV签名(如wosign、verisigned等),或由开发者本人创建发布的签名(如用64Signer签名,具体信任策略要看本地策略)
      ② WHQL认证:只能通过微软官方对驱动进行测试并通过后获得的认证(认证过程极其严格、周期长、费用高,不适合个人开发者),凡是通过WHQL认证的产品均会被授予“Designed for Windows”标识。此类别驱动最大的特点是稳定性高,和微软操作系统的兼容性好(几乎100%兼容)。

    特别需要注意的是:自签名和WHQL认证不是同一个东西
      自签名只能证明该驱动是来自可靠的发布者,并且内容未被改变(受信任的合法证书也包含在这个范围);WHQL认证则是说明微软认可这个驱动。
      换而言之,即使驱动程序有合法的签名,但没有通过WHQL认证,也是无法被加载的,因为自Win Vista/7 x64 以后的操作系统在加载驱动时所校验的是WHQL认证,不是自签名。

    表 2 驱动程序在x64系统的各模式下的可装载情况
    - - x64驱动的数字签署方式 -
    系统模式(x64) 无数字签署 自签名 WHQL认证
    正常模式(默认) 不能装载 不能装载 可以装载
    禁用驱动程序签名
    强制检测模式
    不能装载
    (旧版本系统可以)
    不能装载
    (旧版本系统可以)
    可以装载
    TestSigning
    测试模式
    不能装载 可以装载 可以装载

    注:
     ① 32位系统不检查WHQL,只会给出警告。
     ② 禁用驱动程序签名强制检测模式:
      临时方式(重启后失效):【开机按F8】 --> 【禁用驱动程序签名强制】(如图 28)
      永久方式(重启后有效):以管理员身份在DOS控制台输入命令【bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS】
     ③ TestSigning测试模式:以管理员身份在DOS控制台输入命令【bcdedit /set testsigning on】
     ④ 较旧版本的系统可以只用方式 ② 实现驱动装载,但现在已经失效了,目前只能通过方式 ③ 实现。 然而某些程序(如游戏)会检测系统是否处于测试模式,否则不予运行,避免被非法驱动(如外挂)Hook。

    在这里插入图片描述

    图 28 (F8)禁用驱动程序签名强制
    展开全文
  • 对于很多linux开发初学者,手里没有开发板,但是又想练练linux驱动(入门级)的同学来说,在虚拟机ubuntu 下搭建一个简单的驱动开发环境不失为一个很好的选择。 linux驱动正常的开发环境搭建有以下几方面; 1、安装好...

        对于很多linux开发初学者,手里没有开发板,但是又想练练linux驱动(入门级)的同学来说,在虚拟机ubuntu 下搭建一个简单的驱动开发环境不失为一个很好的选择。

        linux驱动正常的开发环境搭建有以下几方面;

        1、安装好交叉编译工具,比如arm-linux-gcc之类的(不同的开发板厂家时长会提供适合自己板子的交叉编译工具)

        2、搭建好nfs(为了后边方便在虚拟机上挂载文件系统,便于板子的驱动调试)

        3、安装gdb调试工具

        4、创建linux内核设备树(与目标开发板的linux内核版本一致,最好使用厂家提供的linux源码树)

        5、连接开发板和PC机(网线,串口....)等等,

        6、编写驱动开发环境测试程序,测试编写好的驱动能否在目标开发板上运行。

        7、开始自己的驱动开发(移植)之旅。

    为了简单的了解驱动开发的原理和步骤,以下我们先在虚拟机ubuntu上搭建简单的驱动开发环境。

        1、安装build-essential软件包

        Ubuntu缺省情况下,并没有提供C/C++的编译环境,因此还需要手动安装。幸运的是,为了能够编译Ubuntu的内核,Ubuntu提供了一个build-essential软件包

    安装方法如下:

    $sudo apt-get install build-essential

      2、找到自己所使用ubuntu的软件版本号

        uname -r

        我自己的是 3.2.0-23-generic-pae

      3、下载源码包

        $sudo apt-get   install  linux-source-3.2.0

        会默认下载到/usr/src中,cp该文件到自己的工作目录,当然也可以在本地进行解压缩 $sudo tar -jxvf  linux-source-3.2.0.tar.bz2

        得到 linux-source-3.2.0 源码包

      4、配置内核,进入源码包目录linux-source-3.2.0,可以使用$sudo make oldconfig,然后一路回车到结束

      5、编译内核 使用sudo make指令

            liufei@liufei-virtual-machine:~/workspace/linux-source-3.2.0$ sudo make

        大概需要等待的时间比较久

        期间会报错误 ERROR: "__modver_version_show" [drivers/staging/rts5139/rts5139.ko] undefined,可以使用make menuconfig命令在编辑界面去掉rts5139这个选项的选择

        

       6、生成和构建设备树 $make modules, $make modules_install两条指令

        结束后在/lib/modules下生成xxx(版本号)和xxx-generic-pae这两个目录

        

        7、然后就是写代码测试了

        测试代码test.c

            

    //test.c
    #include<linux/init.h>
    #include<linux/module.h>
    MODULE_LICENSE("GPL");
    static int test_init(void)
    {
    	printk(KERN_ALERT "Hello,world\n");
    	return0;
    }
    static void test_exit(void)
    {
    	printk(KERN_ALERT"Goodbye,cruel world\n");
     
    }
    module_init(test_init);
    module_exit(test_exit);

    makefile

    obj-m:=test.o
    
    KERNELDIR:=/lib/modules/$(shell uname -r)/build
    
    PWD:=$(shell pwd)
    
    modules:
    	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

    将代码cp到虚拟机上make编译生成test.ko文件


    然后$insmod test.ko加载驱动

           $lsmod 就可以在驱动列表里边看到刚才加载的驱动了


    要卸载这个驱动使用$rmmod  test命令就可以

    以上我们搭建了一个初级的驱动开发环境,完成了驱动开发的基本体验,要进行真正的驱动开发(移植),还有许多功课要做的。

    注:正常情况下当我们使用$insmod test.ko加载驱动时会打印log ,"Hello,world"。使用$rmmod test卸载驱动时会打印log“Goodbye,cruel world”。但是实际操作过程中却没有看到。这时应为linux系统将log级别的打印做了限制,具体的原理以及解决办法可以学习 https://blog.csdn.net/mingzznet/article/details/47315163




        

        






    展开全文
  • 一个基本的Linux设备驱动开发环境由宿主机和目标机组成,宿主机就是用来做驱动开发工作的主机,...由于 步骤有所不同,下面分为普通Linux设备驱动开发和嵌入式Linux设别驱动开发两种情况来讲述环境搭建和驱动程序的
  • Visual Studio 2015如何搭建驱动开发环境? 网上搜索了很多圈是vs2010 2012的. 想问一下vs2015搭配的 WDM 什么的..都是什么版本? 具体参数细节那些需要设置的?
  • 1 依赖 build-essintial kernel-package gcc make kernel-source kernel-headers libncurses5-dev libssl-dev 2 源文件获取与安装 2.1 获取 # 查看系统内核版本 ...sudo apt-get install lin...
  • Android底层开发需要的工具: 1、JDK6 JDk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html(推荐下载jdk6版tar.gz),解压缩到任意目录(如/home/developer/jdk6) #gedit /etc/...
  • 开发环境搭建: 系统:win7 x64 工具:vs2012 + WDK8.0 插件:wdfcoinstaller.msi (1)先安装vs2012,再安装wdk8.0,这样在打开vs2012时可以创建windows drivers类型的工程。 注:vs2012不能安装wdk8.1,wdk8.1必须...
  • 更改软件的默认安装路径 1、win+R,启动管理器,输入regedit 2、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 3、ProgramFilesDir右击,修改,数值数据:D:\Program Files ...
  • linux驱动开发环境搭建 linux驱动程序开发的初学经验
  • 开发环境: (1)主机:vmware8+fedora14,内核版本为2.6.35,主机自带GCC版本4.5。(这两点很重要,所有的问题都与这两个因素有关)。 (2)目标机:S3C6410(arm11) (3)目标机内核:linux2.6.24 (4)交叉编译...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • Linux_Ubuntu下驱动开发环境搭建 linux下驱动需要编译内核 1.首先是基本的开发工具,如gcc,gdb,make等 apt-get install build-essential 2.其次是找到你所用的ubuntu的版本号:uname -r  然后查看你要下载...
  • 1.搭建虚拟机 2.搭建android 应用开发环境 3.掌握ADB常用命令
  • Linux设备驱动开发环境搭建 http://hi.baidu.com/jcno1888/blog/item/301d590cf2efaec07bcbe10d.html<br /><br />经过两周的摸索,终于对Linux设备驱动开发有了个初步的认识,下面对Linux设备驱动开发环境的...
  • 这次学习最后采用的开发环境如下: Windows : win10 64位 1809版本(Host计算机和测试计算机上相同) Visual Studio Community 2017 : 版本15.9.4 SDK : 10.0.17763.132 WDK : 10.0.17763.132 之前一个朋友...
  • 在Win10环境下开发Windows驱动程序需要依赖WDK,微软在”WDK7600“以后就不再提供独立的内核驱动开发包了,而是必须首先安装微软集成开发环境VisualStudio。本文将介绍如何在Win10环境下配置Visual Studio 2015 + ...
1 2 3 4 5 ... 20
收藏数 61,935
精华内容 24,774
关键字:

环境搭建 驱动开发