为了方便开发人员为 Windows
编写驱动程序,微软昨天发布了一个开源框架驱动程序模块框架(DMF)。
这个新框架将允许开发人员编写简单和结构化的
Windows 驱动程序框架(WDF)、驱动程序并在驱动程序之间共享代码。

   1.  前言

原文地址:React Native on the Universal Windows
Platform

在为 Surface 设备驱动程序时,Microsoft Devices
团队开发了此框架供内部使用。微软现在将其作为开源发布,以帮助其他 OEM
以最高的效率和可维护性,开发和维护高质量的驱动程序。微软还解释了传统 WDF
与这款新的基于 DMF 的 WDF 驱动程序之间的一些主要差异。

因工作上项目的需要,笔者需要做驱动相关的开发,之前并没有接触过相关的知识,折腾一段时间下来,功能如需实现了,也积累了一些经验和看法,所以在此做番总结。

今天,微软和Facebook在Facebook的开发者大会F8
2016上,宣布他们正在将通用Windows平台(UWP)支持React
Native。这被作为一个开源的,社区支持的框架。新UWP支持扩展这些原生应用,包括270万活跃的Windows10设备的新市场,并拥有超越移动设备范畴的机会,从个人电脑,到Xbox
One和HoloLens。对于Windows应用程序开发人员,这也意味着有机会嵌入React
Native组件到他们现有的UWP应用程序并利用React
Native提供的开发工具和编程范式。

这些差异在于:设备上下文(以绿色显示)独立存在于每个模块和客户端驱动程序特定的代码中。每个较小的设备上下文仅包含该模块所需的元素。没有模块可以访问另一个模块的设备上下文;WDF
回调(以红色显示)现在在每个模块和客户端特定代码中独立存在。 WDF
调用客户端驱动程序。DMF
拦截调用并将其调度到实例化模块树中的每个模块;每个模块按其认为合适的方式处理每个回调。最后,DMF
将回调调度到客户端驱动程序的回调。

对于驱动开发的开发指引,微软官方文档网站已经提供了很详细的教程文档,并且在Github上提供了一系列典型的例程源码用于开发人员参考。开发人员在具备一定的驱动概念知识后,通过参考官方例程可以很容易实现拥有特定功能的驱动应用程序。

除了在核心框架支持这项工作,微软还提供了开源工具和服务,以帮助开发人员创建React
Native应用。该React Native扩展为Visual Studio
Code编辑器带来了一个直观,高效的环境来编写和调试React
Native应用。再加热代码推送,一个开源的服务可以直接将更新推送给用户,微软正在帮助React
Native社区构建和比以往更快速地部署应用程序。

澳门新葡萄京官网注册 1

Windows驱动程序入门:

对于那些不熟悉的人,React
Native是2015年成长最快的开源项目,在GitHub上累积超过30,000个stars。它不是一个“编写一次,到处运行”的框架,React
Native认为每个平台有着不同的特性和功能,所以应用程序可以且应该,运用这些独特的差异。相反,他们使用的口号是“学习一次,到处编写”,表达了React
Native关注更多的是编程范式和开发工具及扩展生态系统,而不仅是共享代码的事实。这同样适用于UWP上的React
Native;基于UWP使用React
Native编写的应用程序应该像原生应用,直接使用XAML编写的应用程序那样。

最后,请注意箭头。箭头专门显示模块和客户端特定代码之间的流程。在此示例中,特定于客户端的代码只能与三个模块通信:ACPI,Button和
Stream。它无法与 GPIO,FIFO,列表或线程通信。 ACPI 无法与 FIFO
等进行通信。即使不查看源代码,我们也很清楚数据如何在此驱动程序中流动。

Github:

作为示例,让我们来看看在F8大会日程安排应用程序,它展示了许多可在React
Native的Windows模块。在Windows10移动设备和桌面设备家族中,该应用程序的外观和运行都很棒。

有关此公告的更多信息:

 

