IoSetCompletionRoutine

IoSetCompletionRoutine函数 IoSetCompletionRoutine宏注册一个IO完成例程,这个完成例程将会在调用此函数的驱动的下一层驱动完成IRP指定的操作请求时被调用。 void IoSetCompletionRoutine( IN PIRP      Irp, IN PIO_COMPLETION_ROUTINE      CompletionRoutine, IN PVOID      Cont 阅读详情

IoSetCompletionRoutine宏注册一个IO完成例程,这个完成例程将会在调用此函数的驱动的下一层驱动完成IRP指定的操作请求时被调用。

 

void IoSetCompletionRoutine(

 IN PIRP      Irp,

 IN PIO_COMPLETION_ROUTINE      CompletionRoutine,

 IN PVOID      Context,

 IN BOOLEAN      InvokeOnSuccess,

 IN BOOLEAN      InvokeOnError,

 IN BOOLEAN      InvokeOnCancel

);

 

参数:

Irp

        指向本驱动正在处理的IRP的指针

CompletionRoutine

        驱动提供的完成例程专用接口,当他的下一层驱动程序完成请求包时被调用

Context

        指向传递给完成例程的参数的指针。参数内容由驱动设置,并且只能存储在“非分页”(nonpaged)内存中,因为完成例程的中断请求级范围是IRQP<=DISPATCH_LEVEL.

InvokeOnSuccess

        特指完成例程被调用时的IRP IO_STATUS_BLOCK子域为NT_SUCCESS

InvokeOnSuccess

        特指完成例程被调用时的IRP IO_STATUS_BLOCK子域为不成功的情况

InvokeOnSuccess

        特指完成例程被调用时的IRP IO_STATUS_BLOCK子域指明,它的下层驱动对传下来的这个IRP执行了IoCancelIrp操作

 

返回值:

        无

 

头文件:

        在wdm.h和ntddk.h中声明,需要包含上面两个头文件。

 

comment:

         这个函数在它得到的IRP中设置了完成例程的偏移地址,因此下层驱动可以很容易的调用它。设备驱动链最底层的驱动程序不能调用这个函数。

         IoSetCompletionRoutine注册了相应的回调函数,这类回调函数会在下一层设备完成它传递出去的操作请求时被调用,操作请求有以下几种                  

·  With a success status value

·  With a nonsuccess status value

·  By canceling the IRP

          通常,I/O status子域被下层设备驱动设置。高层驱动的完成例程可以读取但不应修改它。

         

          高层驱动使用IoAllocateIrp或IoBuildAsynchronousFsdRequest 分配/建立 IRP,在调用IoCallDriver时传递驱动 分配/建立 的IRP参数前必须传递所有InvokeOnXXX参数为TRUE来调用此完成例程。当完成例程通过这个IRP被调用时它必须释放驱动建立的IRP和任何其他相关的资源,比如:IoBuildPartialMdl分配的MDL。这类驱动如果调用IoFreeIrp阻止I/0 manager完成这个驱动创建的IRP将会返回STATUS_MORE_PROCESSING_REQUIRED。(Such a driver should returnSTATUS_MORE_PROCESSING_REQUIRED when it calls IoFreeIrp to forestall the I/0 manager's completion processing for the driver-allocated IRP.)

          那种在他们的完成例程执行前可能被unload的非即插即用类驱动要使用IoSetCompletionRoutineEx。

          IoSetCompletionRoutine的调用者必须运行在IRQL<=DISPATCH_LEVEL.

 

 

 

评论(转):

此函数定义一个函数接口给下一层驱动调用,当下一层驱动完成给定的IRP任务时,就调用此函数设定的函数接口,从微软驱动结构来说,最上层接受应用程序发出的命令,做一些处理,并向下一层驱动发出IRP命令,驱动堆栈中驱动按此模式,依次处理命令并向下发出IRP命令,当最底层驱动完成以后,在依次调用此函数定义的函数接口,调用上层驱动的函数,完成操作,这样控制又由最低层依次返回应用程序,完成应用程序的一个调用驱动.

驱动开发函数详解之Wdm 整理常用函数 阅读详情

相关推荐

Ubuntu22.04 上ROS1 Noetic的安装与常见问题解决

本文详细介绍了在Ubuntu 22.04系统上安装ROS1 Noetic的两种主要方法:推荐使用社区维护的适配仓库进行便捷安装,并提供了从源码编译的备选方案。文章重点解决了安装后编译ROS包时极易遇到的“shared_mutex”等C++标准库冲突问题,并给出了其他常见错误的排查与解决指南,帮助开发者顺利搭建稳定的ROS开发环境。

weixin_29295541的博客 361

IoSetCompletionRoutine routine

IoSetCompletionRoutine routine IoSetCompletionRoutine 例程注册了一个 IoCompletion 例程。这个IoCompletion 例程在下一层级的驱动程序完成在IRP中指定的请求操作时被调用。 Syntax   VOID IoSetCompletionRoutine( _In_ PIRP

死胖子的博客 2027

从零开始学习信号完整性(SIPI)--2

上一节我们已经谈过,信号完整性研究的是如何使驱动器输出的信号传输到接收器件并被正确的接收。 信号完整性的三要素包含了:信号、驱动接收芯片、传输通道。 这其中信号是主体,我们要做的主要工作就是设计好信号的传输路径为信号的正确传输扫清障碍。要做信号完整性分析与设计首先要了解信号的特性,以及信号质量的判别标准。 对一个信号进行描述通常需要如下几个指标: 信号特性的描述 摆幅:信号从低电平到高电平之间的电压差,对于单端信号通常由信号的供电电压决......

qq_29476769的博客 2万+

白话IoSetCompletionRoutine

IoCopyCurrentIrpStackLocationToNext    IoSetCompletionRoutine   IoCallDriver 这三个函数一般关联在一起,到底做了什么呢?          先看 IoCopyCurrentIrpStackLocationToNext    FORCEINLINE VOID IoCopyCurrentIrpStackLocation

sqqsongqiqi的专栏 889

语义通信实战:跳过“比特”保“语义”,手把手构建轻量级图像压缩重建网络(基于PyTorch)

本文详细介绍了基于PyTorch的轻量级语义通信系统LICRnet的实现,专注于图像压缩重建中的语义信息保留。通过深度可分离卷积、可变窗口多尺度注意力等创新技术,显著降低计算量并提升性能,特别适用于无人机巡检、远程医疗等物联网场景。文章包含完整的代码实现、训练策略及部署优化方案。

weixin_27697385的博客 220

SMETANA 安装使用教程

关于SMETANA的安装和简单使用信息

qq_44940977的博客 1166

【转帖】驱动编程学习笔记之IO处理

 典型的i/o处理过程=================操作系统将所有的i/o请求都抽象成针对一个虚拟文件的操作,从而掩盖了“一个i/o操作的目标可能不是一个文件结构的设备“这样的事实。这一抽象也使得应用程序对待设备的接口变得泛化。用户模式api   |i/o系统服务api(Ntxxx)   |i/o管理器(Ioxxx)   |内核模式设备驱动程序------驱动程序支持例程(Io,

floweronwarmbed的专栏 2036

Linux下自动化解析q7签名文件的有效期与时间戳

本文详细介绍了在Linux环境下自动化解析q7签名文件有效期与时间戳的方法。通过编写高效脚本,开发者可以批量提取签名时间信息,验证签名有效性,并集成到CI/CD流程中。文章提供了完整的脚本实现,包括错误处理、批量处理功能,并解决了常见环境问题,特别适用于国产操作系统如UOS的开发场景。

weixin_30872499的博客 518

WDF驱动开发-特定于KMDF的技术(五)

WDF驱动开发-和WDM I/O请求相关的处理

王马的博客 1127

SAP Integration Suite 与 SAP Cloud Integration 的关系解析

SAP Cloud Integration是SAP Integration Suite套件的核心组件,专注于消息与流程集成。两者关系可概括为:Integration Suite是SAP BTP上的集成平台套件(iPaaS),而Cloud Integration是其中负责应用与B2B集成的关键能力。日常所说的"CPI"实际指代的是Integration Suite中的Cloud Integration功能。该套件还包含API管理、事件网格等其他集成能力,共同构成企业集成解决方案。理解这一层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 592

置顶必读(2) |《YOLOv8实战:从入门到深度优化》总目录导航 & 学习路线指南(持续更新中)

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 28万+

IoSetCompletionRoutine函数(转载)

IoSetCompletionRoutine宏注册一个IO完成例程,这个完成例程将会在调用此函数的驱动的下一层驱动完成IRP指定的操作请求时被调用。 void IoSetCompletionRoutine( IN PIRP      Irp, IN PIO_COMPLETION_ROUTINE      CompletionRoutine, IN PVOID      Cont

收破烂的 1142

Qt5+Ros+GUI界面

在之前建立的工程的基础上添加一个gui界面。 在ros包中新建一个文件夹,名字叫gui 右击gui文件夹添加一个文件,选择Qt->Qt设计师界面类 选择MainWindow 选择下一步 最后在gui中生成三个文件 mainwindow.cpp、mainwindow.h、mainwindow.ui 但此时,这些新创建的文件和原本的ros工程还没建立任何关系,只是目录下多出了几个文件而已...

二毛的博客 8843

Windows驱动编程(关于IoCopyCurrentIrpStackLocationToNext和IoSetCompletionRoutine以及IoCallDriver)

首先看看IoCopyCurrentIrpStackLocationToNext的实现: #define IoCopyCurrentIrpStackLocationToNext( Irp ) { \ PIO_STACK_LOCATION __irpSp; \ PIO_STACK_LOCATION __nextIrpSp; \ __ir...

kemaWCZ的博客 975

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

IoCopyCurrentIrpStackLocationToNext与IoSetCompletionRoutine的深入理解

1、IoCopyCurrentIrpStackLocationToNext是拷贝本层的IO_STACK_LOCATION 到下一层。在楚狂人的驱动教程中说:如果对irp完成之后的事情有兴趣,并打算在完成函数中处理,应该首先拷贝当前 IO_STACK_LOCATION(IoCopyCurrentIrpStackLocationToNext),然后指定完成函数,并返回 IoCallDriver()所返...

weixin_34283445的博客 301

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IRP请求的完成与返回

 IRP请求的完成与返回    每当完成了一个以IRP为代表的I/O操作请求的时候,就要执行IRP的善后操作IoCompleteRequest(),这是个宏操作,定义为函数IofCompleteRequest()。#define  IoCompleteRequest  IofCompleteRequest    如前所述,以IRP为代表的I/O操作请求的执行可以是同步的,也可以是异步的,所以一

博文视点(北京)官方博客 1940

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

异步IRP的教训(已附DUMP)

[教训]异步IRP中,IoSetCompletionRoutine()要在IoCallDriver()的前面,不然底层驱动完成了读写之后,找不到完成例程,会导致出错。看似简单,不小心却可能带来大麻烦。 [经过]修改驱动,需要把原来较大的IO切成小IO发给磁盘驱动,结果改完后一读写数据就蓝屏,百思不得其解。折腾了很长时间之后,才发现在RwBuildIrpAndCallDriver(...

weixin_30556161的博客 192

突破icesword实现文件隐藏

突破icesword实现文件隐藏 估计想在icesword下隐藏文件的人有很多吧。今天我介绍一种方法。 先介绍一下icesword是如何查找文件的。基本原理就是自己构造一个irp出来,然后直接IoCallDriver发送到fsd。但是 icesword做了更多的工作。它直接读取ntfs.sys 和fastfat.sys,从pe文件格式的角度上计算出正确的fsd的dispatch routine...

编程开发资料库 137

[转&精]IO_STACK_LOCATION与IRP的一点笔记

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料。 1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window) 2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元...

weixin_30449453的博客 978

IO_STACK_LOCATION与IRP的一点笔记

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料。 1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window) 2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都

lixiangminghate的专栏 747

Windows 驱动与驱动之间的通信

本文主要介绍 windows NT 驱动之间利用 CTL_CODE 如何通信. 一般来讲, 用户态的应用程序通过调用 CreateFile 和 DeviceIOControl 就可以和内核态驱动之间进行通信, 如果是内核态的一个驱动程序想和另外一个驱动程序进行类似操作又如何实现呢, 接下来会做详细的说明. 主要的思路是首先得到另外一个驱动的 handle, 再构建一个 IRP, 赋予必要的参

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 2054

剖析一个典型的Keyboard_Hook

//本人巨菜,纯粹的学习笔记 //高手飘过就可以了 //不当之处还请指出,谢谢了. //先mark下,回头再弄,笔记本没电了... 1.键盘过滤 2.深入native application 3.进程与线程 EPROCESS 分析 //关于I/O堆栈 1.当前设备堆栈不对IRP做任何处理. //给出一个通用的DispatchCommon函数 NTSTATUS Dis...

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值