资源描述:
《IRP结构 驱动程序基础概念.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、IRP结构——驱动程序基础概念WIN2000以上的系统I/O都是包驱动的,系统采用一种称为”1/0请求包”的数据格式与内核模式下的驱动程序通信。所谓的"I/O请求包”,就是IRP"一、IRP简介IRP是I/ORequestPcaket的缩写,即I/O请求包。驱动与驱动之间通过IRP进行通信。而使用驱动的应用层调用的CreatFile,ReadFile,WriteFile,DeviceloControl等函数,说到底也是使用IRP和驱动进行通信。IRP由I/O管理器根据用户态程序提出的请求创建并传给相应的驱动程序。在分层的驱动程序中,这个过程很复杂,一个IR
2、P常常要穿越几层驱动程序。二、IRP结构IRP功能的复杂性也决定了IRP结构的复杂性。正确理解IRP的结构是理解驱动程序开发的基础。另外,IRP的创建是由1/0管理器在非分页内冇进行的。一个IRP有两部分组成:头部区域和I/O堆栈位置。1)IRP的头部区域是一个固定的部分,起始就是一个IRP结构。2)在这个头部的后面是一个I/Ostacklocations,这是一个IO_STACK_LOCATIONS的结构体数组,这个数组中元素的个数视具体情况而定。由IoAllocateIrp(INCCHARStackSize,INBOOLEANChargeQuota)时
3、的参数StackSize决定。而StackSize通常由IRP发往的目标DEVICE_OBJECT的+30charStackSize决定。而这个StackSize是由设备对彖连入所在的设备栈时,根据在设备栈中位置决定的。下面看看IRP结构(头部区域)和IO_STACK_LOCATIONS(I/O堆栈)的结构的定义1・IRP结构介绍,结构图如下,其中灰色部分为不可见区域,这里主要讲解一下可见区域。MdlAddressFlagsAssociatelrploStatusRequestorModePendingRetumedCancelCarwellrqlCanc
4、elRoutineUserBufferTail1.1PMDLMdlAddress:设备执行直接I/O时,指向用户空间的内存描述表1.2ULONGFlags:包含一些对驱动程序只读的标志。但这些标志与WDM驱动程序无关1.3Associatedlrp・SystemBuffer:SystemBuffer扌旨针扌旨向一个数据缓冲区,该缓冲区位于内核模式的非分页内存中I/O管理器把用户模式程序发送给驱动程序的数据复制到这个缓冲区,这也是创建IRP过程的一部分。对于读请求,设备驱动程序把读出的数据填到这个缓冲区,然后I/O管理器再把缓冲区的内容复制到用户模式缓冲区。
5、这个结构体仅包1.4IoStatus:是一个结构体10.STATUS.BLOCK,含两个域,驱动程序在最终完成请求时设置这个结构。IoStatus.Status:将收到一个NTSTATUS代码。IoStatus.Information的类型为ULONGPTR,它将收到一个信息值,该信息值的确切含义要取决于具体的IRP类型和请求完成的状态。InfosEiticm域的一个公认用法是用于保存数据传输操作。某些PnP请求把这个域作为指向另外一个结构的指针,这个结构通常包含查询请求的结果。1.5RequestorMode将等于一个枚举常量UserMode或Kerne
6、lMode,指定原始I/O请求的来源。驱动程序有时需要查看这个值来决定是否要信任某些参数。1.6PendingReturned(BOOLEAN)如果为TRUE,则表明处理该IRP的最低级派遣例程返回了STATUS_PENDINGO完成例程通过参考该域來避免自己与派遣例程间的潜在竞争。1.7Cancel(BOOLEAN)如果为TRUE,则表明IoCaiicelIi*p己被调用,该函数用于取消这个请求。如果为FALSE,则表明没有调用IoCancellrp函数。取消IRP是一个相对复杂的主题,我将在本章的最后详细描述它。1.8Cancellrql(KIRQL)
7、是一个IRQL值,表明那个专用的取消自旋锁是在这个IRQL上获取的。当你在取消例程中释放自旋锁时应参考这个域。1.9CancelRoutine(PDRIVER_CANCEL)是驱动程序取消例程的地址。你应该使用IoSetCancelRoutine函数设置这个域而不是直接修改该域。2.0UserBuffer(PVOID)对于MET1IOD_NEITI1ER方式的1RP_M.J_DEV1CE_CONTROL请求,该域包含输出缓冲区的用户模式虚拟地址。该域还用于保希读写请求缓冲区的用户模式虚拟地址,但指定了DOBUFFERED10或DO_DIRECT_10标志的
8、驱动程序,其读写例程通常不需要访问这个域。当处理一个METI1OD