什么是IRP:

I/O request packets,简称IRP。即输入输出请求包。它是WINDOWS内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求。操作系统将相应的I/O请求转换为相应的IRP。不同的IRP会根据类型被分派的不同的派遣历程中进行处理。

作用:

上层应用程序于底层驱动之间的通讯,即EXE程序和SYS之间的通讯。
应用程序 想要访问内核数据,必须通过IRP数据。又叫IRP请求,当应用程序和驱动交互时,发送一个IRP请求,IRP会在各层设备驱动个之间来回传动和转发。

五种常用的IRP类型:

#define IRP_MJ_CREATE 0X00 //对应用户层函数CreateFile()
#define IRP_MJ_CLOSE  0X02 //对应用户层函数CloseHandle()
#define IRP_MJ_READ 0X03 //对应用户层函数ReadFile()
#define IRP_MJ_WRITE 0X04 //对应用户层函数WirteFile()
#define IRP_MJ_DEVICE_CONTROL 0X0e //DeviceIoControl()

使用过程:

  1. 创建IRP处理函数。
  2. 在驱动入口函数里面DriverEntry()注册处理函数。
  3. 细化IRP函数。

(1)注册派遣函数


(2)应用程序与驱动通信
在驱动里创建符号链接

通过符号链接与相应驱动程序通信

IRP 是数据请求包的一个简称。当应用程序发起CreateFile或ReadFile API操作设备的时候,就会将相关参数信息封装为一个IRP数据包。通过IoCallDriver传递给驱动程序。

IRP数据结构

typedef struct _IRP {PMDL              MdlAddress;ULONG             Flags;union {struct _IRP*   MasterIrp;PVOID          SystemBuffer;} AssociatedIrp;IO_STATUS_BLOCK   IoStatus;KPROCESSOR_MODE   RequestorMode;BOOLEAN           PendingReturned;BOOLEAN           Cancel;KIRQL             CancelIrql;PDRIVER_CANCEL    CancelRoutine;PVOID             UserBuffer;union {struct {union {KDEVICE_QUEUE_ENTRY DeviceQueueEntry;struct {PVOID    DriverContext[4];};};PETHREAD     Thread;LIST_ENTRY   ListEntry;} Overlay;} Tail;
} IRP, *PIRP;kd> dt nt!_IRP+0x000 Type             : Int2B+0x002 Size             : Uint2B+0x004 MdlAddress       : Ptr32 _MDL+0x008 Flags            : Uint4B+0x00c AssociatedIrp    : <unnamed-tag>+0x010 ThreadListEntry  : _LIST_ENTRY+0x018 IoStatus         : _IO_STATUS_BLOCK+0x020 RequestorMode    : Char+0x021 PendingReturned  : UChar+0x022 StackCount       : Char+0x023 CurrentLocation  : Char+0x024 Cancel           : UChar+0x025 CancelIrql       : UChar+0x026 ApcEnvironment   : Char+0x027 AllocationFlags  : UChar+0x028 UserIosb         : Ptr32 _IO_STATUS_BLOCK+0x02c UserEvent        : Ptr32 _KEVENT+0x030 Overlay          : <unnamed-tag>+0x038 CancelRoutine    : Ptr32     void +0x03c UserBuffer       : Ptr32 Void+0x040 Tail             : <unnamed-tag>

具体含义:

MdlAddress : 是一个MDL的指针,当内核层和用户层采用共享内存的结构传递数据的时候,这个MDL就代表共享的内存信息(共享物理内存,通过MDL映射)。这个成员生效的标记为:DO_DIRECT_IO, METHOD_IN_DIRECT 或者METHOD_OUT_DIRECT.
AssociatedIrp : 这个成员是个联合体,其中存在一个SystemBuffer程序;当内核层使用用户层的数据的时候是通过拷贝数据的方式来实现的话,那么拷贝后的数据就放在了AssociatedIrp.SystemBuffer中了。这个成员生效的标记是DO_BUFFERED_IO或者METHOD_BUFFERED。
IoStatus : 返回的状态信息。
RequestorMode : UserMode或KernelMode,指定原始I/O请求的来源。驱动程序有时需要查看这个值来决定是否要信任某些参数。
PendingReturned : Pending 状态,如果为TRUE,则表明处理该IRP的最低级派遣例程返回了STATUS_PENDING。
StackCount : 设备栈的数目。
CurrentLocation : 当前处于哪个设备栈的索引。
Cancel : IRP是否被取消,如果为TRUE,则表明IoCancelIrp已被调用(该函数用于取消这个请求)。如果为FALSE,则表明没有调用IoCancelIrp函数。
CancelIrql(KIRQL) : 是一个IRQL值,表明那个专用的取消自旋锁是在这个IRQL上获取的.
CancelRoutine(PDRIVER_CANCEL) : 是驱动程序取消例程的地址。你应该使用IoSetCancelRoutine函数设置这个域而不是直接修改该域(因为可以原子修改)。
UserBuffer(PVOID) : 用户层参数的直接地址,设置标记METHOD_NEITHER时候有效。
Tail.Overlay 是Tail联合中的一种联合结构,如下:

