首页
社区
课程
招聘
[求助]用户模式到内核模式参数拷贝问题
发表于: 2011-2-22 09:28 5227

[求助]用户模式到内核模式参数拷贝问题

2011-2-22 09:28
5227
我在Undocumented Windows 2000 Secrets 一书中看到,ntdll.dll中的Native API通过软件中断Int 2Eh 或者 Sysenter进入内核模式, eax中存放的是服务例程的服务号, 而服务例程的参数是通过栈传递的, 根据参数表中的字节数, 将用户模式下的栈空间内容拷贝到内核模式的栈空间下。

现在我有一个问题, 如果服务例程的参数是指针, 比如指向一个字符串的指针, 那么从用户模式拷贝到内核模式, 那么这个指针可能就无效了(因为线程调度), 这也就意味着参数是无效的。
这个问题是怎么解决的呢?

还有, 如果说, 是通过指向字符串的指针拷贝字符串, 那么内核是如何知道,这个参数是字符串指针而不是结构指针,或者其它的呢?

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
我这个问题很弱智吗? 为什么没有人回应一下呢?
2011-2-22 10:39
0
雪    币: 163
活跃值: (75)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
参照deviceiocontrol的那几中通信方式,systembuffer, userbuffer,irp->mdladdress
2011-2-22 10:44
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
我想你没有明白我说的意思
比如NtCreateFile:
mov eax, serviceID
mov edx, [用户栈]
int 2eh

这里面, 通过serviceID内核知道是哪个服务, 通过edx知道用户空间的参数放在什么地方, 通过ArgumentTable知道这个服务需要拷贝的参数是多少个字节
现在问题是, 假设这个参数中有指针, 而这个指针可能是字符串指针, 或者是结构指针,那么内核是如何知道这个是字符串, 还是结构?
2011-2-22 11:06
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
我想是不是这样的, 通过ServiceID可以知道是哪个具体的服务例程, 然后每个服务例程参数都知道, 具体的服务例程, 参数具体处理, 这样就应该没有问题了

如果是字符串, 那么在内核空间开辟内存, 把用户空间的字符串复制过来, 并把字符串指针改为内核模式下的字符串指针, 这样的话, 就不会有问题了
2011-2-22 11:14
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
用户模式拷贝到内核模式,线程不会调度。不是驱动的ioctl,呵呵
2011-2-23 10:47
0
游客
登录 | 注册 方可回帖
返回
//