5

我正在自己研究 Windows 设备驱动程序,我发现很难区分 PDO 和 FDO。让我告诉你我脑子里的流程,如果我错了,请纠正我!

当系统启动时,它会加载将创建 FDO 的根总线驱动程序。现在它会枚举它的子设备,我猜总线驱动程序的一些热插拔方法会被调用,当一个新的子设备被发现时,该方法会通知 PNP 管理器。PNP 管理器将调用根总线驱动程序的 AddDevice() 例程,这将为新总线创建 PDO,例如用于 PCI 等。请详细解释整个流程,这只是我的想象。然后记录了系统将加载将创建 FDO 的 PCI 总线的功能驱动程序?这是什么FDO??为什么我需要那个?根据我的说法,PCI 总线驱动程序也应该遵循与根总线相同的操作,枚举其子节点并为它们创建 PDO,或者通过这个 FDO,它们仅表示 PDO?我很困惑:(!!

4

3 回答 3

13

你实际上在做什么,或者你只是想学习?我只是想知道您是如何在筹码中处于如此低位的。

PDO = 物理设备对象

FDO = 功能设备对象

PDO充当物理设备,但不一定是物理设备。它本质上是总线上的设备与总线本身之间的接口。这在 MSDN 上有很好的介绍。

是一个使用 U 盘的示例,这很好地说明了差异。

是更深入的解释和重要的报价

如果您的参考点是 PCI 总线,那么 Pci.sys 就是功能驱动程序。但如果您的参考点是 Proseware Gizmo 设备,那么 Pci.sys 就是总线驱动程序。这种双重角色在 PnP 设备树中很典型。用作总线功能驱动程序的驱动程序也用作总线子设备的总线驱动程序。

您还拥有过滤驱动程序,允许您介于 PDO 和 FDO 之间并开始做一些顽皮的事情,例如隐藏文件、POC rootkit 等。在这个阶段,您可以添加额外的功能,或完全阻止对 PDO 的访问。

这是所有 MSDN 链接。

http://msdn.microsoft.com/en-us/library/windows/hardware/hh439632(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/hardware/ ff554721(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/hardware/hh439643(v=vs.85).aspx http://msdn.microsoft.com/ en-us/library/windows/hardware/ff554731(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/hardware/ff564859(v=vs.85).aspx http://technet.microsoft.com/en-us/library/cc776371(v=ws.10).aspx

如果这不能为您解决问题,请随时回帖。

于 2013-10-01T10:31:13.370 回答
4

Windows 驱动程序模型中设备对象和驱动程序的分层。

这是“Programming the Microsoft Windows Driver Model”的摘录,第 2 版,Walter One:

- PDO stands for physical device object. The bus driver uses this
   object to represent the connection between the device and  the bus. 
    
 - FDO stands for function device object. The function driver uses
   this object to manage the functionality of the device.   
 - FiDO stands
   for filter device object. A filter driver uses this object as a place
   to store the information it needs to keep  about the hardware and its
   filtering activities. (The early beta releases of the Windows 2000
   DDK used the term FiDO,  and I adopted it then. The DDK no longer
   uses this term because, I guess, it was considered too frivolous.)

希望这可以帮助你。

于 2014-01-21T08:46:20.163 回答
1

According to me PCI bus driver should also follow the same as done by the root bus, enumerate its child and create PDOs for them-- WRONG!.

如果您谈论的是 WDM,则 PnP 管理器会创建 PDO。在此之前,YOU必须在DriverEntry().

于 2013-10-05T09:01:23.373 回答