Windows NT FileSystem Internals》学习笔记之IO_STACK_LOCATION的结构

Windows NT File System Internals(中文版) Windows NT File System Internals(中文版) Windows NT File System Internals(中文版) 立即下载

by fengcaho

NTDDK定义的Stack Location结构体由以下几个字段组成:

MajorFunction:

该字段定义了一个函数功能集,内核模式驱动可以实现其中的每一个函数。每一个函数由一个函数代码对应。

当内核模式驱动接收到一个IRP时,驱动首先检查当前StackLocation中的MajorFunction字段,得出驱动将要执行的功能,可能的MajorFunction功能代码如下:

#define IRP_MJ_CREATE                   0x00

#define IRP_MJ_CREATE_NAMED_PIPE        0x01

#define IRP_MJ_CLOSE                    0x02

#define IRP_MJ_READ                     0x03

#define IRP_MJ_WRITE                    0x04

#define IRP_MJ_QUERY_INFORMATION        0x05

#define IRP_MJ_SET_INFORMATION          0x06

#define IRP_MJ_QUERY_EA                 0x07

#define IRP_MJ_SET_EA                   0x08

#define IRP_MJ_FLUSH_BUFFERS            0x09

#define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a

#define IRP_MJ_SET_VOLUME_INFORMATION   0x0b

#define IRP_MJ_DIRECTORY_CONTROL        0x0c

#define IRP_MJ_FILE_SYSTEM_CONTROL      0x0d

#define IRP_MJ_DEVICE_CONTROL           0x0e

#define IRP_MJ_INTERNAL_DEVICE_CONTROL  0x0f

#define IRP_MJ_SHUTDOWN                 0x10

#define IRP_MJ_LOCK_CONTROL             0x11

#define IRP_MJ_CLEANUP                  0x12

#define IRP_MJ_CREATE_MAILSLOT          0x13

#define IRP_MJ_QUERY_SECURITY           0x14

#define IRP_MJ_SET_SECURITY             0x15

#define IRP_MJ_POWER                    0x16

#define IRP_MJ_SYSTEM_CONTROL           0x17

#define IRP_MJ_DEVICE_CHANGE            0x18

#define IRP_MJ_QUERY_QUOTA              0x19

#define IRP_MJ_SET_QUOTA                0x1a

#define IRP_MJ_PNP                      0x1b

#define IRP_MJ_PNP_POWER                IRP_MJ_PNP      // Obsolete....

#define IRP_MJ_MAXIMUM_FUNCTION         0x1b

MinorFunction

MinorFunction提供了MajorFunction更详细的信息

Flags

      Flags提供了函数期望驱动执行的附加信息

Control

       当内核驱动异步处理IRP时,驱动可以通过调用IoMarkIrpPending()将IRP标记为Pending状态,以排队IRP处理。IoMarkIrpPending实际上只是将当前Stack Location的Control字段设定为SL_PENDING_RETURNED。内核驱动可以检查该字段查询是否有该标记。

DeviceObject

     当调用IoCallDriver()时,NT I/O管理器设定该字段,该字段的内容被设定为目标设备对象的指针。

Win2K源代码中可以看出上面的过程:

NTSTATUS

FASTCALL

IopfCallDriver(

    IN PDEVICE_OBJECT DeviceObject,

    IN OUT PIRP Irp

    )

 

/*++

Routine Description:

    This routine is invoked to pass an I/O Request Packet (IRP) to another

    driver at its dispatch routine.

Arguments:

    DeviceObject - Pointer to device object to which the IRP should be passed.

    Irp - Pointer to IRP for request.

Return Value:

    Return status from driver's dispatch routine.

--*/

{

    PIO_STACK_LOCATION irpSp;

    PDRIVER_OBJECT driverObject;

    NTSTATUS status;

    //

    // Ensure that this is really an I/O Request Packet.

    //

    ASSERT( Irp->Type == IO_TYPE_IRP );

    //

    // Update the IRP stack to point to the next location.

    //

    Irp->CurrentLocation--;

if (Irp->CurrentLocation <= 0)

{

        KeBugCheckEx( NO_MORE_IRP_STACK_LOCATIONS, (ULONG_PTR) Irp, 0, 0, 0 );

    }

    irpSp = IoGetNextIrpStackLocation( Irp );

    Irp->Tail.Overlay.CurrentStackLocation = irpSp;

    //

    // Save a pointer to the device object for this request so that it can

    // be used later in completion.

    //

    irpSp->DeviceObject = DeviceObject;

    //

    // Invoke the driver at its dispatch routine entry point.

    //

    driverObject = DeviceObject->DriverObject;

    PERFINFO_DRIVER_MAJORFUNCTION_CALL(Irp, irpSp, driverObject);

    status = driverObject->MajorFunction[irpSp->MajorFunction]( DeviceObject,

                                                              Irp );

    PERFINFO_DRIVER_MAJORFUNCTION_RETURN(Irp, irpSp, driverObject);

    return status;

}

