过滤驱动中创建IRP时IO堆栈单元的细节处理

驱动开发(7)IRP与派遣函数 在上一篇博文中,介绍了NT驱动的基本结构,这几篇博文,博主来说说驱动开发的一个核心内容——如何处理I/O请求。 为何要处理I/O请求?因为通常一个驱动程序是为了控制硬件而设计的(虽然没有对应具体硬件的驱动远比有对应具体硬件的驱动要多得多),可以说,是操作系统与硬件通信的桥梁。而I/O操作是控制硬件的基本方法(不考虑对CPU和内存的操作),而驱动程序就是为操作系统提供了一种抽象,驱动程序如 阅读详情
过滤驱动中创建IRP时IO堆栈单元的细节处理

作者:猪头三
网站:http://www.x86asm.com

假设某过滤驱动的分层结构如下:

1 FIDO  <-- 此时你在这里调用IoAllocateIrp()创建一个先的IRP往下层驱动FDO传送
2 FDO
3 PDO

这时创建出来的新IRP[假设用new_IRP来表示],那么new_IRP的StackCount只能是 >= 2,因为FIDO的下层驱动有2个分别是FDO和PDO。
此时new_IRP的IO堆栈单元为StackCount+1。 假设IO堆栈单元有3个,第3个IO堆栈单元表示new_IRP当前IO堆栈单元 第2个表示FDO的IO堆栈单元 第1个表示PDO的堆栈单元

那么如果要发送此IRP到下层驱动FDO,则预先初始化new_IRP的FDO的IO堆栈单元,也就是第二个IO堆栈单元。

此时new_IRP 的 StackCount = 2, CurrentLocation = 3 这里的3表示new_IRP的当前IO堆栈单元 如果你需要把此IRP完FDO驱动传递,那么不用初始化这个IO堆栈单元,为什么呢?

因为IoCallDriver() 内部会调用 类似 IoSetNextIrpStackLocation() 的操作来调整 CurrentLocation的索引。也就是 索引-1 ;

所以要调用IoCallDriver() 把new_IRP传递到FDO这个下层驱动,需要先调用IoGetNextIrpStackLocation() 获取FDO对应的IO堆栈单元,并进行初始化。
初始化完成后才能调用IoCallDriver()
此时new_IRP的 CurrentLocation = 2 这个索引才是指向FDO的IO堆栈单元

下面是来自WMD一书的例子:我上面的话就是为了理解下面的代码片断

发往派遣例程
创建完IRP后,你可以调用IoGetNextIrpStackLocation函数获得该IRP第一个堆栈单元的指针。然后初始化这个堆栈单元。在初始化过程的最后,你需要填充MajorFunction代码。堆栈单元初始化完成后,就可以调用IoCallDriver函数把IRP发送到设备驱动程序:

PDEVICE_OBJECT DeviceObject;     //something gives you this
PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp);
stack->MajorFunction = IRP_MJ_Xxx;
<other initialization of "stack">
NTSTATUS status = IoCallDriver(DeviceObject, Irp);
 

IoCallDriver函数的第一个参数是你在某处获得的设备对象的地址。我将在本章的结尾处描述获得设备对象指针的两个常用方法。在这里,我们先假设你已经有了这个指针。

IRP中的第一个堆栈单元指针被初始化成指向该堆栈单元之前的堆栈单元,因为I/O堆栈实际上是IO_STACK_LOCATION结构数组,你可以认为这个指针被初始化为指向一个不存在的“-1”元素,因此当我们要初始化第一个堆栈单元时我们实际需要的是“下一个”堆栈单元。IoCallDriver将沿着这个堆栈指针找到第0个表项,并提取我们放在那里的主功能代码,在上例中为IRP_MJ_Xxx。然后IoCallDriver函数将利用DriverObject指针找到设备对象中的MajorFunction表。IoCallDriver将使用主功能代码索引这个表,最后调用找到的地址(派遣函数)。

你可以把IoCallDriver函数想象为下面代码:

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

相关推荐

Windows NTFS文件系统与IRP内核派发机制深入解析

