IRP的传递与完成

驱动开发:应用程序与驱动程序 IOCTL 通讯 + DeviceIoControl + IRP 详解 使用 DeviceIoControl 函数的前提是:我们在驱动中自定义IOCTL(IO控制码)。这是应用程序和驱动程序交互的一种通信方式。先看看 CTL_CODE 原型:<<16<<14<<2CTL_CODE 宏有四个参数,用于辅助自定义 IOCTL,把4个部分组成一个32位 IOCTL。高16位存储设备类型,14~15位访问权限,2~13位操作功能,最后0,1两位就是确定缓冲区是如何与I/O和文件系统数据缓冲区进行数据传递方式,最常见的就是METHOD_BUFFERED。 阅读详情
在Windows分层驱动模型中,设备栈中的设备一般都是通过对上层传来的IRP做相应的处理来实现驱动的功能。这里对常用的几种IRP传递及完成的方式进行归纳和总结:

1. 在本层驱动中完成

1.1 在本层驱动中以同步方式完成
在本层同步完成一般做完相应处理后,设置Irp->IoStatus.Status和Irp->IoStatus.Information,调用IoCompleteRequest完成该IRP,return IRP的完成状态即可。

1.2 在本层驱动中以异步方式完成
在本层异步完成一般是得到IRP后将其入队/起线程另行处理,同时调用IoMarkIrpPending将该IRP标记为Pending,之后即可return STATUS_PENDING。此时该IRP并未真正完成,需待未决的操作在他处完成后调用IoCompleteRequest才真正完成。


2. 转发至下层驱动

2.1 本层不作处理
有时对于某些IRP,本层驱动不需要做任何处理。此时可调用IoSkipCurrentIrpStackLocation跳过当前设备栈,然后调用IoCallDriver将IRP转发至下层驱动,并将转发的结果直接返回。此种处理方式并不需要关心下层驱动处理IRP的方式究竟是同步还是异步。IRP转发至下层后就与己无关了。

2.2 同步转发方式
有时IRP在本层无法直接处理,需要将其转发至下层,待下层处理完后在其结果上进行修改再将其返回。这时可以采用同步转发方式进行处理。首先在相应dispatch routine中初始化一个未激发的event,调用IoCopyCurrentIrpStackLocationToNext将本层设备栈参数复制到下层。然后设置一个CompletionRoutine,将刚才初始化过的event作为context传给它。之后调用IoCallDriver转发IRP至下层,并判断返回值是否为STATUS_PENDING。是则wait之前的event。在CompletionRoutine中判断该IRP是否PendingReturned,是则说明之前IoCallDriver返回了STATUS_PENDING,于是激发event。CompletionRoutine返回STATUS_MORE_PROCESSING_REQUIRED使我们的dispatch routine重新取得对该IRP的控制权。本层dispatch等待结束再次获得控制权后,进行相应处理,之后需再次调用IoCompleteRequest完成该IRP。
同步转发是驱动中常用的一种IRP处理方式。一般会将本层dispatch转发IRP至下层并等待CompletionRoutine激发event的行为独立成一个ForwardIrpSynchronous的函数。几个dispatch只需一个ForwardIrpSynchronous,代码相对简单。
注意不要在本层dispatch中调用IoMarkIrpPending,因为上层的请求在本层被同步处理了。在同步转发中,如果下层驱动也采用同步方式处理,则本层dispatch不会(也不需要)wait,IoCallDriver返回时CompletionRoutine已经被调用,性能上也没有什么损失。

2.3 异步转发方式
异步转发也能在下层驱动完成IRP时获得处理的机会,其主要是采用了异步处理机制。首先本层dispatch调用IoCopyCurrentIrpStackLocationToNext将本层设备栈参数复制到下层,设置相应的CompletionRoutine,然后调用IoCallDriver将IRP转发至下层驱动,并将转发的结果直接return给上层调用者。在CompletionRoutine中再判断该IRP是否PendingReturned,是则需要调用IoMarkIrpPending。之后可对下层驱动处理该IRP的结果进行相应操作。最后返回STATUS_CONTINUE_COMPLETION(同STATUS_SUCCESS)。
异步转发在异步处理时性能最佳,但处理的逻辑放在了CompletionRoutine中,因此多个dispatch需要编写多个CompletionRoutine。而同步转发往往几个dispatch只需一个ForwardIrpSynchronous即可,代码相对简单。


