2024年3月31日发(作者:)
我这里重点的介绍如何写驱动程序,对于一些应用程序我就不做介绍了,因为
我对于那些高层的东西写得很少。倘若再讲,有班门弄斧之嫌,呵呵! 作为
WIN98 和 WIN2K 推荐的一项新技术来说,USB 的驱动程序和以往的直接跟 硬件
打交道的 WIN95 的 VXD 的方式的驱动程序不同,它应该是 WDM 类型的。
USB 的 WDM 接口框图如下(这个图可以说是 USB 软件总体框图)
对于 HID 的设备,就可以采用上图左上边的结构,其它类的话采用右上的结构,
其实右边的结构可以又细分成两层,一层是 Class Driver,一层是 Miniport
Driver。而倒数第三行的 UHCD 和 OpenHCI 分别是由 INTEL 和 COMPAQ 两位老大 定
的一个和硬件有关的底层驱动程序标准,各位可以根据所需要的选择。
对于 USB 的驱动程序,大家还得去了解 WDM 驱动程序的写法,或者早些时候的
NT 驱动程序,其实 WDM 驱动程序可以看做是 NT 驱动程序的一个 update,只是
增加了一些新的特性。
“写驱动程序是一个很漫长和繁琐的工作,在此之前,你最好要熟悉硬件,熟
悉 C/C++,还要用过 DDK,会用一些调试程序,如 SOFTICE 和 WINDBG 之类。如
果一切就绪,你就可以开始写驱动程序,工作的进程有时侯会取决于你的运
气” 。(这是一位留美的朋友对我说的,我写出来和大家共享)
下面是我从一个朋友那里得到的一篇文章的摘要:
NT 驱动程序的分层结构
驱动程序是指管理某个外围设备的一段程序代码。NT 采用更灵活的分层驱动方
法,允许杂应用程序和硬件之间 存在几个驱动程序层次。分层机制允许 NT 更
加广泛地定义驱动程序,包括文件系统、逻辑卷管理器和各种网络组件,各种
物理设备驱动程序等等。
1、 设备驱动程序
这些是管理实际数据传输和控制特定类型的物理设备的操作的驱动程序,包括
开始和完成 I/O 操作,处理中断和执行特定的设备要求的任何差错处理。
2、 中间驱动程序
NT 允许在物理设备驱动程序上分层任意数目的中间驱动程序。这些中间层次提
供扩展 I/O 系统的功能一种方法,而不必修改底层的驱动程序。这也是微软鼓
吹的他们的系统灵活的一面!实际上我觉得这样反而牺牲了一些效率上的东西。
3、 文件系统驱动程序(FSD)
FSD 是一类比较特殊的驱动程序,通常负责维护各种文件系统 所需要的磁盘结
构。注意我们并不能使用 DDK 来开发 FSD,而必须使用 Microsoft 的文件系统
开发人员工具包。
一般比较少写中间过滤驱动程序,过滤驱动程序它截获和修改高层发送给类驱
动程序的请求。这样就允许利用现有类驱动程序的功能,而不必从头开始写所
有程序。 NT 内核模式对象在我们的实际开发过程中的对象是设备,由于端口
驱动程序已经隐藏了硬件控制操作,因此我在这里不讲述跟硬件相关的部份。
如果今后的开发对象不同,需要对硬件进行操作的时候,可能会对中断、DMA
等有比较详细的了解,这些内容可以参考 DDK 帮助。
NT 使用对象技术管理所有的数据,下面分别对一般驱动程序所涉及的一些对象
做一介绍。不过在介绍这些对象之前,有必要先对驱动程序的结构做一介绍。
驱动程序结构
NT 驱动程序和一般的 DOS/Windows C 语言程序不一样,它没有 main()或者
WinMain()函数入口。和 DLL 类似地,它向操作系统显露一个名称为
DriverEntry()的函数,在启动驱动程序的时候,操作系统将调用这个入口。
DriverEntry 除了做一些必要的设备初始化工作外,还初始化一些 Dispatch 例
程入口。我们知道,NT 应用和设备驱动程序打交道主要是通过 CreateFile、
ReadFile、WriteFile 和 DeviceIoControl 等 Win32 API 来进行的。这些 API 其
实都对应着驱动程序的一些 Dispatch 例程。而驱动程序除了 DriverEntry 以 外,
主要就是由这些 Dispatch 例程组成的。例如调用 Win32 API CreateFile 的时
候,操作系统最终转化为对驱动程序 IRP_MJ_CREATE 功能代码所对应的
Dispatch 例程的调用,如果驱动程序没有提供该例程, CreateFile 调用就会
失败。
NT 中一些常用的功能代码和 Win32 API 的对象关系如下所示。
功能代码
说明
IRP_MJ_CREATE
打开设
备 CreateFile
IRP_MJ_CLEANUP
在关闭设
备时,取消挂起的 I/O 请求 CloseHandle
IRP_MJ_CLOSE
关闭设
备 CloseHandle


发布评论