当一个应用程序调用函数去操作某个设备时,比如调用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元素。

IRP和IO_STACK_LOCATION相关推荐

  1. windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互

    windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互 前面两篇学习笔记分别介绍了IRP和IO_STACK_LOCATION,整个设备栈来处理这个IRP,但是每个设 ...

  2. IRP和IO_STACK_LOCATION结构

    图5-1显示了IRP的数据结构,阴影部分代表不透明域.下面是该结构中重要域的简要描述. MdlAddress(PMDL)域指向一个内存描述符表(MDL),该表描述了一个 与该请求关联的用户模式缓冲区. ...

  3. Windows驱动之IRP结构

    文章目录 Windows驱动之IRP结构 1. IRP 2. IO_STACK_LOCATION 3. IRP 和 IO_STACK_LOCATION 的交互 3.1 IoAllocateIrp 3. ...

  4. 内核文件管理-IRP(一)创建或打开文件

    内核下通过直接向 FSD (File System Driver) 发送 IRP (I/O Request Packet)来管理文件,可以绕过一些 API Hook. 本文讲怎样通过向 FSD 发送 ...

  5. 创建IRP的相关内容

    篇一: 在驱动程序中,经常会调用其他的驱动程序:其中,手动构造IRP,然后将IRP传递到相应驱动程序的派遣函数中是一种比较简单的方法,下面就来介绍下手动创建IRP的几种不同的方法及其特点. 创建IRP ...

  6. Windows驱动编程基础教程

    前言     本书非常适合熟悉Windows应用编程的读者转向驱动开发.所有的内容都从最基础的编程方法入手.介绍相关的内核API,然后举出示范的例子.这本书只有不到70页,是一本非常精简的小册子.所以 ...

  7. Driver Development Part 1: Introduction to Drivers

    //来自codeproject的文章,共有六篇,感觉写的挺好的.因为不想经常翻墙,所以先收藏. //对于初学者是不错的文章,虽然是英文但是咬咬牙还是可以看懂的,建议不要百度.google翻译了 //M ...

  8. 楚狂人Windows驱动编程基础教程

    版权声明     本书是免费电子书.作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者以任何形式(包括各种 ...

  9. 《寒江独钓》内核学习笔记(1)-- IRP - .Little Hann

     原文  http://www.cnblogs.com/LittleHann/p/3450436.html 在学习内核过滤驱动的过程中,遇到了大量的涉及IRP操作的代码,这里有必要对IRP的数据结 ...

最新文章

  1. vue样式 引入图片_详解Vue.js中引入图片路径的几种方式
  2. TCP/IP——基本知识
  3. Android在 普通类(非Activity,多数为Adapter) 中 传输数据为空值 解决方法 :在startActivity 用 intent传输数据
  4. 织梦CMS调用文章列表时,怎么显示短时间格式
  5. 3像素尺寸是多少_纸张的尺寸
  6. Sort方法根据T类某个字段对泛型集合ListT排序
  7. mysql 加密 en_以极少的停机时间加密运行 MySQL 或 MariaDB 的 Amazon RDS 数据库实例...
  8. Google学术IP被锁--403
  9. Quartz.net官方开发指南 第七课 : TriggerListeners和JobListeners
  10. Spring中使用集成MongoDB Client启动时报错:rc: 48
  11. 【window】Windows10下为PHP安装redis扩展
  12. 为什么程序员做测试其实是有优势的?这是我听过最....的话
  13. 【财务预警】基于matlab BP神经网络财务预警【含Matlab源码 494期】
  14. java大学实用教程(第四版)_Java大学实用教程(第4版)
  15. gbq可以算出土建量吗_广联达土建算量软件必备操作指南
  16. Python实现电子词典(图形界面)
  17. mysql 免费报表工具_10款最出色的免费数据库管理工具
  18. 网站被攻击客户信息被泄露如何解决
  19. 选票统计 SDUT
  20. 如何观察一棵树 - 笔记

热门文章

  1. android设备报警推送,Firebase推送通知未送达所有android设备
  2. python 判断文件是否被占用_python 在删除文件的时候检测该文件是否被其他线程或者进程占用?...
  3. 未结束的字符文字_PAT B1042:字符统计
  4. -9 逆序输出一个整数的各位数字_【Java编程基本功】(八)逆序输出、是否为回文数,判断星期几,升序排列...
  5. java的迭代器类中有哪些类_java中的集合类 以及 迭代器
  6. 一行代码蒸发64亿人民币!黑客盯上区块链漏洞!Python真的变态!
  7. JAVA程序员已成为最疯狂的加班行业,没有之一?
  8. 更换锁定计算机图片,电脑锁屏图片怎么设置
  9. mysql编程语法_MYSQL语法(一)
  10. mysqlfor循环中出错继续_Python学习笔记(循环)