值得注意的是,各个dispatch routine运行的IRQL是由调用关系决定的。如果上层调用者有运行在DISPATCH_LEVEL的可能,则本层的dispatch也需要按照运行在DISPATCH_LEVEL来设计。比如传递至本层dispatch的IRP是在上层驱动的StartIO例程中转发的,则本层处理该类IRP的代码就可能运行在DISPATCH_LEVEL。

 转自:http://www.cnblogs.com/spinsoft/archive/2012/06/26/2563808.html

Windows内核驱动开发:深入解析I/O请求包(IRP)处理机制与实战 在操作系统内核开发中,I/O(输入/输出)子系统是连接用户应用程序与硬件设备的核心桥梁,其设计直接决定了系统的性能与稳定性。其基本原理是通过统一的抽象接口(如虚拟文件操作)屏蔽底层硬件差异,由I/O管理器将用户请求转化为标准化的内核对象进行处理。这一机制的技术价值在于实现了高效、安全的数据传输与设备控制,是构建文件系统、网络协议栈及各类设备驱动的基础。在Windows平台,该机制的具体实现依赖于两个核心概念:驱动程序对象与设备对象,以及贯穿始终的I/O请求包(IRP)。IRP作为I/O请求的载体,其生命周期 阅读详情

相关推荐

从FPGA工程师视角看CXP-12:如何用Xilinx GTX/GTH收发器搞定一条50Gbps的工业相机数据流?

本文从FPGA工程师视角详细解析了如何利用Xilinx GTX/GTH收发器实现50Gbps的CXP-12工业相机数据流传输。通过协议分析、硬件设计要点和FPGA逻辑实现,帮助开发者高效构建高带宽工业视觉系统,特别适合4K/8K高分辨率图像处理需求。

weixin_42533622的博客 280

[转]分层驱动模型中IRP的传递与完成

在Windows分层驱动模型中,设备栈中的设备一般都是通过对上层传来的IRP做相应的处理来实现驱动的功能。这里对常用的几种IRP传递及完成的方式进行归纳和总结:1. 在本层驱动中完成1.1 在本层驱动中以同步方式完成在本层同步完成一般做完相应处理后,设置Irp->IoStatus.Status和Irp->IoStatus.Information,调用IoCompleteRequest完...

weixin_30522183的博客 177

解决ArcGIS-OpenStreetMap Toolbox-Load OSM File错误

在安装成功OpenStreetMap Toolbox后,首次运行Load OSM File工具,出现以下错误

Zjf的博客 8820

IRP 乱杂谈

IRP 乱杂谈 作者: JIURL                 主页: http://jiurl.yeah.net     IRP 是 I/O request packet 的缩写,即 I/O 请求包。驱动与驱动之间通过 IRP 进行通信。而使用驱动的应用层调用的 CreatFi

jiurl的专栏 4889

一文搞定 GitHub SSH Key:生成、配置、好处全攻略

本文详细介绍了如何配置GitHub SSH Key,实现免密安全认证。主要内容包括:SSH协议的四大优势(免密登录、安全性高、稳定省心、支持自动化);Git身份配置步骤;检查本地SSH Key;生成RSA密钥对;添加密钥到SSH代理;复制公钥到GitHub;测试连接。配置完成后,开发者可通过SSH地址克隆仓库,实现push/pull全程免密操作。该方案显著提升Git使用效率,同时保障安全性,是开发者必备技能。

qq_62904883的博客 956

一键熄火:在 SAP ABAP 平台停用 OAuth 2.0 Client 的正确姿势

本文是一篇面向SAP ABAP平台运维与开发团队的实战指南,重点讲解了OAuth 2.0客户端的停用操作。文章首先阐述了停用的必要性——当客户端存在泄漏风险或配置错误时,停用能在阻断访问的同时保留配置。随后详细介绍了通过SOAUTH2事务码执行停用的具体步骤,并区分了"停用"、"删除"和"撤销令牌"三个关键概念及其适用场景。 文章提供了两个真实案例:一个是怀疑客户端泄漏后的紧急处置流程,另一个是合规审计期间的冻结与恢复操作。最后总结了一份验证清单,

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

