IRP和IO_STACK_LOCATION

当一个应用程序调用函数去操作某个设备时,比如调用createFile,deviceIOControl,等等时,I/O管理器为此函数创建一个IRP数据结构对象和一个IRP_STACK_LOCATION数据结构对象数组。

(数组个数等于驱动程序堆栈上驱动的个数)。IRP对象中的数据成员是已经被填充好了的,其中有一个CurrentLocation是当前IRP_STACK_LOCATION堆栈单元的索引,Tail.Overlay.CurrentStackLocation

是当前IRP_STACK_LOCATION单元的指针。

一开始的时候,它当然是指向IRP_STACK_LOCATION数组的第一个元素。

这调用某个驱动程序的分发函数时,IRP作为参数传给了该分发函数,这样,该函数就可以访问IRP中的Tail.Overlay.CurrentStackLocation, 这样就可以访问IRP_STACK_LOCATION的

成员了(当然我们不需要直接这样做,而是调用IoGetCurrentStackLocation来实现)。因为OS并不会为我们初始化IRP_STACK_LOCATION数组中的每一个对象,所以初始化下一层驱动要使用的IRP_STACK_LOCATION就由它的上一层驱动来完成。要初始化它们,首先要找到它们,方法是调用IoGetNextStackLocation(它内部实现只是将CurrentStackLocation++),得到下一个IRP_STACK_LOCATION

对象指针。然后为其赋值。然后调用IOCALLDRIVER().

理解的关键点是:

一 OS为我们生成IRP,IPR_STACK_LOCATION数组,注意,是个数组。IRP中的CurrentStackLocation指向IRP_STACK_LOCATION中的某一个元素。

二 OS 并不会为我们填充好IRP_STACK_LOCATION数组,每一个元素是由上一层驱动负责填充的。

三 IRP_STACK_LOCATION数组,它们的元素之间不需要指针联系。

四 OS只负责把IRP包给最上层的驱动程序,至于如何向下层,就是驱动程序自己的事情了。所以下层对就的那些IRP_STACK_LOCATION,完全由上层驱动函数负责填充,OS不管。

 

驱动程序如何填充一层驱动需要用的IRP_STACK_LOCATION呢?

可以通过调用IoGetNextIrpStackLocation调用得到。其实该函数内部就是返回CurrentStackLocation加1而已。对数组值加1,当然就是得到数组的下一个值了。

这样就可以对它进行赋值了。然后调用IoCallDriver(),IoCallDriver()会将irp包中的CurrentStackLocation值加1,然后调用那个DRIVER.

 

如果下一层的驱动需要的IRP_STACK_LOCATION和本层驱动的一样,则可以直接调用IoSkipCurrentIrpStackLocation或IoCopyCurrentIrpStackLocationToNext.

IoSkipCurrentIrpStackLocation将CurrentStackLocation减1. 正好与IoCallDriver的加1抵消。所以相当于下层驱动和本层驱动用的是同一个IRP_STACK_LOCATIN元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IRQL

转自:http://blog.csdn.net/changsha2011/article/details/6895529 最近开始入门windows 驱动开发,遇到一个IRQL。不知道何解,于是找了些资料,顺带记录下。下面的东西可能有不准确,如发现错误之处请指正,以…

#pragma code_seg(INIT)/code_seg(PAGE)

转自:http://blog.chinaunix.net/uid-24504987-id-161192.html Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存 有些虚拟内存 永远不会交换到文件中,这些内存叫非分页内存 #define PAGEDCODE code_seg(“PAGE”);//分页内…

JSON.stringify() 方法

JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串,如果指定了replacer是一个函数,则可以替换值,或者如果指定了replacer是一个数组,可选的仅包括指定的属性。 语法 JSON.stringify(value[, repla…

师--链表的结点插入

Problem Description 给出一个只有头指针的链表和 n 次操作,每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。Input 多组输入。每组数据首先输入一个整数n(n∈[1,100]),代表有n次操作。接下来的n行&…

BeanUtils工具的使用(转载)

原文章地址:https://www.cnblogs.com/vmax-tam/p/4159985.html BeanUtils工具 什么是BeanUtils工具 BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品。 BeanUtils工具一般可以方便javaBean的哪些操作? 1&…

线程可警告状态以及APC队列

转自:http://blog.csdn.net/qq_22423659/article/details/53425828 一、线程可警告状态的真实含义 1、通过另一些方法让线程"暂停"(非SuspendThread方法,比如SleepEx,wait函数族等),并可以进入一种称之为 Alterable的状…

数据结构实验之链表三:链表的逆置

Problem Description 输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据。Input 输入多个整数,以-1作为结束标志。Output 输出逆置后的单链表数据。…

DBUtils使用详细示例(转载)

https://www.cnblogs.com/smyhvae/p/4085684.html

APC异步过程调用

转自:http://blog.sina.com.cn/s/blog_c2ef450f010192hx.html APC 异步过程调用 记得第一次看见这个名词的时候,觉得云里雾罩,然而上网看了下它的介绍,感觉说的都是没头没脑的 然而今天,我再次接触了它,我将…

张小龙:如何把产品做简单

今天从一个小故事开始讲:为什么苹果的手机只有一个按钮? (台下:我觉得对于用户来说,只有一个按钮不会有太多的干扰,只要从这里开始,其它的菜单都在这里面了,这是我个人的一些想法。&…

数据结构实验之链表九:双向链表

Problem Description 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内存中找到下一个位置,这是一个不会轻易断裂的链。但单链表有一个弱点——不能回指。比如在链表中有两个节点A,B,他们的关系是B是A的后…

不敢死队问题

Problem Description 说到“敢死队”,大家不要以为我来介绍电影了,因为数据结构里真有这么道程序设计题目,原题如下: 有M个敢死队员要炸掉敌人的一个碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战…

槽边往事

http://chuansong.me/account/bitsea?start12

数据结构实验之链表五:单链表的拆分

Problem Description 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据的相对次序与原链表一致。Input 第一行输入整数N;; 第二行依次输…

聊天机器人调用API实现

后端调用API: package com.mychat.servlet;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder;…

Dump文件

1. Dump文件 1. Dump文件介绍 Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀。dump文件是进程在内存中的镜像文件,通过转换然后存储成以.DMP后缀的文件。dump文件根据存储时的选项不同,会生成不同大小的文件,其中…

整理音乐

Problem Description 请用链表完成下面题目要求。 xiaobai 很喜欢音乐,几年来一直在收集好听的专辑。他有个习惯,每次在听完一首音乐后会给这首音乐打分,而且会隔一段时间给打好分的音乐排一个名次。今天 xiaobai 打开自己的音乐文件夹&#…

VS2013正在等待所需操作完成

在用VS2013打开解决方案的时候,遇到”正在等待所需操作完成 ,此对话框将在操作完成后关闭“一直弹出显示,解决方案无法加载的情况!此时需要将与解决方案名字相同的文件全部相同(除解决方案文件除外)全部删除…