windows驱动开发-设备栈

设备栈是windows内核中非常重要的部分,这部分理解可以让我们在调试中节省大量的时间,

在windows NT体系中,内核所有的设备被按照连接次序加载到设备树上,这棵树的根节点是ROOT节点,每一个设备可以从当前路径一直遍历到根节点,从而遍历整个设备树。这里我们看一下USB的例子:

从此图底部开始,示例设备堆栈中的设备对象包括:

1. 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驱动程序。

2. 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驱动程序。

3. USB 集线器的 PDO 和 FDO:

USB 主机控制器枚举其总线,在唯一端口中定位 USB 集线器,并为集线器创建 PDO。 USB 集线器驱动程序为集线器创建并附加 FDO。

此示例中没有 USB 集线器的Filter驱动程序。

4. 手柄设备的 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请求,它才会依次返回并一一通知所有在它上面挂载了完成通知的驱动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/573024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ARMv9 DSU-120 系列 4.1 -- Utility bus 详细介绍 2】

文章目录 ARM DSU-120DSU-120 Utiity BusCluster and core PPUPPU寄存器的访问性PPU寄存器的作用系统组件基地址ARM DSU-120 DSU-120 Utiity Bus 在ARMv9架构中,DSU-120(Dynamic Shared Unit 120)是一个关键组件,用于管理核心和系统组件之间的通信与协作。某些系统组件寄存…

【漏洞复现】号卡极团管理系统 index.php SQL注入漏洞

0x01 产品简介 号卡极团管理系统是一款专为号卡行业打造的管理系统,它具备一系列强大的功能,能够满足号卡行业推广人员在业务运营中的各类需求。 0x02 漏洞概述 号卡极团管理系统存在SQL注入漏洞,未授权的攻击者可以通过该漏洞获取数据库敏…

vue 请求php接口 header 传自定义参数 提示cors 跨域问题

前端地址 http://192.168.0.125:4021 请求后端地址的时候报 from origin http://192.168.0.125:4021 has been blocked by CORS policy: Request header field userid is not allowed by Access-Control-Allow-Headers in preflight response. 大概意思是请求 header里有个…

【leetcode面试经典150题】74. 填充每个节点的下一个右侧节点指针 II(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

【11-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

如何看待AIGC技术

文章目录 前言如何看待AIGC技术AIGC可以应用到哪些领域 欢迎来到 请回答1024 的博客 🍓🍓🍓欢迎来到 请回答1024的博客 关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸…

Games101-相机与透镜

成像:光栅化成像(上图)和光线追踪成像(下图) 都是用合成的方法来成像。还可以用捕捉的方法来成像 利用小孔成像原理制作的相机就是针孔相机 如果一个相机没有针孔/透镜,是无法拍照的。 因为任何一个点都有可能收集到来自不同方向上的光。这个点本身作为…

telnet 退出失败ctrl+c

1. 使用ctrl] ,退出到telnet >界面 2. quit 或者 3. 直接强制退出: ] Enter键

第十五届蓝桥杯省赛第二场C/C++B组F题【狡兔k窟】题解(AC)

题意分析 有一个 n n n 个点, n − 1 n-1 n−1 条边的无向图,边权均为 1 1 1。 每个点隶属于一个集合,同一个集合的点可以互相传送。 给定 m m m 个询问,求 x , y x, y x,y 的最短距离。 最短路解法 步骤: 建…

探索数学语言模型的前沿进展——人工智能在数学教育和研究中的应用

数学一直被认为是科学的基石,对于推动技术进步和解决现实世界问题具有重要意义。然而,传统的数学问题解决方式正面临着数字化转型的挑战。MLMs的出现,预示着数学学习和研究方式的一次革命。 MLMs,包括预训练语言模型(…

黑马-设计模式-笔记(未完)

一、基础 UML类图 可见性: public- private#protected 表示方式:属性:可见性 名称:类型[默认值]方法:可见性 名称(参数)[:返回类型] 关系:关联关系:实线,引用关系,类属性里有另一个…

CUDA的应用场景

CUDA的应用场景随着技术的发展不断扩展,其核心优势在于能够显著提高并行计算任务的处理速度,这对于任何需要处理大量数据和执行复杂计算的领域都是极其有价值的。CUDA开发的应用场景非常广泛,主要得益于其强大的并行计算能力,以下…

【软考】UML中的关系

目录 1. 说明2. 依赖3. 关联4. 泛化5. 实现 1. 说明 1.UML中有4种关系:依赖、关联、泛化和实现2.这 4种关系是 UML,模型中可以包含的基本关系事物。它们也有变体,例如,依赖的变体有精化、跟踪、包含和延伸 2. 依赖 1.依赖(Dependency)。2.…

代码随想录刷题随记27-贪心1

代码随想录刷题随记27-贪心 455.分发饼干 leetcode链接 class Solution {public int findContentChildren(int[] g, int[] s) {//boolean used[]new boolean [s.length];Arrays.sort(s);Arrays.sort(g);int index0;int ret0;for(int i0;i<g.length;i){while(index<s.…

MySQL--表的操作

目录 创建表 查看表结构 修改表 新增列 修改列类型 修改列名 修改表名&#xff1a; 删除列 删除表 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引…

【Entity Framework】聊一聊EF如何使用数据库函数

【Entity Framework】聊一聊EF如何使用数据库函数 文章目录 【Entity Framework】聊一聊EF如何使用数据库函数一、数据库函数的类型二、内置函数与用户定义的函数四、聚合函数、标量函数和表值函数五、Niladic函数六、EF Core 中的数据库函数映射6.1 内置函数映射6.2 EF.Functi…

请编写一个函数void fun(char*ss),其功能是:将字符串ss中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

mPEG-Dansyl,Methoxy PEG Dansyl由甲氧基-聚乙二醇(mPEG)和丹磺酰氯(Dansyl)两部分组成

【试剂详情】 英文名称 mPEG-Dansyl&#xff0c;Methoxy PEG Dansyl 中文名称 聚乙二醇单甲醚丹磺酸酯&#xff0c;甲氧基-聚乙二醇-丹磺酰胺 外观性状 由分子量决定&#xff0c;液体或者固体 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k&#xff0c;3.4k…

Fisher 准则分类

目录 一、什么是Fisher 准则 二、具体实例 三、代码实现 四、结果 一、什么是Fisher 准则 Fisher准则&#xff0c;即Fisher判别准则&#xff08;Fisher Discriminant Criterion&#xff09;&#xff0c;是统计学和机器学习中常用的一种分类方法&#xff0c;由统计学家罗纳…

JuliaImages教程(二):图像分割

1、介绍 图像分割是将图像划分为具有相似属性的区域的过程。图像分割具有多种应用&#xff0c;例如医学图像分割、图像压缩&#xff0c;并用作对象检测和光流等更高级别视觉任务中的预处理步骤。该包是用 Julia 编写的图像分割算法的集合。 2、安装 Pkg.add("ImageSegm…