IRP 处理流程

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

门没锁的专栏 7344

从零开始学习PX4源码9(部署px4源码到gitee)

由于PX4-Autopilot托管在github,在没有翻墙的情况下,下载固件无法下载。为了提高下载速度,这里将PX4在github上的仓库以及其子仓库(依赖仓库)都搬移到gitee上了。本教程讲解如何快速部署px4固件到gitee上,实现不需要翻墙快速本地就可以下载PX4固件。暂时没有找到如何批量直接通过修改.gitmodules后,使用什么命令可以直接把所有的一级二级子模块的指向直接正常映射。!!

陌城烟雨 810

IRP的同步完成与异步完成

应用程序中对设备进行同步、异步操作,都必须得到驱动程序的支持。所有对设备的操作都会转化为IRP请求,并传递到相应的派遣函数中。可以有两种方式处理IRP请求,第一种是在派遣函数中直接结束IRP请求,即同步处理。另一种方法是在派遣函数中不结束IRP请求,而是让派遣函数直接返回。IRP在以后的某个时候再进行处理。

ingor的专栏 2700

数控系统(CNC)系列:Fanuc 31i-B_(16).CNC系统的网络连接与数据传输

硬件连接:包括网络接口的类型、连接方式等。网络协议:常用的网络协议包括Ethernet、Modbus TCP、Profinet等。网络配置:如何在CNC系统中配置网络参数,使其能够正确接入网络。在网络化的现代工业生产环境中,CNC系统的网络连接和数据传输能力变得越来越重要。通过以太网、Modbus TCP和Profinet等网络协议,可以实现CNC系统与上位机、其他CNC系统以及各种工业设备之间的高效通信。

2401_87715305的博客 2433

Python GUI编程:视频播放器(opencv、tkinter、PIL、ffpyplayer、threading)

用了几天做了一个视频播放器,搞了几个版本,开始想的是运用cv2模块把视频转化成一张张图片,然后再用ffpyplayer模块下的相关类来播放视频。但是,结果画面和视频的音频播放不同步(原因是cv2将转换得到的图片展示到tk上canvas,花费的时间多于每张图片应该展示的时间[1/fps])。后面看到ffpyplayer这个模块官网的介绍,发现这个模块可以得到视频播放时的图片,只不过这个图片是一个对象,我对这个不是很了解,到网上找了很久,终于找到了一篇文章,说可以利用PIL模块下的相关类,把上述这个对象转化成。

坚持不懈的大白的博客 3405

IRP原理及派遣函数基本工作流程

转载于百度文库 http://wenku.baidu.com/link?url=So3khjvq-fqL3G1JjI3BLAJh7dI9DJcaR6Km3m3McAl71wb6FRQK_cnwAOYUBhtMzNm_I7ZkbjM-ZVW1J-z4Txji8kN9WkJRB6SIArPBw-7 I/O Request Packet (IRP) IRP 基本数据结构: IRP 是

baidu_36226689的博客 1765

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Irp的传递与完成

1.在本层驱动中完成1.1在本层驱动中以同步方式完成在本层同步完成一般做完相应处理后,设置Irp->IoStatus.Status和Irp->IoStatus.Information,调用IoCompleteRequest完成该IRP,returnIRP的完成状态即可。 1.2在本层驱动中以异步方式完成在本层异步完成一般是得到IRP后将其入队/起线程另行处理,同时调用IoMarkIrpPending

955

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

分层驱动模型中IRP的传递与完成

本文转自Hanke空间,原文地址:http://hi.baidu.com/hankebao/blog/item/7e8329804e0ce9d2bc3e1e2b.html --------- 在Windows分层驱动模型中,设备栈中的设备一般都是通过对上层传来的IRP做相应的处理来实现驱动的功能。这里对常用的几种IRP传递及完成的方式进行归纳和总结: 1. 在本层驱动中完成 1.1

421

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IRP概述

