windows驱动开发-总线驱动的生命周期

Filter驱动比较特殊,它的生命周期基本是辅助他所以来的设备驱动或者总线驱动,故我们只考虑功能驱动和总线驱动即可。

启动设备

总线驱动程序在其 DispatchPnP 例程中使用以下过程启动子设备 (子 PDO) :

1. 启动设备。具体步骤因设备而异。例如,PCI 总线驱动程序对其映射寄存器进行程序,以便在 PCI 总线上启用请求。 PnP ISA 总线驱动程序启用 PnP ISA 卡以便函数驱动程序可以访问它。

2. 完成 IRP。如果总线驱动程序的启动操作成功,驱动程序会将 Irp->IoStatus.Status 设置为 STATUS_SUCCESS并调用 IoCompleteRequest,以指定IO_NO_INCREMENT的优先级提升。 总线驱动程序从其 DispatchPnP 例程返回STATUS_SUCCESS。

如果总线驱动程序在启动操作期间遇到错误,驱动程序会在 IRP 中设置错误状态,使用 IO_NO_INCREMENT 调用 IoCompleteRequest ,并从其 DispatchPnP 例程返回错误。

如果总线驱动程序需要一些时间来启动设备,它可以将 IRP 标记为挂起并返回STATUS_PENDING。

删除设备

删除子设备 (子 PDO) 时,父总线驱动程序必须撤消为添加和启动设备而执行的任何操作。

总线驱动程序在其 DispatchPnP 例程中使用如下过程删除子设备:

1. 驱动程序以前处理过此 PDO 的IRP_MN_SURPRISE_REMOVAL 请求吗?如果是,请执行任何剩余的清理并跳到步骤 4。驱动程序通常在设备扩展中维护一个标志,指示驱动程序是否已处理设备的 IRP_MN_SURPRISE_REMOVAL 请求;

2. 完成驱动程序中排队的任何请求;

3. 如果总线驱动程序能够这样做,请从设备中删除电源,并通过调用 PoSetPowerState 通知电源管理器。如果可能,总线驱动程序关闭子设备,并通知电源管理器设备的电源状态更改。 总线驱动程序执行此操作以响应 IRP_MN_REMOVE_DEVICE 请求;删除设备时,设备的电源策略所有者不会发送 IRP_MN_SET_POWER 请求;

4. 如果总线驱动程序在最近对 BusRelationsIRP_MN_QUERY_DEVICE_RELATIONS请求的响应中报告了此设备,则设备仍实际存在于计算机上。 在这种情况下,总线驱动程序:

  • 保留设备的 PDO,直到设备被物理删除。
  • 将 Irp->IoStatus.Status 设置为 STATUS_SUCCESS。
  • 使用 IoCompleteRequest 完成 IRP。
  • 从 DispatchPnP 例程返回 。

总线驱动程序必须继续在后续枚举中报告此设备, (BusRelations) IRP_MN_QUERY_DEVICE_RELATIONS,直到设备被物理移除。 PnP 管理器跟踪枚举设备是否已添加和启动;

5. 如果总线驱动程序对 BusRelations的IRP_MN_QUERY_DEVICE_RELATIONS请求的最新响应中未包含该设备,则总线驱动程序会将该设备视为从计算机中物理删除。 在这种情况下,总线驱动程序执行以下操作:

  • 清理特定于设备的分配、内存、事件等。
  • 将 Irp->IoStatus.Status 设置为 STATUS_SUCCESS。
  • 使用 IoCompleteRequest 完成 IRP。
  • 使用 IoDeleteDevice 释放 PDO。
  • 如果驱动程序从最新的 BusRelations 列表中省略了设备,则总线驱动程序必须删除 PDO。 如果用户再次将设备插入计算机,总线驱动程序必须创建新的 PDO 以响应下一个 BusRelations 查询。 如果总线驱动程序对设备的新实例重复使用同一 PDO,则计算机将无法正常运行。
  • 从 DispatchPnP 例程返回 。

