Windows驱动开发详解:设备栈原理与实践
创作时间:
作者:
@小白创作中心
Windows驱动开发详解:设备栈原理与实践
引用
CSDN
1.
https://blog.csdn.net/m0_72813396/article/details/138049956
设备栈是Windows内核中非常重要的部分,理解设备栈可以帮助我们在驱动开发和调试中节省大量时间。本文将通过USB设备的例子,详细解释设备栈的结构和工作原理,帮助读者掌握这一核心概念。
在Windows NT体系中,内核所有的设备被按照连接次序加载到设备树上,这棵树的根节点是ROOT节点,每一个设备可以从当前路径一直遍历到根节点,从而遍历整个设备树。这里我们看一下USB的例子:
从此图底部开始,示例设备堆栈中的设备对象包括:
- PCI 总线的 PDO 和 FDO:
- 根总线驱动程序枚举内部系统总线(根总线),并为找到的每个设备创建 PDO。其中一个 PDO 适用于 PCI 总线。(图中未显示根总线的 PDO 和 FDO。)
- PnP 管理器将 PCI 驱动程序标识为 PCI 总线的功能驱动程序,加载驱动程序,并将 PDO 传递给 PCI 驱动程序。在其 AddDevice 例程中,PCI 驱动程序为 PCI 总线(IoCreateDevice)创建 FDO,并将 FDO 附加到 PCI 总线的设备堆栈(IoAttachDeviceToDeviceStack)。PCI 驱动程序创建并附加此 FDO,作为其作为 PCI 总线的功能驱动程序的职责的一部分。
- 在此示例中,PCI 总线没有 Filter 驱动程序。
- USB 主控制器的 PDO 和 FDO:
- PnP 管理器指示 PCI 驱动程序启动其设备(IRP_MN_START_DEVICE),然后查询其子级(IRP_MN_QUERY_DEVICE_RELATIONS 的关系类型为 BusRelations)。作为响应,PCI 驱动程序枚举其总线上的设备。在此示例中,PCI 驱动程序查找 USB 主控制器并为该设备创建 PDO。图中的宽箭头表示 USB 主机控制器是 PCI 总线的“子级”。作为 PCI 总线的总线驱动程序的一部分,PCI 驱动程序为其子设备创建 PDO。
- PnP 管理器将 USB 主机控制器的 mini Class/Class 加载驱动程序对标识为 USB 主机控制器的功能驱动程序,并加载驱动程序。PnP 管理器在适当的时间调用驱动程序,以便为 USB 主控制器创建和附加 FDO。
- 在此示例中,USB 主控制器没有 Filter 驱动程序。
- USB 集线器的 PDO 和 FDO:
- USB 主机控制器枚举其总线,在唯一端口中定位 USB 集线器,并为集线器创建 PDO。USB 集线器驱动程序为集线器创建并附加 FDO。
- 此示例中没有 USB 集线器的 Filter 驱动程序。
- 手柄设备的 PDO、FDO 和两个 Filter DO:
- USB 集线器驱动程序枚举其总线,手柄设备的 HID 设备,并为手柄创建 PDO。
- 在此示例中,已在手柄设备的注册表中设置了较低级别的 Filter 驱动程序,因此 PnP 管理器加载 Filter 驱动程序。Filter 驱动程序确定它与设备相关,并创建 Filter DO 并将其附加到设备堆栈。
- PnP 管理器确定游戏杆设备的函数驱动程序是 HID Class/mini Class 加载驱动程序对并加载这些驱动程序。驱动程序对由链接到类驱动程序 DLL 的微型类驱动程序组成;它们共同充当设备的一个函数驱动程序。类/微型类驱动程序对创建一个设备对象 FDO,并将其附加到设备堆栈。
- 上层 Filter 驱动程序以类似于较低级别 Filter 的方式创建 Filter DO 并将其附加到设备堆栈。
- 请注意,父总线驱动程序创建的 PDO 始终位于特定设备的设备堆栈底部。当驱动程序处理 PnP 或电源 IRP 时,它们必须将每个 IRP 一直向下传递到 PDO 及其关联的总线驱动程序。
下图显示了与上图相同的设备堆栈,但强调由哪些驱动程序创建和管理哪些设备对象。
总线驱动程序跨越多个设备堆栈。总线驱动程序为其总线适配器/控制器创建 FDO,并为其每个子设备创建 PDO。
设备栈的总结:
设备堆栈本身描述了内核设备的组织形式,这个形式我们可以在设备管理器中看到:
需要注意的是即插即用软件设备枚举器,这个实际上是 PNP 管理器在应用层看到的接口,当然,它也是第一个在 ACPI 总线上枚举出来的设备,本身的作用就是枚举 PNP 设备。
设备栈和 I/O 请求是息息相关的,I/O 请求本身在设备栈中向下传递,直到有一个驱动程序完成了 I/O 请求,它才会依次返回并一一通知所有在它上面挂载了完成通知的驱动。
热门推荐
猪生肖不可缺少的三大风水
《高山流水》何以“一曲千年”?看央视镜头下的知音佳话~
心脏为什么会跳动
学前儿童阅读现状研究
新手主播必读:直播电脑配置与OBS设置完全指南
DALL·E 3模型及其论文详解
国产动画百年征程,孙悟空、喜羊羊、哪吒接力跑出加速度
AI4Science前沿综述:机器学习应用于计算流体力学最新进展
事故现场有关人员应立即报告本单位负责人
分母为零,数学世界的禁忌?
肚子疼时别慌!掌握这些自我缓解技巧,舒缓不适一点也不难
协商解决纠纷时需注意哪些关键事项?
是调味料也是药!辣椒、生姜、葱蒜用对了美味又保健
弘扬“两弹一星”精神,奋力谱写青春华章
如何延缓更年期
MBTI人格类型中的理想伴侣组合与各类型概述
如何分析ETF的行业竞争格局和投资机会变化?
差价千元的i7-13700H和i5-13500H怎么选?性能实测给你答案
掌握选择指南,找到最适合自己的笔记本电脑秘诀
国产硬派越野对比:坦克300和北汽BJ40谁更胜一筹?
新书 | 《中国当代科幻小说的海外译介与传播》
道教咒语法则的高阶妙用——“祝法”
苹果AR眼镜难产背后的挑战与机遇
如何改善房子的格局问题?这些改善方法存在哪些难点?
李时珍泡酒药方:古方今用,健康养生
灭鼠全攻略:什么时候是最佳的灭鼠时间?
桑寄生蓮子蛋茶食譜:製作方法、好處一次滿足!
预支工资是否可以算作现金业绩的一部分?
IG爆冷负于NIP!Doinb复出首秀亮眼,Rookie失误连连
八字命理:火土专旺格的命理特征与顶级富贵的八字特征