当前位置: 首页 > news >正文

WDF驱动开发-PNP和电源管理(三)

对于PNP设备来说,理解它们的启动和删除顺序,以及意外移除顺序非常重要,在早期,经常有拔插U盘导致windows重启的例子,这就是意外移除带来的问题。

功能或Filter驱动程序的启动顺序

下图显示了框架调用 WDF (KMDF 和 UMDF V2) 功能或Filter驱动程序的事件回调函数的顺序,从图底部的“设备插入”状态开始:

宽横线标记启动设备所涉及的步骤。 图左侧的列描述了步骤,右侧的列列出了完成该步骤的事件回调。

在图的底部,系统不存在该设备。 当用户插入设备时,框架首先调用驱动程序的 EvtDriverDeviceAdd 回调,以便驱动程序可以创建设备对象来表示设备。 框架继续调用驱动程序的回调例程,方法是继续执行序列,直到设备正常运行。 请记住,框架按自下而上的顺序调用事件回调,如图所示,因此 在 EvtDeviceFilterAddResourceRequirements 等之前调用 EvtDeviceFilterRemoveResourceRequirements 。 如果设备已停止以重新平衡资源或实际存在但处于低功耗状态,则并非所有步骤都是必需的,如图所示。

总线驱动程序的启动顺序

下图显示了从图底部的“设备插入”状态开始,使设备进入完全运行状态时,框架调用 KMDF 总线驱动程序的事件回调函数的顺序:

在从系统中物理删除相应的设备之前,框架不会以物理方式删除 PDO。 例如,如果用户在 设备管理器 中禁用了设备,但没有实际删除该设备,则框架会保留其设备对象。 因此,图底部的三个步骤仅在即插即用枚举期间发生,即在初始启动期间或用户插入新设备时。 如果设备以前已禁用但未实际删除,框架会通过调用 EvtDevicePrepareHardware 回调启动。

功能或Filter驱动程序的电源关闭和删除顺序

下图显示了关闭和删除设备时框架调用 KMDF 功能或Filter驱动程序的事件回调函数的顺序。 序列从图的顶部开始,设备处于工作电源状态 (D0) :

如图所示,KMDF 关机和删除序列涉及按框架调用使设备正常运行所涉及的函数的相反顺序调用相应的“撤消”回调。 框架在删除设备对象上下文区域后删除设备对象。

总线驱动程序的电源关闭和删除顺序

下图显示了在关闭并删除连接到总线的设备时框架调用 KMDF 总线驱动程序的事件回调函数的顺序。 序列从图的顶部开始,设备处于工作电源状态 (D0) :

 

在从系统物理删除设备之前,框架不会删除 PDO。 例如,如果用户在 设备管理器 中禁用设备或在“安全删除硬件”实用工具中将其停止,但未以物理方式删除设备,则框架将保留 PDO。 如果设备稍后重新启用,框架将使用相同的 PDO,并通过调用 EvtDevicePrepareHardware 回调来开始启动序列,如 物理设备对象的电源启动序列中所示。

注意:通常,框架在为驱动程序枚举的所有子设备调用 EvtDeviceReleaseHardware 函数后,会调用总线驱动程序的 EvtDeviceReleaseHardware 回调函数。 如果父级遇到设备开机或关机故障,框架可能会在调用所有子设备的 EvtDeviceReleaseHardware 函数之前调用驱动程序的 EvtDeviceReleaseHardware 。 请考虑调用 WdfDeviceInitSetReleaseHardwareOrderOnFailure ,以确保框架仅在删除所有子设备后调用总线驱动程序的 EvtDeviceReleaseHardware 回调。

意外删除顺序

如果用户在不发出警告的情况下移除设备,只需在不使用 设备管理器 或安全删除硬件实用工具的情况下拔下设备,则设备被视为“意外删除”。发生这种情况时,框架遵循略有不同的删除顺序。 如果另一个驱动程序在设备上调用 IoInvalidateDeviceState ,则也会遵循意外删除序列,即使设备在物理上仍然存在。 在意外删除序列中,框架先调用 EvtDeviceSurpriseRemoval 回调,然后再调用删除序列中的其他任何回调。 序列完成后,框架将销毁设备对象。 所有可移动设备的驱动程序必须确保关闭和启动路径中的回调可以处理故障,尤其是硬件删除导致的故障。 访问硬件的任何尝试都不应无限期等待,但应受到超时或监视程序计时器的约束。

