IRP(I/O Request Package)详解
来源:互联网 发布:东方红资产管理 知乎 编辑:程序博客网 时间:2024/05/22 14:01
简介:
IRP(I/O Request Package)在windows内核中,有一种系统组件——IRP,即输入输出请求包。
当上层应用程序需要访问底层输入输出设备时,发出I/O请求,系统会把这些请求转化为IRP数
据,不同的IRP会启动I/O设备驱动中对应的派遣函数。
IRP类型
由于IRP是响应上层应用程序的。可想而知,IRP类型是与上层对底层设备的访问类型相对应。
文件相关的I/O函数如:CreateFile/ReadFile/WriteFile/CloseHandle等,操作系统就会将其转为
IRP_MJ_CREATE/IRP_MJ_READ/IRP_MJ_WRITE/IRP_MJ_CLOSE等IRP类型,这些
IRP再被传送到驱动程序的派遣函数中。
IRP列表如下:
名称
描述
调用者
IRP_MJ_CREATE
请求一个句柄
CreateFile
IRP_MJ_CLEANUP
在关闭句柄时取消悬挂的IRP
CloseHandle
IRP_MJ_CLOSE
关闭句柄
CloseHandle
IRP_MJ_READ
从设备得到数据
ReadFile
IRP_MJ_WRITE
传送数据到设备
WriteFile
IRP_MJ_DEVICE_CONTROL
控制操作(利用IOCTL宏)
DeviceIoControl
RP_MJ_INTERNAL_DEVICE_CONTROL
控制操作(只能被内核调用)
N/A
IRP_MJ_QUERY_INFORMATION
得到文件的长度
GetFileSize
IRP_MJ_SET_INFORMATION
设置文件的长度
SetFileSize
IRP_MJ_FLUSH_BUFFERS
写输出缓冲区或者丢弃输入缓冲区
FlushFileBuffers
FlushConsoleInputBuffer
PurgeComm
IRP_MJ_SHUTDOWN
系统关闭
InitiateSystemShutdown
IRP对应的派遣函数处理过程
多数的IRP都来自于Win32 API函数,如CreateFile,ReadFile,WriteFile函数等等。
一种简单的IRP派遣函数的实现就是:将该IRP中的状态置为成功(pIRP->IoStatus =
STATUS_SUCCESS ),然后结束该IRP请求(调用I噢CompleteRequest函数),并返回
成功状态。
NTSTATUS status = STATUS_SUCCESS;// 完成IRPpIrp->IoStatus.Status = status;pIrp->IoStatus.Information = 0;// bytes xferedIoCompleteRequest( pIrp, IO_NO_INCREMENT );KdPrint(("Leave HelloDDKDispatchRoutin\n"));return status;
VOID
IoCompleteRequest(
IN PIRP Irp,
IN CCHAR PriorityBoost
);
下面以ReadFile为例,详细介绍。
1.ReadFile调用ntdll中的N他ReadFile。其中ReadFile函数是Win32 API,而NtReadFile
函数是Native API。
2.ntdll中的N他ReadFile进入内核模式,并调用系统服务中的N他ReadFile函数。
3.系统服务函数N他ReadFile创建IRP_MJ_WRITE类型的IRP,然后将这个IRP函数发
送到对应驱动程序的派遣函数中。
4.在对应的派遣函数中一般会通过IoCompleteRequest函数将IRP请求结束。
- IRP(I/O Request Package)详解
- IRP(I/O Request Package)详解
- I/O Request Packet (IRP)
- Handling IRPs: Definition 1: IRP as a Container for an I/O Request
- I/O管理器及IRP缓冲区管理
- 关于Fast I/O和IRP
- I/O管理器及IRP缓冲区管理
- I/O管理器及IRP缓冲区管理
- I/O管理器及IRP缓冲区管理
- I/O管理器及IRP缓冲区管理
- I/O Request Packet
- 构建自己的IRP来处理I/O
- 基础IRP 和I/O Stack location 的关系
- IRP中文意思就是I/O请求包
- 基于I/O请求包(IRP)的工作方式
- IRP数据结构(即 I/O请求包数据结构)
- ecos I/O Package (Device Drivers)
- Java I/O 详解
- DAO查询
- location.href 在Firefox下的替代方案
- Javascript的IE和Firefox兼容性汇编
- 做一个与bug共存的程序员
- Oracle Fusion Applications : Frequently Asked Questions
- IRP(I/O Request Package)详解
- QWS Server
- 字符串包含问题
- 8086汇编在指定页、指定行、指定列、指定颜色、输出指定字符(80*25)
- 页面访问时发生错误: Index: 0, Size: 0
- hdoj 4223 Dynamic Programming?
- 安装AdventureWorks2008
- SVN上的MAVEN项目如何从MyEclipse上配置
- 动态网站开发所需的web构件