WDM 驱动开发相关疑问

我在WDM 一个驱动中 ,有一个PDO,然后创建了多个设备对象FDO,那么这些FDO可以不用挂在PDO上面(IoAttachDeviceToDeviceStack)吗?单独形成一个自己FDO的设备栈,WDM驱动中可以这么做吗?这样会不会不满足驱动WDM 驱动设计规范, PDO必须要有FDO

根据 Windows 驱动模型(WDM)设计规范,每个 PDO 都必须有至少一个 FDO 与之关联。这是因为 FDO 是用来处理底层硬件的操作的,而 PDO 代表了硬件设备。

可以通过调用 loAttachDeviceToDeviceStack 将 FDO 挂载到 PDO 的设备栈上。这样做的好处是可以利用 WDM 驱动框架提供的设备栈管理、I/O 管理和电源管理等功能。

如果你在驱动中创建了多个 FDO 对象,它们应该分别与不同的 PDO 关联。每个 FDO 都需要通过调用 loAttachDeviceToDeviceStack 将其挂载到相应的 PDO 的设备栈上。

但请注意,根据具体的驱动需求和设计,有时也可以有一些特殊情况下的例外。但是,一般来说,为了满足 WDM 驱动模型的设计规范,PDO 必须要有 FDO。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    在WDM驱动中,每个FDO设备对象都必须连接到一个PDO设备对象,这是符合WDM驱动设计规范的要求。PDO设备对象是根据硬件设备的实际存在创建的,通过枚举或者插拔操作系统可以识别到的硬件设备。而FDO设备对象是对驱动程序自身的逻辑设备或者功能的抽象,它们依附于某个PDO设备对象来实现与之相连的硬件设备通信。

    所以,不能直接创建多个独立的FDO设备对象形成设备栈。如果你想要创建多个FDO设备对象,你需要为每个FDO设备对象找到一个合适的PDO设备对象来连接。在创建FDO设备对象时,可以使用IoGetDeviceObjectPointer函数来获取到特定的PDO设备对象的指针,然后将其用作IoAttachDeviceToDeviceStack函数的参数来创建设备栈。

    总结来说,每个FDO设备对象都需要连接到一个PDO设备对象,不能单独形成设备栈。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^