电玩城打鱼捕鱼-专业24小时上下分

驱动开发的一些基本概念,Windows驱动开发入门指引

十一月 14th, 2019  |  电玩城捕鱼系统简介

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

 

   3.  开发环境

 Windows的驱动开发模型

张佩 马勇 董鉴源 编著

Windows驱动程序入门:

WDF驱动程序包括两个类型,一个是内核级的,称为KMDF(Kernel-Mode Driver
Framework),为SYS
文件;另一个是用户级的,称为UMDF(User-Mode
Driver Framework),为DLL文件。

第二个主要内容是关于音视频驱动开发(第10~11章)。音视频驱动包括AVStream架构,本书做了较详细的阐述。第10章讲述使用AVStream小端口架构,第11章讲述ASIO音频驱动开发。

以服务的形式运行

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

 

IO请求包-IRP

这本书《竹林蹊径——深入浅出Windows驱动开发》是三位作者张佩、马勇和董鉴源的最新力作,他们将自己在实践中积累起来的经验整理成册,以期望后学者能少走弯路,缩短Windows驱动程序开发的学习之路。这本书重点介绍了KMDF、USB/1394和音频驱动程序的开发,以及设备驱动程序的发行和安装。建议有一定Windows驱动程序开发基础的读者看一看这本书,尤其是,如果你正打算使用KMDF,或者正在从事与USB/1394或音频驱动程序相关的编程工作,那么,这本书便是一份宝贵的实践指导了。

   2.  驱动类型

windows服务在系统启动是加载,用户需在服务控制平台开启或者关闭服务
Driver Service是服务的一个特例,遵循windows服务的协议
加载和谐在NT驱动分为四个步骤:
1.为NT驱动创建新的服务
2.开启此项服务
3.关闭此项服务
4.删除NT驱动创建的服务
以上四个步骤都是通过SCM组建的服务来实现的。

我一直认为,编写程序是一件很奇妙的事情,它可以带来创造和控制的欲望。每当我阅读或者编写一段代码时,脑子里自然地就会想象这段代码怎样完成预定的逻辑。当面对一个不熟悉的开发环境,或者一个新的基础平台时,首先要清楚这个环境或者平台是如何工作的,以及提供了哪些功能。代码本身可能非常复杂,甚至奥妙无穷,但通常情况下,真正优美的高质量代码往往是简单的、易于理解的。对于代码编写者或者维护者来说,真正见功夫的地方不在于代码本身,而在于对下层开发平台的理解和驾驭能力,可能这就是俗称的“内功”。

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

 

Windows内核驱动程序与内核的紧密关联性使得驱动程序的调试极为不方便,从某种意义上讲,驱动程序的调试等同于Windows内核的调试。而且,对于某些特定的逻辑错误,内核调试器甚至是无能为力的。正因为这个原因,内核驱动程序的代码尽可能精简,从软件设计角度而言,应最大程度地把功能代码放到应用程序中,在驱动程序中只留下最必要的功能逻辑。这样的设计也可以使Windows内核被不正确驱动程序代码牵连而导致稳定性问题的几率相对减小。

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

WDM 是 Win32设备驱动程序体系结构

在Windows平台上开发软件,编写Windows内核驱动程序是最为考验程序员“内功”的。内核驱动程序的代码量通常不大,但驱动程序框架中的任何一个函数,甚至这些函数中任何一行代码背后都可能蕴含着复杂的逻辑,或者隐式的要求和假设。即使驱动程序编写者在纯粹自行定义的函数中,也必须谨慎地关注一些与环境有关的因素,譬如代码是否可被中断、是否可重入,或者所引用的内存是否被交换到外存。另一方面,应用软件开发中的很多概念,比如地址空间、内存管理、异常处理和多线程并发等,在驱动程序开发中可能需要有不同的理解方法。此外,常用的C运行库函数基本上不再适合于驱动程序了,驱动程序编写者必须面对一个全新的底层环境和支持平台。因此,要编写可正确运行的驱动程序,程序员不仅要清楚地理解驱动程序所针对的目标设备或功能(可能包括硬件设备的各种特性),还要掌握Windows内核是如何与驱动程序打交道的,以及内核中诸多管理和运行机制,尤其是内存管理、线程调度和并发控制。

基于WDF的驱动开发

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

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

 

   5.  驱动安装

 

Windows设备驱动程序,过去是WDM(Windows
Driver Model)框架,编程复杂,初学者难以掌握其编程
要领。为了解决这一问题,微软对WDM驱动程序的架构做了改进,形成了全新的WDF(Windows
Driver F
oundation)框架结构。它提供了面向对象和事件驱动的驱动程序开发框架,大大降低了开发难度。从现
在开始,掌握Windows设备驱动程序的开发人员,由过去的“专业”人士,将变为“普通”大众。

潘爱民

 驱动分为如下几种类型:

 

ISBN 978-7-121-12555-3

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

WDK(Windows Driver
Kit)是一种完全集成的驱动程序开发系统,它包含 Windows DDK,用于测试
Wi
ndows 驱动器的可靠性和稳定性.

这个观点既适用于应用软件程序员,也适用于系统软件程序员。对于应用软件程序员,低层的应用开发平台是支撑应用开发的基础,譬如,基于Windows
SDK来开发Windows应用程序。那么,程序员有必要理解Windows
SDK中的基本要素,诸如消息分发机制、各种图形功能等。在这种情况下,阅读一些典型的例子程序代码往往能起到快速引领入门的效果。同样地,C/C++程序员如果局限于C/C++语言本身,很难编写出高质量的实用程序。他们不仅要掌握C/C++运行库中函数和类型的用法,甚至还要理解这些函数和类型的实现机理。即使源代码层面上的库,例如STL(C++的标准模板库),也需要理解其代码实现才能灵活自如地用好这些库(比如STL中的各种容器数据结构、迭代器或算法)。

标签:,

Your Comments

近期评论

    功能


    网站地图xml地图