在操作系统底层开发与系统安全研究领域,理解文件系统的运作原理是排查疑难问题的关键。Windows 将上层应用的文件操作请求封装为 IRP(I/O 请求包),经由 I/O 管理器分发至文件系统驱动、卷管理驱动直至磁盘设备,构成一条完整的存储栈流水线。这一机制不仅决定了读写性能,更与缓冲区管理、缓存策略及数据恢复等工程实践紧密相关。NTFS 作为 Windows 默认文件系统,其 MFT 记录、日志文件与目录索引等元数据布局,为定位文件操作异常和恢复删除数据提供了底层依据。掌握 IRP 的派发路径、缓冲模式以及

weixin_42116058的博客 70

Windows驱动开发系列之三:WDF驱动开发入门

我将带领大家学习WDM驱动开发,包括重要的理论与实践。我们逐步深入,在系列一和二的基础上慢慢推进,开始学习WDF驱动模型,包括面向对象和事件机制、重要的WDF对象,具体章节包括:1)WDF编程框架:面向对象和事件机制2)WDF重要对象:驱动对象、设备对象、IO队列、IO请求、等3)事件回调函数:从派遣函数到事件回调函数的原理流程解析4)WDF过滤驱动:掌握WDF对IRP的处理,以及过滤驱动的应用5)WDF驱动安装:掌握驱动安装原理和INF文件的重要概念 Windows内核开发寄语:1、Windows内核非常复杂,相关图书和课程都很少,让很多初学者望而生畏;没关系,我带领大家别有兴致地来领略Windows内核的神秘,解开面纱,层层深入。2、本书以Windows10x64位基准,所有程序都编译、运行在Vmware的Win10x64位机器上。vs2019+wdk3、内核学习并不可怕,授人以鱼不如授人以渔,艺多不压身,学习能提升人的综合能力,尤其是核心技术。

Unity 接入HybridCLR的点点滴滴,亲测三平台(PC、Android、WebGL)妥妥的。-问题分享

一入热更深似海啊,没有热更是真恼火啊,干啥啥不方便,动不动就得重新发包;说实在的,也是工作之余研究这个,在原有框架基础上接入这个热更,既要保持原有功能,还要支持热更,实实在在、断断续续搞了这么久,终于是接入并测通了,这一路是坎坎坷坷,下面把走过的弯弯绕绕记录下,希望对后来想接入的小伙伴有帮助吧。

GarFe的博客 1万+

驱动学习(1)---IRP和IO堆栈

WDM使用分层设备对象结构的目的就是使IRP能方便地从一层驱动程序传递到下一层驱动程序。 IPR创建的同时创建IO堆栈数组,并随IRP一起从上层驱动传递到下层。上层为下层建立IO堆栈,若要设置完成例程则使用IoCopyCurrentIrpStackLocationToNext建立堆栈,若无需设置完成例程,使用IoSkipCurrentIrpStackLocation,不建立IO堆栈,因为建立IO堆

xgbing 2706

Python实战:超分辨率图像质量评估全攻略——PSNR、SSIM、LPIPS与NIQE的代码实现与优化

本文详细介绍了在Python中实现超分辨率图像质量评估的完整方案,涵盖PSNR、SSIM、LPIPS和NIQE四大核心指标。通过模块化代码设计、多进程并行处理和GPU加速优化,帮助开发者构建高效、可扩展的评估系统,并提供了实战避坑指南与结果解读方法。

weixin_29053073的博客 475

Camera(5)metadata

Metadata 是整个 Android camera 中类似于高楼大厦中的管道系统一样,贯穿了整个 Camera 的 Framework 和 vendor HAL。Metadata 里面包含了所有的控制、参数、返回值等等。Metadata分为Android原生的Metadata和芯片商或者用户自定义的Metadata,即Android Tag和Vendor Tag。Vendor Tag在Hal中定义,并在camx和chi目录中使用。

qq_55893245的博客 3052

IoSetNextIrpStackLocation routine

IoSetNextIrpStackLocation routine IoSetNextIrpStackLocation 为调用者在驱动程序申请的IRP中设置一个IRP stack location。 Syntax   VOID IoSetNextIrpStackLocation(   _Inout_ PIRP Irp );   Parameters Irp [in, out]

死胖子的博客 568

电池管理系统(BMS)系列—状态估计之SOH

BMS系列文章,介绍了SOH估计

zxx52113140的博客 1846

文件,注册表过滤--Sfilter、Minifilter

