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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QMT和Ptrade有什么区别?该如何选择?

QMT(Quantitative Model Trading)和Ptrade(Professional Trading)是两种不同的交易策略和方法,它们在金融市场中被广泛应用。了解它们的区别有助于投资者根据自己的需求和目标做出选择: QMT(量…

将记录从excel当中导出为.sql文件,再新增到数据库

一、背景 临时遇到了一个需求,比如根据人员的名字查询对应记录,看起来还是很简单的,直接用select查询就可以,然而如果此时存在以下情况: 数据库根本就没有人员信息表;------这个倒是好操作;现…

AlDente Pro for mac最新激活版:电池长续航软件

AlDente Pro是一款专为Mac用户设计的电池管理工具,旨在提供电池安全和健康管理的一站式解决方案。它具备实时监控电池状态的功能,让用户随时了解电池的电量、充电次数、健康状态等信息。 AlDente Pro for mac最新激活版下载 同时,AlDente Pro…

分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测

分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测 目录 分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Mat…

Vue3 + Js + Element-Plus + VueX后台管理系统通用解决方案

前言 本文是作为学习总结而写的一篇文章,也是方便以后有相关需求,可以直接拿来用,也算是记录吧,文中有一些文件的引入,没给出来,完整项目地址(后续代码仓库放这里) 1、layout解决方…

【Python性能优化】list、array与set

list、array与set 详述测试代码 详述 本文对比 list 与 set 在插入和取值时的性能差异,以提供一条什么时候该选择什么数据类型的建议。先上结果: array 与 list 的不同: 内存方面 array 是 C array 的包装,它直接存储数据&#xf…

【002_音频开发_基础篇_Linux音频架构简介】

002_音频开发_基础篇_Linux音频架构简介 文章目录 002_音频开发_基础篇_Linux音频架构简介创作背景Linux 音频架构ALSA 简介ASoC 驱动硬件架构软件架构MachinePlatformCodec ASoC 驱动 PCMALSA设备文件结构 ALSA 使用常用概念alsa-libALSA Open 流程ALSA Write 流程2种写入方法…

Eclipse+Java+Swing实现学生信息管理系统-TXT存储信息

一、系统介绍 1.开发环境 操作系统:Win10 开发工具 :Eclipse2021 JDK版本:jdk1.8 存储方式:Txt文件存储 2.技术选型 JavaSwingTxt 3.功能模块 4.工程结构 5.系统功能 1.系统登录 管理员可以登录系统。 2.教师-查看学生…

打破国外垄断|暴雨发布纯血国产电脑

要说现在国产手机这边已然进入纯自研模式,但电脑这边却还是仍未打破国外技术垄断。但就在刚刚,暴雨发布自研架构台式机open Station X ,这是纯血鸿蒙系统之后国产又一款纯血产品发布!标志的我们已经彻底打破西方在硬件及软件方面的…

c++ - 空间申请和释放 new/delete

文章目录 一、c/c内存分布二、new/delete 的使用三、malloc/free 和 new/delete 的对比四、new/delete 的实现原理五、匹配问题 一、c/c内存分布 求下面各个变量的位置 // c/c内存分布int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar …

PyTorch与深度学习:探索现代神经网络的魅力

在科技飞速发展的今天,深度学习作为人工智能领域的重要分支,已经在图像识别、自然语言处理、语音识别等多个领域取得了突破性的进展。而PyTorch,作为一款开源的深度学习框架,以其简洁易用、动态计算图等特性,赢得了广大…

Django中间件的源码解析流程(上)——中间件载入的前置

目录 1. ​前言​ 2. 请求的入口 3. 中间件加载的入口 4. 源码中的闭包实现 5. 最后 1. 前言 哈喽,大家好,我是小K,今天咋们分享的内容是:在学会Django中间件之后, 我们继续深入底层源码。 在执行中间件时请求到来总是从前往后…

ChatGPT研究论文提示词集合3-【数据收集】、【数据分析】和【解释与讨论】

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.数据收集 2.数据分析 3.讨论与解释 4.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程,精心准备一套学术研究各个流程的提示词集合。总共14个步…

【IDEA】用idea导入eclipse的项目后,提示:The file was loaded in a wrong encoding ‘utf-8‘

前言 最近用IDEA导入一个exlipse项目后,窗口出现这个红色提示: 可以项目中的中文,包括注释都是乱码,要解决问题就跟我开始做吧。 一定要看仔细在操作! 一定要看仔细在操作! 一定要看仔细在操作&#xf…

rmallox勒索病毒威胁网络安全:如何避免数据被锁定

尊敬的读者: 随着信息技术的飞速发展,网络空间的安全问题日益凸显。近年来,一种名为.rmallox的勒索病毒频繁出没,给广大计算机用户带来了严重的困扰。本文将对该病毒进行深入剖析,并探讨相应的应对策略。在面对被勒索…

飞书API(5):查看多维表 28 种数据类型的数据结构

一、引入 前面我们用于测试的数据集其实都是比较常用的数据,比如说文本、数字、单选等,但飞书多维表并不仅仅只有这些数据,截止发文,飞书多维表应用上支持28种数据类型,在数据层面飞书官方只提供了23种数据类型&#…

微信小程序vue.js+uniapp服装商城销售管理系统nodejs-java

本技术是java平台的开源应用框架,其目的是简化Sping的初始搭建和开发过程。默认配置了很多框架的使用方式,自动加载Jar包,为了让用户尽可能快的跑起来spring应用程序。 SpinrgBoot的主要优点有: 1、为所有spring开发提供了一个更快…

AI 智能工具以及热门AI开源项目整理,包含国内中科院版GPT

AI 智能工具以及热门AI开源项目整理,包含国内中科院版GPT。 不用xx即可访问的镜像网站 https://chat1.yqcloud.top https://chat.bnu120.space https://chat.aidutu.cn https://hzdjs.cn/chatgpt https://chats.fenqubiao.com/zh 需要xx才能访问的网站 https://o…

「 网络安全常用术语解读 」什么是0day、1day、nday漏洞

1. 引言 漏洞攻击的时间窗口被称为漏洞窗口(window of vulnerability)。一般来说,漏洞窗口持续的时间越长,攻击者可以利用漏洞进行攻击的可能性就越大。 2. 0day 漏洞 0day 漏洞,又被称为"零日漏洞"&…

react之组件与JSX

第一章 - 描述用户界面 概述:React是一个用于构建用户界面(UI)的JavaScript库,用户界面由按钮,文本和图像等小单元内容构建而成。React帮助你把它们组合成可重用,可嵌套的组件。从web端网站到移动端应用&a…