【IRP】Windows 驱动之IRP

这篇具有很好参考价值的文章主要介绍了【IRP】Windows 驱动之IRP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是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)注册派遣函数
【IRP】Windows 驱动之IRP
【IRP】Windows 驱动之IRP
(2)应用程序与驱动通信
在驱动里创建符号链接
【IRP】Windows 驱动之IRP
通过符号链接与相应驱动程序通信
【IRP】Windows 驱动之IRP
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联合中的一种联合结构,如下:

图示

【IRP】Windows 驱动之IRP
应用程序和驱动:
【IRP】Windows 驱动之IRP
【IRP】Windows 驱动之IRP
Windows驱动大致分为:
function driver: 设备功能驱动
filter driver: 设备辅助驱动
software driver: 软件模块驱动
bus driver: 总线设备驱动

驱动程序通信:

https://github.com/G4rb3n/Windows-Driver/tree/master/MT-Communication文章来源地址https://www.toymoban.com/news/detail-405427.html

到了这里,关于【IRP】Windows 驱动之IRP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 医学影像系统【简称PACS】源码

    PACS(Picture Archiving and Comuniations Systems)即PACS,图像存储与传输系统,是应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统。目标是支持在医院内部所有关于图像的活动,集成了医疗设备,图像存储和分发数字图像在重要诊断和会诊时的显示,图像归档,以及外部

    2024年02月07日
    浏览(46)
  • Python requests 中 timeout = 300 和 timeout = (300, 300) 有什么区别?

    在Python的 requests 库中, timeout 参数用于指定请求的超时时间,即请求在等待服务器响应时最多等待的时间。这个参数可以通过一个数字或一个元组来指定。 timeout = 300 : 这种情况下, timeout 被设置为一个单独的数值,表示请求的连接和读取操作都必须在指定的秒数内完成。

    2024年02月12日
    浏览(33)
  • Kubernetes(简称k8s)简介

    Kubernetes(简称k8s)是一种开源的容器编排平台,它可以自动化地部署、扩展和管理容器化应用程序。Kubernetes最初由Google公司设计和开发,并于2014年正式发布。如今,它已成为容器编排领域的事实标准,被广泛应用于各种场景中,包括Web应用程序、大数据处理、人工智能等。

    2024年02月06日
    浏览(41)
  • Windows 系统添加 VirtIO 驱动(Windows ISO 安装镜像添加驱动)

    为什么要在 ISO 镜像里添加驱动?而不是在进系统以后装驱动?一切都是形势所迫。如果你也是爱折腾的人,那么这也会成为一个有用的方案之一。 最近,因为在给公司研究部署 OpenStack,在制作初始镜像(也就是使用 ISO 进行全新安装)的时候,发现 Windows 自带的驱动不支持

    2024年02月09日
    浏览(43)
  • 驱动开发-windows驱动设计目标

    驱动程序和应用程序不一样的,由于其直接运行于windows r0级,故对于开发有更多和更严格的标准,一般会有以下一些常见的设计目标: 安全性、可移植性、可配置性、 可被中断、多处理器安全、可重用 IRP、 支持异步 I/O 这些是基本目标。 1. 安全性: 驱动程序是足够安全的

    2024年04月23日
    浏览(33)
  • 单向-->不带头-->非循环链表(简称:单链表)

    目录 一、链表的介绍 1.链表的概念 2.单链表的节点类型 3.单链表简图 二、单链表的增删查改 1.单链表的头插 2.单链表的尾插 3.单链表的头删 4.单链表的尾删 5.单链表pos位置之后插入一个节点 6.单链表删除pos位置后的一个节点         链表是一种物理存储结构上非连续、非顺

    2024年02月13日
    浏览(45)
  • RouterOS(简称ROS) IPTV/iTV 配置

    RouterOS 是由拉脱维亚MikroTik 司开发的一 种基于Linux 内核的路由操作系统。RouterOS在具备现有路由系统的大部分功能,能针对网吧、企业、小型ISP接入商、社区等网络设备的接入,Mikrotik厂家提供带有RouterOS的硬件路由器,同时支持标准的x86构架PC。一台586PC机就可以实现路由功

    2024年02月06日
    浏览(36)
  • 微信小程序名称、简称设置规范

    1、名称设置方法 1)小程序名称可以由中文、数字、英文、空格及部分特殊符号组成。长度在4-30个字符之间,一个中文字等于2个字符。 2)公众号、小程序在微信公众平台上的名称是唯一的,且属于同一主体下,可以重名。 3)不得与不同主体的公众号名称重名。 2、简称设

    2024年02月11日
    浏览(26)
  • 人工智能(Artificial Intelligence,简称AI)

    人工智能(Artificial Intelligence,简称AI)是一种模仿人类智能的技术,通过计算机系统实现某种智能任务。在现代科技中,人工智能已经广泛应用于许多领域,包括医疗保健、金融、交通、安全等。 在医疗保健领域,人工智能可以辅助医生进行诊断和治疗决策。通过分析海量

    2024年01月25日
    浏览(55)
  • VbScript脚本Request获取RFID读卡器以HTTP提交的访问文件中的参数Response回应驱动读卡器显示、播报语音

    本示例使用的设备:RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) 

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包