本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/49047055
在之前的一篇博文“驱动开发(2)第一个NT驱动和NT驱动的编译”(http://blog.csdn.net/zuishikonghuan/article/details/48805945)中,给出了一个空壳驱动,下面,将会以此源码为基础进行扩充,并给大家解说一下NT驱动的基本结构。其实WDM和KWDF驱动也是基于此的。
1。驱动对象 DRIVER_OBJECT
驱动的入口函数 DriverEntry 的第一个参数就是驱动加载时系统为当前驱动创建的驱动对象的指针。
这个结构微软没有完全公开,如果有兴趣可以可以到网上找找相关资料。其中一些重要的成员有:
PDEVICE_OBJECT DeviceObject:指向第一个设备对象的指针。一个驱动可以创建多个“设备”,这个成员是指向第一个设备对象的指针。驱动程序可以使用此成员和 DEVICE_OBJECT 的 NextDevice 成员来逐句通过驱动程序创建的所有设备对象的列表。
UNICODE_STRING DriverName:驱动名称,是 UNICODE_STRING 字符串。(见我的上上篇博文“内核中的字符串”)
PDRIVER_DISPATCH MajorFunction:派遣函数的指针。应将他视作一个数组,通过他注册派遣函数,如何注册我已经在之前的那一篇博文“驱动开发(2)第一个NT驱动和NT驱动的编译”中详细说了。
PDRIVER_UNLOAD DriverUnload:驱动卸载函数的指针。指向一个卸载函数,驱动卸载时负责清理工作,应在这个函数中关闭打开的句柄、释放申请的内存,防止内存泄露。如果驱动程序不注册卸载函数,那么驱动一旦加载就无法卸载。同样,如何注册我已经在之前的那一篇博文“驱动开发(2)第一个NT驱动和NT驱动的编译”中详细说了。
2。设备对象 DEVICE_OBJECT
结构原型:
typedef struct _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
struct _DRIVER_OBJECT *DriverObject;
struct _DEVICE_OBJECT *NextDevice;
struct _DEVICE_OBJECT *AttachedDevice;
struct _IRP *CurrentIrp;
PIO_TIMER Timer;
ULONG Flags;
ULONG Characteristics;
__volatile PVPB Vpb;
PVOID DeviceExtension;
DEVICE_TYPE DeviceType;
CCHAR StackSize;
union {
LIST_EN