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请求结束。