下图显示了意外删除中涉及的回调:

 

如果设备在删除时未处于工作状态,框架会在 EvtDeviceSurpriseRemoval 之后立即调用 EvtDeviceReleaseHardware 事件回调。 它省略了在设备退出工作状态时已执行的干预步骤。 

处理停止设备的请求

在两种情况下,在要求设备的驱动程序停止设备之前,PnP 管理器会询问驱动程序是否是一个好主意:

  • 用户已插入新设备,PnP 管理器必须 重新分发系统的硬件资源 以适应新设备;
  • 用户已指示他/她要 删除该设备;

驱动程序可以通过多种方式处理这些情况:

  • 如果驱动程序由于设备支持特殊文件而调用了 WdfDeviceSetSpecialFileSupport ,并且如果设备上打开了特殊文件,则框架将不允许设备停止;
  • 若要在相对较短的时间内暂时阻止所有停止,驱动程序可以调用 WdfDeviceSetStaticStopRemove;
  • 若要单独评估和处理每个停止尝试,驱动程序可以提供 EvtDeviceQueryStop 和 EvtDeviceQueryRemove 回调函数;

如果设备不支持特殊文件,并且停止或删除设备绝不是驱动程序或设备的问题,则驱动程序不提供 EvtDeviceQueryStop 和 EvtDeviceQueryRemove 回调函数,并且从不调用 WdfDeviceSetStaticStopRemove。 在这种情况下,PnP 管理器始终停止设备,而无需先检查驱动程序是否允许它。

重新分发资源

有时,PnP 管理器必须重新分发系统的硬件资源。 通常,发生此重新分发是因为总线驱动程序已报告已插入新设备,并且新设备需要已分配的资源。 在重新分配资源之前,必须停止设备。

如果驱动程序有时需要阻止 PnP 管理器停止繁忙的设备,驱动程序可以提供 EvtDeviceQueryStop 回调函数。 如果驱动程序的 EvtDeviceQueryStop 回调函数返回错误状态值,则 PnP 管理器不会停止设备。

如果驱动程序确定停止设备是安全的,则回调函数将返回STATUS_SUCCESS。 如果设备的其他驱动程序都无法阻止停止,PnP 管理器将暂时停止设备。

用户删除或禁用设备

用户可以删除或禁用某些设备。 例如:

  • 如果驱动程序已设置可移动成员 (而不是设备WDF_DEVICE_PNP_CAPABILITIES结构的 SurpriseRemovalOK 成员) ,则用户可以运行拔出或弹出硬件程序,然后拔出或弹出设备;
  • 如果驱动程序尚未设置设备的WDF_DEVICE_STATE结构的 NotDisable 成员,则用户可以使用 设备管理器 禁用设备;

在这种情况下,PnP 管理器会尝试在用户删除设备之前将其停止。

如果驱动程序有时需要阻止删除繁忙设备,驱动程序可以提供 EvtDeviceQueryRemove 回调函数。 如果任何驱动程序的 EvtDeviceQueryRemove 回调函数返回错误状态值,则 PnP 管理器不会停止设备。

如果驱动程序确定用户删除设备是安全的,则回调函数将返回STATUS_SUCCESS。 如果设备的其他驱动程序都无法阻止删除,PnP 管理器将停止设备。

相关文章:

WDF驱动开发-PNP和电源管理(三)

