IRP(I/O Request Package)详解

简介:

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;
	// 完成IRP
	pIrp->IoStatus.Status = status;
	pIrp->IoStatus.Information = 0;	// bytes xfered
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );

	KdPrint(("Leave HelloDDKDispatchRoutin\n"));

	return status;

VOID
IoCompleteRequest(
INPIRP
Irp,
INCCHAR
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请求结束。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值