首页 > 其他分享 >WDF驱动开发-PNP和电源管理(三)

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

时间:2024-06-09 13:58:09浏览次数:23  
标签:调用 管理器 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,电源,驱动程序,设备
From: https://blog.csdn.net/m0_72813396/article/details/139538309

相关文章

  • PNPXAssoc.dll文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个PNPXAssoc.dll文件(挑选合适的版本文件)把它......
  • BOSHIDA AC/DC电源模块:简化电路设计的便捷解决方案
    BOSHIDAAC/DC电源模块:简化电路设计的便捷解决方案AC/DC电源模块是一种常用的电力转换装置,用于将交流电源转换为直流电源,以提供给各种电子设备和系统使用。它在电路设计中起到了简化电路、提高效率和可靠性的重要作用。本文将介绍AC/DC电源模块的工作原理、应用领域以及优势。......
  • 电源设计01
    嵌入式电源设计电池容量的计算电路充电时的选择:科普硬件知识,写写关于电路板电源的事情。各类电源模块实物但为什么硬件工程师又必须要了解电源并且在板内自己设计电源呢?首先是DCDC的降压芯片下面推荐几个升压芯片:LDO电池容量的计算1kwh=3.6*10^6J,和电源的毫安时,要......
  • 基于STM32的同步整流Buck-Boost数字电源 开源
    一款基于STM32G474的四开关Buck-Boost数字电源,支持TypeC接口PD诱骗输入和DC5.5接口输入,输入/输出最高48V10A,这是我的毕业设计,现在开源出来,含原理图、PCB、程序源码、外壳3D模型等资料。做得一般,勿喷,欢迎友好交流。作品演示视频:https://www.bilibili.com/video/BV1Ui421y7i......
  • MDZ UPnP和端口映射 区别
    DMZ(demilitarizedzone):可以简单理解成把网关的全端口转发到指定内网主机上,只能指定一台主机。这是一种静态全端口映射。这个协议只要早网关开启就行了。UPnP(UniversalPlugandPlay):这个协议的目的是动态的映射网关的指定端口到指定主机上,可以一把网关的不同端口映射到不同......
  • BOSHIDA AC/DC电源模块:跟踪技术的创新之选
    BOSHIDAAC/DC电源模块:跟踪技术的创新之选AC/DC电源模块是一种能将交流电转化为直流电的设备,广泛应用于各种电子设备中。在过去的几十年中,AC/DC电源模块一直在不断发展和演进,以满足不断进步的科技需求。其中一项创新技术,即跟踪技术,成为AC/DC电源模块设计的首选。 跟踪技术是......
  • 开关电源基本原理1
    目录内容概述关于电感认识电感电感充电电感储能电感充电电感参数电感放电利用电感升压电感电流波形伏秒法则电流纹波率电感电流三种导电模式电流纹波率与频率的关系电流纹波率与电感值的关系电感值与电感体积电路纹波率r的最优值电感值与电感体积内容概述......
  • AC/DC电源模块的效率及其影响因素
    BOSHIDAAC/DC电源模块的效率及其影响因素AC/DC电源模块是一种将交流电转换为直流电的设备,广泛应用于电子设备、通信设备、工业自动化等领域。其效率是衡量其性能的重要指标之一。本文将介绍AC/DC电源模块的效率及其影响因素。 AC/DC电源模块的效率指的是其输出功率与输入功......
  • 基于51单片机数控直流数控电源的设计
    电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。直流稳压电源是电子技术常用的仪器设备之一,广泛的应用于教学、科研等领域,是电子实验员、电子设计人员及电路开发部门进行实......
  • BOSHIDA AC/DC电源模块:紧凑设计,高效能源利用
    BOSHIDAAC/DC电源模块:紧凑设计,高效能源利用AC/DC电源模块是一种用于将交流电转换为直流电的装置。它是许多电子设备中不可或缺的一部分,如计算机、通信设备、家电等。AC/DC电源模块的设计紧凑,具有高效能源利用的特点,下面将详细介绍这些特点。 一,AC/DC电源模块的设计紧凑。由......