21
1月
2016

1、Windows的设备驱动框架

我们所关心的主要是WDM框架,而WDM设备驱动模块一般是堆叠的,所以我们关心设备驱动模块的堆叠。一个设备驱动堆叠中的模块完成了初始化,创建了设备对象,并将设备对象累入堆叠之后,该堆叠的结构便如图9.1所示:

 

 

 

这里有着两个方向上的队列。其一是横向的队列,属于同一个驱动对象的设备对象都串在一起,形成一个单链的队列,但是每个设备对象都有个指针指向其所属的驱动对象。其二是纵向的队列,这就形成设备对象的堆叠。图中的横向队列排在同一条水平线上,可能会给人一个错觉,就是这些设备对象都在同一个层次上。其实未必,同一个驱动对象的不同设备对象完全可以同时出现在(通常是不同堆叠中的)不同的层次上。即便是在同一堆叠中,实际上也并不排除在不同层次上出现同一驱动对象的不同设备对象,因为这些设备对象有着不同的参数、不同的状态信息和不同的上下层连接。

 

注意上下层之间连接形成堆叠的是设备对象而不是驱动对象。每个设备对象通过指针AttachedDevice指向其直接上层的设备对象,而上层的设备对象则通过某个指针反过来指向这个设备对象。通过什么指针呢?从原则上说,设备驱动模块的设计者需要自己在扩充部中安排一个向下的指针,所以严格说来只有各模块的设计者才知道是哪一个指针指向其下层模块的数据结构。这样,如果从最底层的模块开始,自底向上,顺着各个设备对象中的AttachedDevice指针上溯,是可以遍历整个堆叠的;但是反过来自顶向下就不一定了,因为在设备对象的数据结构DEVICE_OBJECT中并没有安排向下的指针,向下的指针只能放在设备对象的扩充部,那是由具体设备驱动模块的设计者自行设计和定义的。不过,只要设备对象扩充部的头部是EXTENDED_DEVOBJ_EXTENSION而不是DEVOBJ_EXTENSION,里面就有个指针AttachedTo,这就是向下的指针。事实上通过内核函数IoCreateDevice()创建的设备对象都以EXTENDED_DEVOBJ_EXTENSION作为扩充部的头部,但是微软的资料说这一点是没有保证的,劝大家不要依靠这个指针。

 

所谓堆叠,虽然形式上是设备对象的堆叠,实质上却代表着驱动模块的堆叠.

Categories: 驱动开发

Overall Rating (0)

0 out of 5 stars

Leave your comments

Post comment as a guest

0 Character restriction
Your text should be more than 3 characters
  • No comments found