本公众号分享的所有技术仅用于学习交流,请勿用于其他非法活动,如有错漏,欢迎留言交流指正 文件,注册表过滤 分层驱动框架 NT驱动框架:单层驱动,只能接受自己进程的IRP Sifileter驱动框架:多层驱动,接受所有进程的IRP 过滤:分层驱动中再加一层而不影响它的上下层,以过滤它们之间的数据,对数据或行为进行安全控制。过滤是通过设备绑定实现的(有多少个文件卷设备就生成多少个文件过滤驱动设备对象一一绑定,这样,发给各个卷设备对象的IRP都会被监控到)。 磁盘过滤驱动:用于文件还原 绑定与..

2570

从零搭建 C# + YOLO 工业视觉系统:从模型训练到上位机部署(工业级落地)

做工业质检、自动化生产线的同学都懂:一套能用的工业视觉系统,既要“检测准”,又要“界面易操作”,还要“部署稳”。之前帮某电子厂做PCB缺陷检测,一开始用Python+YOLO做检测核心,QT做上位机,结果踩了无数坑:Python推理速度波动大,QT和Python跨语言集成繁琐,数据传递容易卡顿;后来换成C# + YOLO的组合,直接打通了“模型训练-上位机开发-工业部署”全流程——C#的WinForms/WPF开发上位机高效,工业相机SDK支持完善;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 737

实战全解|大疆司空2二次开发:从接口开发到第三方业务系统深度融合

大疆司空2二次开发是实现行业无人机定制化应用的关键,通过OpenAPI后端对接+前端组件集成的组合方式,可快速完成功能定制,而与第三方业务系统的深度融合,能彻底打通“业务下发-设备执行-数据回传-流程闭环”的全链路,让无人机管控真正融入行业业务流程。开发过程中,建议优先采用私有版部署保障数据安全,通过中间适配层降低系统耦合度,结合实际业务场景打磨功能,避免过度开发。随着大疆开发者生态的完善,司空2的二次开发能力将持续升级,为更多行业无人机应用提供技术支撑。

2501_93651177的博客 971

从源码角度浅谈IRP

从源码角度看IRP的构建一、前言1、写作目的2、参考资料二、文件加解密中的IRP应用1、概览2、什么是IRP3、StackSize、Attached、AttachedTo的分析4、什么是VPB5、irp的构建与派发6、完成历程的设置7、IoCallDriver函数的理解三、总结 一、前言 1、写作目的 最近研究了文件加解密的驱动代码,获益良多。其中在构建Post过滤函数上遇到了重新从当前设备发送请求查看数据中是否存在加密的代码操作,其中有几步代码看的我百思不得其解,毕竟是刚接触驱动编程的新手,于是乎查阅了《

tatorey的博客 1622

华为OD机试真题 新系统2026-04-08 Python&JS 实现【直捣黄龙】

小王在玩一款叫做直捣黄龙的小游戏,在该游戏中他需要从入口位置进入敌营,绕过哨兵的层层封锁,达到敌军司令部实施斩首行动。 敌军阵营是一个n*n的矩阵,入口在坐标(0,n/2),敌军司令部在坐标(n-1,n/2),每个哨兵警戒以自己为中心的9宫格,一旦被哨兵发现则行动失败。

MISAYAONE的博客 588

IO Stack Location

为了驱动的构建,在IRP建立时,IO管理器给每个驱动分配一个IO堆栈区,每个IO堆栈区由 IO_STACK_LOCATION 结构组成。     IO管理器为每个IRP建立了一个IO堆栈序列,这个序列中每个IO堆栈可以给驱动使用。每个驱动拥有这个序列中的一个堆栈结构,并且 可以通过IoGetCurrentIrpStackLocation函数取得这个IO操作的详细信息。     驱动程序可以通过调用

猫猫不喵喵 的专栏 1606

Windows 11 安装 Miniconda + Mamba,配置国内源

本文详细介绍了在 Windows 11 系统下安装 Miniconda 并配置 Mamba 的完整流程,包括选择精简版 Miniconda 的理由、安装过程中的关键选项设置、配置清华大学镜像源以加速包下载,以及在 base 环境中设置 pip 国内源。同时说明了 Mamba 相较 Conda 的性能优势,并指导用户完成 Mamba 安装与 Shell 集成,最终通过命令验证环境管理功能,帮助用户构建高效、轻量的 Python 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 3345

efm32 入门.pdf

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

rootkit hook 之[五] -- IRP Hook全家福