澳门新葡萄京官网注册 2

   2.  驱动类型

Win10 Mobile

 驱动分为如下几种类型:

澳门新葡萄京官网注册 3

  • 设备函数驱动程序
  • 设备筛选器驱动程序
  • 软件驱动程序
  • 文件系统筛选器驱动程序
  • 文件系统驱动程序

Win10 Desktop

驱动程序不是一定需要与硬件通讯,如果需要访问操作系统核心数据,往往应用程序没有足够的权限,这种情况则需要在内核模式下进行访问。就上面5种驱动类型,笔者参考着微软的驱动例子开发过
鼠标键盘设备过滤驱动
网络过滤软件驱动程序,所以对驱动开发的理解仍在浅水区,如在阅读过程中发现有误的地方,还请不吝指出。

在表象之下,React
Native使应用构建工具能够使用JavaScript来定义用户界面,该框架将来自JavaScript中React
DOM翻译到原生平台视图管理器的方法调用,使开发人员能够通过JavaScript函数调用,取代直接调用原生模块。这种情况下React
Native
UWP,视图管理器和原生模块使用C#实现的,视图管理器实例化和操作XAML元素。我们使用Chakra作为JavaScript运行环境,它可以被任何UWP应用使用,而无需打包的额外的二进制文件。

采用的驱动类型关乎到代码的实现(需不需要考虑PNP和电源管理)和驱动的安装(
NT式驱动程序以 service
的形式运行,其他驱动需要采用通用的INF文件安装),微软的官方文档这样提到:

今天的公告和发布仅仅是个开始。此版本提供了一个独立的GitHub
Repo作为初始平台支持。展望未来,我们将努力增加额外的功能,并把我们的实现对标原来的项目。

style=”font-family: ‘Microsoft YaHei’;”>有关软件驱动程序,你的两个选项为
KMDF 和内核模式 Windows NT 驱动程序模型。 使用 KMDF 和内核模式 Windows
NT 模型,你可以编写驱动程序,而无需考虑即插即用 (PnP) 和电源管理。
你可以改为专心于驱动程序的首要任务上。 使用 KMDF,你不必考虑 PnP
和电源,因为框架会为你处理 PnP 和电源。 使用内核模式 Windows NT
模型,你不必考虑 PnP 和电源,因为内核模式服务在与 PnP
和电源管理完全无关的环境中运行。

