简介:
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(
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请求结束。