前面的文章介绍了一个简单的功能驱动和过滤驱动。它们都是用WDM模型写的驱动,在写WDM驱动的时候,我们经常会碰到PDO和FDO。PDO就是物理设备对象,FDO是功能设备对象。FDO是附在PDO上面的,当然FDO上面还可以有其他的FDO。这样就构成了一个栈,就是设备栈。所以说WDM驱动天生就是分层驱动程序,最起码它有PDO和FDO。其实WDM驱动就是从分层的NT驱动发展过来的。
设备栈(Device Stack)
当我们在WDM驱动的AddDevice里面创建一个设备对象时,一定会调用这个函数:IoAttachDeviceToDeviceStack。
PDEVICE_OBJECT IoAttachDeviceToDeviceStack(
_In_ PDEVICE_OBJECT SourceDevice,
_In_ PDEVICE_OBJECT TargetDevice
);
这个参数的作用就是将SourceDevice附在TargetDevice上面,通常TargetDevice是AddDevice传进来的PDO。如果PDO上面还有其他FDO,比如过滤驱动啥的,那么SourceDevice将会附在这些过滤驱动设备对象上面。SourceDevice就是新创建的FDO。这个参数的返回值是SourceDevice的下层设备对象,也就是说返回的设备对象的上面就是新创建的FDO(SourceDevice)。
通过IoAttachDeviceToDeviceStack函数,可以构成一个设备栈。比如前面讲过滤驱动的时候(h