概述
驱动对象
驱动对象,本质就是内核中一块描述驱动信息的内存
kd> dt _DRIVER_OBJECT 8988fe20
+0x000 Type : 4 //NT式驱动的类型为4
+0x002 Size : 168 //该结构体的大小
+0x004 DeviceObject : (null) //自己创建的设备对象 该驱动中所有的设备对象会组成一个链表。
+0x008 Flags : 0x12
+0x00c DriverStart : 0xbaba8000 //驱动开始的地址
+0x010 DriverSize : 0x6000 //驱动的大小
+0x014 DriverSection : 0x89706c38
+0x018 DriverExtension : 0x8988fec8 //驱动的扩展信息
+0x01c DriverName : _UNICODE_STRING “DriverMyDriver1” //驱动的名字
+0x024 HardwareDatabase : 0x8067e260 “REGISTRYMACHINEHARDWAREDESCRIPTIONSYSTEM” //注册表中的位置
+0x028 FastIoDispatch : (null)
+0x02c DriverInit : 0xbabac000 MyDriver1!GsDriverEntry+0
+0x030 DriverStartIo : (null) //记录StartIo函数的地址,用于串行化
+0x034 DriverUnload : 0xbaba9030 MyDriver1!UnLoad+0 //驱动的卸载函数
+0x038 MajorFunction : [28] 0x804f5552 nt!IopInvalidDeviceRequest+0
kd> dt _DRIVER_OBJECT 8988fe20
+0x000 Type : 4
+0x002 Size : 168
+0x004 DeviceObject : (null)
+0x008 Flags : 0x12
+0x00c DriverStart : 0xbaba8000
+0x010 DriverSize : 0x6000
+0x014 DriverSection : 0x89706c38
+0x018 DriverExtension : 0x8988fec8
+0x01c DriverName : _UNICODE_STRING “DriverMyDriver1”
+0x024 HardwareDatabase : 0x8067e260 “REGISTRYMACHINEHARDWAREDESCRIPTIONSYSTEM”
+0x028 FastIoDispatch : (null)
+0x02c DriverInit : 0xbabac000 MyDriver1!GsDriverEntry+0
+0x030 DriverStartIo : (null)
+0x034 DriverUnload : 0xbaba9030 MyDriver1!UnLoad+0
+0x038 MajorFunction : [28] 0x804f5552 nt!IopInvalidDeviceRequest+0
设备对象
0: kd> dt _DEVICE_OBJECT
+0x000 Type : Int2B //该结构体类型
+0x002 Size : Uint2B //该结构体大小
+0x004 ReferenceCount : Int4B //设备引用的次数
+0x008 DriverObject : Ptr32 _DRIVER_OBJECT //指向驱动对象结构
+0x00c NextDevice : Ptr32 _DEVICE_OBJECT //指向该设备的下一个设备,最后一个设备指向空
+0x010 AttachedDevice : Ptr32 _DEVICE_OBJECT //指向下一个设备对象,这里指的是,如果有更高一层的驱动附加到这个驱动的时候,AttachedDevice 指向的是更高一层的驱动 谁附加了我 这个值就指向谁的设备对象指针 这个值存放在被附加的设备对象上
+0x014 CurrentIrp : Ptr32 _IRP 在使用StartIo函数的时候,指向当前IRP结构
+0x018 Timer : Ptr32 _IO_TIMER //定时器指针
+0x01c Flags : Uint4B
+0x020 Characteristics : Uint4B //设备对象特征
+0x024 Vpb : Ptr32 _VPB
+0x028 DeviceExtension : Ptr32 Void //指向的是设备的扩展对象,每个设备都会指定一个扩展对象。
设备扩展对象记录的是设备自己特殊定义的结构体,也就是由程序员自己定义的结构体。另外,在驱动程序中,应该尽量避免全局变量的使用,因为全局变量涉及不容易同步的问题。解决的办法,将全局变量存在设备扩展里。
+0x02c DeviceType : Uint4B
根据设备的需要,需要填写相应的设备类型,当制作虚拟设备时,应该选择FILE_DEVICE_UNKNOWN类型的设备
+0x030 StackSize : Char //在多层驱动情况下,驱动与驱动之间会形成类似堆栈的结构,IRP会依次从最高层传递到最底层,StackSize描述的就是这个层数
+0x034 union {
LIST_ENTRY ListEntry;
WAIT_CONTEXT_BLOCK Wcb;
}QUEUE; IRP链表
+0x05c AlignmentRequirement : Uint4B //设备在大容量传输的时候,需要内存对齐,已保存传输速度。
+0x060 DeviceQueue : _KDEVICE_QUEUE //设备队列
+0x074 Dpc : _KDPC
+0x094 ActiveThreadCount : Uint4B
+0x098 SecurityDescriptor : Ptr32 Void
+0x09c DeviceLock : _KEVENT
+0x0ac SectorSize : Uint2B
+0x0ae Spare1 : Uint2B
+0x0b0 DeviceObjectExtension : Ptr32 _DEVOBJ_EXTENSION
+0x0b4 Reserved : Ptr32 Void
最后
以上就是难过戒指为你收集整理的驱动对象和设备对象的全部内容,希望文章能够帮你解决驱动对象和设备对象所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复