一、简述 任何内核模式程序在创建一个IRP时,都同时创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序,另外还有一个堆栈单元供IRP的创建者使用。堆栈单元中包含该IRP的类型代码和参数信息以及完成函数的地址。IRP的CurrentLocation为当前IO堆栈单元的索引,IRP的Tail.Overlay.CurrentStack

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

windows过滤驱动程序设计入门(驱动程序基本结构,设备栈,IRP栈和工作原理)

最近在学习windows驱动设计,认真看了些教材后总结了我认为驱动中都会涉及到,也最重要的概念,和大家分享。如果有说的不对的请大家留言指出。谢谢! 这里主要是写概念,代码涉及的不多也不详细,但是我会说出涉及到的API,详细的使用细节大家可以自己动手搜搜。掌握下面的概念之后,看驱动开发的教材里的代码,或者理解教材里说的内容应该就顺利很多! 过滤驱动程序概括: 对于windows驱动程序...

首席技术总监的专栏 657

从IRP说起

从IRP说起 IRP(I/O request package)是操作系统内核的一个数据结构。应用程序与驱动程序进行通信需要通过IRP包。当上层应用程序需要与驱动通信的时候,通过调用一定的API函数,IO管理器针对不同的API产生不同的IRP,IRP被传递到驱动内部不同的分发函数进行处理。对于不会处理的IRP包需要提供一个默认的分发函数来处理。 现在我们来看一下IRP的结构: typed...

weixin_30216561的博客 96

《寒江独钓》内核学习笔记

《寒江独钓》内核学习笔记(1)-- IRP - .Little Hann 时间 2013-11-30 15:40:00  博客园_.Little Hann原文  http://www.cnblogs.com/LittleHann/p/3450436.html 在学习内核过滤驱动的过程中,遇到了大量的涉及IRP操作的代码,这里有必要对IRP的数据结构和与之相关的API函数做一

码码要洗手 1239

Windows 文件过滤驱动经验总结(转)

1、获得文件全路径以及判断时机 除在所有 IRP_MJ_XXX 之前自己从头创建 IRP 发送到下层设备查询全路径外, 不要尝试在 IRP_MJ_CREATE 以外的地方获得全路径,因为只有在 IRP_MJ_CREATE 中才会使用 ObCreateObject() 来建立一个有效的 FILE_OBJECT。而在 IRP_READ IRP_WRITE 中它们是直接操作 FCB (Fil

zfdyq 2241

Windows 文件过滤驱动经验总结

看了 ChuKuangRen的第二版《文件过滤驱动开发教程》后,颇有感触。我想,交流都是建立在平等的基础上,在抱怨氛围和环境不好的同时应该先想一想自己究竟付出了多少?只知索取不愿付出的人也就不用抱怨了,要怪也只能怪自己。发自己心得的人无非是两种目的,一是引发一些讨论,好纠正自己错误的认识,以便从中获取更多的知识使自己进步的更快。二是做一份备忘,当自己遗忘的时候能够马上找到相关资料。我这

trents的专栏 631

windows内核情景分析---设备驱动

设备驱动 设备栈:从上层到下层的顺序依次是:过滤设备、类设备、过滤设备、小端口设备【过、类、过滤、小端口】 驱动栈:因设备堆栈原因而建立起来的一种堆栈  老式驱动:指不提供AddDevice的驱动,又叫NT式驱动 Wdm驱动:指提供了AddDevice的驱动 驱动初始化:指IO管理器加载驱动后,调用驱动的DriverEntry、AddDevice函数 设备栈中上层设备与下层设备的绑定关

maomao171314的专栏 2055

Driver 加载步骤

1)当硬件连接到PC或从PC移除时,在硬件上会有信号跳变,BUS Driver会检测到器件的插入和移除,比如DVI的hotplug,再比如USB1.1的1.5K上拉。BUS Driver将调用IOInvalidateDevcieRelations,PNP Manager将知道BUS上的Device关系有所改变。   2)为了获得新的Device关系,PNP Manager将调用IRP_

求索 1368

白话IoSetCompletionRoutine

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

sqqsongqiqi的专栏 889
上一篇: 关于NT驱动irp pending的注意事项
下一篇: 硬盘的数据结构
vbsourcecode
博客等级 码龄17年 19粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值