Windows驱动模型

Windows有两种驱动类型,一种是NT式驱动,另一种是WDM式驱动,两者最大不同是WDM式驱动支持即插即用(PNP)而NT式驱动则不支持。由于USB设备为即插即用设备,因此选择WDM为设计所用类型。

 

一、数据结构

Windows驱动中有两个重要的数据结构:DRIVER_OBJECT和DEVICE_OBJECT,两者结构中部分成员如下:

typedef struct _DRIVER_OBJECT
{
PDEVICE_OBJECT		DeviceObject;
PVOID			DriverStart;
ULONG			DriverSize;
PVOID			DriverSection;
PDRIVER_EXTENSION	DriverExtension;
UNICODE_STRING		DriverName;
PFAST_IO_DISPATCH	FastIoDispatch;
PDRIVER_UNLOAD		DriverUnload;
PDRIVER_DISPATCH	MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+ 1];
……
} DRIVER_OBJECT, *PDRIVER_OBJECT;
其中重要的部分有:

DeviceObject:每个驱动都会有一个或多个设备对象。每个设备对象中都有一个指针指向下一对象,最后一个设备对象的该指针为空,这类似于单向链表。驱动对象中的DeviceObject指向的则是这个链表中的第一个。通过DeviceObject即可遍历所有设备对象。

DriverName:驱动的名字,用UNICODE字符串进行记录,该字符串一般为\Driver\[驱动程序名称]。

DriverUnload:指定该驱动卸载时的回调函数。

MajorFunction:此为一个函数指针数组,每个指针成员的记录一个I/O请求包的派遣函数。这一点和Linux下struct usb_driver结构体的接口函数是一样的原理。如MajorFunction[IRP_MJ_READ]指向的是处理读请求包的派遣函数,MajorFunction[IRP_MJ_WRITE]指向的是处理写请求包的派遣函数。这些函数是需要驱动开发者自行编写并将函数地址赋值给MajorFunction数组的。

typedef struct _DEVICE_OBJECT
{
PDRIVER_OBJECT		DriverObject;
PDEVICE_OBJECT		NextDevice;
PDEVICE_OBJECT		AttachedDevice;
PIRP			CurrentIrp;
PVOID			DeviceExtension;
DEVICE_TYPE		DeviceType;
CCHAR			StackSize;
……
} DEVICE_OBJECT, *PDEVICE_OBJECT;
 其中重要的部分有:

DriverObject:回指该产生设备的驱动对象。

NextDevice:指向下一个由同样驱动产生的设备对象。通过这个指针产生了上面提到的设备对象链表。

AttachedDevice:WDM驱动模型中驱动和设备都是分层的。本层驱动产生的设备可能会有高一层驱动产生的设备依附在其上面,而AttachedDevice则指向高一层的设备。该结构也称为驱动程序的垂直结构,此概念将在下面讲述。

Flags:设备对象的标志,32个位每一位都代表相应的性质。

DeviceType:指明设备类型。

DeviceExtension:此指针指向驱动开发者自己定义的数据结构,大小不限,用于存储一些针对该设备的特殊信息。另外驱动程序中避免使用全局变量,因为全局变量不易同步,办法便是将其存入设备扩展中。

StackSize:由于WDM驱动模型中驱动和设备都是分层的,形成堆栈结构。StackSize会指出当前驱动为堆栈结构的第几层。

设备对象和驱动对象这两种数据结构为Windows驱动结构的形成奠定了基础。

 

二、驱动结构

WDM模型中,完成一个设备的操作,至少需要两个设备对象:物理设备对象(Physical Device Object,PDO)和功能设备对象(Function Device Object,FDO)。当某设备被插入时,物理设备对象被创建,这是由总线驱动创建的。该设备不可被单独操作,需要功能设备对象。实际应用中,插入设备Windows会提示检测到新设备并要求安装驱动,指的就是WDM驱动。此驱动创建功能设备对象并附加到物理设备对象之上。物理设备对象中的AttachedDevice指针会指向功能设备对象,但实际情况比上述情况复杂。物理设备对象和功能设备对象间可能会存在过滤设备对象,如图3.3所示。产生这些设备对象的驱动,有些是系统自带,而有些需要程序员编写。通过设备对象的AttachedDevice指针可以找到在其上方的设备对象;通过在DeviceExtension中定义下层设备对象的指针可以找到在其下方的设备对象。

Windows驱动模型_第1张图片

(本文是将相关材料整理后写出的,来源:张帆. Windows驱动开发技术详解[M]. 北京:电子工业出版社,2008)

你可能感兴趣的:(Driver,Development)