IoMarkIrpPending

驱动开发(13)IRP 的异步完成和 CancelRoutine 本博文由优快云博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.youkuaiyun.com/zuishikonghuan/article/details/51301922在之前的博文中,我们对于IRP,都是同步完成的,但是 Windows 对异步操作很友好,我们来看看如何异步完成 IRP 。在应用程序中异步访问设备在开始之前,我认为有必要提 阅读详情

IoMarkIrpPending

 

IoMarkIrpPending例程用于标记指定的IRP,标志着某个驱动的分发例程(分发函数)因需要被其他的驱动程序进一步处理最终返回STATUS_PENDING状态。

 

VOID IoMarkIrpPending( IN OUT PIRP  Irp );

 

参数:Irp

                 将被标记为Pending状态的IRP指针。

 

返回值:

                 无

 

Comments:

                 除非IRP的派遣例程完成这个IRP或向下层驱动传递,否则派遣例程必须调用IoMarkIrpPending挂起这个IRP。否则I/0 manager将在这个函数返回时试图完成该IRP。

                 调用IoMarkIrpPending后,派遣例程必须返回STATUS_PENDING,尽管有些函数在派遣例程的IoMarkIrpPending返回前完成了这个IRP。

                 如果驱动队列收到了IRP,它应该先把这些要进入队列的IRP挂起(通过调用IoMarkIrpPending)在放入队列。否则队列中的未挂起的IRP可能被其他的驱动例程取出并完成(调用 IoCompleteRequest)和释放(由系统来做),如果在这时再调用IoMarkIrpPending就会导致系统的crash。

                 如果驱动设置了一个完成例程然后向下层驱动传递IRP,它的完成例程应该检测IRP->PendingReturned标志域(Flag)。如果这个子域被设置成TRUE,完成例程就必须调用IoMarkIrpPending挂起该IRP。(完成例程不返回STATUS_PENDING,更多信息参考:Implementing an IoCompletion Routine)。

 

Warning:

                 创建和发送IRP给其他的设备栈不得在完成例程(Completion Routine)中调用IoMarkIrpPending挂起自己创建的IRP。这个调用会毁坏前面被分配的内存,因为这是所有驱动对应的location stack中最后一个location stack,也就是前面已经没有IRP_STACK_LOCATION了。

                 驱动程序把IRP向下传递后,等待一个事件对象不应该把IRP设置为Pending,它的完成例程应该设置事件对象并返回STATUS_MORE_PROCESSING_REQUIRED。

 

必要条件:

                 IRQL:Any level

                 头文件:在wdm.h中声明,需要包含wdm.h,Ntddk.h,Ntifs.h。

下面是我对上面几句话的理解:

“如果驱动队列收到了IRP,它应该先把这些要进入队列的IRP挂起(通过调用IoMarkIrpPending)在放入队列。否则队列中的未挂起的IRP可能被其他的驱动例程取出并完成(调用 IoCompleteRequest)和释放(由系统来做),如果在这时再调用IoMarkIrpPending就会导致系统的crash。”

当然若IRP被IO manager Free掉了再引用肯定会引起系统的crash,因为内存违规访问。主要是这里:“驱动收到IRP后要先挂起然后再入队列,这样可以防止系统crash”,我认为IoMarkIrpPending函数会引起该IRP引用计数(reference)的“加1”,所以即使该IRP被一个其它的Driver完成(调用IoCompletionRequest,估计引起引用计数“减1”)也不会被IO manager Free掉,不过还有一种方式是IoFreeIrp,这种方式我认为不适用与非自己创建的IRP,也可能这句不准确,更多IoFreeIrp的资料请自己查看DDK或WDK文档。

Windows驱动开发WDM (7)- 异步IRP 同步IRP是很简单的,比如caller调用DeviceIoControll,那么DeviceIoControll的IRP会发到相应的驱动,驱动把这个IRP完成,然后caller的DeviceIoControll才返回。同步的缺点很明显,比如驱动需要花10秒处理这个IRP,那么caller就得等待10秒钟,有时候这是个浪费。这是个很常见的问题,解决方案就是采用异步的方式。   异步IRP ca 阅读详情

