wdm驱动开发之路
WDM驱动

Windows驱动开发模型WDM学习笔记绪言 (4)1.WDM驱动程序开发基础知识 (5)1.1WDM简介:Win32 Driver Model Win32驱动程序模型 (5)1.2 Win32 API (5)1.3 WDM特性 (5)1.4 WDM工作原理 (6)1.5 WDM与其它驱动程序的比较 (6)2.WDM驱动程序开发环境DDK设备驱动程序开发包 (6)2.1■安装DDK (6)2.1.1.Windows 98 DDK的安装 (7)2.1.2.Windows 95 DDK的安装 (7)2.1.3.NT DDK的安装 (8)2.2 ■构造环境:建立WDM驱动程序构造环境的方法 (8)2.2.1. 用SETENV.bat来安装驱动程序构造环境 (9)2.2.2. 手工运行SETENV.bat (9)2.2.3. 构造WDM驱动程序 (9)2.2.4.构造驱动程序 (9)2.2.5.检查Windows 98 DDK的安装 (9)3.WDM驱动程序的设计与开发 (10)3.1■WDM 驱动程序的运作流程 (10)3.2■驱动程序设计 (10)3.3■驱动程序开发 (11)3.3.l.编写驱动程序框架 (11)3.3.2.测试驱动程序 (11)4.WDM驱动程序编译运行:编译和安装设备驱动程序的方法 (12)4.1■编译设备驱动程序的方法 (12)4.1.1.举例分析 (12)4.1.2.编译的基本步骤 (13)4.2■设备驱动程序的安装和启动 (13)4.2.1.添加注册表中的键值 (13)4.2.2.控制驱动程序的装入次序 (14)4.2.3.驱动程序的Start值 (14)4.2.4.修改注册表的方法 (15)4.2.5.启动设备驱动程序 (15)4.2.6.调试工具 (16)5.wdm驱动开发基础-一些需要注意的问题汇总 (16)5.1注册表的角色 (16)5.2.如何命名注册表键 (16)5.3从用户模式中访问设备键 (17)5.4 函数原型“IN”关键字 (17)5.5 注册设备接口 (18)5.6 初始化设备扩展 (18)5.7 注意侧效 (19)5.8 try-finally中的控制流程 (20)5.9 生成异常 (22)5.10 __Leave语句 (23)5.11 简化页大小 (24)5.12 页故障关于分页 (24)5.13 alloc_text的使用 (25)5.14 关于段布置 (26)5.15 服务函数描述 (26)5.16 ExAllocatePoolWithTag (28)5.17 ExAllocatePool的其它形式 (29)5.18 单链表 (30)5.19 lookaside链表的服务函数 (31)5.20 打开注册表键 (31)5.21 删除子键或键值 (32)5.22 枚举子键或键值 (33)5.23 IRQL限定 (35)5.24 IRQL的明确控制 (35)5.25 自旋锁 (36)6. wdm驱动开发基础代码分析解析 (36)绪言在Windows的不同版本上开发的驱动程序“模型”(模型这个词语应该来源于单词“Mode”。
WDM驱动开发之路(1)

WDM驱动开发之路(1)WDM开发之路(1)--驱动开发网WDM教程WDM驱动开发之路写在前面:在专栏的前几期中,我们一起初步学习了vxd的开发技术。
Vxd技术是很深奥的,不是一篇两篇文章能讲清楚,但你已经入了门,剩下的就要看你的修行了。
多看书,多泡论坛(当然是上咱们的驱动开发网论坛了:->),多写程序…我的手不够用了。
功到自然成嘛。
不过话又说回来,vxd只是权宜之计,WDM才符合当今的潮流(程序员都是时髦人士,君不见先是VB、VC然后是asp、JSP、PHP,数也数不过来呀),Win9x寿终正寝时也就是vxd的末日,你不想随它而去吧(开个玩笑),那就随我来。
按笔者的想法,这篇文章写成连载形式,一次讲一个主题,并且必要时带着例子,让大伙step by step地把WDM驱动弄个透底,不想让大家觉得稀里糊涂,也不想让大家觉得白买杂志了。
今天我们一起讨论第一部分,了解篇。
(一)了解篇WDM模型(Windows Driver Model)是微软公司为当前主流操作系统Windows98和Windows 2000的驱动程序设计的一种构架。
它和传统的win3.x和win95使用的vxd的驱动是完全不同的体系结构。
不过对于最终用户来说,WDM驱动程序在Windows98和Windows2000下的表现很相似。
作为驱动开发人员来说,它在两者中有很多的不同。
并且Windows98中的WDM只能算是Windowss2000中的WDM的一个了集。
在Windows98中有一些驱动程序只能使用VXD来实现,如串行通讯驱动等。
要写驱动程序,首先要了解操作系统的结构。
在WDM体系中,windows2000操作系统中是最标准的实现方式,Windows98则是部分兼容WDM结构。
照微软的说法,Windows98和Windows2000 X86(Intel 架构)版本实现二进制码兼容(参见98DDK),Windows2000 x86版本与其它CPU平台版本实现源码级兼容(因为Windows 2000是基本NT相似的结构,最底层是硬件抽象层HAL,所有我们相信它们之间能源码级兼容)。
USB驱动程序的编写采用WDM驱动程序

U S B驱动程序的编写采用W D M驱动程序Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】USB驱动程序的编写采用WDM 驱动程序。
WDM 驱动程序是一些例程的集合,它们被动地存在,等待主机系统软件(PnP 管理器、I/O 管理器、电源管理器等)来调用或激活它们。
具体驱动程序不同,其所包含的例程也不同。
一个WDM 驱动程序的基本组成包括以下5个例程:(1)驱动程序入口例程:处理驱动程序的初始化。
(2)即插即用例程:处理PnP 设备的添加、删除和停止。
(3)分发例程:处理用户应用程序发出的各种 I/O 请求。
(4)电源管理例程:处理电源管理请求。
(5)卸载例程:处理驱动程序的卸载。
包含文件:, ,, , , makefile,sources)在文件中,包含了上述五个例程:中定义了各种数据结构还有各种IOCTL控制码,用于不同数据的读写。
中实现了各种驱动例程。
包含了上述五个所说例程外还包含了其他例程,课程从下面的驱动程序入口例程得出一些信息。
驱动程序入口例程:NTSTATUSDriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){NTSTATUS ntStatus = STATUS_SUCCESS;PDEVICE_OBJECT deviceObject = NULL;DriverObject->MajorFunction[IRP_MJ_CREATE] = Ezusb_Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ezusb_Close; ources. If you want to add a new source # file to thiscomponent. This file merely indirects to the real make file # that is shared by all thedriver components of the Windows NT DDK # !INCLUDE $(NTMAKEENV) 不要编辑这个文件。
WDM设备驱动程序的设计和实现

1 WD M
11 WD 概 念 . M
维普资讯
S IT C F R TO E E O M N C — E HI O MA I N D V L P E T&E O O Y N C NM
文章编号:0 5 6 3 (0 7 0 - 2 2 0 10 - 0 3 2 0 )5 0 0 — 2
1 WD . 2 M的工作原理 WD M是一种分层化 的驱动程序模 型 , 在这种模 型中 , 驱动程序的层
个 高层 的驱动程序必须具有低层 驱动程序绝 大多数I P M _ X R _ JX X
和堆栈一起 工作 , 处理 I / O请求 。Wi o so 0 n w 2 o ⅨP的 I d / O子系统是基 于 对 象 的,对 WD 而言 ,最 重要 的对象 是驱 动程序对 象 和设备 对象 。 M
20 年 07
第 l卷 第 5 7 期
WD 设备驱 动程序 的设计和 实现 M
秦 为 郭志平 吕彩琴 周力农 , , ,
( . 大学机 电工程学院 , 1中北 山西太原 ,30 12内蒙古一机集团科研所二室 , 0 0 5 ;. 内蒙古包头 , 10 2 04 3 ) 摘 要: 设备 驱动程序是硬件设备连接 到计算机 系统的软件接 口。分析 了 WD 的工 M
Wid w 20 / P的 I no 80 0X / O子系统也是一 个包驱动系统 , 在该 系统中 , 每个
例 程人 口, 若设计 一个中间层驱动程序 , 首先应确认下层驱 动程序所 管
基于Windows开发WDM设备驱动程序的方法

基于Windows2000开发WDM设备驱动程序的方法摘要:本文介绍了Windows 2000 WDM驱动程序结构及其原理,给出一个驱动程序的例子关键词: WDM 驱动程序1.概述引入了全新的WDM (Win32 Driver Model)的驱动程序架构,说是新技术,其实早在1997年Microsoft就提出了该项技术并在Windows 98中得到了充分的应用,换句话说,Windows 98也支持WDM。
这样WDM就成为了一个跨平台的驱动程序模型不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行。
2.WDM设备驱动程序的特点和原理2.1通用驱动程序对基本上一样的硬件,因为他们共享一个总线或完成类似的任务,设备驱动程序可以使用这些标准的驱动程序功能,使公共总线的共享容易,且更容易写出新的驱动程序,总线驱动程序,如USB、1394,和类驱动程序。
(1)Win32程序接口:可以使用Win32函数像访问文件那样访问设备CreateFile() 、Closehandle()、ReadFile()、WriteFile()、DeviceIoControl ()用于发出特殊请求,可发送数据给驱动和从驱动得到数据,IOCTL代码可以是预先定义的也可是自己定义的。
(2)创建设备大多数WDM设备对象都是在PnP管理器中调用AddDevice入口时创建,这个PnP 例程在插入新设备和安装Inf文件时被调用,此后一系列的PnP IRP 被发送到驱动程序,指示设备应如何启动和查询它的功能2.2WDM-的工作原理WDM是在NT 4.0驱动程序结构上发展起来的,所以它与NT 4.0驱动程序极为相似,但是它却有了本质上的提高,比如它支持USB、IEEE 1394、ACPI等全新的硬件标准。
虽然Windows 98与Windows 2000都支持WDM,可是并不意味着Windows 98下的VxD可以在 Windows 2000下运行,而NT下的WDM却可以在Windows 98下运行。
开发WDM型USB设备驱动程序

开发WDM型USB设备驱动程序USB设备驱动程序开发⼯具开发USB设备驱动程序需要专门的开发⼯具,⽬前应⽤⼴泛的⼯具主要有两⼤类。
⼀类是Microsoft公司提供的Windows DDK(Device Driver Kit)。
它有Windows 98 DDK 和Windows 2000 DDK两个版本。
Windows 98 DDK能够开发Windows 95/98/Me/NT下的VxD、KMD和WDM驱动程序。
Windows 2000 DDK 能够开发Windows 98/Me/NT/2000下的KMD和WDM驱动程序。
由于DDK基于汇编语⾔的编程⽅式和内核模式的调⽤,对没有深厚的OS原理和编程⽔平的⼈员来说,任务相当艰巨。
另⼀类是NuMega公司提供的DriverStudio,它是⼀个⼤的开发⼯具包,包含VtoolsD、SoftICE和DriverWorks等开发⼯具。
VtoolsD开发包提供了对VxD编程的C/C++类库⽀持,利⽤VtoolsD中的QuickVxD⼯具可以快速⽣成VxD的C/C++代码框架,开发者可以在此基础上根据各⾃的需要添加⾃⼰的代码。
DriverWorks⽤于开发KMD和WDM驱动程序,并且对DDK函数进⾏了类的封装,从⽽为开发Windows NT、Windows 2000和Widnwos98 WDM设备驱动程序提供了⼀个⾃动化的⽅法。
DriverWorks,提供了VC++下的开发向导Driver Wizard,按照它的提⽰可以迅速地⽣成驱动程序的框架。
这个框架结构提供可以正确执⾏WDM动态环境中IRP的请求,⽽且,也包含⽤于简化系统提供的标准类驱动程序(如HID、流)和总线驱动程序(如PCI和USB)接⼝的类等。
总之,利⽤DriverWorks开发WDM驱动程序,可以⼤⼤简化开发⼈员的⼯作量、缩短开发周期以及降低开发驱动程序的难度。
[1]⽤DriverWorks开发WDM型USB设备驱动程序要想使⽤DriverWorks,必须先安装以下软件:DriverStudio2.5,VisualStudio6.0,以及Windows2000DDK。
PCI9052 WDM驱动开发

在设计和使用PCI设备时,经常要在PC机的软件中访问和控制硬件设备,但Windows操作系统(Windows NT、Windows2000、WindowsXP)为了保证系统的安全性、稳定性和可移植性,对应用程序访问硬件资源加以限制,这就要求设计设备驱动程序以实现PC机的软件对PCI 设备的访问。
内核(Kernel)模式的驱动程序可以应用于WINDOWS NT和WINDOWS 2000的操作系统中。
它区别于WDM(Win32 Driver Model)模型,主要不支持即插即用,但对于编程的思想二者基本上一致,对于本文所述的DMA编程的方法在WDM模式的驱动程序中一样适合。
本文通过现有最常见的AMCC公司生产的AMCC S5933 PCI 控制芯片为例说明在WINDOWS NT平台下如何编写设备驱动程序以实现DMA传输方式。
本文对基本的驱动程序设计技术不作详细的说明,重点介绍PCI设备驱动程序开发的相关技术与实现方法,以及用户接口程序的设计与实现技术。
1 NT平台驱动程序模式及开发工具设备驱动程序是指管理某个外围设备的一段代码,驱动程序不会独立地存在,而是操作系统的一部分。
通过设备驱动程序,多个进程可以同时使用这些资源,从而可以实现多进程并行运行。
在本文中,将调用设备驱动程序的PC机程序称为用户程序。
Intel 80386以上的微处理器有4个优先级别:0级、1级、2级和3级。
Windows NT使用了一个简化的模型描述硬件特权级,然后这个模型映射到指定CPU上可用的特权检查机制,即内核模式和用户模式。
内核模式对应于Intel系统的0级,可以执行特权级指令,对任何I/O 设备有全部的访问权,还能够访问任何虚地址和控制虚拟内存硬件。
用户模式对应于Intel系统的3级环,用户程序在该模式下运行,对硬件的访问操作受到系统的限制。
开发设备驱动采用的工具包括微软为驱动开发提供的设备驱动开发包(Device Driver Kit,DDK)。
如何为ISA设备编写WDM驱动程序

如何为ISA设备编写WDM驱动程序WDM(Windows Driver Mode1)是Microsoft公司全新的Windows驱动程序模式,支持即插即用(PNP)、电源管理和WMI技术,它的运行平台是Windows 98/2000/XP/2003操作系统。
这种具有跨平台性的设备驱动模型可以大大简化驱动程序的开发工作,为用户的PNP设备驱动完成了大量的底层工作。
这也使得WDM对各种老设备,特别是那些不具有即插即用特性硬件的支持明显的不足。
在科研和工控中,最常用的数据采集卡通常都是基于PC总线的不能为PNP提供硬件支持的ISA设备。
为这类硬件编写非WDM驱动程序只能局部支持PNP特性,而且需要做大量额外的工作如:必须检测硬件,为硬件创建设备对象(用于代表硬件),配置并初始化硬件使其正常工作,这些工作非常复杂。
利用WDM可以大大简化这些工作。
1 WDM的结构WDM实际上是一个编写驱动程序的规范。
其驱动程序结构的特点和WINDOWS程序设计的消息驱动机制很相像,采用IRP驱动机制。
WINDOWS 98和WINDOWS 2000处理IRP 的方式一样,本质却完全不同。
Windows2000的内存管理采用了虚拟内存的概念,系统表现为具有一个比物理内存大得多的虚拟内存空间。
每个进程都被赋予它自己的虚拟地址空间,这个地址空间划分成固定大小的页(x86、32位处理器的页大小为4KB),一个页可以驻留在物理内存(非分页内存),或者被交换到硬盘上(分页内存)。
当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存,属于所有其他进程的内存则隐藏着,并且不能被正在运行的线程访问。
每个进程有独立的内存空间,不会被其他程序访问,保护了数据的完整性。
这样,有一部分内存实际上不是在物理内存中,而是在硬盘上。
当访问并不存在于实际物理内存的地址时,内存管理器引发DISPATCH_ LEVEL级别的页故障中断,调用硬盘驱动程序把故障页读入内存。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WDM驱动开发之路写在前面:在专栏的前几期中,我们一起初步学习了vxd的开发技术。
Vxd技术是很深奥的,不是一篇两篇文章能讲清楚,但你已经入了门,剩下的就要看你的修行了。
多看书,多泡论坛(当然是上咱们的驱动开发网论坛了:->),多写程序…我的手不够用了。
功到自然成嘛。
不过话又说回来,vxd只是权宜之计,WDM才符合当今的潮流(程序员都是时髦人士,君不见先是VB、VC然后是asp、JSP、PHP,数也数不过来呀),Win9x寿终正寝时也就是vxd的末日,你不想随它而去吧(开个玩笑),那就随我来。
按笔者的想法,这篇文章写成连载形式,一次讲一个主题,并且必要时带着例子,让大伙step by step地把WDM驱动弄个透底,不想让大家觉得稀里糊涂,也不想让大家觉得白买杂志了。
今天我们一起讨论第一部分,了解篇。
(一)了解篇WDM模型(Windows Driver Model)是微软公司为当前主流操作系统Windows98和Windows 2000的驱动程序设计的一种构架。
它和传统的win3.x和win95使用的vxd的驱动是完全不同的体系结构。
不过对于最终用户来说,WDM驱动程序在Windows98和Windows2000下的表现很相似。
作为驱动开发人员来说,它在两者中有很多的不同。
并且Windows98中的WDM只能算是Windowss2000中的WDM的一个了集。
在Windows98中有一些驱动程序只能使用VXD来实现,如串行通讯驱动等。
要写驱动程序,首先要了解操作系统的结构。
在WDM体系中,windows2000操作系统中是最标准的实现方式,Windows98则是部分兼容WDM结构。
照微软的说法,Windows98和Windows2000 X86(Intel 架构)版本实现二进制码兼容(参见98DDK),Windows2000 x86版本与其它CPU平台版本实现源码级兼容(因为Windows 2000是基本NT相似的结构,最底层是硬件抽象层HAL,所有我们相信它们之间能源码级兼容)。
但实际上,Windows2000的WDM实现中有很多例程在Windows98中没有实现,一旦试图加载这样的WDM驱动程序到Windows98中,则不能正常加载,当然我们也有办法实现它,那就是利用“桩”技术。
具体可参见Walter Oney写的《Programming the Microsoft Windows Driver Model》一书。
我们首先来看看Windows 2000的系统结构,然后再来看看Windows 98的。
图一是Windows 2000的系统结构图。
从图中我们可以看出:整个系统被分为两个态,用户态和核心态。
从图中可以明显看出I/O操作最后是怎样作用到硬件上的。
用户态应用程序对Windows 子系统进行win32 API调用,这个调用由系统服务接口作用到I/O管理器(严格地说,在Windows 系统中不存在I/O管理器这样的独立模块,这个只是为了方便叙述而将各种核心功能调用的集合称作I/O管理器,业界人士都这样称呼这个部分),I/O管理器进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的IRP(IO Request Package,I/O请求包),并把此IRP传给驱动程序。
简单情况下,驱动程序直接执行这个请求包,并与硬件打交道,从而完成I/O请求工作,最后由I/O管理器将执行结果返回给用户态程序。
但在WDM体系结构中,大部分实行分层处理。
即在图中“设备驱动“这部分,分成了若干层,典型地分成高层驱动程序、中间层驱动程序、底层驱动程序。
每层驱动再把I/O请求划分成更简单的请求,以传给更下层的驱动执行。
以文件系统驱动为例,最高层驱动只知道文件如何在磁盘上表示,但不知到怎样得到数据。
最低层驱动程序只知道怎样从磁盘取出512B为单的数据块,但不知道文件怎样表示。
举个更具体的生活例子。
主人(最高层驱动)知道(并且需要)笔计本电脑,但不知道具体放在什么位置;而仆人(最底层驱动)却知道它放在具体什么地方,但图一不知道(也不需要管)怎么使用。
在WDM驱动体系中,驱动尽可能被设计成分层并且通用的。
以USB驱动为例,USB 总线驱动负责与硬件打交道,但不负责数据的逻辑表示。
其它驱动程序只是扮演客户端驱动程序的角色,把各种请求转换成对USB总线驱动程序的请求。
比如我们使用的HID驱动中的键盘驱动程序(USB接口),我们按下键时,它只是简单(当然不是想象的那么简单,只是相对于USB总线驱动而言的)地把它转化为对USB总线驱动程序的请求,然后将USB总线驱动程序得到的结果返回系统中。
还有一类驱动程序就是我们常说的过滤器驱动程序。
它不负责完成基本的驱动任务,但它位其它驱动层次之间,并添加一些功能。
在设计过程中,有一个原则就是不影响其它层次的功能。
常见的例子是防火墙,底层实现其实是一种中间层过滤器驱动程序,负责检查IP 包的进出情况,允许合法的包通过,阻止非法的包通过。
最底层的驱动程序在收到IRP后,通过硬件抽象层,然后与硬件发生作用,从而完成I/O请求工作。
在这样的架构下,Windows 2000( or NT)上面的层就不需要对应每个操作系统都要开发一遍了。
所以微软认为在Windows2000 x86平台下开发的驱动和其它CPU平台下Windows 2000源码级兼容。
(试想一下,如果大家都用c写一个“hello world!”程序,那么只要有c编译器的操作系统平台下,运行的结果都是一致的。
)WDM驱动体系相对于Windows NT的KMD驱动体系不同之处在于它支持即插即用、拥有总线驱动和类驱动等等。
WDM驱动体系重新定义驱动程序层次,以便适应即插即用系统。
在这时我们引入了”驱动程序栈“的概念。
驱动程序栈是WDM驱动体系中驱动层次的有序集合。
可以这样理解:把各层次的驱动程序按一定顺序排列起来,各负责完成一定的功能。
具体可以看以下的图示:从图中我们可以看到,处于最下层的是总线驱动程序,上面是功能驱动程序。
在总线驱动程序和功能驱动程序之间还有可能出现过滤器驱动程序(中间层驱动)。
在某些特殊情况下有可能在第一个功能驱动程序层上出现几个另外的功能驱动程序。
总线驱动程序负责列举设备,也就是说,它负责发现总线上的所有设备并检测设备何时添加到总线上或何时从总线上删除。
总线驱动程序每发现一个设备就创建一个对应的物理设备对象。
一些总线驱动程序只是简单地控制对总线的访问权。
我们知道,一旦拥有总线权时,我们就可以完成我们想做的任何工作。
当然,大部分的总线驱动程序为我们完成这类总线上的所有任务。
功能驱动程序负责完成特定的功能,知道如何控制设备工作。
它在驱动程序栈中位于总线驱动程序上面。
功能驱动程序负责创建一个功能设备对象。
在USB 总线情形中,功能驱动程序必须使用总线驱动程序来访问它自己的设备。
在驱动程序栈中,可以插入各种类型的过滤驱动程序。
对于总线上的所有设备,总线过滤驱动程序被添加在总线驱动之上;而对于一个特定类的所有功能的功能驱动程序添加类过滤驱动程序。
设备过滤驱动程序仅对特定的设备添加。
上层的过滤驱动程序添加在功能驱动程序之上,而低层的过滤驱动程序添加在功能驱动程序下面。
在WDM 驱动体系中,为了实现上面所说的分层思想,也为了简化驱动程序的编写,预先提供了几种类驱动程序和总线驱动程序。
主要包括如下几类:一、人工输入设备(HID)类驱动程序人工输入设备类驱动程序提供输入设备的一个抽象接口。
实际的输入硬件可以使用不同的方法连接。
这些方法被HID 类驱动程序隐藏。
如果是USB 总线的人工输入设备,有可能要调用USB 总线驱动程序,但HID 类驱动提供给上层的接口是相同的,不因为底层接口的改变而有所不同。
二、静态图象体系静态图象体系结构(STI)根本上不是一种驱动程序,而是使用小类驱动程序获得扫描仪和静态图象相机图形数据的一种手段。
STI 目前支持SCSI 设备、串行设备、并行设备和USB 设备。
三、流类驱动程序流类驱动程序提供访问高带宽、时间关键的视频和音频数据的基础。
流类驱动程序使用小类驱动程序接口到实际的硬件。
我们可以编写中间过滤驱动程序来转换数据格式。
四、端口驱动程序音频端口驱动程序和小端口驱动程序用于控制实际的硬件。
通常由硬件制造商编写。
五、IEEE 1394总线驱动程序IEEE1394总线驱动程序列举并控制IEEE1394高速总线,这个总线驱动程序使用端口驱动程序访问IEEE1394硬件设备的控制电路。
IEEE1394客户驱动程序发出IEEE1394请求块IRB来控制它们自己的设备(这点上和USB驱动程序很相似的)。
六、USB总线驱动程序USB总线驱动程序列举并控制低速的USB总线设备。
主机控制器驱动程序(HOST设备)作为访问主要的两类USB主机控制器的标准。
USB客户驱动程序使用各种IOCTL通过USB类驱动程序访问它们自己的设备。
最主要的还是通过URB(USB请求块)来控制它们自己的设备。
七、SCSI和CDROM/DVD驱动程序SCSI和CDROM/DVD驱动程序用于访问硬盘、软驱、CDROM和DVD设备。
和上面的相似,提供各种端口驱动程序和小端口驱动程序来访各自的硬件设备。
例如:IEEE1394总线上的CDROM的请求会发送到IEEE1394总线驱动程序。
八、ACPIACPI(高级配置和电源管理接口)总线驱动程序与PC ACPI BIOS作用,列举系统中的设备并控制它们的电源使用。
九、PCI和PnPISA总线驱动程序它们和USB总线驱动相似,列举各自总线上的设备并控制它们。
PnPISA只对符合即插即用工业标准的ISA总线设备作这些工作。
还有一点必须明白,那就是I/O管理器向设备驱动程序栈发送的IRP是从栈顶进入的,理解这点很重要。
这样,当用户向I/O管理器请求了它要访问的功能设备时,I/O管理器将保证它的全部请求都发送到设备栈的顶部,这样处在设备驱动程序栈中的任何层次的过滤器驱动程序或功能驱动程序都得到首先处理这些请求的机会。
这就是WDM驱动程序的简单介绍。
上面我们主要讲述了Windows2000中的情形。
在Windows98中很相似,但由于它继承于windows95,所有不能够所有的设备都实现WDM体系结构。
有几种设备还只能使用VXD体系。
如串口驱动和文件系统驱动等。
从上面我们已经知道wdm究竟是怎么回事,接下来让我们看看在Windows2000操作系统中有哪些驱动程序。
请见图三。
∙虚拟设备驱动程序(VDD)是一个用户模式部件,它可以使DOS应用程序访问x86平台上的硬件。
VDD通过屏蔽I/O权限掩码来捕获端口存取操作,它基本上是模拟硬件操作,这对于那些直接对裸机硬件编程的应用程序特别有用。