• 映泰主板驱动 > WDM驱动程序设计
  • WDM驱动程序设计

    免费下载 下载该文档 文档格式:PPT   更新时间:2009-11-01   下载次数:0   点击次数:1
    文档基本属性
    文档语言:
    文档格式:ppt
    文档作者:lilh
    关键词:
    主题:
    备注:
    点击这里显示更多文档属性
    WDM驱动程序设计
    I/O请求包(IRP)
    IRP的总体结构
    Windows操作系统使用一种称为I/O请求包(IRP)的数据结构与内核模式驱动程序通信.Windows驱动程序中几乎所有的I/O操作都是包驱动的.
    一个I/O请求包由一个IRP首部加一系列的栈单元组成.每个栈单元是一个IO_SATCK_LOCATION结构.
    IRP首部
    栈单元1
    栈单元2
    栈单元3
    … …
    当前栈单元
    驱动程序栈与I/O栈单元之间的关系
    栈单元数组(I/O堆栈)中的每个堆栈单元都对应一个将处理该IRP的驱动程序.
    IRP首部的结构
    IRP首部的重要字段
    MdlAddress(PMDL):指向一个内存描述符表(MDL),它描述了一个与该请求关联的用户模式缓冲区.在驱动程序与用户模式程序之间利用"直接I/O方式"进行通信时,驱动程序利用该字段访问用户模式的虚拟内存.
    AssociatedIrp:是一个三指针联合(union).其中,与NT式驱动程序相关的指针是AssociatedIrp.SystemBuffer. SystemBuffer指针指向一个数据缓冲区,该缓冲区位于内核模式的非分页内存中.在驱动程序与用户模式程序之间利用"缓冲I/O方式"进行通信时,驱动程序利用该缓冲区输入输出数据.I/O管理器会自动将用户模式缓冲区中的数据复制到SystemBuffer缓冲区,或者自动将SystemBuffer缓冲区中的数据复制到用户模式缓冲区.
    IRP首部的重要字段
    IoStatus(IO_STATUS_BLOCK):是一个仅包含两个域的结构,驱动程序在最终完成请求时设置这个结构.IoStatus.Status域将收到一个NTSTATUS代码,而IoStatus.Information的类型为ULONG_PTR,它将收到一个信息值,该信息值的确切含义要取决于具体的IRP类型和请求完成的状态.
    IoStatus.Information域的一个公认用法是用于保存数据传输操作,如IRP_MJ_READ,的流量总计.某些PnP请求把这个域作为指向另外一个结构的指针,这个结构通常包含查询请求的结果.
    RequestorMode:是一个枚举常量,取值为UserMode或KernelMode,指定IRP的最初来源.驱动程序有时需要查看这个值来决定是否要信任某些参数.
    IRP首部的重要字段
    PendingReturned(BOOLEAN):如果为TRUE,则表明处理该IRP的低级派遣例程返回了STATUS_PENDING.完成例程通过参考该域来避免自己与派遣例程间的潜在竞争.
    Cancel(BOOLEAN):如果为TRUE,则表明内核服务函数IoCancelIrp已被某个程序实体在该IRP所调用,该函数用于取消这个IRP.如果为FALSE,则表明没有被取消.
    CancelIrql(KIRQL):是一个IRQL值,表明那个专用的取消自旋锁是在这个IRQL上获取的.当在取消例程中释放自旋锁时应参考这个域.
    CancelRoutine(PDRIVER_CANCEL):是一个回调函数指针,指向取消例程.在取消某个IRP时,取消例程会被自动调用.应该使用IoSetCancelRoutine函数设置这个域而不是直接修改该域.
    IRP首部的重要字段
    UserBuffer(PVOID) :对于METHOD_NEITHER方式的IRP_MJ_DEVICE_CONTROL请求,该域用于保存读写请求缓冲区的用户模式虚拟地址 .
    Tail:是一个联合,其结构如下所示:
    IRP首部的重要字段
    CurrentLocation (CHAR):当前栈单元在数组中的索引.
    Tail.Overlay.CurrentStackLocation(PIO_STACK_LOCATION):指向当前栈单元的指针.一般不在驱动程序中直接访问这两个字段,可以使用象IoGetCurrentIrpStackLocation这样的函数获取这些信息.
    IO_STACK_LOCATION的结构
    栈单元的重要字段
    MajorFunction(UCHAR):表示该IRP的主功能码.这个代码应该为类似IRP_MJ_READ一样的值,并与驱动程序对象中MajorFunction表的某个派遣函数指针相对应.
    MinorFunction(UCHAR):表示该IRP的副功能码.它进一步指出该IRP属于哪个主功能类.例如,IRP_MJ_PNP请求就有很多的副功能码,如IRP_MN_START_DEVICE,IRP_MN_REMOVE_DEVICE,等等.

    下一页

  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 PPT格式下载
  • 您可能感兴趣的
  • 映泰主板驱动下载  映泰主板驱动包  映泰主板网卡驱动下载  映泰主板声卡驱动  映泰p31a7主板驱动  映泰h61主板网卡驱动  主板映泰a785ge驱动  映泰主板h61主板驱动  映泰880g主板驱动下载