zoukankan      html  css  js  c++  java
  • IoSkipCurrentIrpStackLocation .(转)

    原文链接:http://m.blog.csdn.net/blog/ruanben/19758769#

    当驱动被分层以后,他们被注册到一个chain中,IRP会在这个chain中传递,从最上面,到最下面,再回到最上面
    为适应这种体制,IRP的结构的大小是不固定的,大体结构如下:
    --------------------
    | IRP header |
    --------------------
    |IO_STACK_LOCATION |<-----lowest driver stack location #index1
    --------------------
    |IO_STACK_LOCATION |<-----next higher stack location #index2
    --------------------
    |IO_STACK_LOCATION |<-----topmost driver stack location #index3
    --------------------
    也就是说,chain的最顶层的驱动,对应的IO_STACK_LOCATION是在最下面
    IRP头中存放着当前驱动对应的IO_STACK_LOCATION的索引,是从1开始的,不是从0开始
    同时,也保存着当前驱动对应的IO_STACK_LOCATION的地址
    最上面的驱动处理完这个IRP后,调用IoCallDriver,这会使索引减1,地址也修正为下一个IO_STACK_LOCATION的地址,
    然后IRP被交给下一个Driver处理,
    而IoSkipCurrentIrpStackLocation宏的作用就是使IO_STACK_LOCATION指针少前进一步
    而IoCallDriver函数会使IO_STACK_LOCATION指针向前一步,中和的结果就是IO_STACK_LOCATION2006-11-20指针不变
    当下一个驱动程序的派遣例程调用IoGetCurrentIrpStackLocation时,它将收到与我们正使
    用的完全相同的IO_STACK_LOCATION指针,因此,它所处理的将是同一个请求(相同的主副功
    能代码)以及相同的参数。

     

    附:过滤驱动与IRP处理方式

    a.pending 完成例程

         IoCopyCurrentIrpStackLocationToNext

    b.忽略直接下发

        IoSkipCurrentIrpStackLocation,下层设备拿到的IO_STACKLOCATION和当前的一样

    c.结束IRP不下发

       PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(irp);

       irp->IoStatus.Status = STATUS_SUCCESS;

       irp->IoStatus.Information = 0;

       IoCompleteRequest(Irp,IO_NO_INCREMENT);

    d.手动构建IRP

        IoAllocateIrp

       IoGetNextIrpStackLocation

    每天进步一点点,有时间先装修空间哈

  • 相关阅读:
    jQuery-封装的表单元素选择器
    jQuery-获取DOM元素的各类选择器
    jQuery-外部引用和直接引用
    数据库-查询平均成绩大于60分的同学的学号和平均成绩
    数据库-查询“001”课程比“002”课程成绩高的所有学生的学号
    ps让图片背景透明
    echarts中饼图的legend自定义icon图片(扇形为例)
    获取bootstrap模态框点击的对应项(e.relatedTarget.dataset)
    echarts属性的设置(完整大全)
    小程序获取地理位置授权
  • 原文地址:https://www.cnblogs.com/dhf327/p/4562431.html
Copyright © 2011-2022 走看看