irp专题

派遣函数 - IRP与派遣函数

派遣函数是Windows驱动程序中的重要概念。驱动程序的主要功能是负责处理IO请求,其中 大部分I/O请求是在派遣函数中处理的。         用户模式下所有对驱动程序的IO请求,全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP 数据会被“派遣”到不同的派遣函数(Dispatch Function)中,这也派遣函数名字的由来。本章将针对IRP和派遣函数进行详细的介绍。

Windows驱动开发(9) - IRP结构体

Windows驱动开发(9) - IRP结构体 typedef struct _IRP {PMDL MdlAddress;ULONG Flags;union {struct _IRP* MasterIrp;PVOID SystemBuffer;} AssociatedIrp;IO_STATUS_BLOCK IoStatu

IRP结构体之Flag成员

IRP_NOCACHE //表示I/O请求从存储的媒介而不是高速缓存中读取数据IRP_PAGING_IO //表示此时执行内存页的I/O操作IRP_MOUNT_COMPLETION //卷挂载操作完成IRP_SYNCHRONOUS_API //该操作是一个同步分页I/O操作。IRP_ASSOCIATED_IR

彻底弄明白IRP

微软的东东,多数是把聪明人搞晕,把晕的人搞残,把残的人搞死!     一直以来,想弄明白驱动和IRP到底是怎么回事,在驱网上也查了无数的资料,到头来,手脚抽筋也没弄明白。     从网上查到一段说明,可以说是迄今最后的解释,在家里看了N天,似同天书。 引用: 1.    子系统调用NT的IO系统服务打开命名文件。 2.    NT的IO管理器调用对象管理器,查询命名文件,并且帮助解决文件

IRP概述

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

IRP数据结构

几乎所有的Windows2000的I/O都是包驱动的,系统采取一种称为“I/O请求包(IRP--­I/O request packet)”的数据结构来完成与内核模式驱动程序通信。IRP由I/O管理器根据用户态程序提出的请求创建并传给相应的驱动程序。在分层的驱动程序中,这个过程很复杂,一个IRP常常要穿越几层驱动程序。另外,驱动程序也能够建立新的IRP并传递给其它驱动程序。   IR

《Windows NT FileSystem Internals》学习笔记之Complete IRP

原来以为完成IRP的处理仅仅是简单的调用一下IoCompleteRequest()函数而已,内部的代码应该很简单。阅读了Win2K源代码才发现,事情并不简单啊,呵呵,再一次发现Win2K源代码的价值了。 驱动必须调用IoCompleteRequest()通知I/O管理器相应的IRP已经处理完毕。IoCompleteRequest函数的处理过程如下(对应着Win2K源代码阅读,在ioS

IRP Hook

谈到irp拦截,基本上有三种方式 在起点拦截在半路拦截在终点拦截 下面我们会详细分析这几种方式哪些是有效的,哪种是无效的。 要理解这几种拦截,我们需要看看irp地传送过程。 (注意并不是每种IRP都经过这些步骤,由于设备类型和IRP种类的不同某些步骤会改变或根本不存在。) 一、IRP创建。 由于IRP开始于某个实体调用I/O管理器函数创建它,可以使用下面任何一种函数创建IRP: Io

IRP 处理流程

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