《Windows内核编程》基本数据结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《Windows内核编程》基本数据结构
学习各种高级外挂制作技术,马上去百度搜索(魔鬼作坊),点击第一个站进入,快速成为做挂达人。
驱动对象:
每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的。驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并且内核对一个驱动只加载一个实例。确切地说,是由内核中的I/O管理器负责加载的,驱动程序需要在DriverEntry中初始化。驱动对象的结构定义如下(wd m.h):
typedef struct_DRIVER_OBJECT{
//结构的类型和大小
CSHORT Type;
CSHORT Size;
//每个驱动程序会有一个或多个设备对象,其中,每个设备对象都有一个指针指向下一个驱动对象
//最后一个设备对象指向空。DeviceObject指向驱动对象的第一个设备对象。通过Devic eObject,就
//可以遍历驱动对象中的所有设备对象了。
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
//The following section describes where the driver is loaded.The count //field is used to count the number of times the driver has had its
//registered reinitialization routine invoked.
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
//记录驱动设备的名字,用UNICODE字符串记录,该字符串一般/Driver/[驱动程序名称]
UNICODE_STRING DriverName;
//设备的硬件数据库键名,也是UNICODE字符串记录。一般为
///REGISTRY/MACHINE/HADRWARE/DESCRIPTION/SYSTEM
PUNICODE_STRING HardwareDatabase;
//文件驱动中用到的派遣函数
PFAST_IO_DISPATCH FastIoDispatch;
//The following section describes the entry points to this particular
//driver.Note that the major function dispatch table must be the last //field in the object so that it remains extensible.
PDRIVER_INITIALIZE DriverInit;
//记录StartIO例程的函数地址,用于串行化操作
PDRIVER_STARTIO DriverStartIo;
//指定驱动卸载时所用的回调函数地址
PDRIVER_UNLOAD DriverUnload;
//MajorFunction域记录的是一个函数指针数组,也就是MajorFunction是一个数组,数组中的每个
//成员记录着一个指针,每一个指针指向的是一个函数。这个函数是处理IRP的派遣函数PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1];
}DRIVER_OBJECT;
typedef struct_DRIVER_OBJECT*PDRIVER_OBJECT;
实际上如果写一个驱动程序,或者说编写一个内核模块,要在Windows中加载,就必须填写上面的结构,来告诉Windows程序提供的功能。注意内核模块并不生成一个进程,它只是写一组回调函数让Windows调用,且这组回调函数必须符合Windows内核规定的格式。上面代码中的“快速IO分发函数”FastIoDispatch和“普通分发函数”MajorFunction就是这样一种回调函数。这些函数用来处理发送给这个内核模块的请求。
Windows中很多组件都拥有自己的DRIVER_OBJECT,例如:所有的硬件驱动程序、所有的类驱动(Disk、Cdrom…)、文件系统(NTFS和FastFat,有各自的DRIVER_OBJECT),以及许多其他的内核组件。我们可以使用一个软件WinObj来查看所有的内核对象。
设备对象:
每个驱动程序会创建一个或多个设备对象,用DEVICE_OBJECT数据结构表示。每个设备对象都会有一个指针指向下一个设备对象,因此就形成一个设备链。设备链的第一个设备是由DRIVER_OBJECT结构体中指明的。
设备对象是内核中的重要对象,其重要性不亚于Windows GUI编程中的窗口。窗口是唯一可以接收消息的对象,任何消息都是发送到一个窗口中的;而在内核编程中,大部分“消息”是以请求IRP的方式传递的。而设备对象(DEVICE_OBJECT)是唯一可以接收请求的实体,任何一个请求IRP都是发送给某个设备对象的。
设备对象的结构是DEVICE_OBJECT,常常被简称为DO。一个DO可以代表很多不同的东西,例如一个实际的硬盘、或实现一个类似管道的功能等等。我们总是在内核程序中生成一
个DO,而一个内核程序是用一个驱动对象表示的,因此,一个设备对象总是属于一个驱动对象。
在WDK的wdm.h文件中DO的定义如下:
typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)
_DEVICE_OBJECT{
//结构的类型和大小
CSHORT Type;
USHORT Size;
//引用计数
LONG ReferenceCount;
//指向驱动程序中的驱动对象,同属于一个驱动程序的驱动对象指向的是同一驱动对象struct_DRIVER_OBJECT*DriverObject;
//下一个设备对象。
//这里指的下一个设备对象是同属于一个驱动对象的设备,也就是同一个驱动程序创建的若干设备
//对象,每个设备对象根据NextDevice域形成链表,从而可以枚举每个设备对象
struct_DEVICE_OBJECT*NextDevice;
//指向下一个设备对象,这里指的是,如果有更高一层的驱动附加到这个驱动的时候
//AttachedDevice指向的就是那个更高一层的驱动
struct_DEVICE_OBJECT*AttachedDevice;
//在使用StartIO例程的时候,此域指向的是当前IRP结构