图示


应用程序和驱动:


Windows驱动大致分为:
function driver: 设备功能驱动
filter driver: 设备辅助驱动
software driver: 软件模块驱动
bus driver: 总线设备驱动

驱动程序通信:

https://github.com/G4rb3n/Windows-Driver/tree/master/MT-Communication

【IRP】Windows 驱动之IRP相关推荐

  1. Windows驱动之IRP PENDING

    文章目录 Windows驱动之IRP PENDING 1. IRP的发起 2. IoMarkIrpPending 3. IoCompleteRequest 4. 总结 Windows驱动之IRP PE ...

  2. Windows驱动之IRP结构

    文章目录 Windows驱动之IRP结构 1. IRP 2. IO_STACK_LOCATION 3. IRP 和 IO_STACK_LOCATION 的交互 3.1 IoAllocateIrp 3. ...

  3. windows 驱动开发基础(二)事件通知---关于irp处理,DPC,链表等

    代码来源及参考:wdk 7,路径:C:\WinDDK\7600.16385.1\src\general\event 这个例子演示了两种关于当硬件事件发生时,驱动如何通知应用程序的方法.一种是基于eve ...

  4. 键盘过滤驱动之IRP劫持

    参考资料: [1] <Rootkits--Windows内核的安全与防护> [2] 让一切输入都难逃法眼(驱动级键盘过滤钩子) 本文主要介绍通过劫持IRP(IRP_MJ_READ)实现键盘 ...

  5. 《Windows驱动开发技术详解》读书笔记(一)

    首先需要安装DDK,这里我选择Microsoft Windows Server 2003 SP1 DDK Windows驱动分成两类,一类是不支持即插即用的NT式驱动,一类是支持即插即用的WDM驱动. ...

  6. Windows驱动开发要点总结一

    1 概述 驱动程序大体可分为两类三种: 第一类:传统型驱动     传统型驱动的特点就是所有的IRP都需要自己去处理,自己实现针对不同IRP的派发函数.其可以分 为以下两种:     1. Nt式驱动 ...

  7. Windows驱动开发学习笔记(四)—— 3环与0环通信(常规方式)

    Windows驱动开发学习笔记(四)-- 3环与0环通信(常规方式) 设备对象 创建设备对象 设置数据交互方式 创建符号链接 IRP与派遣函数 IRP的类型 其它类型的IRP 派遣函数 派遣函数注册位 ...

  8. [Windows驱动开发](三)基础知识——驱动例程

    一.NT式驱动的基本例程 1. 驱动入口函数--DriverEntry [cpp] view plaincopy // 驱动程序的一般性定义 NTSTATUS DriverEntry(IN PDRIV ...

  9. [Windows驱动开发](一)序言

    笔者学习驱动编程是从两本书入门的.它们分别是<寒江独钓--内核安全编程>和<Windows驱动开发技术详解>.两本书分别从不同的角度介绍了驱动程序的制作方法. 在我理解,驱动程 ...

最新文章

  1. mysql 5.7.18-winx64_mysql 5.7.18 winx64安装配置方法图文教程
  2. 树莓派修改密码(有单独屏幕)
  3. LeetCode 795. Number of Subarrays with Bounded Maximum
  4. ArchLinux安装图文教程(2017.06.15)
  5. 风控业务-模型稳定性评价指标PSI
  6. 【ThinkPHP系列篇】ThinkPHP框架使网页能够在浏览器中访问(二)
  7. https和server-status配置案例
  8. Java命令行界面(第5部分):JewelCli
  9. set_error_handler自定义错误处理
  10. 【请收藏】自动化构建部署之Circle CI使用(GitHub/CircleCI/Vue)
  11. 雷声大雨点小-参加江西省网站内容管理系统培训有感
  12. Sniffer安全技术从入门到精通
  13. TypeError: can‘t convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory fi
  14. Unreal Engine UE4虚幻引擎,生成Cubemap(HDR高动态范围贴图)
  15. PLC网关是什么 PLC网关是做什么的
  16. LeetCode知识点总结 - 868
  17. 华硕电脑连接不上wifi_四招解决华硕笔记本不能连接WiFi!
  18. 【参考文献】骨骼肌成肌细胞低血清培养​
  19. 氚云CRM管理员手册
  20. 通俗来理解 ARM芯片内核,架构,指令集,软核和硬核之间的关系

热门文章

  1. HBuilder发行App(Android和ios)
  2. python opencv pdf脚本之家_Python-OpenCV
  3. 2021国潮新消费大会落幕,新国潮产业进入“黄金十年”
  4. M1 Mac使用photoshop液化、存储为web格式黑屏如何解决
  5. 《2019全球货运代理TOP25、全球第三方物流Top50排行榜》
  6. 刺激战场android闪退,刺激战场总是闪退怎么办?刺激战场闪退解决办法
  7. easyexcel注解样式无效_easyexcel注解
  8. 微信发朋友圈如何只发文字?
  9. 陌生单词-专业英语代码编码符号2
  10. crypto-js 加密 php后端解密