首页
社区
课程
招聘
[求助]内核编程,在IoCompleteRequest后还能再修改输出数据吗?
发表于: 2020-4-22 08:45 2721

[求助]内核编程,在IoCompleteRequest后还能再修改输出数据吗?

2020-4-22 08:45
2721
在IRP_MJ_DEVICE_CONTROL函数中,METHOD_IN_DIRECT方式:


*(DWORD*)MmGetSystemAddressForMdlSafe(pIrp->MdlAddress, NormalPagePriority)=0x123456;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);

//此时pIrp->MdlAddress已经清零.在这里还能修改输出的数据0x123456为别的吗?因为只能在这里进行修改操作,有什么办法吗.

return status;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可以,重新分配一个mdl,写入后再释放
2020-4-22 11:07
0
雪    币: 15
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
yy虫子yy 可以,重新分配一个mdl,写入后再释放
感谢回复,可是调用IoCompleteRequest好像就没办法重新分配MDL呢.
这个问题可能无法实现,我是初学者不太懂,让大家见笑了.
2020-4-22 16:49
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
蒋明通 感谢回复,可是调用IoCompleteRequest好像就没办法重新分配MDL呢. 这个问题可能无法实现,我是初学者不太懂,让大家见笑了.
调用IoCompleteRequest之前,取出MDL描述的地址
调用后,再用这个地址重新分配MDL就好了
因为这个地址在返回用户层之前还是有效的
而此时MDL的作用是确保内核层间接访问用户层不会引起页故障
间接访问的意思就像是MDL在内核层和用户层之间架起一座桥梁,因为不能直接访问
所以,IoCompleteRequest虽然把MDL这座桥梁拆了,但是你可以自己重新搭起来,用完之后再自行拆除
2020-4-22 18:22
0
雪    币: 15
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
yy虫子yy 调用IoCompleteRequest之前,取出MDL描述的地址 调用后,再用这个地址重新分配MDL就好了 因为这个地址在返回用户层之前还是有效的 而此时MDL的作用是确保内核层间接访问用户层不 ...
非常感谢,测试确实可行,已经解决问题了.
2020-4-23 13:38
0
雪    币: 15
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
蒋明通 非常感谢,测试确实可行,已经解决问题了.
您好,请问如果是METHOD_BUFFERED方式的也能实现修改吗.

大致就是这样.
PBYTE outbuffer=(PBYTE)pIrp->AssociatedIrp.SystemBuffer;
*outbuffer=1;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
*outbuffer=2;//这里虽然修改成功,但返回用户层的数据并未发生改变.

return 0;
最后于 2020-4-24 20:14 被蒋明通编辑 ,原因:
2020-4-24 20:13
0
游客
登录 | 注册 方可回帖
返回
//