首页
社区
课程
招聘
[讨论]Irp可以直接复制或者克隆吗?
2023-4-9 22:35 6439

[讨论]Irp可以直接复制或者克隆吗?

2023-4-9 22:35
6439
收藏
点赞2
打赏
分享
最新回复 (4)
雪    币: 2927
活跃值: (2530)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caocaofff 2023-4-10 08:41
2
0

不建议直接复制或克隆Irp对象。因为Irp对象是内核数据结构,需要了解其结构和使用方法,否则会带来不可预知的后果。


如果需要请用IoCopyCurrentIrpStackLocationToNext() 函数拷贝原Irp栈,然后通过IoGetNextIrpStackLocation() 函数取得新Irp的栈,通过IoSetCompletionRoutine() 函数复制完成处理例程和Context,最后完成copy。具体代码实现如下:


PIRP new_irp = IoAllocateIrp(old_irp->StackCount, FALSE);
if (new_irp) {
    IoCopyCurrentIrpStackLocationToNext(old_irp, new_irp);
    IoSetCompletionRoutine(new_irp, old_irp->CompletionRoutine, old_irp->CompletionContext, TRUE, TRUE, TRUE);
    // 现在 new_irp 被完全复制,可以把它传递给 IoCallDriver() 函数了。
    IoCallDriver(DeviceObject, new_irp);
}



雪    币: 8236
活跃值: (4946)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
大道在我 2023-4-10 10:23
3
0
可以,有API当然用API   irp栈刚刚申请的时候全是空的   操作系统也是帮你复制传递下去的
雪    币: 2415
活跃值: (9240)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
TkBinary 5 2023-4-10 10:28
4
0
同一楼. 可以拷贝.但是要对IRP结构熟悉. 比如里面因为同步异步可能设置事件. 也会设置完成函数. CompletionRoutinue. 建议看下了解下IRP之后再拷贝.否则就是BSOD. xxxx 
雪    币: 504
活跃值: (3061)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wem 2023-4-13 10:38
5
0
谢谢楼上
游客
登录 | 注册 方可回帖
返回