IRP 处理流程

2023-10-28 02:38
文章标签 流程 处理 irp

本文主要是介绍IRP 处理流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文通过打开一个文件对象为例子,描述了一个带有两个I/O stack location的IRP的详细处理过程。当然一个IRP可以有多个I/O stack location,具体个数取决于将要处理该请求的驱动的层数。下图详细描述了驱动程序是如何通过使用I/O支持例程(IoXxx routines)来处理IRP以此来实现对相应文件的读写操作。




1:I/O管理器调用文件系统驱动(FSD)并把包含了子系统读/写请求的IRP传递给该驱动。 FSD访问IRP中的I/O stack location, 从而决定应该执行什么操作。


2:通过单此或者多次调用例程(IoAllocateIrp)来分配附加的IRP,FSD就可以把原始的请求分成几个小的请求(对于设备驱动不只一个的情况)。这些附加的IRP中的I/O stack location区域将会被下一级的驱动填充成零返回给FSD,正因为如此,FSD可以重复使用原始的IRP, 而不是向前面所讲的那样执行分配额外的IRP,并在这些IRP中创建针对下一层驱动的I/O stack location 并传送给下一层驱动。


3:对每一个驱动分配的IRP,如前面所述,FSD将调用I/O支持例程来注册一个由FSD提供的完成例程;在完成例程中,FSD可以判定下级驱动是否满足该请求,并且当下级驱动成功完成该IRP时释放该IRP。I/O管理器将调用FSD提供的完成例程来判断分配给驱动的IRP是成功完成了,还是完成了但有错误,或者是被取消了。上层驱动负责释放该驱动自己为下层驱动分配并设置的IRP。I/O管理器负责示释放它本身分配的并且被驱动完成的IRP。接下来,为了建立传递给下层驱动执行的请求,FSD将调用I/O支持例程(IoGetNextIrpStackLocation)来访问下层驱动的I/O stack location。(本例中,下一层驱动就是最后一层驱动)最后,FSD调用例程(IoCallDriver)将IRP传递给下一层驱动。


4:当IRP传递到下层驱动时,该驱动检查它对应的I/O stack location以此来判断自己在目标设备上该执行何种操作(由IRP_MJ_XXX之类的功能代码决定)。在指定的I/O stack location中已经把相应的目标设备通过设备对象抽象表征出来并出传递给本层驱动程序了。最底层的驱动可以做如下假设:I/O管理器把IRP转发给驱动的入口点,该入口点里面,驱动已经定义好了各种IRP_MJ_XXX操作(本例中是IRP_MJ_READ或者IRP_MJ_WRITE),而且上层的驱动已经对该请求的参数的有效性进行了检查。
如果没有上层驱动,那么底层驱动就要为针对IRP_MJ_XXX操作的参数的有效性进行检查,如果有效, 驱动程序通常调用I/O 支持例程来通知I/O管理器该层设备是将IRP挂起了,还是将IRP移入队列里等待,还是直接将IRP转发给由其他驱动提供的访问目标设备的驱动应用例程(此例中是一个物理或者逻辑设备: 磁盘或者分区)。

5: I/O管理器先判断驱动程序是否在忙于处理其他IRP,如果忙,则将IRP移入队列,并返回。否则,I/O管理器将把IRP转发给驱动提供的例程,该例程将在它所在的设备层发起I/O操作。

6:当设备中断发生时,驱动的中断服务例程(ISR)必须屏蔽相应中断并保存相关的上下文环境。然后,ISR将调用I/O支持例程(IoRequestDpc)将该IRP传递给由本层驱动提供的延时处理调用(DPC)例程中,以此使得该操作请求在比ISR低一级的硬件优先级下完成。

7:当驱动程序的DPC执行时,它使用上下文(由ISR中调用IoRequestDpc时传递下来)来完成I/O操作。 DPC调用相关的例程将下一个IRP(如果有的话)移出队列并将该IRP转发给由驱动提供的例程,这个例程开始在这个设备执行I/O操作。然后,DPC设置IRP中的I/O状态并调用例程IoCompleteRequest将它返回给I/O管理器。

8:I/O管理器把最底层的驱动程序的I/O stack location置零,然后调用文件系统已经注册好的完成例程(见步骤3)并把分配给FSD的IRP传递给文件系统驱动。该完成例程根据I/O状态(I/O status block)的结果来决定是重发该请求,还是更新原始请求保存的的内部状态信息,或者是释放分配给驱动的IRP。文件系统收集完所有分配给驱动的IRP中的状态信息,由此可以设置I/O的状态信息并结束原始IRP,当文件系统完成原始的IRP时,I/O管理器返回一个NTSTATUS的值给发起该I/O操作的原始请求者(子系统的原生函数)。


和上图描述的文件系统驱动一样,任何一个添加进驱动链表的新的驱动程序都可以实现下列功能:

●     在IRP中设置自己的完成例程。IoCompletion例程检查I/O status block来判断该IRP是被下一层的驱动成功完成了,还是被取消了, 或者是完成了但有错误. 完成例程还可以更新任何由驱动程序保存的IRP相关的状态, 也可以释放由驱动分配的任何操作相关的资源。另外,结束IRP之前,完成例程还可以延迟IRP的完成(通过告诉I/O管理器该IRP需要处理更多东西),并且可以在允许该IRP完成之前,向下一层驱动程序发送另外的请求。

●     在分配的IRP中可以创建下一层驱动对应的I/O stack location,并将请求发送给下一层驱动。

●     任何收到的IRP都可以通过在每一个IRP中添加针对下一层驱动的I/O stack location并调用IoCallDriver例程实现转发(值得注意的是: 针对主要功能代码为IRP_MJ_POWER,的IRP,驱动必须调用PoCallDriver例程才能转发)。

 

从上图我们可以知道,大部分驱动处理IRP是通过驱动提供的一组标准例程,但是处在驱动链中不同层的驱动必须有不同标准的例程。比如说,只有最底层的驱动可以处理来自物理设备的中断,所以只有最底层的驱动可以有ISR和DPC,ISR和DPC负责完成那些由中断驱动的I/O操作。从另一方面来说,因为最底层的驱动在收到来自设备的中断时就知道这些I/O操作已经完成,所以只有高层的驱动才有一个或者多个类似上文中提到的FSD的完成例程。


注:该文章英文原文出自msdn。



这篇关于IRP 处理流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/290128

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

火语言RPA流程组件介绍--浏览网页

🚩【组件功能】:浏览器打开指定网址或本地html文件 配置预览 配置说明 网址URL 支持T或# 默认FLOW输入项 输入需要打开的网址URL 超时时间 支持T或# 打开网页超时时间 执行后后等待时间(ms) 支持T或# 当前组件执行完成后继续等待的时间 UserAgent 支持T或# User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

8. 自然语言处理中的深度学习:从词向量到BERT

引言 深度学习在自然语言处理(NLP)领域的应用极大地推动了语言理解和生成技术的发展。通过从词向量到预训练模型(如BERT)的演进,NLP技术在机器翻译、情感分析、问答系统等任务中取得了显著成果。本篇博文将探讨深度学习在NLP中的核心技术,包括词向量、序列模型(如RNN、LSTM),以及BERT等预训练模型的崛起及其实际应用。 1. 词向量的生成与应用 词向量(Word Embedding)