文章作者: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!\n", "\\\\.\\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电子书(邪恶八进制有下载)。
 
 
 
 
 
 

【驱动笔记9】初探IRP的更多相关文章

  1. linux 2.6 驱动笔记(一)

    本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6 交叉编译环境:windows 7 + v ...

  2. 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】

    转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...

  3. 【驱动笔记10】再谈IRP

    文章作者:grayfox作者主页:http://nokyo.blogbus.com原始出处:http://www.blogbus.com/nokyo-logs/34010655.html 这一节会对I ...

  4. 【驱动笔记11】使用DeviceIoControl通信

    文章作者:grayfox作者主页:http://nokyo.blogbus.com原始出处:http://www.blogbus.com/nokyo-logs/34018521.html 在我昨日发布 ...

  5. LINUX驱动笔记 目录

    笔记参考了宋宝华老师的<Linux设备驱动开发详解:基于最新的Linux 4.0内核>以及韦东山老师的嵌入式驱动教程 笔记开发环境: 单板:第一章到第八章使用TINY4412-1611:第 ...

  6. 学习Linux下s3c2440的USB鼠标驱动笔记

    1.ARM-Linux下USB驱动程序开发1.1.1.linux下USB配置:*********(MassStorage:存储设备)********************************** ...

  7. linux 2.6 驱动笔记(三)

    驱动的并发与应用的并发实现一样,以信号量为例,修改基本字符驱动代码如下: 1. 增加sem定义 struct globalmem_dev{ struct cdev cdev; /*linux 2.6 ...

  8. linux 2.6 驱动笔记(二)

    字符设备驱动 linux 2.6的字符驱动由cdev结构体描述,具体参考globalmem例子,代码主要分以下几部分: 1. 定义一个字符类型设备驱动的结构体 struct globalmem_dev ...

  9. 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖

    文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...

随机推荐

  1. 一款超炫的jquery图片播放插件[Cloud Carousel]

    今天给大家介绍一个jquery图片播放插件,也可以说是一款幻灯片放映插件,它叫Cloud Carousel,支持自动播放.图片预览.鼠标滚轮滚动,非常酷,下图是效果预览. 该jquery图片播放项目演 ...

  2. [Vue warn]: Error in render: "TypeError: Cannot read property '0' of undefined、vuejs路由使用的问题Error in render function

    1.[Vue warn]: Error in render: "TypeError: Cannot read property '0' of undefined 注意,只要出现Error i ...

  3. 使用baksmali及smali修改apk并打包

    使用baksmali及smali修改apk并打包 工具的下载,请自行google. 有时候使用apktool反编译apk修改Smali文件之后再进行build会出现错误,这种情况下可以换一个更高版本的 ...

  4. C++中无法解析的外部符号错误

      在编译C++程序的时候,如果引用了对应的头文件,但是调用一个函数的时候仍然出现" 无法解析的外部符号错误"的编译错误,比如: 无法解析的外部符号__imp__PathFileE ...

  5. JS字符串false转boolean

    大家都知道在JS的世界里, 0.-0.null."".false.undefined 或 NaN,这些都可以自动转化为布尔的 false,那么字符串的"false&quo ...

  6. 关于bootstrap-datetimepicker.js不支持IE8的解决办法

    if (!Array.prototype.indexOf) Array.prototype.indexOf = function (elt /*, from*/) { var len = this.l ...

  7. Python批量处理CSV文件

    #encoding: utf-8 __author__ = 'DELL' import csv import glob import datetime import sys import os rel ...

  8. 刀片服务器和磁盘阵列卡(RAID)技术---永和维护(转)

    近期客户需要更换服务器,客户把买好的服务器送来了,原本感觉很小的一个服务器,可当我看到的时候是一个大个的又长又宽,类似机房服务器的那种,后来米老师给大致讲解一番:这个是刀片服务器. 刀片服务器是指在标 ...

  9. PHP高级教程-过滤器

    PHP 过滤器 PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入. 什么是 PHP 过滤器? PHP 过滤器用于验证和过滤来自非安全来源的数据. 测试.验证和过滤用户输入或自定义数据是 ...

  10. PHP表单-PHP $_POST 变量

    PHP $_POST 变量 在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 预定义的 $_POST 变量用 ...