如果在 PnP 管理器发送 IRP_MN_REMOVE_DEVICE 请求时设备仍然存在,则总线驱动程序会保留 PDO。 如果稍后某个时间将设备从总线上物理移除,则 PnP 管理器会发送另一 个IRP_MN_REMOVE_DEVICE。 收到后续删除 IRP 后,总线驱动程序将删除设备的 PDO。

总线驱动程序必须能够处理已移除且其 PDO 标记为要删除的设备 IRP_MN_REMOVE_DEVICE 。 为了响应此类 IRP,总线驱动程序可以成功执行 IRP 或返回STATUS_NO_SUCH_DEVICE。 尽管总线驱动程序以前调用 了 IoDeleteDevice,但在这种情况下尚未删除设备的 PDO,因为某些组件仍具有对 对象的引用。 因此,总线驱动程序可以在处理第二个删除 IRP 时访问 PDO。 总线驱动程序不得为 PDO 再次调用 IoDeleteDevice ;当 PDO 的引用计数达到零时,I/O 系统将删除 PDO。

在收到对设备的 IRP_MN_REMOVE_DEVICE 请求之前,总线驱动程序不会删除子设备的数据结构。 总线驱动程序可能会检测到设备已被移除并调用 IoInvalidateDeviceRelations,但在 PnP 管理器发送 IRP_MN_REMOVE_DEVICE 请求之前,它不得删除设备的 PDO。

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

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

相关文章

redis进阶--IDEA环境

目录 一、解决redis服务器端口问题 二、java环境下使用redis 三、javaSpringt环境下使用redis 四、redis持久化 1、持久化概念 2、redis持久化策略 3、RDB策略 4、AOF策略 5、混合持久化策略 五、redis事务 1、数据库事务 2、redis事务特点 3、redis事务的作用 4…

jquery项目 html使用export import方式调用模块

