驱动对象:
每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的。驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核中的I/O管理器负责加载,并且内核对一个驱动只加载一个实例。
驱动程序需要在DriverEntry中初始化。驱动对象描述了驱动程序载入到内存什么地方,驱动程序的大小和它的主要入口点(MajorFunction数组,就是分发函数);驱动程序对象有一个DeviceObject域指向一个设备对象链表,每个设备对象代表一个设备。
驱动对象的结构定义如下(wdm.h):
设备对象:
每个驱动程序会创建一个或多个设备(物理设备或逻辑设备)对象,用DEVICE_OBJECT数据结构表示。简称为DO。一个DO可以代表很多不同的东西,例如一个实际的硬盘、或实现一个类似管道的功能等等。我们在内核程序中生成一个DO,而一个内核程序是用一个驱动对象表示的,因此,一个设备对象总是属于一个驱动对象。但一个驱动对象可以有多个设备对象,每个设备对象都会有一个指针指向下一个设备对象,因此就形成一个设备链。设备链的第一个设备是由DRIVER_OBJECT结构体中指明的。
设备对象的结构定义如下(wdm.h):
请求对象:
内核中大部分请求以IRP的形式发送。IRP是一个内核数据结构,比较复杂,因为它要表示无数种实际请求。
请求对象的结构定义如下(wdm.h):