Windows驱动开发入门指引

   1.  前言

 

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

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

Windows驱动程序入门: https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/

Github: https://github.com/Microsoft/Windows-driver-samples

 

   2.  驱动类型

 

设备函数驱动程序

设备筛选器驱动程序

软件驱动程序

文件系统筛选器驱动程序

文件系统驱动程序

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

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

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

   3.  开发环境

 

Visual Studio + WDK(Windows Driver Kit)

笔者是在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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydjfy.html