关于NT驱动irp pending的注意事项

关于NT驱动irp pending的注意事项发布时间:2008-04-02 20:38:30
  

在NT内核中,有时候不能立马完成一个irp,需要pending它,这个时候有一些微妙的地方需要注意,因为NT得代码没有真正公开,详细搞清楚NT处理IRP的过程很不容易,以前网上有两篇文章讨论过,但我觉得还是讲的不是很清楚.现在win2k得代码泻了很久了,里面也许有关于这块的代码,我没有时间去仔细研究,看哪天有空要好好研究.
但总体而言,pending一个IRP时候,要遵守下面的几条规则:
1.如果你在分派例程中不pending irp,而是完成它,那么一定要设置irp的完成状态和information,然后一定要调用IoCompleteRequest完成该IRP,最后返回你刚刚设定的irp完成状态:
      Irp->IoStatus.Status = STATUS_SUCCESS;

       Irp->IoStatus.Information = bytesTransfered;

       IoCompleteRequest(Irp, IO_NO_INCREMENT);

       return(STATUS_SUCCESS);//这里一定返回STATUS_SUCCESS,因为你刚刚设定Irp->IoStatus.Status = STATUS_SUCCESS
2.如果你要在分派例程中pending它,则你一定要先调用IoMarkIrpPending(),再返回STATUS_PENDING,绝对不能不IoMarkIrpPending就return STATUS_PENDING
3.如果你想返回lower driver的状态给上层驱动,那么如果lower driver返回的是STATUS_PENDING,那么你一定要将它传递上去,除非你有充分的理由返回STATUS_MORE_ PROCESSING_REQUIRED,自己搞定这个IRP,而不需要I/O manager插手.上upper driver传递pending状态的正确方法是在你的完成例程中(注意是在你的完成例程,不是分派例程)这样做:
If(Irp->PendingReturned) {

              IoMarkIrpPending(Irp);

             return STATUS_PENDING;
}
4.如果你没有指定完成例程,则不必管上面第3条规则,I/O manager会自动帮你搞定这一切。
.
lammps后处理:ovito选择原子高级技巧讲解 大家好,我是小马老师。 本文介绍如何在ovito中使用公式(Expression)选择需要的原子。 用ovito查看lammps模拟结果时,可能会遇到选择特定原子的情况,比如选择坐标位于一定范围内的原子,或者选择结构为fcc的原子等等。 这时候,就需要用到expression selection功能。 Expression selection功能比较强大,下面分别介绍几种选择原子的方法。 在输入公式前,先点击“Add modification”->"Expression selection"选项,在B 阅读详情

相关推荐

方差迭代计算公式

方差迭代计算过程推导术语约定递推公式过程推导 术语约定 (1)En=1n∑i=1nxi E_n =\frac{1}{n} \sum_{i=1}^{n}x_i \tag{1} En​=n1​i=1∑n​xi​(1) (2)F(n)=∑i=1n(x2−En) F(n) = \sum_{i=1}^{n}{(x^2-E_n)} \tag{2} F(n)=i=1∑n​(x2−En​)(2) (3)V(n)...

weixin_44479136的博客 7920

什么是Ntrip?Ntrip协议简介