FileObject

       I/O管理器将该字段设定为指向I/O操作的目标文件对象

CompletionRoutine

       当调用IoSetCompletionRoutine()函数时,设定该字段。I/O管理器在IRP处理完成时,要进行一系列的事后处理,其中就包括检查CompletionRoutine。如果指定了CompletionRoutine,该函数就将在执行事后处理的线程中调用;一般情况下就是调用IoCompleteRequest()函数的线程上下文中。

       CompletionRoutine采用堆栈顺序调用,即最后指定的CompletionRoutine最先调用,因此最高层驱动的完成函数最后被调用。如果某个驱动CompletionRoutine返回了STATUS_MORE_PROCESSING_REQUIRED,I/O管理器将立即停止IRP事后处理。返回STATUS_MORE_PROCESSING_REQUIRED的驱动有责任释放IRP占用的内存。

       如果你开发一个高层的驱动程序,例如文件系统驱动或者过滤驱动,并且指定了一个Completion Routine。记得使用以下代码:

if(PtrIrp->PendingReturned)

{

IoMarkIrpPending(PtrIrp);

}

否则的话IRP处理将会出现错误。

Context

       该字段为Completion Routine提供参数 

Windows NT File System Internals . pdf Windows NT File System Internals.pdf 英文版 立即下载

相关推荐

Windows NT File System Internals(中英文两本,含随书源码)

Windows NT File System Internals(中英文两本,含随书源码) 注意:这里的英文版是单独一本完整版,其它帖子里的英文版是分散独立的,内容有缺失~~

【翻译WINDOWS NT FILE SYSTEM INTERNAL】NT缓存管理器一(1)

