windows驱动开发-功能驱动的生命周期

PNP设备的功能驱动生命周期有一些稍微特殊的地方没下面看一下具体的,

功能驱动的设备启动

功能驱动程序设置 IoCompletion 例程,在设备堆栈中向下传递 IRP_MN_START_DEVICE 请求,并推迟其启动操作,直到所有较低的驱动程序都已完成 IRP。 有关使用内核事件和 IoCompletion 例程推迟IRP处理的详细信息,请参阅将PnPIRP处理推迟到较低的驱动程序完成。

当其 DispatchPnP 例程在所有较低级驱动程序使用IRP完成后重新获得控制权时,功能驱动程序将执行其启动设备的任务。 功能驱动程序使用如下过程启动设备:

1. 如果较低版本的驱动程序失败,IRP (IoCallDriver) 返回错误,请不要继续处理 IRP。 执行任何必要的清理并从 DispatchPnP 例程返回, 转到最后一个步骤;

2. 如果较低的驱动程序已成功处理 IRP,请启动设备:启动设备的确切步骤因设备而异。 此类步骤可能包括映射 I/O 空间、初始化硬件寄存器、将设备设置为 D0 电源状态,以及使用 IoConnectInterrupt 连接中断。 如果驱动程序在 IRP_MN_STOP_DEVICE 请求后重启设备,则驱动程序可能具有要还原的设备状态;

必须先打开设备,然后任何驱动程序才能访问它。 如果应为设备启用唤醒,其电源策略所有者 (通常功能驱动程序) 应在设备通电后和完成 IRP_MN_START_DEVICE 请求之前发送等待/唤醒 IRP;

3. 启动IRP持有队列中的 IRP:清除驱动程序定义的HOLD_NEW_REQUESTS标志,并启动IRP持有队列中的 IRP。 驱动程序应在首次启动设备时以及查询停止或停止IRP后重启设备时执行此操作。 

4. [可选]通过调用 IoSetDeviceInterfaceState 为设备启用接口:启用驱动程序以前在其 AddDevice 例程中注册的接口。

在 Windows 2000 及更高版本的 Windows 上,在 IRP_MN_START_DEVICEIRP完成之前,PnP 管理器不会发送设备接口到达通知,指示设备的所有驱动程序已完成其启动操作。 在设备的所有驱动程序完成启动IRP之前,PnP 管理器还会使到达的任何创建请求失败;

5. 完成 IRP:功能驱动程序的 IoCompletion 例程STATUS_MORE_PROCESSING_REQUIRED返回,如 将PnPIRP处理推迟到较低驱动程序完成中所述,因此功能驱动程序的 DispatchPnP 例程必须调用 IoCompleteRequest 以恢复 I/O 完成处理。

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

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

如果较低级驱动程序失败,IRP 通过IoCallDriver 返回错误),功能驱动程序使用 IO_NO_INCREMENT 调用 IoCompleteRequest,并从其 DispatchPnP 例程返回 IoCallDriver 错误。 在这种情况下,功能驱动程序不会设置 Irp->IoStatus.Status,因为状态已由IRP失败的较低驱动程序设置。

当功能驱动程序收到IRP_MN_START_DEVICE请求时,它应检查 IrpSp->Parameters.StartDevice.AllocatedResources 和 IrpSp->Parameters.StartDevice.AllocatedResourcesTranslated 中的结构,它们分别描述了PnP 管理器分配给设备的原始资源和已翻译的资源。 驱动程序应在设备扩展中保存每个资源列表作为调试辅助。

资源列表 CM_RESOURCE_LIST 结构配对,其中原始列表的每个元素对应于已翻译列表的同一元素。 例如,如果 AllocatedResources.List[0] 描述原始 I/O 端口范围,则 AllocatedResourcesTranslated.List[0] 描述转换后的相同范围。 每个已翻译的资源都包含一个物理地址和资源类型。

