WDM为分层驱动模型,至少两层,下层控制PDOs,上层控制FDOs,还可以有若干过滤驱动,同一层的DOs有相同的StackSize域(物理层的StackSize总是为1),即当前设备栈的大小。
具体到任何一个物理设备或者虚拟设备,它的每一层DO构成它的设备栈,该设备栈为通过AttachedDevice联系的链栈,链首为PDO。要将当前设备压栈,需要使用PDEVICE_OBJECT
PDEVICE_OBJECT IoAttachDeviceToDeviceStack(
IN PDEVICE_OBJECT SourceDevice,
IN PDEVICE_OBJECT TargetDevice
);
函数,该函数的SourceDevice可以是链栈中任何一个对象,返回的一定是栈顶的对象(详见MSDN和张帆的HelloWDM).
为了更好地查看链栈,请翻阅<<张帆P110>>的DeviceTree:
首先由Driver\PnpManager创建\Device\00000040(PDO),然后有一个 \Device\MyWDMDevice附加在其上(注意\Device\MyWDMDevice的命名管理方式并不好,最好是\Device\MyWDMDevice1,\Device\MyWDMDevice2。。。,因为系统中可能有多个FDO设备)。
No comments:
Post a Comment