Rover12421's Blog

The End.

设备链

     当一个驱动程序载入内存时,就会有一个驱动对象(DRIVER_OBJECT)。设备对象(DEVICE_OBJECT)由驱动创建。一个驱动可以创建多个设备对象(DEVICE_OBJECT)。通过驱动对象(DRIVER_OBJECT),可以找到由该驱动创建的所有设备对象(DEVICE_OBJECT)。
      驱动调用 IoCreateDevice 创建设备对象,一个驱动创建的所有设备对象链成一个链,这个链以空表示结束。驱动对象通过 struct _DEVICE_OBJECT *DeviceObject 可以找到这个链。设备对象通过 struct _DEVICE_OBJECT *NextDevice 链在一起。设备对象通过 struct _DRIVER_OBJECT *DriverObject 可以找到创建它的驱动的驱动对象。

      后创建的设备对象拥有其前创建的设备对象的指针(NextDevice),即后创建的设备对象用NextDevice指向其前创建的设备对象。


设备栈

      一个物理设备的驱动任务,通常由几个驱动程序一层一层的共同完成。每层一个设备对象,他们联系在一起,组成一个设备栈。一个设备栈上的设备对象,从上自下,联系在一起。从下自上,也联系在一起。

      设备栈上的设备对象,从上自下,通过 DEVICE_OBJECT DEVOBJ_EXTENSION 的  struct DEVICE_OBJECT *AttachedTo (AttachedTo为Windows2000中DEVICE_OBJECT 的成员,而在2000后则没有该成员)联系在一起。设备栈上的设备对象,从下自上,通过 DEVICE_OBJECT 的  struct _DEVICE_OBJECT *AttachedDevice 联系在一起。

区别:

      设备链是同一个驱动程序在内存中的驱动对象创建的多个设备对象组成的。

      设备栈是不同驱动程序为了完成物理设备的驱动工作而在不同层次创建的设备对象组成的设备栈。一般在一次层次中只有这个驱动创建的一个设备对象。

Comments