驱动小牛
![]() |
阅读:1341回复:4
关于FDO和PDO (谢谢指点)
学习概念时是这样的
总线发现新硬件,自动为它创建一个PDO(并说只能有一个),安装时调用AddDevice,该函数创建一个FiDO或FDO,并实现关联,(FDO可以有多个)。 实际看代码是这样的。 DriverEntry里面有一个DriverObject, (我想只能有一个),在AddDevice中,我们通过IoCreateDevice创建了一个deviceObject,(不知道能否创建多个) 是不是可以这样理解代码中的DriverObjce ====》PDO 而代码中的 deviceObject =====》FDO ??? 那AddDevice中的另一个参数 PhysicalDeviceObject,有成了什么了? 代码通过 IoAttachDeviceToDeviceStack (deviceObject, PhysicalDeviceObject); 将创建的deviceObject放到栈上,接受IRP的为什么是这个对象? |
驱动小牛
![]() |
沙发#
发布于:2007-10-11 20:14
DDK 上说PhysicalDeviceObject 是 Points to another driver's device object,
我理解是在调用之前位于系统设备栈的顶部的那个driver's device object,是这样么? |
板凳#
发布于:2007-10-12 10:03
你理解有一些错误
PhysicalDeviceObject才是pdo DriverObject不是pdo!! 每个设备都有pdo和fdo,总线驱动也不例外。 简单说一下吧,usb的总线驱动程序,会随时监听是否有设备的插入,一旦检测到插入,就会创建一个pdo,也就是你有几个usb设备,总线就创建出几个pdo。然后系统会发送IRP_MN_QUERY_ID到这个pdo上,设备pdo再将这个消息传送到总线驱动的fdo上,总线驱动就查询你插入这个设备的pid呵vid什么的,查到后会检测是否有相应的驱动加载,如果没加载会根据这个信息去找相应的inf,加载驱动的driverentry,然后系统调用你设备的adddevice,这里的主要工作就是去创造一个fdo,然后放在刚才的那个pdo上面。 那为什么wdm驱动非要有个pdo呢,在老式的nt驱动没这么复杂。主要原因是要解决即插即用问题,你的读写是不需要把irp转发到pdo的,绝大多数的IRP_MJ_PNP是要你转发到这个pdo里的。pdo会和总线驱动的fdo通讯,注意pdo是你设备栈的最底层,而总线驱动的fdo不在这个堆栈里,而在他一些列堆栈里。 明白没?? |
|
|
地板#
发布于:2007-10-12 13:33
《深入解析windows操作系统》的599页,也有关于这方面的介绍。
|
|
驱动小牛
![]() |
地下室#
发布于:2007-10-12 14:02
感谢fanzi,谢谢w5271591,我在消化消化
|