虽然不断发展的技术为我们带来了更快更便宜的存储设备,(accessingdata off secondary storage media中的off是什么意思,难道off有“从。。”的意思)从二级存储媒介访问数据一直比从系统内存数据缓冲读数据慢很多。因此,管理大量数据的应用程序(如数据库管理程序)为了获取更好的性能,在应用程序访问数据之前让数据进入系统内存(Read-aheadfunctionali...

t225com 298

windows nt file system internal 第九章中文

windows nt file system internal第九章翻译,第一部分。 网上有1-6的中文部分,后面的没有放出来,这是我自己的翻译。第一次献丑,如有错误,请批评指正。

硬盘文件系统系列专题之二 NTFS

一、NTFS概述NTFS (New Technology File System),是 WindowsNT 环境的文件系统。新技术文件系统是Windows NT家族(如常见的Windows XP、Win7 、Win8、Win10)等的限制级专用的文件系统(操作系统所在的盘符的文件系统必须格式化为NTFS的文件系统,4096簇环境下)。NTFS取代了老式的FAT文件系统。NTFS可以支持的分区(如果采用动态磁盘则称为卷)大小可以达到2TB。

存储随笔 1万+

Windows NT文件系统深度解析

本专栏深入剖析Windows NT文件系统的核心机制,涵盖I/O管理、缓存体系、虚拟内存与驱动开发实践。结合原著《Windows NT File System Internals》的技术精髓,解析文件控制块、Unicode字符串处理、过滤器驱动设计等关键技术。适合内核开发者、系统程序员及存储技术爱好者,帮助读者掌握NT系统底层原理,提升驱动开发与系统调试能力。内容兼顾理论与实战,配有结构化代码分析与设计思路,是深入Windows系统内部不可多得的进阶指南。

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

各位FPGAer周末愉快,今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。

haoxingheng的专栏 1448

IO_STACK_LOCATION

IO_STACK_LOCATION IO_STACK_LOCATION 结构定义了一个 I/O stack location, 是每个IRP关联的 I/O stack的其中一个入口。 在IRP中的每个I/O stack location 都有一些通用的成员和一些与请求相关的成员。 typedef struct _IO_STACK_LOCATION { UCHAR MajorFunct

死胖子的博客 1786

西门子S7-1200的PID应用(恒温热水器)

物料清单:1200PLC一台,模拟量输入模块SM1231(PLC自带的输入通道不支持4-20mA电流输入)一个,PT100一个,温度变送器,热得快,固态继电器。 第一步,硬件接线; 第二步,新建1200工程,添加PLC和模拟量输入模块,修改模块的模拟量输入类型为4-20mA,模拟量模块的IO地址为96-103(8个字); 第三步,新建循环组织块OB30,循环时间选择默认点1...

weixin_30835649的博客 6551

关于windows驱动中的IO_STACK_LOCATION

理解IO_STACK_LOCATION是驱动入门的一个重要知识点,该结构体是理解驱动工作过程的核心知识之一。闲话不多时,直接看代码,看完下面几段windows源码,你要还不能理解,直接来找我。

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

Wireshark抓包分析:如何从HTTP流量中快速定位黑客攻击痕迹(附pcap文件)

本文通过Wireshark实战,详细解析了如何从HTTP流量中快速定位黑客攻击痕迹。文章提供了核心过滤策略,并重点剖析了如何识别SQL注入攻击的流量特征、揭露WebShell的隐蔽通信以及追踪攻击者在横向移动中的行为,帮助安全人员系统性地从pcap文件中还原完整攻击链。

sprite的博客 1010

Score Matching(得分匹配)

Score Matching(得分匹配)是一种统计学习方法,用于估计概率密度函数的梯度(即得分函数),而无需知道密度函数的归一化常数。这种方法由Hyvärinen在2005年提出,主要用于无监督学习,特别是在密度估计和生成模型中。

weixin_39699362的博客 2168

《Windows NT FileSystem Internals》学习笔记之IO_STACK_LOCATION的结构

NTDDK定义的Stack Location结构体由以下几个字段组成:MajorFunction:该字段定义了一个函数功能集,内核模式驱动可以实现其中的每一个函数。每一个函数由一个函数代码对应。当内核模式驱动接收到一个IRP时,驱动首先检查当前StackLocation中的MajorFunction字段,得出驱动将要执行的功能,可能的MajorFunction功能代码如下:

不论你在什么时候开始,重要的是开始之后就不要停止。 1430

SAP_SD模块深度解析SAP信用检查中的“未清数量”取值逻辑

确认数量 vs 订单数量:如果系统配置了可用性检查(ATP),并且订单只确认了部分数量,信用检查通常只占用已确认数量的额度(具体取决于信用组的配置)。在SAP中,未清订单数量的计算并非简单读取订单行项目的目标数量(VBAK-KWMENG),而是基于**计划行(Schedule Lines)**层级来汇总的。状态的转换点:当交货单创建(VL01N)并保存时,这部分数量对应订单的“未清订单数量”减少,“未清交货数量”增加。业务人员眼中的未清数量很简单:“我卖了100个,发了30个,未清就是70个”。

我小时候很黑的博客 315

《Windows NT FileSystem Internals》学习笔记之IO_STACK_LOCATION的学习

学而时习之,不亦悦乎?这次记下的时IO_STACK_LOACTION的东东,以前就知道用,一直很迷糊,现在终于搞通了,爽!还发现一个秘密,微软的Win2K源代码真是好东西啊,可惜放在我硬盘上的宝贝被浪费这么长时间。IO_STACK_LOCATION和它的名字一样,是一个类似于栈的结构,属于先进后出的结构,看下面的例子 : 如上面的图所示,I/O管理器想文件系统驱动发送一个读

不论你在什么时候开始,重要的是开始之后就不要停止。 1796

华为OD机试真题 新系统 2026-04-22 C++ 实现【小学生班长选举增强版】

9 月份开学第一天,小学某班级进行班长选举活动,班级共有 N 个学生,每个学生最多可投 3 票(对同一个人只能投一票),也可以弃权不投票,大家投票时写上对应学生的名字。 假设学生不存在重名。考虑到部分少数民族名字带分隔,且整体较长,同学在投票时为了方便,允许同学写全称,也可以只写其中的部分连续段。 例如班级里只有 2 个少数民族名称带点的同学:

MISAYAONE的博客 169

无人机——电机篇(一)

1. 电机的定义 电机俗称“马达”,是无人机的动力来源,无人机通过改变电机的转速来改变无人机的飞行状态。即改变每个电机的速度,使得无人机能够盘旋空中,上升或下降,或向各个方向移动。2. 电机的分类 电机分为:“无刷电机”和“有刷电机” - 无刷电机:是采用半导体开关器件来实现电子换向,具有可靠性高、低干扰、低噪声低、寿命长等优点。一般应用在稍大型的飞行器,载重大,可以有更广泛的用途。 - 有刷电机:是内含电刷装置的将电能转换成机械能(电动机)或将机械能转换成电能(发电机)的旋转电机。有刷电机是所有电机的基

weixin_46066938的博客 1万+

Windows 驱动中的IO堆栈

最近好忙,事情好多,不知道,自己能不能遵守之前的约定,一个星期更新一篇。尽量抽出时间了,还有要注意身体,身体是自己的,身体是革命的本钱,身体不好,再大的志向,也不可能实现。忙中偷闲,喝杯茶去!             今天来看一下,跟IRP密切相关的一个数据结构,IO_STACK_LOCATION,即IO堆栈,我们知道内核的IO管理器,每创建一个IRP,必然会创建一个IO_STACK_LOCAT

Z18_28_19的专栏 1944

AI 编程工具面试题(Claude Code、Codex 等)进阶篇(一)

答案MCP 是 Anthropic 推出的开放协议,允许 LLM 安全连接外部工具和数据源。Claude Code 可以作为 MCP 客户端,通过配置连接到 MCP 服务器(如文件系统、数据库、API),从而获得实时上下文和工具调用能力,大大扩展编程场景。追问:请举一个用 MCP 查询数据库 schema 并自动生成对应 Model 代码的流程。追问参考答案部署 MCP 数据库服务器(如),配置只读数据库连接。在中添加该服务器。启动 Claude Code,说“查询public。

篮球界最会写bug的人;程序猿中打球最菜的人。 90

《Windows NT File System Internals》学习笔记之Windows NT系统启动顺序

操作系统的启动顺序因为系统、处理器、操作系统版本和结构的不同而不同。NT系列的操作系统启动顺序如下:1.电脑的系统启动模块调用NT系统启动程序,OS Loader组件传递一个BootRecord结构体给该程序。NT系统启动程序执行全局初始化工作,然后决定操作系统启动分区,初始化工作还包括初始化启动过程中使用到的内存描述符。NT系统启动程序也调用一个堆初始化程序,该程序创建内存描述符,这

不论你在什么时候开始,重要的是开始之后就不要停止。 1535

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

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

调试笔记之雨过天晴多点还原软件MBR实例

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;B

jgftyfc的博客 505

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Window XP驱动开发(二十三)Window驱动的派遣函数

转载请标明是引用于 http://blog.youkuaiyun.com/chenyujing1234  欢迎大家拍砖   参考书籍>   用户模式下所有对驱动程序的I/O请求,全部由操作系统转化一个叫做IRP的数据结构,不同的IRP数据会被“派遣”到不同 的派遣函数(Dispatch Function)中,这也是派遣函数名字的由来。 1、 IRP与派遣函数 IRP的处理机制类似Windows

chenyujing1234的专栏 3399

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[Win32驱动10] 派遣函数与读写方式

1. 派遣函数 在Windows中,用户态进程的各类IO请求最后都会转化成对应的IRP请求并发送给底层驱动。其流程差不多是这样的,拿WriteFile来举例: 在用户态调用WriteFile函数 WriteFile会调用NTDLL.dll中的NtWriteFile函数 NtWriteFile会陷入内核调用系统服务NtWriteFile(注意只是相同的名字,但本质完全不同) NtWriteFile会生成相应的IRP,对应IRP类型为: IRP_MJ_WRITE并将其发送给底层对应驱动 IRP会顺次

輚至消亡 993

浅谈驱动中强制结束进程的3种方法

一个应用程序想要结束另一个进程所要做的事:首先获得目标的进程ID,接着利用OpenProcess获取进程句柄(确保足够权限),最后将句柄传给TerminateProcess了结那个进程. OpenProcess通过本机系统服务接口进入核心态,随后调用ntoskrnl的NtOpenProcess.在服务函数里,系统使用SeSinglePrivilegeCheck检查调用者是否有DEBUG权

少仲 7287

CMD中相关命令操作

ASSOC          显示或修改文件扩展名关联。 ATTRIB         显示或更改文件属性。 BREAK          设置或清除扩展式 CTRL+C 检查。 BCDEDIT        设置启动数据库中的属性以控制启动加载。 CACLS          显示或修改文件的访问控制列表(ACL)。 CALL           从另一个批处理程序调用这一个。 CD      ...

GET知识不迷路,点赞评论加关注! 636
上一篇: Windows NT FileSystem Internals》学习笔记之Complete IRP
下一篇: Windows NT File System Internals》学习笔记之物理内存管理简介
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值