1
Windows 2000的设备驱动程序
WDM的核心概念和数据结构
WDM驱动程序的结构
WDM驱动程序的编程实例第9章Windows设备驱动程序设计
2
Windows 2000的设备驱动程序用户模式驱动程序核心模式驱动程序文件系统驱动程序遗留设备驱动程序
PnP
驱动程序小端口驱动程序
WDM
驱动程序类驱动程序小驱动程序视频小端口驱动程序
NDIS小端口驱动程序
SCSI小端口驱动程序
3
Windows 2000的设备驱动程序
用户模式驱动程序
Win32多媒体驱动虚拟设备驱动程序VDD
其他保护子系统的驱动程序
4
Windows 2000的设备驱动程序
核心模式驱动程序
PnP驱动程序
WDM驱动程序小端口驱动程序文件系统驱动程序遗留设备驱动程序
5
Windows 2000的设备驱动程序
WDM驱动程序以Windows NT 4.0的内部结构为基础,同时引入了Windows 9x的即插即用特性在Windows 98和Windows 2000间实现源代码级兼容
6
WDM的核心概念和数据结构
FiDO
FDO
FiDO
PDO
上层过滤器驱动程序功能驱动程序下层过滤器驱动程序总线驱动程序
IRP
设备和驱动程序的分层
7
F总线驱动程序负责枚举连接在该总线上的所有设备并进行必要处理
FMicrosoft为大多数总线如PCI、PnPISA、SCSI
以及USB等提供了驱动程序
F机器中每种类型的总线都有相应的总线驱动程序
F总线枚举时驱动程序识别其上的设备并为其创建一个物理设备对象
WDM的核心概念和数据结构
设备和驱动程序的分层 fi总线驱动程序
8
F功能驱动程序是一个设备的主要驱动程序,它知道如何控制设备的主要功能
F功能驱动程序为它的设备提供操作接口,处理对设备的读/写,并管理设备的电源策略
F功能驱动程序创建一个功能设备对象FDO放在设备栈中
WDM的核心概念和数据结构
设备和驱动程序的分层 fi功能驱动程序
9
WDM的核心概念和数据结构
设备和驱动程序的分层 fi过滤器驱动程序
F过滤器驱动程序过滤对每个设备、每一类设备或一条总线的I/O请求
F过滤器驱动程序是可选择的
10
WDM的核心概念和数据结构
驱动程序对象(driver object)
I/O管理器使用驱动程序对象来代表每个设备驱动程序,驱动程序对象描述了驱动程序载入到物理内存的什么地方,驱动程序的大小和它的主要入口点。
驱动程序对象是一个数据结构,其格式由
DRIVER_OBJECT定义
11
WDM的核心概念和数据结构
驱动程序对象(driver object)
驱动程序对象是一个数据结构,其格式由
DRIVER_OBJECT定义
CSHORT Type CSHORT Size
PDEVICE_OBJECT DeviceObject
ULONG Flags
PVOID DriverStart
ULONG DriverSize
PVOID DriverSection
PDRIVER_EXTENSION DriverExtension
UNICODE_STRING DriverName
PUNICODE_STRING HardwareDatabase
PFAST_IO_DISPATCH FastIoDispatch
PDRIVER_INITIALIZE DriverInit
PDRIVER_STARTIO DriverStartIo
PDRIVER_UNLOAD DriverUnload
PDRIVER_DISPATCH
MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]
12
WDM的核心概念和数据结构
驱动程序对象
fiDeviceObject
指向一个设备对象链表,每个设备对象代表一个设备
13
WDM的核心概念和数据结构
设备对象(device object)
代表能够成为I/O操作目标的物理设备或逻辑设备,它以DEVICE_OBJECT结构来描述
CSHORT Type CSHORT Size
LONG ReferenceCount
PDRIVER_OBJECT DriverObject
PDEVICE_OBJECT NextDevice
PDRIVER_OBJECT AttachedObject
PIRP CurrentIrp
PIO_TIMER Timer
ULONG Flags
ULONG Characteristics
.,,
PVOID DeviceExtension
DEVICE_TYPE DeviceType
CCHAR
StackSize
.,,
.,,
SIZE_T AlignmentRequirement
.,,
14
设备对象
fiDriverObject
指向与该设备对象相关的驱动程序对象
fiNextObject
指向属于同一个驱动程序的下一个设备对象
WDM的核心概念和数据结构
15
WDM的核心概念和数据结构
设备对象
fiDeviceExtension
指向一个用户定义的数据结构,驱动程序可以使用该结构保存每个设备实例的信息——设备扩展
(device extension),或设备扩展对象
typedefstruct_DEVICE_EXTENSION
{
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT
LowerDeviceObject; PDEVICE_OBJECT
Pdo; UNICODE_STRING
ifname;
WMILIB_CONTEXT WmiLibInfo
...
} DEVICE_EXTENSION,*PDEVICE_EXTENSION
16
WDM的核心概念和数据结构
驱动程序对象、设备对象、设备扩展之间的关系驱动程序对象
DeviceObject
设备对象
DriverObject
NextDevice
DeviceExtension
设备对象
DriverObject
NextDevice
DeviceExtension
设备扩展
DriverObject
设备扩展
DriverObject
17
WDM的核心概念和数据结构
I/O请求包
IRP是I/O管理器在响应一个I/O请求时从非分页系统内存中分配的一块可变大小的数据结构内存
IRP由两部分组成:
固定部分
I/O堆栈。
I/O堆栈单元1
I/O堆栈单元2
I/O堆栈单元n
.,,
固定部分
I/O堆栈
18
WDM的核心概念和数据结构
I/O请求包过滤器设备对象
(FiDO)
功能设备对象
(FDO)
物理设备对象
(PDO)
过滤器驱动程序功能驱动程序总线驱动程序
I/O堆栈单元
(IO_STACK_LOCATION)
I/O堆栈单元
(IO_STACK_LOCATION)
I/O堆栈单元
(IO_STACK_LOCATION)
驱动程序和I/O堆栈之间的平行关系
19
WDM的核心概念和数据结构
I/O请求包 I/O功能代码 fi
功能代码 说明 对应的Win32 API函数
IRP_MJ_CREATE 打开设备 CreateFile
IRP_MJ_CLEANUP 在关闭设备时,取消挂起的I/O请求
CloseHandle
IRP_MJ_CLOSE 关闭设备 CloseHandle
IRP_MJ_READ 从设备获得数据 ReadFile
IRP_MJ_WRITE 向设备发送数据 WriteFile
IRP_MJ_DEVICE_CONTROL 对用户模式或内核模式客户程序可用的控制操作
DeviceIoControl
IRP_MJ_INTERNAL_DEVICE_CONTROL 只对内核模式客户程序可用的控制操作
没有对应的Win32 API
IRP_MJ_QUERY_INFORMATION 得到文件的长度 GetFileLength
IRP_MJ_SET_INFORMATION 设置文件的长度 SetFileLength
IRP_MJ_FLUSH_BUFFERS 写输出缓冲区或丢弃输入缓冲区 FlushFileBuffers
FlushConsoleInputBuffer
PurgeComm
IRP_MJ_SHUTDOWN 系统关闭 InitialSystemShutdown
20
IRP的处理
WDM的核心概念和数据结构
I/O请求包 fi
驱动程序1
驱动程序2
驱动程序3
驱动程序4
I/O堆栈单元1
I/O堆栈单元2
I/O堆栈单元3
I/O堆栈单元4
IRP
最低最高
21
WDM的核心概念和数据结构
用户对设备的访问过程
Windows中对设备的访问分为用户态和核心态两种方式:
用户态通过调用Win32 API函数如ReadFile、WriteFile
等访问设备,它不能直接控制硬件核心态通过发送I/O请求包IRP来运行驱动程序实现对设备的控制
22
WDM的核心概念和数据结构
用户对设备的访问过程应用程序
Win32子系统 用户态核心态I/O系统服务
I/O
管理器
IRP 高层驱动程序中层驱动程序低层驱动程序
HAL
23
WDM驱动程序的结构分发例程I/O控制例程
StartIo
AdapterControl
OnInterrupt
DpcForIsr
DriverEntry
AddDevice
基本驱动程序例程必须的驱动程序例程处理请求队列需要包含StarIo
如果设备产生中断需要包含中断和DPC例程
DMA操作需要包含AdapterControl例程可选的IRP分发例程
DispatchPnp
DispatchPower
DispatchWmi
DispatchRead
DispatchWrite
24
WDM驱动程序的结构
DriverEntry例程没有作为入口的main函数或WinMain函数,它向操作系统显露一个名称为DriverEntry的函数,在启动驱动程序的时候,操作系统将调用这个入口。驱动程序可以被多个类似的硬件使用,但驱动程序的某些全局初始化操作只能在第一次被装入时执行一次,DriverEntry例程就是用于这个目的
DriverEntry例程的主要工作是把各种函数指针填入驱动程序对象,这些指针为操作系统指明了驱动程序容器中各种子例程的位置
25
WDM驱动程序的结构
AddDevice例程
AddDevice函数的基本职责是创建一个设备对象并把它连接到以pdo为栈底的设备堆栈中,主要步骤如下:
调用IoCreateDevice创建设备对象,并建立一个私有的设备扩展对象。
注册一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号连接。
调用IoAttachDeviceToDeviceStack函数,把新设备对象放到堆栈上。
初始化设备对象的Flag成员。
26
WDM驱动程序的结构
其他必须的例程
DispatchPnp例程
DispatchPower例程
DispatchWmi例程
其他可选的例程
Windows应用程序与设备驱动程序打交道主要是通过CreateFile、ReadFile、WriteFile和
DeviceIoControl等Win32 API来进行的,这些API对应着驱动程序的一些分发例程
驱动程序中除了DriverEntry例程必须以DriverEntry
命名以外,其他例程都可以使用程序员自定义的名字,并且都要由DriverEntry例程向系统注册
27
开发设备驱动程序时的一般步骤:
1,对照相关硬件设备的资料仔细分析驱动程序应实现哪些功能
2,根据WDM设备驱动程序的组成,采用渐进的方法对驱动程序进行模块化设计一个WDM设备驱动程序通常完成以下工作:
初始化、创建、删除设备、即插即用处理、访问硬件、处理电源管理、使用WMI、处理Win32I/O
及控制请求等等,将这些功能划分为不同模块
WDM驱动程序的编程技术
Windows 2000的设备驱动程序
WDM的核心概念和数据结构
WDM驱动程序的结构
WDM驱动程序的编程实例第9章Windows设备驱动程序设计
2
Windows 2000的设备驱动程序用户模式驱动程序核心模式驱动程序文件系统驱动程序遗留设备驱动程序
PnP
驱动程序小端口驱动程序
WDM
驱动程序类驱动程序小驱动程序视频小端口驱动程序
NDIS小端口驱动程序
SCSI小端口驱动程序
3
Windows 2000的设备驱动程序
用户模式驱动程序
Win32多媒体驱动虚拟设备驱动程序VDD
其他保护子系统的驱动程序
4
Windows 2000的设备驱动程序
核心模式驱动程序
PnP驱动程序
WDM驱动程序小端口驱动程序文件系统驱动程序遗留设备驱动程序
5
Windows 2000的设备驱动程序
WDM驱动程序以Windows NT 4.0的内部结构为基础,同时引入了Windows 9x的即插即用特性在Windows 98和Windows 2000间实现源代码级兼容
6
WDM的核心概念和数据结构
FiDO
FDO
FiDO
PDO
上层过滤器驱动程序功能驱动程序下层过滤器驱动程序总线驱动程序
IRP
设备和驱动程序的分层
7
F总线驱动程序负责枚举连接在该总线上的所有设备并进行必要处理
FMicrosoft为大多数总线如PCI、PnPISA、SCSI
以及USB等提供了驱动程序
F机器中每种类型的总线都有相应的总线驱动程序
F总线枚举时驱动程序识别其上的设备并为其创建一个物理设备对象
WDM的核心概念和数据结构
设备和驱动程序的分层 fi总线驱动程序
8
F功能驱动程序是一个设备的主要驱动程序,它知道如何控制设备的主要功能
F功能驱动程序为它的设备提供操作接口,处理对设备的读/写,并管理设备的电源策略
F功能驱动程序创建一个功能设备对象FDO放在设备栈中
WDM的核心概念和数据结构
设备和驱动程序的分层 fi功能驱动程序
9
WDM的核心概念和数据结构
设备和驱动程序的分层 fi过滤器驱动程序
F过滤器驱动程序过滤对每个设备、每一类设备或一条总线的I/O请求
F过滤器驱动程序是可选择的
10
WDM的核心概念和数据结构
驱动程序对象(driver object)
I/O管理器使用驱动程序对象来代表每个设备驱动程序,驱动程序对象描述了驱动程序载入到物理内存的什么地方,驱动程序的大小和它的主要入口点。
驱动程序对象是一个数据结构,其格式由
DRIVER_OBJECT定义
11
WDM的核心概念和数据结构
驱动程序对象(driver object)
驱动程序对象是一个数据结构,其格式由
DRIVER_OBJECT定义
CSHORT Type CSHORT Size
PDEVICE_OBJECT DeviceObject
ULONG Flags
PVOID DriverStart
ULONG DriverSize
PVOID DriverSection
PDRIVER_EXTENSION DriverExtension
UNICODE_STRING DriverName
PUNICODE_STRING HardwareDatabase
PFAST_IO_DISPATCH FastIoDispatch
PDRIVER_INITIALIZE DriverInit
PDRIVER_STARTIO DriverStartIo
PDRIVER_UNLOAD DriverUnload
PDRIVER_DISPATCH
MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]
12
WDM的核心概念和数据结构
驱动程序对象
fiDeviceObject
指向一个设备对象链表,每个设备对象代表一个设备
13
WDM的核心概念和数据结构
设备对象(device object)
代表能够成为I/O操作目标的物理设备或逻辑设备,它以DEVICE_OBJECT结构来描述
CSHORT Type CSHORT Size
LONG ReferenceCount
PDRIVER_OBJECT DriverObject
PDEVICE_OBJECT NextDevice
PDRIVER_OBJECT AttachedObject
PIRP CurrentIrp
PIO_TIMER Timer
ULONG Flags
ULONG Characteristics
.,,
PVOID DeviceExtension
DEVICE_TYPE DeviceType
CCHAR
StackSize
.,,
.,,
SIZE_T AlignmentRequirement
.,,
14
设备对象
fiDriverObject
指向与该设备对象相关的驱动程序对象
fiNextObject
指向属于同一个驱动程序的下一个设备对象
WDM的核心概念和数据结构
15
WDM的核心概念和数据结构
设备对象
fiDeviceExtension
指向一个用户定义的数据结构,驱动程序可以使用该结构保存每个设备实例的信息——设备扩展
(device extension),或设备扩展对象
typedefstruct_DEVICE_EXTENSION
{
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT
LowerDeviceObject; PDEVICE_OBJECT
Pdo; UNICODE_STRING
ifname;
WMILIB_CONTEXT WmiLibInfo
...
} DEVICE_EXTENSION,*PDEVICE_EXTENSION
16
WDM的核心概念和数据结构
驱动程序对象、设备对象、设备扩展之间的关系驱动程序对象
DeviceObject
设备对象
DriverObject
NextDevice
DeviceExtension
设备对象
DriverObject
NextDevice
DeviceExtension
设备扩展
DriverObject
设备扩展
DriverObject
17
WDM的核心概念和数据结构
I/O请求包
IRP是I/O管理器在响应一个I/O请求时从非分页系统内存中分配的一块可变大小的数据结构内存
IRP由两部分组成:
固定部分
I/O堆栈。
I/O堆栈单元1
I/O堆栈单元2
I/O堆栈单元n
.,,
固定部分
I/O堆栈
18
WDM的核心概念和数据结构
I/O请求包过滤器设备对象
(FiDO)
功能设备对象
(FDO)
物理设备对象
(PDO)
过滤器驱动程序功能驱动程序总线驱动程序
I/O堆栈单元
(IO_STACK_LOCATION)
I/O堆栈单元
(IO_STACK_LOCATION)
I/O堆栈单元
(IO_STACK_LOCATION)
驱动程序和I/O堆栈之间的平行关系
19
WDM的核心概念和数据结构
I/O请求包 I/O功能代码 fi
功能代码 说明 对应的Win32 API函数
IRP_MJ_CREATE 打开设备 CreateFile
IRP_MJ_CLEANUP 在关闭设备时,取消挂起的I/O请求
CloseHandle
IRP_MJ_CLOSE 关闭设备 CloseHandle
IRP_MJ_READ 从设备获得数据 ReadFile
IRP_MJ_WRITE 向设备发送数据 WriteFile
IRP_MJ_DEVICE_CONTROL 对用户模式或内核模式客户程序可用的控制操作
DeviceIoControl
IRP_MJ_INTERNAL_DEVICE_CONTROL 只对内核模式客户程序可用的控制操作
没有对应的Win32 API
IRP_MJ_QUERY_INFORMATION 得到文件的长度 GetFileLength
IRP_MJ_SET_INFORMATION 设置文件的长度 SetFileLength
IRP_MJ_FLUSH_BUFFERS 写输出缓冲区或丢弃输入缓冲区 FlushFileBuffers
FlushConsoleInputBuffer
PurgeComm
IRP_MJ_SHUTDOWN 系统关闭 InitialSystemShutdown
20
IRP的处理
WDM的核心概念和数据结构
I/O请求包 fi
驱动程序1
驱动程序2
驱动程序3
驱动程序4
I/O堆栈单元1
I/O堆栈单元2
I/O堆栈单元3
I/O堆栈单元4
IRP
最低最高
21
WDM的核心概念和数据结构
用户对设备的访问过程
Windows中对设备的访问分为用户态和核心态两种方式:
用户态通过调用Win32 API函数如ReadFile、WriteFile
等访问设备,它不能直接控制硬件核心态通过发送I/O请求包IRP来运行驱动程序实现对设备的控制
22
WDM的核心概念和数据结构
用户对设备的访问过程应用程序
Win32子系统 用户态核心态I/O系统服务
I/O
管理器
IRP 高层驱动程序中层驱动程序低层驱动程序
HAL
23
WDM驱动程序的结构分发例程I/O控制例程
StartIo
AdapterControl
OnInterrupt
DpcForIsr
DriverEntry
AddDevice
基本驱动程序例程必须的驱动程序例程处理请求队列需要包含StarIo
如果设备产生中断需要包含中断和DPC例程
DMA操作需要包含AdapterControl例程可选的IRP分发例程
DispatchPnp
DispatchPower
DispatchWmi
DispatchRead
DispatchWrite
24
WDM驱动程序的结构
DriverEntry例程没有作为入口的main函数或WinMain函数,它向操作系统显露一个名称为DriverEntry的函数,在启动驱动程序的时候,操作系统将调用这个入口。驱动程序可以被多个类似的硬件使用,但驱动程序的某些全局初始化操作只能在第一次被装入时执行一次,DriverEntry例程就是用于这个目的
DriverEntry例程的主要工作是把各种函数指针填入驱动程序对象,这些指针为操作系统指明了驱动程序容器中各种子例程的位置
25
WDM驱动程序的结构
AddDevice例程
AddDevice函数的基本职责是创建一个设备对象并把它连接到以pdo为栈底的设备堆栈中,主要步骤如下:
调用IoCreateDevice创建设备对象,并建立一个私有的设备扩展对象。
注册一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号连接。
调用IoAttachDeviceToDeviceStack函数,把新设备对象放到堆栈上。
初始化设备对象的Flag成员。
26
WDM驱动程序的结构
其他必须的例程
DispatchPnp例程
DispatchPower例程
DispatchWmi例程
其他可选的例程
Windows应用程序与设备驱动程序打交道主要是通过CreateFile、ReadFile、WriteFile和
DeviceIoControl等Win32 API来进行的,这些API对应着驱动程序的一些分发例程
驱动程序中除了DriverEntry例程必须以DriverEntry
命名以外,其他例程都可以使用程序员自定义的名字,并且都要由DriverEntry例程向系统注册
27
开发设备驱动程序时的一般步骤:
1,对照相关硬件设备的资料仔细分析驱动程序应实现哪些功能
2,根据WDM设备驱动程序的组成,采用渐进的方法对驱动程序进行模块化设计一个WDM设备驱动程序通常完成以下工作:
初始化、创建、删除设备、即插即用处理、访问硬件、处理电源管理、使用WMI、处理Win32I/O
及控制请求等等,将这些功能划分为不同模块
WDM驱动程序的编程技术