欢迎来到天天文库
浏览记录
ID:37915729
大小:94.00 KB
页数:6页
时间:2019-06-02
《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标志的驱动程序,其读写
此文档下载收益归作者所有