<br />年过得真快,马上过完了。我们今天一起来汇总看看IRP HOOK的方法。又是长篇大论,别着急,慢慢看。谈到irp拦截,基本上有三种方式,一种是在起 点拦截,一种是在半路拦截,一种是在终点拦截。 下面我们会详细分析这几种方式哪些是有效的,哪种是无效的。 要理解这几种拦截,我们需要看看irp地传 送过程。我们看下图的标准模型。请看大屏幕。  <br />8.JPG下载此附件需要消耗2Kx,下载中会自动扣除。<br /> 注意这个标准模型中,并不是每种IRP都经过这些步骤,由于设备类型和IRP

kansa1988的专栏 490

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

文件系统过滤驱动开发(二)

<br />    声明:高手请一笑而过.>_<<br /> <br />    文件系统过滤驱动开发(一)里面已经讲了文件系统过滤驱动绑定设备的大概思路,剩下的就是一些细节处理部分.<br /> <br />    首先说说fast I/O派遣函数,我们知道,IRP是默认的I/O请求处理机制,IRP可以用于同步或者异步I/O,也可以用于缓存和非缓存I/O,同时还可以用于分页I/O.内存管理器通过发送合适的IRP到文件系统以处理缺页错误.快速I/O是是特别设计用于缓存文件的快速同步I/O.在快速I/O操作中

GaA.Ra的自留地 in Csdn 2589

怀旧版电脑GBC模拟器

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Windows文件系统的过滤器驱动程序设计

Windows文件系统的过滤器驱动程序设计西安电子科技大学 李新摘要:某些应用程序对文件系统的性能有较高要求。例如媒体播放器需要满足最小数据传输率才能保证视觉上的流畅。由于Windows文件系统本身没有提供这样的保证,需要编写过滤器驱动程序添加这项功能。本文首先介绍系统驱动体系和文件系统工作机制,然后分析文件系统过滤器驱动程序的功能特点,最后介绍一种满足此类应用程序传输带宽的总体解决方案(

张云飞的专栏 1136

驱动基础

1、三种类型的WDM驱动程序   总线驱动程序(bus driver)   功能驱动程序(function driver)   过滤驱动程序(filter driver) 2、其他分类方法   类驱动程序(class driver)   端口驱动程序(port driver)   小端口驱动程序(miniort driver) 3、驱动程序对象(DRIVER_OBJECT)

embededvc的专栏 1339

驅動開發學習筆記1

1:設備對象是系統為幫組軟件管理硬件而創建的數據結構,一個物理硬件可以有多個這樣的數據結構。處於堆棧最底層的設備對象稱為物理設備對象(PDO); 2:操作系統的pnp管理器按照設備驅動程序的要求構造了設備對象堆棧。總線驅動程序的任務就是枚舉總線上的設備。并為每個設備創建一個PDO;一旦總線驅動程序檢查到新硬件存在。Pnp管理器就創建一個PDO.創建完PDO后。PNP管理器參照注冊表中的信息查找于...

weixin_30653023的博客 88

WDM驱动开发实战指南:从核心概念到调试避坑

驱动程序是连接硬件与操作系统的核心桥梁,它运行在内核模式,直接管理硬件资源并处理系统I/O请求。其核心原理在于通过定义良好的接口和派遣例程,响应来自用户态应用程序或系统组件的IRP请求,实现硬件抽象与安全访问。掌握驱动开发技术对于深入理解操作系统底层机制、提升系统编程能力具有重要价值,尤其在嵌入式系统、硬件加速、安全软件和虚拟化等场景中不可或缺。本文聚焦于Windows Driver Model这一经典驱动框架,通过解析即插即用、电源管理等核心机制,并结合IRP处理、内存管理等热词,系统阐述WDM驱动的开发

weixin_34405354的博客 349

关于文件透明加密解密

1.windows文件系统概述 硬盘文档加密系统驱动原理一般有两种:通过HOOK一些底层的系统内核调用对文件目录的访问权限进行控制,在文件系统输入输出驱动上层直接建立一个驱动对文件目录的数据进行加密。由于windows文件系统不是物理设备,其堆栈结构比较特殊,因此文件系统过滤驱动也与一般过滤驱动有一些不同(这一点背景可以参考下楚狂人[1]的文档和IFS的提供的若干文档,除了正常的文件接口,还有一种...

JAVA for GIS 444
上一篇: fsd inline hook
下一篇: 在驱动中弹出对话框
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值