IRP结构----驱动程序基础概念

IRP结构----驱动程序基础概念

ID:37915729

大小:94.00 KB

页数:6页

时间:2019-06-02

IRP结构----驱动程序基础概念_第1页
IRP结构----驱动程序基础概念_第2页
IRP结构----驱动程序基础概念_第3页
IRP结构----驱动程序基础概念_第4页
IRP结构----驱动程序基础概念_第5页
资源描述:

《IRP结构----驱动程序基础概念》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、IRP结构----驱动程序基础概念WIN2000以上的系统I/O都是包驱动的,系统采用一种称为"I/O请求包"的数据格式与内核模式下的驱动程序通信。所谓的"I/O请求包",就是IRP。一、IRP简介        IRP是I/ORequestPcaket的缩写,即I/O请求包。驱动与驱动之间通过IRP进行通信。而使用驱动的应用层调用的CreatFile,ReadFile,WriteFile,DeviceIoControl等函数,说到底也是使用IRP和驱动进行通信。IRP由I/O管理器根据用户态程序提出的请求创建并传给相应的驱动

2、程序。在分层的驱动程序中,这个过程很复杂,一个IRP常常要穿越几层驱动程序。二、IRP结构       IRP功能的复杂性也决定了IRP结构的复杂性。正确理解IRP的结构是理解驱动程序开发的基础。另外,IRP的创建是由I/O管理器在非分页内存进行的。       一个IRP有两部分组成:头部区域和I/O堆栈位置。       1)IRP的头部区域是一个固定的部分,起始就是一个IRP结构。       2)在这个头部的后面是一个I/Ostacklocations,这是一个IO_STACK_LOCATIONS的结构体数组,这个数组

3、中元素的个数视具体情况而定。由IoAllocateIrp(INCCHARStackSize,INBOOLEANChargeQuota)时的参数StackSize决定。而StackSize通常由IRP发往的目标DEVICE_OBJECT的+30charStackSize决定。而这个StackSize是由设备对象连入所在的设备栈时,根据在设备栈中位置决定的。             下面看看IRP结构(头部区域)和IO_STACK_LOCATIONS(I/O堆栈)的结构的定义      1.IRP结构介绍,结构图如下,其中灰色部分

4、为不可见区域,这里主要讲解一下可见区域。            1.1PMDL MdlAddress:设备执行直接I/O时,指向用户空间的内存描述表       1.2ULONGFlags:包含一些对驱动程序只读的标志。但这些标志与WDM驱动程序无关       1.3AssociatedIrp.SystemBuffer :SystemBuffer指针指向一个数据缓冲区,该缓冲区位于内核模式的非分页内存中I/O管理器把用户模式程序发送给驱动程序的数据复制到这个缓冲区,这也是创建IRP过程的一部分。对于读请求,设备驱动程序把读出

5、的数据填到这个缓冲区,然后I/O管理器再把缓冲区的内容复制到用户模式缓冲区。      1.4IoStatus:是一个结构体IO_STATUS_BLOCK,这个结构体仅包含两个域,驱动程序在最终完成请求时设置这个结构。IoStatus.Status:将收到一个NTSTATUS代码。IoStatus.Information的类型为ULONG_PTR,它将收到一个信息值,该信息值的确切含义要取决于具体的IRP类型和请求完成的状态。Information域的一个公认用法是用于保存数据传输操作。某些PnP请求把这个域作为指向另外一个结

6、构的指针,这个结构通常包含查询请求的结果。       1.5RequestorMode将等于一个枚举常量UserMode或KernelMode,指定原始I/O请求的来源。驱动程序有时需要查看这个值来决定是否要信任某些参数。       1.6PendingReturned(BOOLEAN)如果为TRUE,则表明处理该IRP的最低级派遣例程返回了STATUS_PENDING。完成例程通过参考该域来避免自己与派遣例程间的潜在竞争。       1.7Cancel(BOOLEAN)如果为TRUE,则表明IoCancelIrp已被调

7、用,该函数用于取消这个请求。如果为FALSE,则表明没有调用IoCancelIrp函数。取消IRP是一个相对复杂的主题,我将在本章的最后详细描述它。       1.8CancelIrql(KIRQL)是一个IRQL值,表明那个专用的取消自旋锁是在这个IRQL上获取的。当你在取消例程中释放自旋锁时应参考这个域。       1.9CancelRoutine(PDRIVER_CANCEL)是驱动程序取消例程的地址。你应该使用IoSetCancelRoutine函数设置这个域而不是直接修改该域。        2.0UserBuf

8、fer(PVOID)对于METHOD_NEITHER方式的IRP_MJ_DEVICE_CONTROL请求,该域包含输出缓冲区的用户模式虚拟地址。该域还用于保存读写请求缓冲区的用户模式虚拟地址,但指定了DO_BUFFERED_IO或DO_DIRECT_IO标志的驱动程序,其读写

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。