如果为驱动程序分配了已转换的内存资源 (CmResourceTypeMemory) ,则必须调用 MmMapIoSpace 将物理地址映射到可访问设备寄存器的虚拟地址。 要使驱动程序以独立于平台的方式运行,它应检查每个返回的已翻译资源,并在必要时对其进行映射。

功能驱动程序应执行以下操作以响应 IRP_MN_START_DEVICE ,以确保访问所有设备资源:

  • 将 IrpSp->Parameters.StartDevice.AllocatedResources 复制到设备扩展;
  • 将 IrpSp->Parameters.StartDevice.AllocatedResourcesTranslated 复制到设备扩展;
  • 在循环中,检查 AllocatedResourcesTranslated 中的每个描述符元素。 如果描述符资源类型为 CmResourceTypeMemory,请调用 MmMapIoSpace,传递已转换资源的物理地址和长度;

当驱动程序收到 IRP_MN_STOP_DEVICE、 IRP_MN_REMOVE_DEVICE或 IRP_MN_SURPRISE_REMOVAL 请求时,它必须通过在类似的循环中调用 MmUnmapIoSpace 来释放映射。 如果驱动程序必须使IRP_MN_START_DEVICE请求失败,则驱动程序还应调用 MmUnmapIoSpace。

功能设备的删除

删除设备时,功能驱动程序必须撤消为添加和启动设备而执行的任何操作。 此讨论包括外围设备的功能驱动程序和总线设备的功能驱动程序。

功能驱动程序在其 DispatchPnP 例程中使用如下过程删除设备:

1. 这是总线设备的功能驱动程序吗?如果是这样,可能会删除总线上设备的任何未完成子 PDO。

如果总线驱动程序处理了针对子设备的上一个 IRP_MN_SURPRISE_REMOVAL 请求,但驱动程序尚未收到后续 IRP_MN_REMOVE_DEVICE 请求,则总线驱动程序将使子 PDO 保持不变。 稍后,当关闭子设备的所有句柄时,PnP 管理器将发送子设备的删除 IRP,而总线驱动程序此时会删除子 PDO。

如果总线驱动程序处理了设备的上一 个IRP_MN_REMOVE_DEVICE 请求,并且没有后续 IRP_MN_SURPRISE_REMOVAL 请求,则总线驱动程序会删除子 PDO。 在这种情况下,PnP 管理器确保在将删除IRP发送到父总线设备之前,已从子设备中删除任何功能和Filter驱动程序, 确保它们的FDO 和筛选器DO 已被删除。 子 PDO 可能仍然存在,因此总线驱动程序必须先删除子 PDO,然后才能删除总线设备。

2. 驱动程序是否已处理此 FDO 的先前 IRP_MN_SURPRISE_REMOVAL 请求?如果是这样,请执行任何剩余的清理,并跳到步骤 8。驱动程序通常在设备扩展中维护一个标志,指示驱动程序是否已处理设备的 IRP_MN_SURPRISE_REMOVAL 请求。

3. 如果驱动程序以前为设备启用了唤醒,请取消 IRP_MN_WAIT_WAKE 请求。

4. 确保设备处于非活动状态,如果设备尚未处于非活动状态以响应之前的 IRP_MN_QUERY_REMOVE_DEVICE,驱动程序必须将设备标记为不接受新请求,并且必须完成此驱动程序中排队的任何请求。 驱动程序必须使需要访问设备的任何未完成请求失败。

驱动程序可以使用 IoXxxRemoveLockXxx 例程对未完成的 I/O 进行计数,并设置指示删除处理可以继续的事件。

5. 执行任何关机操作。设备的每个驱动程序在收到 IRP_MN_REMOVE_DEVICE 请求时执行其关机操作。 设备的电源策略所有者(通常是功能驱动程序)不会发送单独的 IRP_MN_SET_POWER 请求,将设备电源状态设置为 D3。 父总线驱动程序通常会关闭槽,并在总线驱动程序获取删除IRP时使用 PoSetPowerState 通知电源管理器。

6. 通过调用 IoSetDeviceInterfaceState 禁用任何设备接口。