对于PNP设备来说,理解它们的启动和删除顺序,以及意外移除顺序非常重要,在早期,经常有拔插U盘导致windows重启的例子,这就是意外移除带来的问题。 功能或Filter驱动程序的启动顺序 下图显示了框架调用 WDF (KMDF 和 U…...

Redis集群和高可用性:保障Redis服务的稳定性

I. 引言 A. 对Redis的简单介绍和其在现代Web应用中的角色 Redis(REmote DIctionary Server)是一个开源的、基于内存的键值数据库,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。由于Redis的高性能和丰富的数据类型,使其在现代Web应用中广泛使用。例如,它…...

C# WPF入门学习主线篇(二十一)—— 静态资源和动态资源

C# WPF入门学习主线篇(二十一)—— 静态资源和动态资源 欢迎来到C# WPF入门学习系列的第二十一篇。在上一章中,我们介绍了WPF中的资源和样式。本篇文章将深入探讨静态资源(StaticResource)和动态资源(Dynam…...

出现 Navicat 和 Cmd 下SQL 版本 | 查询不一致的解决方法

目录 1. 问题所示1.1 查询表格不一致1.2 版本不一致2. 原理分析3. 解决方法1. 问题所示 命令行和数据库使用工具出现不一致的情况,分别有如下情况 1.1 查询表格不一致 使用工具查询当地表格: 使用命令行查询当地表格: 1.2 版本不一致 在cmd命令下mysql --version 查询…...

31、matlab卷积运算:卷积运算、二维卷积、N维卷积

1、conv 卷积和多项式乘法 语法 语法1:w conv(u,v) 返回向量 u 和 v 的卷积。 语法2:w conv(u,v,shape) 返回如 shape 指定的卷积的分段。 参数 u,v — 输入向量 shape — 卷积的分段 full (默认) | same | valid full:全卷积 ‘same…...

C++青少年简明教程:文件

C青少年简明教程:文件 文件是指存储在计算机文件系统中的数据集合。文件可以包含各种类型的信息,例如文本、图像、音频视频等。在 C中,文件是一种数据流,可以用于读取或写入数据。C提供了一系列的文件操作函数,用于实现…...

Kimichat使用案例010:快速识别出图片中的表格保存到Excel

文章目录 一、介绍二、图片信息三、输入内容四、输出内容五、markdown提示词六、markdown输出一、介绍 如果有一张图片格式的表格,想要快速复制到Excel表格中,那么一般要借助于OCR工具。之前试过不少在线OCR工具,识别效果差强人意。其实,kimichat就可以非常好的完成这个任务…...

[大师C语言(第二十四篇)]C语言指针探秘

引言 在C语言的学习和应用中,指针无疑是最重要、最难以掌握的概念之一。它为C语言提供了强大的功能和灵活性,同时也带来了不少的复杂性。本文将深入探讨C语言指针背后的技术,帮助你更好地理解和应用指针。 第一部分:指针的基本概…...

Docker命令总结

文章目录 Docker命令总结Docker环境Docker容器生命周期Docker容器运维Docker容器rootfsDocker镜像仓库Docker本地镜像管理Docker容器资源Docker系统日志 Docker命令总结 docker命令非常多,这里主要分为8类总结 Docker环境 可以查看Docker版本和自身的详细信息 d…...

把chatgpt当实习生,进行matlab gui程序编程

最近朋友有个项目需要整点matlab代码,无奈自己对matlab这种工科的软件完全是外行,无奈只有求助gpt这种AI助手了。大神们告诉我们,chatgpt等的助手已经是大学实习生水平啦,通过多轮指令交互就可以让他帮你完成工作啦!所…...

LabVIEW 与组态软件在自动化系统中的应用比较与选择

LabVIEW 确实在非标单机设备、测试和测量系统中有着广泛的应用,特别是在科研、教育、实验室和小型自动化设备中表现突出。然而,LabVIEW 也具备一定的扩展能力,可以用于更复杂和大型的自动化系统。以下是对 LabVIEW 与组态软件在不同应用场景中…...

html--万年历

<!DOCTYPE html> <html lang"zh_CN"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><meta charset"utf-8" /><title>万年历</title><link rel"styles…...

2013年 阿拉斯加巴罗活动层厚度和土壤含水量

Pre-ABoVE: Active Layer Thickness and Soil Water Content, Barrow, Alaska, 2013 ABoVE前&#xff1a;阿拉斯加巴罗活动层厚度和土壤含水量&#xff0c;2013年 简介 文件修订日期&#xff1a;2018-01-10 数据集版本&#xff1a;1 摘要 该数据集提供了 2013 年 8 月在…...

超详解——python数字和运算——小白篇

目录 1.位运算 2. 常用内置函数/模块 math模块&#xff1a; random模块&#xff1a; decimal模块&#xff1a; 3.内置函数&#xff1a; 总结&#xff1a; 1.位运算 位运算是对整数在内存中的二进制表示进行操作。Python支持以下常见的位运算符&#xff1a; 按位与&…...

LabVIEW图像采集处理项目中相机选择与应用

在LabVIEW图像采集处理项目中&#xff0c;选择合适的相机是确保项目成功的关键。本文将详细探讨相机选择时需要关注的参数、黑白相机与彩色相机的区别及其适用场合&#xff0c;帮助工程师和开发者做出明智的选择。 相机选择时需要关注的参数 1. 分辨率 定义&#xff1a;分辨率…...

Java——IO流(一)-(2/9):File类的常用方法(判断文件类型、获取文件信息、创建删除文件、遍历文件夹)

目录 常用方法1&#xff1a;判断文件类型、获取文件信息 方法 实例演示 常用方法2&#xff1a;创建文件、删除文件 方法 实例演示 常用方法3&#xff1a;遍历文件夹 方法 实例演示 常用方法1&#xff1a;判断文件类型、获取文件信息 方法 File提供的判断文件类型、获…...

电子设计入门教程硬件篇之集成电路IC(二)

前言&#xff1a;本文为手把手教学的电子设计入门教程硬件类的博客&#xff0c;该博客侧重针对电子设计中的硬件电路进行介绍。本篇博客将根据电子设计实战中的情况去详细讲解集成电路IC&#xff0c;这些集成电路IC包括&#xff1a;逻辑门芯片、运算放大器与电子零件。电子设计…...

Unity3D测量面积和角度实现方法(二)

系列文章目录 unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、unity测量面积&#x1f449;1-1 视频效果&#x1f449;1-2 先创建预制体&#x1f449;1-3 在创建LineRenderer预制体&#x1f449;1-4 代码如下 &#x1f449;二、测量平面和测量空间切换&…...

vite 配置 typescript 环境

要在 Vite 项目中配置 TypeScript 环境&#xff0c;你需要遵循几个步骤来确保 TypeScript 被正确设置并可以与 Vite 一起工作。以下是一个基本的指南&#xff1a; 初始化项目 如果你还没有初始化项目&#xff0c;可以使用 npm 或 yarn 初始化一个新的项目&#xff1a; npm i…...

ThreadCache线程缓存

一.ThreadCache整体结构 1.基本结构 定长内存池利用一个自由链表管理释放回来的固定大小的内存obj。 ThreadCache需要支持申请和释放不同大小的内存块&#xff0c;因此需要多个自由链表来管理释放回来的内存块.即ThreadCache实际上一个哈希桶结构&#xff0c;每个桶中存放的都…...

UE5_加载本地图片(jpg, png) 转 UTexture

UE5_加载图片到UTexture __Desc使用方式源码 __Desc __Time__: 2024-06-05 16:30 __Author__: Yblackd __Desc__: UE5.2 加载本地图片 转 UTexture2D, 给材质 和 UMG 使用使用方式 新建继承BlueprintFunctionLibrary c 类复制下面源码&#xff0c;修改类名实测加载 jpg,jpeg,…...

Linux操作系统:Spark在虚拟环境下的安装及部署

将Spark安装到指定目录 // 通过wget下载Spark安装包 $ wget https://d3kbcqa49mib13.cloudfront.net/spark-2.1.1-bin-hadoop2.7.tgz // 将spark解压到安装目录 $ tar –zxvf spark-2.1.1-bin-hadoop2.7.tgz –C /usr/local/ // 重命名 $ mv /usr/local/spark-2.1.1-bin-hado…...

内网安全--隧道技术代理技术

注:本文仅做技术交流,请勿非法破坏... 目录 项目: 1-Ngrok 用法 2-Frp 用法 3-Nps 用法 4-Spp 用法 工具: windows下: Proxifier(推荐~) Sockscap ccproxy Linux下: Proxychains 用法 http://t.csdnimg.cn/88Ew7 隧道技术&#xff1a;解决不出网协议上线的问…...

彩虹易支付最新版源码

源码简介 彩虹易支付最新版源码&#xff0c;更新时间为5.1号 2024/05/01&#xff1a; 1.更换全新的手机版支付页面风格 2.聚合收款码支持填写备注 3.后台支付统计新增利润、代付统计 4.删除结算记录支持直接退回商户金额 安装环境 1.PHP版本>7.4 2.Mysql数据库 安装教…...

python生成excel数据并实现隔行变色

代码 from openpyxl import Workbook from datetime import date from openpyxl.styles import PatternFilldef create_excel():wb Workbook()sh wb.activerows [[Date, Batch 1, Batch 2, Batch 3],[date(2024, 2, 1), 40, 30, 25],[date(2024, 2, 2), 40, 25, 30],[date(…...

IEEE754 十进制数转32位浮点数格式

为了将十进制数37.25转换为IEEE 754短浮点数格式&#xff08;32位&#xff09;&#xff0c;我们需要按照以下步骤进行&#xff1a; IEEE 754标准结构 IEEE 754标准的单精度浮点数&#xff08;32位&#xff09;格式如下&#xff1a; 1位符号位&#xff08;S&#xff09;8位指…...

JVM内存分析之JVM分区与介绍

JVM&#xff08;Java Virtual Machine&#xff09;作为Java平台的核心组件&#xff0c;为Java应用程序的运行提供了一个虚拟的计算机环境。为了更好地理解和优化Java应用程序的性能&#xff0c;对JVM的内存管理进行深入分析是至关重要的。本文将详细介绍JVM的内存分区及其功能。…...

多目标检测模型加权框集成

优秀项目推荐&#xff1a;https://gitcode.com/ZFTurbo/Weighted-Boxes-Fusion/overview 参考链接&#xff1a; 目标检测加权框融合 WBF原理讲解 https://blog.csdn.net/YXD0514/article/details/132574588 目标检测加权框融合 WBF原理讲解&#xff08;Weighted Boxes Fusion&…...

转型AI产品经理(6):“ 序列位置效应”如何应用在Chatbot产品中

序列位置效应是心理学中的一个记忆现象&#xff0c;指的是人们对一系列信息的记忆效果受到信息在序列中位置的影响。具体来说&#xff0c;人们通常更容易记住列表的开头和结尾部分的项目&#xff0c;而对中间部分的项目记忆较差。这个效应可以进一步分为“首因效应”和“近因效…...

ESP32:往MicroPython集成PCNT以支持硬件正交编码器

背景 官方发布的1.23依然没有在ESP32中集成PCNT功能。考虑到硬件的PCNT模块可以提供4倍的编码精度&#xff08;对比使用PIn IRQ&#xff09;&#xff0c;还能提供硬件去毛刺。 还是自己集成一下吧。 实际上Github上早在2022年1月的时候就已经有人建议了将PCNT加入正式版本的功…...

给宝宝做衣服网站好/微信推广

startsWith()方法 startsWith()方法用来判断当前字符串是否是以另外一个给定的子字符串“开头”的&#xff0c;根据判断结果返回 true 或 false 参数: str.startsWith(searchString [, position]) searchString 要搜索的子字符串 position 在 str 中搜索 searchString 的…...

国外购物网站系统/网站制作免费

https://www.zhihu.com/question/62277180/answer/196715976 从最高层看&#xff0c;G1的collector一侧其实就是两个大部分&#xff1a; * 全局并发标记&#xff08;global concurrent marking&#xff09; * 拷贝存活对象&#xff08;evacuation&#xff09; 而这两部分可以相…...

网站百度突然不收录/广告设计

HTML代码&#xff1a; <ul><li>jQuery判断当前元素是第几个元素示例</li><li>jQuery获取第N个元素示例</li><li>jQuery选择器示例</li> </ul> 判断当前元素是第几个元素 如果我们点击任何一个li标签&#xff0c;想知道当前点击…...

企业公司网站建设方案/从事网络营销的公司

实验环境搭建 在进行安全学习过程中&#xff0c;难免需要具有各种不同类型的操作系统。 操作系统不仅包括windows和linux&#xff0c;还包括unix和其它的系统&#xff0c;光windows和linux就能说出10种以上&#xff0c;要使用不同的操作系统&#xff0c;对安全漏洞进行研究的情…...

58同城网络营销靠谱吗/优化疫情防控 这些措施你应该知道

内核是操作系统最基础也是最重要的部分。下图为 RT-Thread 内核架构图&#xff0c;内核处于硬件层之上&#xff0c;内核部分包括内核库、实时内核实现。 内核库是为了保证内核能够独立运行的一套小型的类似 C 库的函数实现子集。 这部分根据编译器的不同自带 C 库的情况也会有…...

公司做网站要注意什么/百度后台登录

1. 实践题目 7-3 两个有序序列的中位数 2. 问题描述 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A​0​​,A​1​​,⋯,A​N−1​​的中位数指A​(N−1)/2​​的值,即第⌊(N1)/2⌋个数&#xff08;A​0​​为第1个数&#xff09;。 Input 在一行…...