Win10下VS2015(WDK10)驱动开发环境配置

1、     概述

微软在”WDK7600“以后就不再提供独立的内核驱动开发包了,而是必须首先安装微软集成开发环境VisualStudio,然后再从微软官网下载集成的WDK开发包、或者离线安装包,但是安装后Visual Studio就集驱动程序开发,编译,安装,部署和调试于一身,使得Windows驱动程序开发会变得更容易。对于Windows 10和Visual Studio2015驱动开发WDK环境变量的配置,与其它版本的Windows和WDK环境的配置有很大不同。本人也是苦苦探索了近一周的时间才配好。

2、     WDF驱动模型

设备驱动程序是硬件设备连接到计算机系统的软件接口,任何设备都必须有相应的驱动程序才能在计算机系统上正常工作。设备驱动程序的优劣直接关系到整个系统的性能和稳定性,因此,设计和开发稳定高效的驱动程序具有重要意义。

早期的Windows 95/98的设备驱动是VxD(Virtual DeviceDriver),其中x表示某一类设备。从Windows 2000开始,开发驱动程序必以WDM(Windows Driver Model)为基础的,但是,如果使用DDK来开发WDM,其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易,因此,一般用户都是使用WinDriver、DriverStudio之类的第三方工具。为改善这种局面,从Vista开始,微软推出了新的驱动程序开发环境WDF(Windows Driver Foundation )。WDF(WindowsDriver Foundation)是微软提出的下一代全新的驱动程序模型,它是在WDM(windowsDriver Model)的基础上发展而来的,支持面向对象、事件驱动的驱动程序开发,提供了比WDM更高层次抽象的高度灵活、可扩展、可诊断的驱动程序框架。WDF框架管理了大多数与操作系统相关的交互,实现了公共的驱动程序功能(如电源管理、PnP支持),隔离了设备驱动程序与操作系统内核,降低了驱动程序对内核的影响。

WDF提供了两个框架:KMDF(内核模式驱动程序框架)和UMDF(用户模式驱动程序框架)。

1、内核模式驱动程序 KMDF(Kernel-Mode DriverFramework):

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

2、用户模式驱动程序 UMDF(User-Mode DriverFramework):

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

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

3、     用户模式和内核模式

运行 Windows 的计算机中的处理器有两个不同模式:“用户模式”和“内核模式”。根据处理器上运行的代码的类型,处理器在两个模式之间切换。应用程序在用户模式下运行,核心操作系统组件在内核模式下运行。多个驱动程序在内核模式下运行时,某些驱动程序可能在用户模式下运行。

当启动用户模式的应用程序时,Windows 会为该应用程序创建“进程”。进程为应用程序提供专用的“虚拟地址空间”和专用的“句柄表格”。由于应用程序的虚拟地址空间为专用空间,一个应用程序无法更改属于其他应用程序的数据。每个应用程序都孤立运行,如果一个应用程序损坏,则损坏会限制到该应用程序。其他应用程序和操作系统不会受该损坏的影响。

用户模式应用程序的虚拟地址空间除了为专用空间以外,还会受到限制。在用户模式下运行的处理器无法访问为该操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改并且可能损坏关键的操作系统数据。

在内核模式下运行的所有代码都共享单个虚拟地址空间。这表示内核模式驱动程序未从其他驱动程序和操作系统自身独立开来。如果内核模式驱动程序意外写入错误的虚拟地址,则属于操作系统或其他驱动程序的数据可能会受到损坏。如果内核模式驱动程序损坏,则整个操作系统会损坏。

此图说明了用户模式组件与内核模式组件之间的通信。


4、     驱动模型特点

UMDF和传统的驱动程序差异非常大,简要说来,UMDF是这样的:

  • UMDF是基于COM思想的,运行于用户模式(RING3)的驱动程序模块。

那么,这种驱动模型带来什么变化呢?

首先基于COM思想,引入接口机制,可以把相关联的函数分门别类进行组织,使得驱动代码清晰明了;其次,运行在RING3的驱动,大幅度降低了驱动程序在稳 定性和安全性上面的风险,UMDF驱动崩溃不会导致bugcheck(蓝屏),并且UMDF驱动的宿主进程是在受限的用户身份下运行的,不是受信任的系统内核模块。可以在UMDF里面使用Win32 API。

运行于RING3的UMDF对于程序员开说至少带来两个额外好处:

  • 驱动程序不需要强制数字签名,因为UMDF驱动不是系统信任模块,所以在x64下面的部署更加方便。特别是个人开发者可能无法承受WHQL的费用,或者其他原因暂时无法WQHL的情况下,使用UMDF是一个较好的选择。
  • 调试难度大幅降低,不再需要SoftICE和Syser之类的单机内核调试器或者WinDBG之类的双机调试,我们可以用WinDBG或者VS调试器attach到UMDF宿主进程即可进行调试。可以参考调试UMDF驱动

而KMDF内核模式驱动程序中的错误会损坏系统地址空间,并可能会导致计算机失败。由于这些驱动模型的特点,在构建驱动程序的开发调试环境是也会有所区别,一般在做KMDF驱动的开发调试时都选择双机或搭建虚拟机环境进行,而UMDF驱动可以进行单机调试,下面的环境搭建主要以更为复杂的KMDF模式为例。

5、     开发调试环境配置

5.1     工具及平台环境

平台:Windows 10操作系统

开发环境:Visual Studio 2015 Enterprise Windows WDKWindows SDK

调试环境:Oracle VM VirtualBox 5.0.14虚拟机

 

5.2     方法/步骤

5.2.1     设置主计算机和测试计算机

设置目标或测试计算机是配置计算机以便进行自动驱动程序部署、测试和调试的过程。一个测试和调试环境具有两台计算机:主计算机和目标计算机。目标计算机也称为测试计算机。使用主机上的 Vsual Studio 开发和构建驱动程序。调试程序在主计算机上运行(可以使用 Visual Studio 用户界面或WinDbg调试工具),当测试和调试驱动程序时,驱动程序在目标计算机上运行。

1      安装设置主计算机

本次搭建环境主计算机操作系统使用win10,首先安装Visual Studio 2015 Enterprise,然后安装Wdk 10注意:WDK10一定要在vs2015后面安装,安装完后,启动vs2015在界面菜单上会出现driver菜单,如下图。另外,一般VisualStudio 2015 Enterprise是已经内带windows SDK,但是如果不是和安装的WDK一致的版本,建议在单独安装windows SDK 10,使得WDKSDK

  • 15
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值