您可以了解更多有关参考实现和我们构建和发布Windows 10 React Native版F8
Developer Conference app的经验,可以参加将于Dublin 5月6号举行的[Decoded

   3.  开发环境

Conf](

我们会在那里讨论项目的详细情况。我们邀请开发者参考我们的实现,加入我们,并在GitHub上跟踪最新进展。

Written by Eric
Rozell,
Software Engineer, Microsoft Developer Experience

 

Visual Studio +
WDK(Windows Driver Kit)

其中WDK需要自己手动下载安装

笔者是在Windows平台上开发,使用的开发环境为
Visual Studio 2013 + WDK 8.1

 

   4.  实现方式

 

WDM vs WDF

对于刚接触驱动开发的新手来说,笔者不建议采用WDM(Windows
驱动程序模型)进行开发。目前在网上能找到的关于驱动开发的中文书籍基本上都是围绕WDM模式进行讲述的,而关于WDF(Windows
驱动框架)开发的书籍寥寥无几,《竹林溪径——深入浅出Window驱动开发》和《Developing
Drivers with the Windows Driver
Foundation》算是两本讲述基于WDF开发驱动的书籍,两者都能在网上找到电子书资源。

 

基于WDF的驱动开发

WDF的开发需要遵循一定的规则,开发实现时需要考虑较多的细节,由于篇幅有限,笔者凭着自己的经验暂且稍做列举,后续将写一篇针对WDF驱动开发的文章。

  • PNP和电源管理(WDF已经帮忙封装了大部分的接口);
  • 各种对象:驱动对象,设备对象,WDF对象,文件对象,队列对象;
  • 驱动上下文:有时称为设备扩展,用于存储特定设备对象的相关信息的数据结构;
  • 对象的释放:需要考虑不同性质对象释放的时机;
  • 中断请求级别:处理不当易导致蓝屏;
  • 分页与非分页内存;
  • 同步锁:回调同步锁、框架等待锁、自旋锁、中断锁等;
  • 日志跟踪记录:
    调试的必备,可以采用 WPP(Windows软件追踪预处理器)或简单的
    DebugPrint 输出
  • 与应用程序的通讯:控制代码、IRQ,请求队列

 

   5.  驱动安装

 

测试环境下安装驱动前

开发的驱动程序没有进行签名或者采用测试签名,则需要在设备上开启测试模式,具体操作为:打开控制台,输入:

bcdedit /set testsigning on

回车,会提示:操作成功完成。
然后重启设备,开机后会在电脑桌面右下方显示有“测试模式”字样内容的水印。

如果要关闭测试模式,则需在控制台输入:

bcdedit /set testsigning off

回车,同样会提示:操作成功完成。
重启设备后则会发现桌面右下角的水印消失。

 

以服务的形式运行

NT式的驱动程序允许以 service
的形式运行, 服务安装的例程可以参考 WDF Sample 中的 Eventdrv
工程,或者参考我写的关于进程网络监控的驱动例程的开源代码

 

使用INF文件安装

设备相关的驱动安装可以选择INF进行安装,INF安装文件的编写建议从
WDF Sample
中找到合适的INF文件进行修改,如果你想了解INF的语法,可以参考这里

  • 通过设备管理器手工安装

打开控制台,输入 devmgmt
回车,这是打开设备管理器的其中一种方式,其他方式比如右键系统菜单栏图标均可以打开任务管理器,只是使用命令行的方式比较少见,这里特意记录一下。找到感兴趣的
设备节点,右键 属性(或更新驱动程序软件),切换到
驱动程序,可以进行感兴趣的操作。这里所看到所提供的选项,后续等你熟悉了驱动安装的接口后,你会发现都有对应的接口对应每个功能选项。

  • 通过程序实现自动安装

可以参考 WDF Sample
中的Driver Install Frameworks API (DIFxAPI) Sample
Device Console (DevCon) Tool
两个工程,分别提供了不同调用接口的驱动安装方式,Device Console (DevCon) Tool
生成的devcon.exe
是一个功能强大的工具,不仅可用于驱动(包)的安装和卸载,还可以获取设备的硬件ID,描述符以及设备所安装的驱动列表等信息,开发人员可以从中一窥究竟。

在驱动的安装过程中,系统会自动记录安装的日志,在INF目录(路径一般在 C:Windowsinf下)下可以找到两个日志文件
setupapi.app.logSetupapi.dev.log
,查看这两个日志文件有利于理解驱动安装的执行过程,同时也有利于排查驱动安装过程中出现的异常。

驱动的安装涉及到驱动文件的校验(保证驱动文件的完整性和合法性),驱动的优先级计算(选择最优的驱动去匹配当前识别到的新的设备),驱动的放置目录(Driver
Store)等内容。开发人员熟悉驱动安装逻辑有利于驱动的开发,感兴趣可以通过此处进行了解。

 

   6.  驱动签名

 

测试环境

通过VS集成开发环境创建 Driver
解决方案后会生成两个项目,右键属性打开 XXX Package,左侧选中
Driver Signing ,在右侧栏 Sign Mode 选择 Test Sign,在
Test Certificate选择
<Create test certificate...>,则在编译时会自动生成测试签名证书。

 

生产环境

从Win10开始,驱动文件包不仅需要进行扩展验证
(EV)
代码签名,还需要提交到硬件开发中心仪表盘,具体操作指南可以参考此处,你可以在该文档上找到驱动签名所需的任何内容。