驱动对象和设备对象

驱动对象

驱动对象,本质就是内核中一块描述驱动信息的内存

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 “\Driver\MyDriver1” //驱动的名字
+0x024 HardwareDatabase : 0x8067e260 “\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM” //注册表中的位置
+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 “\Driver\MyDriver1”
+0x024 HardwareDatabase : 0x8067e260 “\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM”
+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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值