zoukankan      html  css  js  c++  java
  • 【驱动笔记9】初探IRP

    文章作者:grayfox
    作者主页:http://nokyo.blogbus.com

    原始出处:http://www.blogbus.com/nokyo-logs/34005738.html

          此前我们可能曾经多次听说过IRP这个名词,那么它究竟是什么呢?
          IRP的全名是I/O Request Package,即输入输出请求包,它是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的I/O请求转换成相应的IRP,不同的IRP会根据类型被分派到不同的派遣例程中进行处理。
          IRP有两个基本的属性,即MajorFunction和MinorFunction,分别记录IRP的主类型和子类型。操作系统根据MajorFunction决定将IRP分发到哪个派遣例程,然后派遣例程根据MinorFunction进行细分处理。
          IRP的概念类似于Windows应用程序中“消息”的概念。在Win32编程中,程序由“消息”驱动,不同的消息被分发到不同的处理函数中,否则由系统默认处理。
          文件I/O的相关函数例如CreateFile、ReadFile、WriteFile、CloseHandle等分别会引发操作系统产生IRP_MJ_CREATE、IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_CLOSE等不同的IRP,这些IRP会被传送到驱动程序的相应派遣例程中。 

     

           在派遣例程中处理IRP最简单做法就是将IRP的状态设置为成功,然后结束IRP请求并返回成功,同时还要记得设置这个IRP请求操作了多少字节。
          我们在派遣函数中设置IRP的完成状态为STATUS_SUCCESS,发起I/O请求的Win32 API才能返回TRUE,否则Win32 API将返回FALSE,在这个时候可以通过GetLastError获得错误代码,这个错误代码会和此时IRP被设置的状态一致。

           下面我们首先在驱动程序中添加一个IRP_MJ_CLEANUP的例程(照抄IRP_MJ_CLOSE的即可),然后编写下面的应用层程序(控制台程序):

     

    01#include "windows.h"
    02#include "stdio.h"
    03
    04int main()
    05{
    06    // 打开设备句柄,它会触发IRP_MJ_CREATE
    07    HANDLE hDevice = ::CreateFile("\\.\Test",          // 符号链接
    08                          GENERIC_READ | GENERIC_WRITE,
    09                          0,
    10                          NULL,
    11                          OPEN_EXISTING,
    12                          FILE_ATTRIBUTE_NORMAL,
    13                          NULL);
    14    if (hDevice == INVALID_HANDLE_VALUE)
    15    {
    16        printf("Try to Open Device %s Error : %d! ", "\\.\Test",::GetLastError());
    17        return -1;
    18    }
    19
    20    // 关闭设备句柄,它会触发IRP_MJ_CLEANUP和IRP_MJ_CLOSE
    21    CloseHandle(hDevice);
    22    return 0;
    23}

          现在我们使用KmdManager加载驱动并运行,同时运行我们前面编写的应用层驱动程序,根据应用层程序的代码我们可知它应该会触发IRP_MJ_CREATE、IRP_MJ_CLEANUP、IRP_MJ_CLOSE这三个IRP,完整文章请参考我的学习笔记汇总之PDF电子书(邪恶八进制有下载)。
     
     
     
     
     
     
  • 相关阅读:
    MySql和oracle的不同
    Session的有效期设置
    WebSocket和WebRtc的一些心得
    Spring事务管理
    Tomcat下使用war包发布项目
    Log4j记日志功能
    javascript typeof和instanceof
    js模块化的意义
    有关call和apply的理解。
    h5滑动插件(包含幻灯片滑动逻辑)
  • 原文地址:https://www.cnblogs.com/huhu0013/p/3312192.html
Copyright © 2011-2022 走看看