7. 释放驱动程序正在使用的设备的任何硬件资源。具体操作取决于设备和驱动程序,但可能包括断开 IoDisconnectInterrupt 中断的连接、使用 MmUnmapIoSpace 释放物理地址范围以及释放 I/O 端口。

8. 将 IRP_MN_REMOVE_DEVICE 请求向下传递到下一个驱动程序。使用 IoSkipCurrentIrpStackLocation 为下一个较低驱动程序设置IRP堆栈位置,并使用 IoCallDriver 将IRP传递给下一个驱动程序。驱动程序无需等待基础驱动程序完成其删除操作,然后再继续其删除活动。

9. 使用 IoDetachDevice 从设备堆栈中删除设备对象。将指向下一个较低设备对象的指针指定为 TargetDevice 参数。 驱动程序从调用 IoAttachDeviceToDeviceStack 在驱动程序的 AddDevice 例程中接收此类指针。

10. 清理任何特定于设备的分配、内存、事件等。

11. 使用 IoDeleteDevice 释放 FDO。

12. 从 DispatchPnP 例程返回,从 IoCallDriver 传播返回状态。

功能驱动程序不会为删除IRP指定 IoCompletion 例程,也不会完成 IRP。 删除IRP由父总线驱动程序完成。

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

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

相关文章

【北京迅为】《iTOP-3588开发板从零搭建ubuntu环境手册》-第2章 获取并安装Ubuntu操作系统

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

buildroot添加ssh功能

在制作了自己的buildroot生成的根文件系统之后,是没有ssh服务的,需要自行添加。 在buildroot的menuconfig里: Target packages -> Networking applications -> openssh 重新编译,还不能通过电脑连接,还需配置并…

101_Linux文件挂载系统相关

一、文件系统简介 传统的磁盘与文件系统应用中,一个分区就只能够被格式化成为一个文件系统,所以我们可以说一个文件系统就是一个硬盘分区。 随着新技术的出现如LMM与软件磁盘阵列software raid),这些技术可以将一个分区格式化为多个文件系统(例如LWM),也能够将多个分区合成一…

又被System.out.print给坑了一把

学过java的同学都应该知道,第一个程序很多人都是这样: public class Hello {public static void main(String[] args) { System.out.print("Hello,world!");} } 打印结果是:Hello,world! 接着可能会…

SSIM(Structural Similarity),结构相似性及MATLAB实现

参考文献 Wang, Zhou; Bovik, A.C.; Sheikh, H.R.; Simoncelli, E.P. (2004-04-01). “Image quality assessment: from error visibility to structural similarity”. IEEE Transactions on Image Processing. 13 (4): 600–612. Bibcode:2004ITIP…13…600W. CiteSeerX 10.…

ctype--数据类型转换函数——vb.net

CType 函数 语法 CType(expression, typename) 组成部分 expression 任何有效表达式。 如果 expression 的值超出 typename 所允许的范围,Visual Basic 将引发异常。 typenameDim 语句的 As 子句中的任何合法表达式,即任何数据类型、对象、结构、类或接…

【系统架构师】-选择题(十三)数据库基础

1、在某企业的营销管理系统设计阶段,属性"员工"在考勤管理子系统中被称为"员工",而在档案管理子系统中被称为"职工",这类冲突称为( 命名冲突)。 同一个实体在同系统中存在不同的命名&am…

2024年财富自由秘籍,创业项目大揭秘!

2024年,一个崭新的创业项目如日中天般迅速崛起,吸引了无数创业者的目光——那就是APP广告变现。这不仅是一条轻松实现财富自由的道路,更是一个充满无限可能的黄金领域。 在移动互联网高速发展的今天,智能手机已成为我们生活中不可…

UE4\UE5 调试源代码流程(重点讲不去Github装源代码情况)

UE4\UE5 调试源代码流程 前言: 很多写UE C代码的小伙伴,肯定发现了,在虚幻源代码里面是没办法打断点进行调试的,就算走Debug调试流程,也依旧不能正常打断点调试,今天我们来分享一下不装Github源代码情况下…

