IoGetCurrentIrpStackLocation和IoSkipCurrentIrpStackLocation和IoCopyCurrentIrpStackLocationToNext
2016-02-19 16:43
495 查看
IoGetCurrentIrpStackLocation 例程返回在给定的IRP的指针调用程序的堆栈位置 #define IoGetCurrentIrpStackLocation( Irp ) ( (Irp)->Tail.Overlay.CurrentStackLocation ) IoSkipCurrentIrpStackLocation 所述IoSkipCurrentIrpStackLocation宏修改系统的IO_STACK_LOCATION数组指针,所以,当电流驱动程序调用下一低级驱动程序,该驱动程序接收的电流驱动器接收到的相同IO_STACK_LOCATION结构 #define IoSkipCurrentIrpStackLocation( Irp ) { \ (Irp)->CurrentLocation++; \ (Irp)->Tail.Overlay.CurrentStackLocation++; } 有时候,当前设备堆栈不对IRP做任何处理。英雌,当时设备就不需要对应I/O堆栈。但是IoCallDriver已经将当前I/O堆栈向下移动了一个单位,所以DDK提供了内核宏IoSkipCurrentIrpStackLocation, 它的作用就是将当前I/O堆栈又往回(上)移动一个单位。 这样IoCallDriver和IoSkipCurrentIrpStackLocation对设备堆栈的移动就实现了平衡,也就是没有改变。这时IoCallDriver调用的低一层驱动所用的I/O堆栈,实际上和一层用到的是同一个。 因此,当本层驱动不需要用I/O堆栈时,可以做如下操作 //获取设备扩展 PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)pDevObj->DeviceExtension; //调用底层驱动 IoSkipCurrentIrpStackLocation(pIrp); //调用下层驱动 ntStatus=IoCallDriver(pdx->TargetDevice,pIrp); IoCopyCurrentIrpStackLocationToNext 该IoCopyCurrentIrpStackLocationToNext例行程序会将从当前的I / O堆栈位置到下一层的驱动的堆栈位置IRP栈参数 #define IoCopyCurrentIrpStackLocationToNext( Irp ) { \ PIO_STACK_LOCATION __irpSp; \ PIO_STACK_LOCATION __nextIrpSp; \ __irpSp = IoGetCurrentIrpStackLocation( (Irp) ); \ __nextIrpSp = IoGetNextIrpStackLocation( (Irp) ); \ RtlCopyMemory( __nextIrpSp, __irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \ __nextIrpSp->Control = 0; } 在另外一种情况下,即当前IRP也参与操作时,就需要将当前I/O堆栈的参数复制到下一层,需要调用内核宏IoCopyCurrentIrpStackLocationToNext,也就是如下操作: //获取设备扩展 PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)pDevObj->DeviceExtension; //调用底层驱动 IoCopyCurrentIrpStackLocationToNext(pIrp); ntStatus=IoCallDriver(pdx->TargetDevice,pIrp);
相关文章推荐
- iOS 快速遍历 效率分析 for loop for in enumerateBlock 适用条件
- iOS7 打开相机代码
- iOS系统越狱检测
- 越狱检测的攻与防
- iOS的断点调试
- iOS应用程序测试打包
- iOS 实现摇一摇功能
- IOS 信息提示2
- iOS基础Framework作用
- iOS一些实用的技巧
- IOS抽出接口对象中集合数据存入一个单一集合
- IOS 设置支付按键方形角为圆弧
- iOS开发 -- 为本地文件添加自定义属性的工具类
- iOS开发的一些奇巧淫技
- IOS 支付完成回退到指定界面
- IOS 信息提示1
- iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- Xcode7制作framework教程 iOS9
- IOS auto layout label自适应长度
- IOS 高级开发 KVC(一),ios开发kvc