简介:
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(
INPIRPIrp,
INCCHARPriorityBoost
);
下面以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请求结束。