相关推荐

Optisystem软件与Matlab软件的联合数据读取

目录 Matlab软件程序编写 Optisystem软件的连接与设置 数据读取结果 Matlab软件程序编写 利用Matlab软件按照下图编写程序,保存为getdata.m文件。 OutputPort1 =InputPort1; fileID=fopen('OSAdata.txt','wt'); fprintf(fileID,'%f\n',OutputPort1.Sampled.Signal); fclose(fileID); Optisystem软件的连接与设置 (以基于线性插值法

Vivian_Chen_的博客 4853

驱动完成例程中为何要调用IoMarkIrpPending?

IRP完成的时候,需要在IRP原始发起线程里做一些事情,此时IO管理器会判断IRP->flag,和IrpSp->Control,FLAG就不说了,如果此时Control有SL_PENDING_RETURNED,那么他会插入一个APC到发起线程里,如果没有这个标记,他就以为当前线程就是发起线程,就不插入APC了,所以你的完成例程必须要按规定传递PENDING_RETURNED标记,否则系统可能会误判的。

要把所有那些负面的信息当做对自身行为的评价,而不是对自身价值的评判。 327

AI大模型实战——模型测评:如何评估大模型的表现

大模型评测体系解析:从数据集到基准测试 本文系统梳理了大模型评测的关键要素。在数据集方面,重点介绍了C-Eval等中文评估套件,强调数据质量需通过人工验证保证。评测维度涵盖自然语言理解、知识推理、代码生成等核心能力。基准测试作为标准化评估方法,Glue、SuperClue等平台提供了公平比较的依据。文章指出厂商自评榜单存在水分问题,建议关注第三方评测。同时解析了少样本和零样本两种prompt模式的应用场景差异。最后解释了"SOTA"这一术语在描述模型最优性能时的应用价值。整体呈现了大模型

小志的博客 895

Windows NT 驱动程序开发人员提示——应注意避免的事项

下面是开发人员在使用 Windows NT 设备驱动程序时应当避免的事项列表: 1. 一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度例程返回 STATUS_PENDING。 2

人是会思考的一棵苇草 2091

LCD工程师必看:Pixelclock、Mipi Clk计算全解析(附实用公式)

本文为LCD工程师详细解析了像素时钟(Pixelclock)与MIPI时钟(Mipi Clk)的核心计算方法。文章从时序参数构成入手,通过实战公式推导,系统阐述了从屏幕分辨率、刷新率到最终MIPI速率的高效计算链路,并提供了实用的调试思路与排查清单,帮助工程师快速解决画面撕裂、闪烁等常见问题。

weixin_29266679的博客 387

Concentration Inequality(集中不等式)更新版

欢迎来我博客 https://wyue.name/2020/04/17/1/阅读这一篇博文 转载前请联系我,联系方式请见我博客 https://wyue.name/ Concentration inequality 刻画了一组随机变量的和(或者样本平均数)与其期望值的偏离程度,在算法收敛性分析过程中是非常有用的一类不等式。 这次主要总结一下最近一段时间遇到的集中不等式,不仅是不等式形式,...

Yue的博客 4554

总结:使用IoMarkPending的原因及原理

 为了使系统吞吐量最大化,I/O管理器希望驱动程序推迟其耗时IRP的完成。驱动程序通过在某个派遣例程中调用IoMarkIrpPending函数并返回STATUS_PENDING来表示完成操作被推迟。(注意:以下讨论未加说明均指在操作被推迟情况下)I/O管理器的原始调用者通常希望在继续执行之前等待操作完成,所以I/O管理器在处理推迟完成时有下面类似的逻辑(不代表真正的Microsoft源代码

gxfan的专栏 4212

uniapp [全端兼容] - 实现人脸识别对比+人脸相似度,从相册选择或拍照上传两张图片进行人脸对比得到人脸相似度及判断是否是同一个人,人脸活体检测及对比(免费纯前端方案+调用第三方API接口方案)

uniApp人脸对比 人脸对比识别 人脸对比相似度,uniapp实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,uniapp实现人脸识别对比,计算两张人脸的相似度,从而判断是否同一个人,并给出相似度评分。uniapp H5网页如何实现人脸相似度比对,uniapp纯前端怎么对比两张图片的相似度,计算两幅图像的相似度,图像相似度对比方法,UNI-APP人脸相似度对比,快速识别两张照片的相似程度(用百分比)图片相似度对比在线测试,图片相似度对比,uniapp微信小程序人脸相似度对比分析,uniapp

🏆 前端领域优质创作者 5018

IOMARKIRPPENDING函数

IoMarkIrpPending IoMarkIrpPending例程用于标记指定的IRP,标志着某个驱动的分发例程(分发函数)因需要被其他的驱动程序进一步处理最终返回STATUS_PENDING状态。 VOID IoMarkIrpPending( IN OUT PIRPIrp); 参数:Irp 将被标记为Pending状态的IRP指针。 返回值: 无 Comments: ...

hutao1101175783的专栏 514

三态门Multisim电路仿真——硬件工程师笔记

三态门原理及应用摘要 三态门是具有高电平(1)、低电平(0)和高阻态(Z)三种输出的逻辑电路,通过使能端(EN)控制状态切换。高阻态时输出端等效断路,避免信号冲突。其核心应用包括: 总线系统:多设备共享总线时,仅使能选中设备的三态门,其余保持高阻态,防止干扰。 数据选择器:利用三态门切换多路输入信号,简化电路设计。 实现方式分两种: TTL三态门(三极管构成):低电平使能有效,仿真验证输出逻辑与高阻态。 MOS三态门(MOS管构成):高电平使能有效,仿真显示使能信号控制输出状态。 文中还附硬件工程师笔试面试

XU157303764的博客 2004

借助AI搞定国社科“研究内容”部分!用Gemini 3 Pro轻松撰写6大模块,让基金本子效率质量更上一层楼

所谓研究整体框架,是对课题研究逻辑结构与技术路径的系统阐述,其核心在于通过研究目标分解、研究内容模块化与研究方法整合,构建一个层次清晰、逻辑严密、科学可行的研究体系。撰写要求:1)分要点、分层次列出主要研究内容,保持各部分之间的逻辑性、层次性与系统性;研究可行性可理解为开展本课题在理论基础、研究方法、研究条件、人员结构、平台支撑及外部协作等方面的可实施程度,可从内部条件与外部条件两个维度进行系统论证。研究背景为:我正在申报xxx年xxx(项目名称),课题名称为:xxx,拟采用的主要研究方法包括:xxx等;

智能AI让学术科研更容易 964

IoMarkIrpPending函数

IoMarkIrpPending IoMarkIrpPending例程用于标记指定的IRP,标志着某个驱动的分发例程(分发函数)因需要被其他的驱动程序进一步处理最终返回STATUS_PENDING状态。 VOID IoMarkIrpPending( IN OUT PIRP  Irp ); 参数:Irp                 将被标记为Pending状态的IRP

skyair624的专栏 4993

ESP32-C3入门教程 基础篇⑩——SNTP(Simple Network Time Protocol) 网络时间同步的简单实例

ESP32-C3入门教程 基础篇⑩——SNTP(Simple Network Time Protocol) 网络时间同步的简单实例

1589

IoMarkIrpPending的使用

IoMarkIrpPendingVOID IoMarkIrpPending( IN OUT PIRP <a class="synParam" onclick="function anonymous(){function anonymous(){function onclick(){function onclick(){showTip(this

Cubie's Blog(カゼドウのブログ) 1604

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

完成例程在什么情况下需要调用 IoMarkIrpPending

完成例程在什么情况下需要调用IoMarkIrpPending(1) 如果完成例程将以 STATUS_PENDING 来结束,则在调用IoCompleteRequest前,必须调用 IoMarkIrpPending。(2) 所有不返回 STATUS_MORE_PROCESSING_REQUIRED 状态的完成例程都需要:   if (Irp->PendingReturned)   {  

Seaquester的专栏 3946

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

wdk tips (5): 再谈IO_STACK_LOCATION:IoMarkIrpPending

<br />IO_STACK_LOCATION很重要,再多聊一点也无妨。上上回我们谈了IO_STACK_LOCATION和那几个重要的函数,当然,我的目的不是扫盲,而是记下一些容易犯错的地方(实际上都是工作中碰到过的钉子)以方便自己回顾。我的记性是如此的差以至于几月不看就会忘记。如果你对这东西没概念,我建议你先多查查WDK文档。<br />上回我们聊了IoCopyCurrentIrpStackLocationToNext和IoSkipCurrentIrpStackLocation的差别(你看我的记性是不是很

myworldbig的专栏 784

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

通过测试实例详细分析 IoMarkPending 的原理

 使用IoMarkPending的原因及原理   为了使系统吞吐量最大化,I/O管理器希望驱动程序推迟其耗时IRP的完成。驱动程序通过在某个派遣例程中调用IoMarkIrpPending函数并返回STATUS_PENDING来表示完成操作被推迟。   I/O管理器在处理推迟完成时有下面类似的逻辑:   Irp->UserEvent =pEvent;//  don't do thi

Jiangkai.net 708

IRP 完成例程

  1.最高层驱动总是运行在发起该请求的程序所处的线程中。DriverEntry总是处在系统线程中,系统线程的空间不涉及到线性地址 0 - 2G。APC 是处在任意上下文中,它所在的线程取决于系统运行APC之前最后被挂起的那个线程。2. 所有不返回 STATUS_MORE_PROCESSING_REQUIRED的完成回调例程,需要使用下面的代码:NTSTATUS MyComplet

八木的专栏 3396

STATUS_PENDING

什么是STATUS_PENDING?如果我还没有使你困惑,我们就继续谈谈STATUS_PENDING和IoMarkIrpPending。 他们的用途是什么? 用途就是我们可以处理异步IRP并且让上层驱动和I/O管理器了解。 第一部分STATUS_PENDING返回是最佳的,所以如果我们想等,我们仅仅需要为异步操作返回它。第二部分是IoMarkIrpPending实际上是传播IRP上的未决返回状

3969

Handling IRPs 9: Summary of Guidelines for Pending IRPs

smmary of Guidelines for Pending IRPs Driver writers must follow certain guidelines when handling IRPs for which STATUS_PENDING can be returned. Ignoring these guidelines may cause post-processing to

静故了群动 808

IRP的完成例程

1.最高层驱动总是运行在发起该请求的程序所处的线程中。DriverEntry总是处在系统线程中,系统线程的空间不涉及到线性地址 0 - 2G。APC 是处在任意上下文中,它所在的线程取决于系统运行APC之前最后被挂起的那个线程。2. 所有不返回 STATUS_MORE_PROCESSING_REQUIRED的完成回调例程,需要使用下面的代码:NTSTATUS MyCompletionRou

windowzhong的专栏 671

读wrk系列 关于IRP(1)

NtReadFile为例,   1.      建立irp PIRP IopAllocateIrpPrivate( IN CCHAR StackSize, IN BOOLEAN ChargeQuota ) //如果大小小于IopLargeIrpStackLocations,那么从prcb->PPLookasideList[number].P;这个快查表里面拿一个,如

Returns' Station 2706
上一篇: irp概述
下一篇: 总结:使用IoMarkPending的原因及原理
vbsourcecode
博客等级 码龄17年 19粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值