Ntrip通讯协议1.0 [https://www.cnblogs.com/hanford/p/6028156.html](https://www.cnblogs.com/hanford/p/6028156.html) linux ntripserver https://blog.youkuaiyun.com/improve100/article/details/119909554 https://gitee.com/duowei/ntripserverlinux/blob/master/NtripServerLinu

mayue_web的博客 2万+

Matlab之fdesign的应用说明

fdesign 是 MATLAB 中用于数字滤波器设计的工具(属于),它提供了一种系统化的方式来定义滤波器参数并生成相应的滤波器。指定滤波器的频率、幅度等参数。例如,设计一个低通滤波器:Fs = 1000;% 采样率 (Hz)% 通带截止频率% 阻带截止频率Apass = 1;% 通带衰减 (dB)Astop = 60;% 阻带衰减 (dB)

嵌入式老牛的博客 1052

关于NT内核cancel irp的问题

NT内核中IRP的cancel是一个复杂的问题,很容易出错导致系统崩溃,ddk中的文档其实对这部分说的很详细,只是需要认真体会,osr网站上以前在NT insider杂志中有过2篇文章研究这个问题,总结这些资料,写个贴子罐水如下:1.为什么要取消irp?ddk文档中说的很清楚:"Any driver in which IRPs can be held in a pending state 

1677

AI训练加速30%!用numactl玩转多显卡绑核的隐藏技巧

本文深入探讨了如何利用Linux系统的numactl工具,通过精确的NUMA绑核策略优化多GPU AI训练性能。文章详细解析了NUMA架构对性能的影响,提供了从拓扑探查、命令实战到多卡脚本化部署的完整指南,并分享了性能验证与常见陷阱,帮助开发者实现高达30%的训练加速。

web99的专栏 448

OPTI Toolbox v2.28 安装与 3 个求解器补全:SCIP、SeDuMi、MOSEK 配置详解

本文详细介绍了OPTI Toolbox v2.28在MATLAB环境下的完整安装指南,包括SCIP、SeDuMi和MOSEK三个关键求解器的配置与优化技巧。通过分步指导和实战案例,帮助用户高效搭建强大的优化工具包,提升混合整数规划、二次约束二次规划等复杂问题的求解效率。

weixin_29039773的博客 350

Windows驱动开发(三)—— 驱动和应用层通信的几种方式

因此,内核线程和用户进程的通信可以通过进程间通信的方式实现,例如文件映射、共享内存、管道等方式。是 Windows 中的一种轻量级的进程间通信机制,允许在同一台计算机上的不同进程之间进行高效的消息传递。在Windows系统中,驱动程序想要正常工作,往往离不开和用户态进程间的交互。因此,驱动和用户态进程的通信就成为了必不可少的手段。是Windows系统内部使用的一种通信机制,微软没有提供任何的公开文档,因此在实际使用中可能存在一定风险。的请求,用户态进程直接通过设备读写的方式与驱动程序通信。

qq_38933606的博客 1968

Open3D (C++) KD tree的使用【2025最新版】

Open3D (C++) KD tree的使用,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 1566

怎样在驱动层和应用层建立准消息机制(转)

怎样在驱动层和应用层建立准消息机制       作者:TigerZD       怎样在驱动层和应用层建立准消息机制       TigerZD       驱动程序与应用程序运行与不同的环境又紧密合作,但是应用程序通知驱动程序易(IOCTL等),驱动程序通知应用程序却不易。一般的方法是单纯通过EVENT来进行,但是这种方法有其缺点:       1、EVENT只有信号态和非信号态两种区别,不能有

我的编程之旅 2359

《UDS协议从入门到精通》系列——图解0x85:控制DTC的设置

如何让ECU停止或恢复DTC状态位更新?有哪些注意点?图解+示例教你快速上手UDS 0x85服务!!

车载系统攻城狮 3861

【GlobalMapper精品教程】070:专题地图制作完整操作教程

与其它GIS软件一样,Globalmapper也可以制作出漂亮的地图,本文讲解专题地图制作完整操作流程。

智慧空间实验室 3749

windows 驱动开发基础(二)事件通知---关于irp处理,DPC,链表等

代码来源及参考:wdk 7,路径:C:\WinDDK\7600.16385.1\src\general\event 这个例子演示了两种关于当硬件事件发生时,驱动如何通知应用程序的方法。一种是基于event的,一种是基于IRP。但是样例驱动程序实际上没有与任何硬件通信,所以就通过 timer DPC 来模拟硬件事件。应用程序告诉驱动是通过设置event 信号还是完成 pending IRP 来通知自己,并给出一个相对的超时时限。 两种方法的处理流程: 1,基于event的方法 应用程序通过...

pureman_mega的博客 1163

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

Windows NT 驱动程序开发人员提示 -- 应注意避免的事项 1. 一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度例程返回 STATUS_PENDING。  2. 一定不要通过中断服务例程 (ISR) 调用 KeSynchronizeExecution。 它会使系统死锁。  3. 一定不要将 DeviceObject->Fla

startexcel的专栏 1018

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【转帖】INFO: Windows NT 驱动程序开发人员提示 -- 应注意避免的事项

下面是对创建 Windows NT 设备驱动程序的一些提示。 这些提示适用于所有技术。 还可以将这些提示用作解决驱动程序问题的核对清单。 要有效地使用下面提供的信息,您需要具备 Windows NT 体系结构的基本知识和某些设备驱动程序的开发经验。 有关开发设备驱动程序的详细信息,请参见 Windows NT 设备驱动程序工具包 (DDK),该工具包可以通过 MSDN Professional 成

floweronwarmbed的专栏 546

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

驱动开发中应该注意的事项

1.一定不要在没有标注I/O请求数据包(IRP)挂起(IoMarkIrpPending)的情况下通过调度例程返回STATUS_PENDING。2.一定不要通过中断服务例程(ISR)调用KeSynchronizeExecution。它会使系统死锁。3.一定不要将DeviceObject->Flags设置为DO_BUFFERED_IO和DO_DI...

weixin_30917213的博客 200

Windows 文件过滤驱动经验总结

原文地址 http://www.dnjsb.com/xitong/win-xp/7930.html   1、获得文件全路径以及判断时机 除在所有 IRP_MJ_XXX 之前自己从头创建 IRP 发送到下层设备查询全路径外,不要尝试在 IRP_MJ_CREATE 以外的地方获得全路径,因为只有在 IRP_MJ_CREATE 中才会使用 ObCreateObject() 来建立一个有效的 FIL

sqqsongqiqi的专栏 598

Windows内核开发:NTSTATUS状态码详解与应用

NTSTATUS是Windows内核开发中的核心状态编码系统,采用32位结构化存储方式记录操作结果。作为系统级错误处理机制,其编码结构包含严重性级别、设施代码和状态标识等关键信息段,广泛应用于驱动开发、系统调用和内核调试等场景。通过位域解析技术,开发者可以准确诊断STATUS_ACCESS_DENIED等常见问题,并利用WinDbg等工具进行深度分析。在文件系统过滤驱动等实际项目中,合理的NTSTATUS处理能显著提升系统稳定性,同时与Win32错误代码的转换机制为跨层调试提供便利。掌握NTSTATUS编码

weixin_33713350的博客 343

IO_REMOVE_LOCK使用方法小结

IO_REMOVE_LOCK(删除锁)的具体结构没有公开,WDK的文档中中查不到IO_REMOVE_LOCK。最开始看到IO_REMOVE_LOCK是在WDK的例子event中。下面是参考网上的一些资料之后的一点总结,错误的地方请指正。 为什么要用IO_REMOVE_LOCK? WDM 驱动程序在处理设备删除 IRP 并释放驱动程序分配的内存后可能接收到附加的 IRP。在处理附加的 ...

weixin_30530939的博客 111

Windows NTSTATUS代码解析与调试指南

NTSTATUS是Windows操作系统内核和驱动程序使用的标准状态码格式,用于表示操作成功或失败的状态。这些32位整数值遵循特定格式规范,包含严重性位、设施代码和状态码等信息。理解NTSTATUS代码对于系统级问题调试至关重要,尤其在蓝屏错误分析、驱动程序开发和系统日志排查中。通过WinDbg等工具可以解析这些代码,STATUS_ACCESS_VIOLATION(0xC0000005)和STATUS_INVALID_HANDLE(0xC0000008)是常见的错误代码。掌握NTSTATUS的结构和调试技巧

weixin_33802505的博客 352

白话STATUS_PENDING

我们经常看见这样一段驱动的代码: IoCopyCurrentIrpStackLocationToNext( Irp ); IoSetCompletionRoutine( Irp, completionRoutine, &waitEvent, TRUE, TRUE,

sqqsongqiqi的专栏 2045

local_softirq_pending位何时置位

硬中断执行结束在退出之前,都会在irq_exit中判断如果有pending的软中断就触发软中断: 内核代码通过调用raise_softirq_irqoff来触发相应的软中断,将相应的bit位置位,这样在irq_exit中判断就有pending的软中断,进而触发执行相应的软中断(直接执行软中断或触发软中断线程): raise_softirq_irqoff函数调用__raise_softi...

yiyeguzhou100的专栏 4435

linux内核源码分析之软中断

目录 软中断 软中断执行 软中断注册 软中断触发 软中断守护进程 软中断 软中断是在编译期间静态分配的,不像tasklet能动态分配 软中断机制的核心部分是一个表,包含32个softirq_action类型的数据项,软中断由softirq_action结构表示。 struct softirq_action { void (*action)(struct softirq_action *); }; 最多32个软中断,这是一个定值,数目没法动态改变。 static struct

1408
上一篇: 《寒江独钓》键盘过滤部分程序修改
下一篇: IRP的传递与完成
vbsourcecode
博客等级 码龄17年 19粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值