`
tibaloga
  • 浏览: 873084 次
文章分类
社区版块
存档分类
最新评论

创建IRP的四种不同方式

 
阅读更多

在驱动程序中,经常会调用其他的驱动程序;其中,手动构造 IRP ,然后将 IRP 传递到相应驱动程序的派遣函数中是一种比较简单的方法,下面就来介绍下手动创建 IRP 的几种不同的方法及其特点。

创建 IRP 总共有 4 种方法。分别通过调用: IoBuildSynchronousFsdRequest 、 IoBuildAsynchronousFsdRequest 、 IoBuildDeviceIoControl 和 IoAllocateIrp 这 4 个内核函数来完成。这其中, IoAllocateIrp 是比较底层的内核函数,其余的三个内核函数是属于靠近上层的内核函数,而且这三个函数都是通过调用 IoAllocateIrp 实现的。

这几个函数都是文档化的函数,原型都可以在 DDK Documentation 中查到,这里就不多说了,下面主要来说说它们的不同点:

1. 可创建的 IRP 类型

这四个函数可以创建的 IRP 的类型是不同的。 IoBuildSynchronousFsdRequest 用于创建同步的 IRP 请求,但是只可以创建以下类型的 IRP : IRP_MJ_PNP ,IRP_MJ_READ,IRP_MJ_WRITE,IRP_MJ_FLUSH_BUFFERS 和IRP_MJ_SHUTDOWN ; IoBuildAsynchronousFsdRequest 可创建的 IRP 类型和 IoBuildSynchronousFsdRequest 一样(从名字就可以看出来),只是它是用来创建异步的 IRP 请求。 IoBuildDeviceIoControl 可以创建的 IRP 类型为:IRP_MJ_DEVICE_CONTROL 和IRP_MJ_INTERNAL_DEVICE_CONTROL 。而且 IoBuildDeviceIoControl 只能创建同步的 IRP 。在这三个函数中,都有一个 ULONG 的输入参数指定创建的 IRP 类型。 IoAllocateIrp 函数的使用比较灵活,他可以创建任意类型的 IRP ,但不是由参数指定,而是创建后自行填写,要求用户对 IRP 的结构有比较熟悉的理解。

2. 创建后 IRP 对象的删除

IoBuildSynchronousFsdRequest 、 IoBuildAsynchronousFsdRequest 和 IoBuildDeviceIoControl 内核函数在创建完 IRP 后,不需要程序员负责删除 IRP ,操作系统会自动删除。而用 IoAllocateIrp 内核函数创建 IRP 时,需要程序员自己调用 IoFreeIrp 内核函数删除 IRP 对象。

3. 关联的事件

IoBuildSynchronousFsdRequest 和 IoBuildDeviceIoControl 在创建 IRP 时,需要为它们准备好一个事件,这个事件会和 IRP 请求相关联,当 IRP 请求被结束时该事件触发。程序中要用 KeWaitForSingleObject 函数等待。 IoBuildAsynchronousFsdRequest 函数创建 IRP 时则不需要准备事件,不过可以通过 IRP 的 UserEvent 子域来通知 IRP 请求的结束。

当执行 IoCompleteRequest 内核函数时,操作系统会检查 IRP 的 UserEvent 子域是否为空。如果该子域为空,则它代表一个事件指针,这时 IoCompleteRequest 会设置这个事件。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vangoals/archive/2009/07/26/4381567.aspx

分享到:
评论

相关推荐

    CodeIgniter-irp:创建,读取数据

    它的目标是通过提供一组用于执行常见任务的库以及一个简单的界面和逻辑结构来访问这些库,从而使您比从头开始编写代码时更快地开发项目。 CodeIgniter使您可以最大限度地减少给定任务所需的代码量,从而创造性地...

    windows内核 自创建IRP访问文件加非递归遍历文件

    windows内核,自构建IRP,防止rootkey 隐藏隐藏文件或拦截,加上非递归遍历文件(内核栈小不递归)代码加完整例子

    WDM_Driver.rar_IRP_WDM irp 初始化_WinCE WDM

    windows驱动程序基本结构:(1)初始化驱动程序,定位和申请硬件资源,创建内核对象(2)添加新设备(3)对PNP IRP进行缺省处理(4)对IRP_MN_REMOVE_DEVICE IRP进行处理(5)对即插即用IRP进行处理

    windows驱动开发技术详解-part2

    这是书的光盘。共分为两个部分,这是第一部分。 本书由浅入深、循序渐进地... 本章总结了在内核模式下的四种等待方法,读者可以利用这些方法灵活地用在自己的驱动程序中。最 后本章还介绍了如何对IRP的超时情况进行...

    8549057USBFilter1.rar_IBtUsb_Filter_irp检查_usb driver filter_usb

    usb过滤驱动WDM(和KDM)是分层的,在构造设备栈时,IO管理器可以使一个设备对象附加到另外一个初始驱动程序创建的设备对象上。与初始设备对象相关的驱动程序决定的IRP,也将被发送到附加的设备对象相关的驱动程序上...

    Windows驱动开发技术详解的光盘-part1

     本章总结了在内核模式下的四种等待方法,读者可以利用这些方法灵活地用在自己的驱动程序中。最后本章还介绍了如何对IRP的超时情况进行处理。  10.1 定时器实现方式一  10.1.1 I/O定时器  10.1.2 示例代码  ...

    Windows驱动开发基础视频教程.txt

    第四十九课 自定义irp与ObReferenceObject 第11章分层过滤驱动 第五十课 分层驱动:枚举设备栈上的设备对象 第五十一课 编写过滤驱动程序 第五十二课 irp完成函数 第12章驱动程序开发高级技能 第五十三课 驱动...

    【专题四】Rootkit的学习与研究

    看雪学堂经典整理, 【专题四】Rootkit的学习与研究 Rootkit是什么?估计很多朋友并不明白,简单的说,Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到...

    虚拟还原功能的源代码

    IRP_MJ_READ,IRP_MJ_WRITE,IOCTL_FILE_DISK_OPEN_FILE,IOCTL_FILE_DISK_CLOSE_FILE这4种,在FileDiskThread中等待这4种事件发生,如果等到,就调用相应的函数处理。 四 应用层源码分析: 1 mount:调用...

    常见的Windows驱动程序开发可靠性问题

    • 驱动程序 I/O 方式及其权衡 • 缓冲 I/O • 直接 I/O • 既未缓冲也非直接的 I/O (METHOD_NEITHER) • 设备状态验证 • 清除和关闭例程 • 设备控制例程 • 同步 • 共享访问 • 锁和禁用 APC ...

    USB Windows 事件跟踪

    通过筛选 USB 事件创建一个较小的事件日志 安装 Netmon 和 Netmon USB 分析器 检查使用 Netmon 跟踪文件 通过使用 ETW 和 Netmon 疑难解答未知的 USB 设备 背景上的未知的设备问题 启动事件跟踪分析 USB 设备摘要...

    R0层获取ShadowSSDT函数原始地址实例

    [ LemonInfo : 派遣函数(DispatchRoutine) IRP Enter IRP_MJ_DEVICE_CONTROL... ] [ LemonInfo : 获取ShadowSSDT表 (460)NtUserMessageCall 函数的“当前地址”为:0xB83ECFC4,“起源地址”为:0xBF80EE6B ] [ ...

    易语言自写驱动

    易语言自写驱动源码,自写驱动,DriverEntry,Irp分派,Irp创建关闭,驱动卸载过程,Hook,UnHook,my_NtOpenProcess,去除内存保护,还原内存保护,取内核原始地址_NtOpenProcess,取内核原始地址_KeServiceDescriptorTable,...

    WDM驱动StartIo例程

    用WDM实现的StartIo例子。将多个线程创建的IRP串行化处理。

    Rootkit的学习与研究

    1)监控进程创建 2)杀线程 3)保护进程和屏蔽文件执行 9。其他 1)获取ntoskrnl.exe模块地址的几种办法 2)驱动感染技术扫盲 3)shadow ssdt学习笔记 4)高手进阶windows内核定时器之一 5)高手进阶...

    ROOTKIT专题的研究

    1)监控进程创建 2)杀线程 3)保护进程和屏蔽文件执行 9。其他 1)获取ntoskrnl.exe模块地址的几种办法 2)驱动感染技术扫盲 3)shadow ssdt学习笔记 4)高手进阶windows内核定时器之一 5)高手进阶...

    Filemon的源代码新版本

    FileMon创建了两类设备,一个是用于和ring3通信的GUI设备,另一个是hook的过滤设备,但在代码中,当收到发向GUI设备的IRP_MJ_DEVICE_CONTROL时,代码竟是去调用属于hook设备的功能函数,而在这个功能函数里面通过...

    hook以驱动方式注入内核源代码

    TRACEMSG("创建设备...失败"); return retValue; } TRACEMSG("创建设备...完成。键盘设备对象指针为:0x%x", pKeyboardDevice); //挂接设备。 TRACEMSG("挂接设备..."); if (!NT_SUCCESS(retValue = ...

    表空间初始化语句

    2、数据库还原请使用语句形如:imp onecard/onecard@IRP_127.0.0.1 fromuser=onecard touser=onecard file=d:\OneCard_IRP.dmp ********************************************************************/ /*********...

Global site tag (gtag.js) - Google Analytics