【驱动笔记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!\n", "\\\\.\\Test",::GetLastError());
17 return -1;
18 }
19
20 // 关闭设备句柄,它会触发IRP_MJ_CLEANUP和IRP_MJ_CLOSE
21 CloseHandle(hDevice);
22 return 0;
23}
相关文章
- Win64 驱动内核编程-20.UnHook SSDT
- 领域驱动设计系列(2)浅析VO、DTO、DO、PO的概念、区别和用处
- 构建你的长寿命的API第1部分:规范驱动的API开发
- Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)
- w5500驱动使用方法调试笔记
- 【网启树莓派】无SD卡 从网络驱动树莓派| raspberry boot via pxe
- 《领域驱动设计:软件核心复杂性应对之道(修订版)》—第2章 2.1节模式:Ubiquitous Language
- 驱动开发(三)——地址空间与驱动辅助信息
- DDD(领域驱动设计)总结
- 外设驱动库开发笔记45:MS4515DO压力传感器驱动
- 外设驱动库开发笔记43:GPIO模拟SPI驱动
- 外设驱动库开发笔记38:RTD热电阻测温驱动
- 外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动
- 外设驱动库开发笔记33:LCD1602液晶显示屏驱动
- 外设驱动库开发笔记27:ESP8266无线通讯驱动
- 外设驱动库开发笔记21:BME680环境传感器驱动
- 外设驱动库开发笔记11:SHT3x系列温湿度传感器驱动
- 外设驱动库开发笔记7:LTC2400系列ADC驱动
- 【哈工大李治军】操作系统课程笔记9:设备驱动与文件管理(显示器、键盘和磁盘)
- 【正点原子MP157连载】第四十二章 Linux RTC驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
- 键盘过滤驱动
- 驱动笔记(二)