jquery的老项目,引入vue3, 需要方便使用export, import方式引用一些常用的方法与常量 导出模块 export js/numberUtil.js /*** Description:* Author Lani* date 2024/1/10*//* * 【金额】 保留2位小数,不四舍五入 * 5.992550 >5.99 , 2 > 2.…

Linux字符设备驱动(二) - 与设备驱动模型的关系

一,从/dev目录说起 从事Linux嵌入式驱动开发的人,都很熟悉下面的一些基础知识, 比如,对于一个char类型的设备,我想对其进行read wirte 和ioctl操作,那么: 1)我们通常会在内核驱动中…

2024-05-06 问AI: 介绍一下深度学习中的LSTM网络

文心一言 当谈到深度学习中的LSTM(Long Short-Term Memory)网络时,它是一种特殊的循环神经网络(RNN)架构,旨在解决传统RNN在处理长序列时遇到的梯度消失和梯度爆炸问题。LSTM网络因其能够捕捉序列数据中的…

VTK —— 三、简单操作 - 示例1 - 3D点之间的平方距离和欧几里得距离(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功,若无VTK库则请先参考如下链接编译vtk源码: VTK —— 一、Windows10下编译VTK源码,并用Vs2017代码测试(附编译流程、附编译好的库、vtk测试源码) 教程描述 本…

如何使用resource-counter统计跨Amazon区域的不同类型资源数量

关于resource-counter resource-counter是一款功能强大的命令行工具,该工具基于纯Python 3开发,可以帮助广大研究人员跨Amazon区域统计不同类型资源的数量。 该工具在统计完不同区域的各类资源数量后,可以在命令行中输出并显示统计结果。res…

【C++ | 语句】条件语句(if、switch)、循环语句(while、do while、for、范围for)、跳转语句、try语句块和异常处理

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-05-02 2…

Vue前端环境准备

vue-cli Vue-cli是Vue官方提供的脚手架,用于快速生成一个Vue项目模板 提供功能: 统一的目录结构 本地调试 热部署 单元测试 集成打包上线 依赖环境:NodeJs 安装NodeJs与Vue-Cli 1、安装nodejs(已经安装就不用了) node-…

【PuTTY/PuttyGen创建密钥及利用密钥登录服务器】

PuTTY/PuttyGen创建密钥及利用密钥登录服务器http://t.csdnimg.cn/n7kJ9

W801学习笔记十九:古诗学习应用——下

经过前两章的内容,背唐诗的功能基本可以使用了。然而,仅有一种模式未免显得过于单一。因此,在本章中对其进行扩展,增加几种不同的玩法,并且这几种玩法将采用完全不同的判断方式。 玩法一:三分钟限时挑战—…

SpringBoot自动连接数据库的解决方案

在一次学习设计模式的时候,沿用一个旧的boot项目,想着简单,就把数据库给关掉了,结果报错 Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. 没有数据库的需…

75.网络游戏逆向分析与漏洞攻防-角色与怪物信息的更新-伪造服务端更新属性消息欺骗客户端

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

IRFBC30PBF 进口原装现货 TO-220直插 N沟道 600V/3.6A 场效应管

IRFBC30PBF是一款通用型高性能MOSFET,它可以应用于多种电子和电力电子设备中。以下是一些可能的应用案例: 1. 开关电源:在开关电源设计中,IRFBC30PBF可以作为高频开关来控制电源的通断,实现电压转换和电流控制。 2. …

自动驾驶融合定位系列教程四:惯性导航解算

自动驾驶融合定位系列教程四:惯性导航解算 一、概述 惯性导航的解算是一个实现起来非常简单,但是理解起来要费一番功夫的东西,所谓“实现”就是把公式变成代码,所谓“理解”,就是要弄明白几个公式是怎么推导出来的。…

【driver5】调用堆栈函数,printk,动态打印,ftrace,proc,sysfs

文章目录 1.内核函数调用堆栈:4个函数2.printk:cat /proc/cmdline查看consolettyS03.动态打印:printk是全局的且只能设打印等级,动态打印可控制选择模块的打印,在内核配置打开CONFIG_DYNAMIC_DEBUG4.ftrace&#xff1a…

【考研数学】武忠祥「基础篇」如何衔接进入强化?

如果基础篇已经做完,并且讲义上的例题也都做完了, 那下一步就是该做题了 这个时候,不能盲目做题,做什么题很重要!我当初考研之前,基础也很差,所以考研的时候选了错误的题集,做起来就…

AI+客服行业落地应用

一、客服行业变迁 1.传统客服时代 (1)客服工作重复性高,技术含量低 (2)呼出效率低,客服水平参差不齐 (3)管理难度高,情绪不稳定 (4)服务质量…

偏微分方程算法之椭圆型方程差分格式编程示例

目录 一、示例1-五点菱形格式 1.1 C代码 1.2 计算结果 二、示例2-九点紧差分格式 2.1 C代码 2.2 计算结果 三、示例3-二阶混合边值 3.1 C代码 3.2 计算结果 本专栏对椭圆型偏微分方程的三种主要差分方法进行了介绍,并给出相应格式的理论推导过程。为加深对…

“全国首批EVO+ ICL(V5)临床应用专家”授牌仪式在铭依眼科举行

近日,“全国首批EVO ICL(V5)新技术临床应用专家”授牌仪式在上海铭依眼科门诊部举行。仪式现场,瑞金医院谢冰教授获得此项荣誉称号。铭依眼科连锁医疗机构创始人吴英、Staar Surgical代表出席仪式现场。 为让近视人群不出国门即可…

ECC 号码总结

1、问题背景 在手机开发过程中,经常遇见各种紧急号码问题,在此特意总结下紧急号码相关知识。 2、紧急号码来源 在MTK RILD EccNumberSource.h中,定义了如下几种紧急号码来源。 按优先级排序介绍如下 2.1、SOURCE_NETWORK 网络下发&#xff…
最新文章