【驱动笔记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}
转载于:https://www.cnblogs.com/huhu0013/p/3312192.html
【驱动笔记9】初探IRP相关推荐
- windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互
windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互 前面两篇学习笔记分别介绍了IRP和IO_STACK_LOCATION,整个设备栈来处理这个IRP,但是每个设 ...
- 嵌入式Linux驱动笔记(十八)------浅析V4L2框架之ioctl【转】
转自:https://blog.csdn.net/Guet_Kite/article/details/78574781 权声明:本文为 风筝 博主原创文章,未经博主允许不得转载!!!!!!谢谢合作 h ...
- ASP.Net学习笔记014--ViewState初探3
ASP.Net学习笔记014--ViewState初探3 为什么禁用了viewstate,还能修改label2的值 因为:viewstate只是记录label2的值,并不影响给label2进行设置 - ...
- ASP.Net学习笔记013--ViewState初探2
ASP.Net学习笔记013--ViewState初探2 上课讲的viewstate,由于需要跟后台服务器进行传值,需要封装很多隐藏列,比如100条数据,就会有100个viewstate 如果用在一些 ...
- 嵌入式Linux驱动笔记--转自风筝丶
为了阅读学习方便,将系列博客的网址进行粘贴,感谢原博客的分享. 嵌入式Linux驱动笔记(一)------第一个LED驱动程序 嵌入式Linux驱动笔记(二)------定时器 嵌入式Linux驱动笔 ...
- charging hw bq25601充电驱动笔记
charging hw bq25601充电驱动笔记 #include "../bq25601.h"/* ====================================== ...
- 嵌入式Linux驱动笔记(十六)------设备驱动模型(kobject、kset、ktype)
###你好!这里是风筝的博客, ###欢迎和我一起交流. 前几天去面试,被问到Linux设备驱动模型这个问题,没答好,回来后恶补知识,找了些资料,希望下次能答出个满意答案. Linux早期时候,一个驱 ...
- 嵌入式Linux驱动笔记(五)------学习platform设备驱动
你好!这里是风筝的博客, 欢迎和我一起交流. 设备是设备,驱动是驱动. 如果把两个糅合写一起,当设备发生变化时,势必要改写整个文件,这是非常愚蠢的做法.如果把他们分开来,当设备发生变化时,只要改写设备 ...
- Linux-USB驱动笔记(五)--主机控制器驱动框架
Linux-USB驱动笔记(五)--主机控制器驱动框架 1.前言 2.主机控制器框架 3.重要结构体 3.1.usb_hcd -- 主机控制器驱动 3.2.hc_driver -- 控制器操作函数 3 ...
- 嵌入式Linux驱动笔记(二十四)------framebuffer之使用spi-tft屏幕(上)
你好!这里是风筝的博客, 欢迎和我一起交流. 最近入手了一块spi接口的tft彩屏,想着在我的h3板子上使用framebuffer驱动起来. 我们知道: Linux抽象出FrameBuffer这个设备 ...
最新文章
- RStudio v1.2.1335 发布,R 语言的集成开发环境
- 4G最快网速相当于30M宽带
- [HOW TO]-github/gitee的仓库统一管理
- 渗透测试之子域到父域的横向移动(Sid History)
- Eclipse 3.7 3.x SWT/Jface 开发环境搭建
- 信号与系统 chapter2 冲激偶函数与阶跃函数
- go 语言 first argument to append must be slice
- ppc linux 性能,用profile和oprofile监视视linux性能!
- Error: EBUSY: resource busy or locked, lstat ‘D:\DumpStack.log.---基于Vue的uniapp手机端_前端UI_uview工作笔记004
- 新职业风口已至!人社部宣布这 10 个职业缺口近千万!
- matlab模拟小球碰撞,在MATLAB中实现模拟小球上抛和反弹运动
- Vue 项目中如何引入 iconfont 字体图标
- windows系统设置保护视力方法
- Android文字转语音引擎(TTS)简单比较及下载
- 【Linux 主机ssh远程连接暴力破解详解】
- github 下载文件加速 https://moeyy.cn/gh-proxy/
- HTML中的大于号和小于号怎样用代码打出来?
- Olivetti PR2/PR2E 打印机故障分析与排除
- 小程序重构 [cnode社区]:mpvue + 开源api,现已上线!
- maven--入门使用及环境变量配置