• 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

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

  • 相关阅读:
    Oracle数据库的权限、用户、角色管理
    linux address already in use:make_sock:could not bind to address [::]:80
    linux上ln命令详细说明
    IPhone多线程下载器,支持多种主题
    Android 开发从入门到精通
    iOS开发视频教程下载/iphone开发视频教程下载
    oscocos2d游戏开发基础进度条开发笔记
    分享10个Android游戏源码,要的赶紧来哈
    android中点中overlay弹出带尾巴的气泡的实现
    分享20个Android游戏源码,希望大家喜欢哈!
  • 原文地址:https://www.cnblogs.com/dhf327/p/4562431.html
Copyright © 2020-2023  润新知