Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
1
电子工程系
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
2
Windows设备驱动程序设计
Windows 2000的设备驱动程序
WDM的核心概念和数据结构
WDM驱动程序的结构
WDM驱动程序的编程实例
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
3
Windows 2000的设备驱动程序用户模式驱动程序核心模式驱动程序文件系统驱动程序遗留设备驱动程序
PnP
驱动程序小端口驱动程序
WDM
驱动程序类驱动程序小驱动程序视频小端口驱动程序
NDIS小端口驱动程序
SCSI小端口驱动程序
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
4
Windows 2000的设备驱动程序
用户模式驱动程序
Win32多媒体驱动虚拟设备驱动程序 VDD
其他保护子系统的驱动程序
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
5
Windows 2000的设备驱动程序
核心模式驱动程序
PnP驱动程序
WDM驱动程序小端口驱动程序文件系统驱动程序遗留设备驱动程序
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
6
Windows 2000的设备驱动程序
WDM驱动程序以 Windows NT 4.0的内部结构为基础,同时引入了 Windows 9x的即插即用特性在 Windows 98和 Windows 2000间实现源代码级兼容
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
7
WDM的核心概念和数据结构
FiDO
FDO
FiDO
PDO
上层过滤器驱动程序功能驱动程序下层过滤器驱动程序总线驱动程序
IRP
设备和驱动程序的分层
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
8
总线驱动程序负责枚举连接在该总线上的所有设备并进行必要处理
Microsoft为大多数总线如 PCI,PnPISA,SCSI
以及 USB等提供了驱动程序
机器中每种类型的总线都有相应的总线驱动程序
总线枚举时驱动程序识别其上的设备并为其创建一个物理设备对象
WDM的核心概念和数据结构
设备和驱动程序的分层 总线驱动程序
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
9
功能驱动程序是一个设备的主要驱动程序,它知道如何控制设备的主要功能
功能驱动程序为它的设备提供操作接口,处理对设备的读 /写,并管理设备的电源策略
功能驱动程序创建一个功能设备对象 FDO放在设备栈中
WDM的核心概念和数据结构
设备和驱动程序的分层 功能驱动程序
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
10
WDM的核心概念和数据结构
设备和驱动程序的分层 过滤器驱动程序
过滤器驱动程序过滤对每个设备、每一类设备或一条总线的 I/O请求
过滤器驱动程序是可选择的
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
11
WDM的核心概念和数据结构
驱动程序对象( driver object)
I/O管理器使用驱动程序对象来代表每个设备驱动程序,驱动程序对象描述了驱动程序载入到物理内存的什么地方,驱动程序的大小和它的主要入口点。
驱动程序对象是一个数据结构,其格式由
DRIVER_OBJECT定义
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
12
WDM的核心概念和数据结构
驱动程序对象( driver object)
驱动程序对象是一个数据结构,其格式由
DRIVER_OBJECT定义
C S H O R T T y p e C S H O R T S i z e
P D E V I C E _ O B J E C T D e v i c e O b j e c t
U L O N G F l a g s
P V O I D D r i v e r S t a r t
U L O N G D r i v e r S i z e
P V O I D D r i v e r S e c t i o n
P D R I V E R _ E X T E N S I O N D r i v e r E x t e n s i o n
U N I C O D E _ S T R I N G D r i v e r N a m e
P U N I C O D E _ S T R I N G H a r d w a r e D a t a b a s e
P F A S T _ I O _ D I S P A T C H F a s t I o D i s p a t c h
P D R I V E R _ I N I T I A L I Z E D r i v e r I n i t
P D R I V E R _ S T A R T I O D r i v e r S t a r t I o
P D R I V E R _ U N L O A D D r i v e r U n l o a d
P D R I V E R _ D I S P A T C H
M a j o r F u n c t i o n [ I R P _ M J _ M A X I M U M _ F U N C T I O N +1 ]
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
13
WDM的核心概念和数据结构
驱动程序对象
DeviceObject
指向一个设备对象链表,每个设备对象代表一个设备
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
14
WDM的核心概念和数据结构
设备对象( device object)
代表能够成为 I/O操作目标的物理设备或逻辑设备,
它以 DEVICE_OBJECT结构来描述
C S H O R T T y p e C S H O R T S i z e
L O N G R e f e r e n c e C o u n t
P D R I V E R _ O B J E C T D r i v e r O b j e c t
P D E V I C E _ O B J E C T N e x t D e v i c e
P D R I V E R _ O B J E C T A t t a c h e d O b j e c t
P I R P C u r r e n t I r p
P I O _ T I M E R T i m e r
U L O N G F l a g s
U L O N G C h a r a c t e r i s t i c s
.,,
P V O I D D e v i c e E x t e n s i o n
D E V I C E _ T Y P E D e v i c e T y p e
C C H A R
S t a c k S i z e
.,,
.,,
S I Z E _ T A l i g n m e n t R e q u i r e m e n t
.,,
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
15
设备对象
DriverObject
指向与该设备对象相关的驱动程序对象
NextObject
指向属于同一个驱动程序的下一个设备对象
WDM的核心概念和数据结构
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
16
WDM的核心概念和数据结构
设备对象
DeviceExtension
指向一个用户定义的数据结构,驱动程序可以使用该结构保存每个设备实例的信息 —— 设备扩展
( device extension),或 设备扩展对象
typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT
LowerDeviceObject; PDEVICE_OBJECT
Pdo; UNICODE_STRING
ifname;
WMILIB_CONTEXT WmiLibInfo
...
} DEVICE_EXTENSION,*PDEVICE_EXTENSION
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
17
WDM的核心概念和数据结构
驱动程序对象、设备对象、设备扩展之间的关系驱动程序对象
DeviceObject
设备对象
DriverObject
NextDevice
DeviceExtension
设备对象
DriverObject
NextDevice
DeviceExtension
设备扩展
DriverObject
设备扩展
DriverObject
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
18
WDM的核心概念和数据结构
I/O请求包
IRP是 I/O管理器在响应一个 I/O请求时从非分页系统内存中分配的一块可变大小的数据结构内存
IRP由两部分组成:
固定部分
I/O堆栈。
I / O 堆栈单元 1
I / O 堆栈单元 2
I / O 堆栈单元 n
.,,
固定部分
I / O 堆栈
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
19
WDM的核心概念和数据结构
I/O请求包过滤器设备对象
( FiDO)
功能设备对象
( FDO)
物理设备对象
( PDO)
过滤器驱动程序功能驱动程序总线驱动程序
I/O堆栈单元
( IO_STACK_LOCATION )
I/O堆栈单元
( IO_STACK_LOCATION )
I/O堆栈单元
( IO_STACK_LOCATION )
驱动程序和 I/O堆栈之间的平行关系
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
20
WDM的核心概念和数据结构
I/O请求包 I/O功能代码
功能代码 说明 对应的 W i n 3 2 API 函数
I R P _ M J _ C R EA TE 打开设备 C r ea teF i l e
I R P _ M J _ C LEA N U P 在关闭设备时,取消挂起的 I / O 请求
C l o s eHa n dl e
I R P _ M J _ C LO SE 关闭设备 C l o s eHa n dl e
I R P _ M J _ R EA D 从设备获得数据 R ea dF i l e
I R P _ M J _ WR I TE 向设备发送数据 W ri teF i l e
I R P _ M J _ D EV I C E_ C ON TR OL 对用户模式或内核模式客户程序可用的控制操作
D ev i ceI o C o n tr o l
I R P _ M J _ I N TER N A L_ D EV I C E_ C ON TR OL 只对内核模式客户程序可用的控制操作没有对应的 W i n 3 2 A P I
I R P _ M J _ Q U ER Y _ I N F OR M A TI ON 得到文件的长度 GetF i l eLe n g t h
I R P _ M J _ SET _ I N F OR M A TI ON 设置文件的长度 SetF i l eLe n g t h
I R P _ M J _ F LU SH_ BU F F ER S 写输出缓冲区或丢弃输入缓冲区 F l u s h F i l eB uff ers
F l u s h C o n s o l eI n p u tB uff er
P u rg eC o m m
I R P _ M J _ SHU TD OW N 系统关闭 I n i t i a l Sy s tem S hu tdo w n
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
21
IRP的处理
WDM的核心概念和数据结构
I/O请求包
驱动程序 1
驱动程序 2
驱动程序 3
驱动程序 4
I/O堆栈单元 1
I/O堆栈单元 2
I/O堆栈单元 3
I/O堆栈单元 4
IRP
最低最高
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
22
WDM的核心概念和数据结构
用户对设备的访问过程
Windows中对设备的访问分为用户态和核心态两种方式:
用户态通过调用 Win32 API函数如 ReadFile,WriteFile
等访问设备,它不能直接控制硬件核心态通过发送 I/O请求包 IRP来运行驱动程序实现对设备的控制
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
23
WDM的核心概念和数据结构
用户对设备的访问过程应用程序
Win32子系统 用户态核心态I/O系统服务
I/O
管理器
IRP 高层驱动程序中层驱动程序低层驱动程序
HAL
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
24
WDM驱动程序的结构分发例程I/O控制例程
StartIo
AdapterControl
OnInterrupt
DpcForIsr
DriverEntry
AddDevice
基本驱动程序例程必须的驱动程序例程处理请求队列需要包含 StarIo
如果设备产生中断需要包含中断和 DPC例程
DMA操作需要包含 AdapterControl例程可选的 IRP分发例程
DispatchPnp
DispatchPower
DispatchWmi
DispatchRead
DispatchWrite
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
25
WDM驱动程序的结构
DriverEntry例程没有作为入口的 main函数或 WinMain函数,它向操作系统显露一个名称为 DriverEntry的函数,在启动驱动程序的时候,操作系统将调用这个入口。
驱动程序可以被多个类似的硬件使用,但驱动程序的某些全局初始化操作只能在第一次被装入时执行一次,DriverEntry例程就是用于这个目的
DriverEntry例程的主要工作是把各种函数指针填入驱动程序对象,这些指针为操作系统指明了驱动程序容器中各种子例程的位置
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
26
WDM驱动程序的结构
AddDevice例程
AddDevice函数的基本职责是创建一个设备对象并把它连接到以 pdo为栈底的设备堆栈中,主要步骤如下:
调用 IoCreateDevice创建设备对象,并建立一个私有的设备扩展对象。
注册一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号连接。
调用 IoAttachDeviceToDeviceStack函数,把新设备对象放到堆栈上。
初始化设备对象的 Flag成员。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
27
WDM驱动程序的结构
其他必须的例程
DispatchPnp例程
DispatchPower例程
DispatchWmi例程
其他可选的例程
Windows应用程序与设备驱动程序打交道主要是通过 CreateFile,ReadFile,WriteFile 和
DeviceIoControl等 Win32 API来进行的,这些 API对应着驱动程序的一些分发例程
驱动程序中除了 DriverEntry例程必须以 DriverEntry
命名以外,其他例程都可以使用程序员自定义的名字,
并且都要由 DriverEntry例程向系统注册
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
28
开发设备驱动程序时的一般步骤,
1,对照相关硬件设备的资料仔细分析驱动程序应实现哪些功能
2,根据 WDM设备驱动程序的组成,采用渐进的方法对驱动程序进行模块化设计一个 WDM设备驱动程序通常完成以下工作:
初始化、创建、删除设备、即插即用处理、访问硬件、处理电源管理、使用 WMI、处理 Win32I/O
及控制请求等等,将这些功能划分为不同模块
WDM驱动程序的编程技术
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
29
电子工程系马洪兵
hoganma@263.net