各种数据获取stream流的方式

1.单列集合&#xff08;直接调用&#xff09; ArrayList<Integer> list new ArrayList<>();list.stream(); 2.双列集合 HashMap<String, Integer> map new HashMap<>();map.put("aaa",111);map.put("bbb",222);map.put("c…

Vue中引入Element组件、路由router、Nginx打包部署

目录 1、Element-ui(饿了么ui) 演示&#xff1a; 怎么打开NPM脚本&#xff1f; Vue路由router Nginx打包部署Vue-Cli项目 1、Element-ui(饿了么ui) element-ui(饿了么ui)是一个非常好用且美观的组件库(插件库)&#xff0c;主要用于网站快速成型&#xff0c;由国产团队饿了么…

RH850F1KM Part1 创建一个新工程

1、选择File->New ECU Project.# 2、填写工程名和工程文件路径&#xff0c;点击Next 3、点击Next 4、点击Finish 5、报错&#xff1a;# 6、步骤5报错原因&#xff1a; RH850F1KM 搭建MCAL配置环境中复制到BSWMD文件夹下的文件过多&#xff0c;除包含当前芯片型号外&#…

618值得入手的平价好物清单,看完再买不吃亏!

即将到来的618年中购物狂欢节&#xff0c;无疑是一年一度的购物盛宴。为了让大家的购物体验更加愉悦和充实&#xff0c;我特地为大家精选了一系列好物。如果你也打算在618尽情购物&#xff0c;那就赶紧收藏这份清单吧&#xff01; 一、舒适佩戴不伤耳——南卡骨传导耳机Runner…

EDA(四)Verilog

EDA&#xff08;四&#xff09;Verilog Verilog是一种用于电子系统设计自动化&#xff08;EDA&#xff09;的硬件描述语言&#xff08;HDL&#xff09;&#xff0c;主要用于设计和模拟电子系统&#xff0c;特别是在集成电路&#xff08;IC&#xff09;和印刷电路板&#xff08;…

关于服务端接口知识的汇总

大家好&#xff0c;今天给大家分享一下之前整理的关于接口知识的汇总&#xff0c;对于测试人员来说&#xff0c;深入了解接口知识能带来诸多显著的好处。 一、为什么要了解接口知识&#xff1f; 接口是系统不同模块之间交互的关键通道。只有充分掌握接口知识&#xff0c;才能…

面试算法之哈希专题

赎金信 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i 0; i< magazine.size(); i) {m_cnt[magazine[i]-a]; // 统计}// 对比for(int i 0; i< ransomNote.size(); i) {if(m_cnt[r…

用幽兰本体验大语言模型

大语言模型&#xff08;LLM&#xff09;是目前炙手可热的话题&#xff0c;每个人都想体验一下大语言模型的魅力。然而如果使用云端的大语言模型服务&#xff0c;则不仅速度慢&#xff0c;而且可能泄露自己的隐私。幽兰代码本使用瑞芯微公司推出的 RK3588 SoC 芯片作为核心硬件&…

财务管理|基于SprinBoot+vue的财务管理系统(源码+数据库+文档)

财务管理系统 目录 基于SprinBootvue的财务管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 1管理员功能模块 2员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1…

2024年必看:13大顶尖Scrum工具助力敏捷项目管理

Scrum 管理工具有&#xff1a;PingCode、Jira、Trello、Zoho Sprints、Active Collab、ProProfs Project、Scrumwise、ClickUp、Monday.com、QuickScrum、Yodiz、ScrumDo、nTask 在过去几年中&#xff0c;Scrum方法论已成为敏捷项目管理的主要框架之一。使用Scrum&#xff0c;项…

存储和NFS共享

存储类型 存储类型分为三种 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS网络附加存储&#xff1a;Network-Attached Storage&#xff0c;简称NAS存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN DAS:存储和主机是直连的&#xff0…
最新文章