zhoujiamurong
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2009-05-06
  • 粉丝4
  • 关注0
  • 积分1081分
  • 威望360点
  • 贡献值0点
  • 好评度215点
  • 原创分0分
  • 专家分0分
阅读:1340回复:4

关于FDO和PDO (谢谢指点)

楼主#
更多 发布于:2007-10-11 19:51
学习概念时是这样的
  总线发现新硬件,自动为它创建一个PDO(并说只能有一个),安装时调用AddDevice,该函数创建一个FiDO或FDO,并实现关联,(FDO可以有多个)。

实际看代码是这样的。
  DriverEntry里面有一个DriverObject, (我想只能有一个),在AddDevice中,我们通过IoCreateDevice创建了一个deviceObject,(不知道能否创建多个)


是不是可以这样理解代码中的DriverObjce  ====》PDO
                          而代码中的 deviceObject  =====》FDO  ???

那AddDevice中的另一个参数 PhysicalDeviceObject,有成了什么了?
代码通过
IoAttachDeviceToDeviceStack (deviceObject,
                                                       PhysicalDeviceObject);
将创建的deviceObject放到栈上,接受IRP的为什么是这个对象?
zhoujiamurong
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2009-05-06
  • 粉丝4
  • 关注0
  • 积分1081分
  • 威望360点
  • 贡献值0点
  • 好评度215点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-11 20:14
DDK 上说PhysicalDeviceObject 是 Points to another driver's device object,
我理解是在调用之前位于系统设备栈的顶部的那个driver's device object,是这样么?
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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不在这个堆栈里,而在他一些列堆栈里。
明白没??
张帆的内核学习论坛 http://bbs.kerneldev.com
w5271591
驱动牛犊
驱动牛犊
  • 注册日期2007-04-24
  • 最后登录2008-07-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望18点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-12 13:33
《深入解析windows操作系统》的599页,也有关于这方面的介绍。
zhoujiamurong
驱动小牛
驱动小牛
  • 注册日期2006-03-20
  • 最后登录2009-05-06
  • 粉丝4
  • 关注0
  • 积分1081分
  • 威望360点
  • 贡献值0点
  • 好评度215点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-12 14:02
感谢fanzi,谢谢w5271591,我在消化消化
游客

返回顶部