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


  • 相关阅读:
    flask之Blueprint蓝图
    flask之Flask、config配置
    flask之路由route
    flask之request
    flask之response
    pyhton中的深浅copy
    jQuery选择器
    Html常用标签
    python中的字典dict
    python基础知识
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207174.html
Copyright © 2020-2023  润新知