首页
社区
课程
招聘
[求助]请教DeviceIoControl如何传用户地址给驱动操作.
发表于: 2009-4-9 12:23 4288

[求助]请教DeviceIoControl如何传用户地址给驱动操作.

2009-4-9 12:23
4288
neirong = (DWORD*)::VirtualAlloc(NULL,4096,4096,16);

if(!::DeviceIoControl(hd,IOCTL_MY,&neirong,4,&b,4,&c, 0))
{
                ::AfxMessageBox("send failuer!");
}

====================驱动====================
neirong = (DWORD*)stack->Parameters.DeviceIoControl.Type3InputBuffer;这样得到的是内核地址

neirong = (DWORD*)Irp->UserBuffer;这样得到的也是内核地址,

neirong = (DWORD*)Irp->AssociatedIrp.SystemBuffer;这样得到的是0;

请教,如何可以在用户层申请的一段内容传给驱动,把内核得到的数据写到用户层申请的内存里返回给应用程序.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
请先了解驱动与ring3共享内存的三种方式:DirectIO,BufferedIO,Neither
2009-4-9 12:29
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
3种都看了,3种也都试了,不知道为什么就是不行,我看书上就是这样的.Neither其他模式下.
是用neirong = (DWORD*)stack->Parameters.DeviceIoControl.Type3InputBuffer这个取的输入缓冲区数据,为什么我取到的还是内核地址,  neirong = (DWORD*)Irp->UserBuffer这个获取用户模式地址,也是得到的内核地址
2009-4-9 12:31
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
问题解决了,得到的是内核地址,只是把用户层的数据映射到内核地址下,*(DWORD*)neirong
这样就可以取到了!!!晕菜...........
2009-4-9 12:34
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
采用哪种模式和你的IOCTL CODE定义有关,参考CTL_CODE宏
2009-4-9 12:35
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
恩,我定义的是neirong模式的,刚才蓝了~~~~~~~~~~~

驱动是不是不能直接操作用户层的内存呀?我把申请的内存传给驱动后,驱动把数据RtlCopyMemory到用户层申请的内存里,蓝了.......

是申请的内存属性问题!!!!
2009-4-9 12:53
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
直接操作userbuffer不好, 自己申请块nonpagepool好点~
2009-4-9 13:56
0
游客
登录 | 注册 方可回帖
返回
//