Enterprise Just Builder

Solution for Enterprise Software Architecture

wdf

WDF 驱动程序开发

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

WDF (Windows Driver Foundation) 是微软新一代驱动程序模型,它在 WDM (Windows Driver Model) 的基础上发展而来,支持面向对象、事件驱动的驱动程序开发,提供了比 WDM 更高层次的抽象,是高度灵活、可扩展、可诊断的驱动程序框架。WDF 框架接管了驱动和操作系统内核的大多数交互,驱动和操作系统的交互交给框架内封装的方法(函数)完成,从而对二者进行了隔离,这样驱动开发者只需专注处理硬件的行为即可。另外 WDF 还将大多数驱动中都需要处理的 PnP (即插即用)和电源管理封装进了框架,成为了公用的驱动程序功能。

WDF 可以开发内核模式驱动, 也可以开发用户模式驱动,二者采用同一套对象模型构建,即 WDF。对于内核模式对象和用户模式对象来说,WDF 是它们的父对象。换言之两者都是从 WDF 派生而来的。针对内核模式派生出来的对象称为 KMDF;针对于户模式派生出来的对象称为 UMDF。无论何种模式的框架,其内部封装的方法、执行的行为其实还是用 WDM 来完成的。

本文主要针对 KMDF 框架展开讨论。

KMDF 对象模型
KMDF 驱动程序模型支持面向对象、事件驱动。它定义了一系列的对象用于表示设备、驱动、中断等,每个对象有其相应的属性、方法和事件。驱动程序利用这些方法创建对象、设置属性和响应事件。该框架定义的主要对象有:

>>> 阅读全文

 

, , ,

基于 UMDF 编写虚拟读卡器驱动

智能卡和 PKI 是有趣的领域。这里你可以看到最先进的计算机安全技术及其在现实环境中的运用。但是,调试测试与智能卡相关的应用有时候十分痛苦,尤其是在运行负面测试用例的时候,很多时候,你手上没有太多的智能卡以供测试。一旦 PIN 码被屏蔽或 CSP 发出错误命令都可能导致智能卡状态不一致。这类问题相当普遍,所以我意识到,从事智能卡开发第一要务就是:你需要个模拟器来进行各种试验而不会有任何损失。本文并不准备谈论该如何实现智能卡的操作系统仿真(也许以后吧),而是先从开发虚拟智能卡阅读器的驱动程序入手。1

在网上搜索“虚拟驱动程序”可以找到很多有用的资源,但大多不是我想要的“傻瓜式指导”。我不是驱动开发专家;所以本文主旨不是“如何编写驱动程序”。而只是展示我在这个新领域里的一些探索,并希望对其他人有所帮助。

还有一种编写智能卡驱动的方法是编写自己的 winscard.dll 版本,并将它保存在要调试的应用程序的目录下。这种方法更简单,但也有一些缺点:

  • 要完全模拟 Windows 智能卡资源管理器,需要自己实现一些缺失的函数。
  • 要实现诸如 SCardGetStatusChange 等函数十分痛苦,特别要同时考虑真实的读卡器和模拟读卡器
  • 由于系统文件保护机制,你无法覆盖掉系统的 winscard.dll,对有些应用来说,想跳过它得大费周章。

尝试了两种做法之后,我认为重新编写个驱动的做法更为妥帖,并从中学习了不少有益的经验。要实现它,通过 Google 可以得到很多有用的资料。为了简单期间,我选用 UMDF (User Mode Driver Framework) 作为开发驱动的基础。我个人认为,它有以下优势:

  • 驱动中的错误不会导致蓝屏死机,开发更容易
  • 可以用你熟悉的调试器,比如 VS2008 来调试代码,而无需内核调试器,调试更容易
  • 在此用例中性能不是关键需求,一点性能开销不会有任何问题。

这里的代码是从 WDK 7.1中的示例 UMDFSkeleton 修改而来的。我会对代码中的重点部分进行解释,然后说明安装流程。

>>> 阅读全文

 

, , , , , , ,

WDF USB设备驱动开发指南

USB 的全称是 Universal Serial BUS(通用串行总线), 它有两个重要的特点:串行数据传输、支持热拔插。从 1996 年 1 月至今,USB 已经经历了四个版本:1.0、1.1、2.0 和 3.0。其应用遍及各个领域, USB 采用主从结构。两个可以互联的设备,一定有主从之分。这导致了两台主机(主设备)或者两个 U 盘之间没有办法互联,只能在设备(U盘)和主机之间建立主从互联关系。

要成为 USB 主机,就一定有两种设备:USB 主控制器、USB 根集线器。主控制器用来处理根集线器上的数据,交给系统处理;根集线器用来连接多个外部设备。请注意:根集线器和普通 USB 集线器是不同的,普通 USB 集线器也是 USB 外部设备的一种,不是主机的组成部分。

我们在使用的电脑,每台电脑都有若干个控制器,控制器上有一个或多个根集线器,集线器上又对外暴露出一个或多个 USB A 型接口让外部设备连接。在设备管理器的视图模式选择 “按连接排序设备” 后,可看到和图 1-1 类似的”设备->集线器–>控制器->系统”层次结构。

最上层是 USB EHCI 接口的控制器,中间层是控制器上唯一的根集线器,最下层是连接在根集线器上的设备(包括普通集线器)。 每个 USB 控制器是一个 USB 族群的核心,其驱动程序负责为子设备分配总线地址。总线地址为 7 位宽,由于控制器自己占一个地址,故而最多可提供(2^7 -1 = 127)个子设备地址,也就是说,每个控制器上最多能连接 127 个子设备。并且这个数目包含了根集线器。

USB 电气特性和枚举
标准 USB 接口有 4 个金属针脚,对应着 USB 线中,就是 4 根金属线:两根电源线(5V的 VBus 和地线 GND )和两根数据线(D+ 和 D-)。这两根数据线实现了数据的差分传输,其实等于是一根线,但是提高了稳定性,这也就是“串行”之由来了。 USB 设备可以自己供电,也可以从总线获取电源,即通过 5V 电源线传过来的。像 U 盘、鼠键这类小型设备,5V 电源或者 100mA 电流足以满足其设备需求,故而多从总线获取电源;移动硬盘、打印机、USB 声卡这种较大设备,往往需要外置电源。

>>> 阅读全文

 

, ,