在wdm.h这个头文件中可以看到这两个结构体的定义,下面简单的分析一下结构体中的内容。
DRIVER_OBJECT
typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; //这个驱动生成的设备对象,形成一个链,DeviceObject指向这个链 PDEVICE_OBJECT DeviceObject; //驱动对象是否可以扩展的标记 ULONG Flags; //这部分描述的就是驱动从哪儿被加载。记数字段用来记录驱动注册的重新初始化程序一共被调用了多少次 PVOID DriverStart; ULONG DriverSize; PVOID DriverSection; //指向driver extension.他唯一可以访问的成员就是 DriverExtension->AddDevice,,我们也是利用这个方法在 DriverEntry 程序中存储驱动程序的AddDevice程序 PDRIVER_EXTENSION DriverExtension; // 驱动程序的名字被错误日志线程用来决定I/O请求所绑定的驱动的名字 UNICODE_STRING DriverName; //这个字段是用来进行注册用的。这个指针指向在注册表中硬件信息的路径。 PUNICODE_STRING HardwareDatabase; //这是一个指向支持快速I/O的备用驱动入口的数组的可选择指针,快速I/O通过传入独立参数直接调用驱动程序来实现,而不是利用标准的IRP呼叫机制。 //注意这些方法只能被用于同步的I/O处理,而且是在文件已经被缓存了的情况下 PFAST_IO_DISPATCH FastIoDispatch; //是DriverEntry这个程序的主入口,在I/O管理中来进行设置 PDRIVER_INITIALIZE DriverInit; //是StartIo程序的入口,在DriverEntry来进行设置,如果没有的话,默认是NULL PDRIVER_STARTIO DriverStartIo; //是Unload程序的入口,在DriverEntry来进行设置,如果没有的话,默认是NULL PDRIVER_UNLOAD DriverUnload; //这是一个指针数组,因为每一个驱动程序都需要处理不同种类的IRP消息,所以驱动程序需要设定当不同类型的IRP请求到来时,用哪一个函数来处理这些 //请求,这个数组的小标的值对应的就是IRP major function code,指向的就是处理这种IRP请求的函数。 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; } DRIVER_OBJECT; typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
DEVICE_OBJECT
typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG ReferenceCount; //从属于哪一个驱动对象 struct _DRIVER_OBJECT *DriverObject; //设备链上的下一个对象 struct _DEVICE_OBJECT *NextDevice; //设备绑定对象 struct _DEVICE_OBJECT *AttachedDevice; //指向当前的IRP结构 struct _IRP *CurrentIrp; PIO_TIMER Timer; //此成员是一个32位的无符号整型变量,每个位有不同的含义。可通过按位取“或”操作为新创建的设备对象设置不同的特性 ULONG Flags; ULONG Characteristics; . __volatile PVPB Vpb; PVOID DeviceExtension; //设备类型 DEVICE_TYPE DeviceType; CCHAR StackSize; union { LIST_ENTRY ListEntry; WAIT_CONTEXT_BLOCK Wcb; } Queue; ULONG AlignmentRequirement; KDEVICE_QUEUE DeviceQueue; KDPC Dpc; ULONG ActiveThreadCount; PSECURITY_DESCRIPTOR SecurityDescriptor; KEVENT DeviceLock; USHORT SectorSize; USHORT Spare1; struct _DEVOBJ_EXTENSION *DeviceObjectExtension; PVOID Reserved; } DEVICE_OBJECT; typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;