基础驱动和设备对象关系

    没事写点基础的东西,有写的不当的地方,希望能指出。

    写过驱动或者正在学习驱动编程的人可能都碰到了驱动对象和设备对象。DriverObject和DeviceObject的关系。这里就做个说明吧。

首先来看看这两个结构体定义,从中我们可以发现一些有意思的东西。


   

 

 

 

 

   我们发现在DRIVER_OBJECT中有一个指向DEVICE_OBJECT的指针,这个指针是什么时候进行赋值的呢。一会说。再看看DEVICE_OBJECT这个结构,我们发现其中有一个回指向DRIVER_OBJECT的指针,还有一个 NextDevice,这也是一个DEVICE_OBJECT,这又是什么意思呢。

   现在我们来一点点的解答。要对这些做一个解答,那么就必须说说IoCreateDevice这个函数。这个函数时用来干什么的。大家都只要是用来生产设备对象的。这个函数机会在内核驱动都有时有见到的。这个函数到底做了什么呢。在这个函数中简单的说就是生成后一个DeviceObject,并进行必要的初始化操作。然后将DeviceObject中的DriverObject进行填充为当前的DriverObject。并将这个设备对象插入到这个驱动的设备列表中。就是这一个函数完成了,之前提到的赋值问题。

    这样DriverObject就和DeviceObject关联起来了。那为什么需要关联起来呢。有一个值得注意的就是,系统的请求是发给设备对象的而不是驱动对象的。可是我们根本就没有位设备对象编写处理请求的处理函数。有人会说,在DeiverEntry中初始化的那些不就是吗。其实这些初始化的MajorFunction我们看到都是在DriverObject中保存着。当有请求过来时,设备对象可以根据相对应的Driverobject找到MajorFunction表,然后再IRP的IO stack loction中可以定位现在应该调用哪个函数进行处理。这样就不难说明为什么要在devicobject中有一个回指的缘故的。

    而在驱动卸载的时候,我们需要将设备对象删除掉。如果一个驱动,生成了很多对象,那么我们怎么一个个删除了。除了使用很多全局变量来存储每个生成的设备对象,明显是不可取的。我们可以将驱动对象保存下来,这样,在需要删除所有的设备对象时,就可以通过DriverObject中的DeviceObject,以及DEVICE_OBJECT中的NextDevice来得到所以得设备对象了。在xp之上,我们不需要手动去得到,可以直接调用IoEnumerateDeviceObjectList得到。

   今天就说到这里了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值