首页
社区
课程
招聘
[求助]关于内核NT 系列函数的问题
发表于: 2009-8-16 14:33 10004

[求助]关于内核NT 系列函数的问题

2009-8-16 14:33
10004
我用depend查看ntoskrnl.exe,发现里面导出了竟50哥NT*函数,然后查看ms网站,显示:Windows Driver Kit: Kernel-Mode Driver Architecture
NtOpenProcess
Do not call this routine from kernel-mode code.

就是说不能使用

不解 请指教 谢谢~~

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

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Do not call this routine from kernel-mode code; instead, call the ZwXxx equivalent. User-mode code can call can this routine or the ZwXxx equivalent. For further comments, if any, see the ZwXxx equivalent.
不是完全不让用,是让你用ZwXXXX
至于区别ZwXXXX和用户态的系统调用会在内核栈上创建一个trap frame
然后通过统一流程到达NtXXXX
而 trap frame的作用主要是保存调用者的完整信息用于恢复执行
ZwXXXX会创建一个trap frame并把TCB的PreviousMode设为内核态
用户态的系统调用会创建一个会创建一个并把TCB的PreviousMode设为用户态
而NtXXXX不创建trap frame
比如说你调用DeviceIoControl 发给你自己编的Device Driver 让它帮你打开一个内核态才能访问的进程
可能的流程是
DeviceIoControl ->Ntdll!NtDeviceIoControlFile ->创建trap frame,PreviousMode为用户态 -> Nt!NtDeviceIoControlFile
->你的Device Driver  XxxDispatchDeviceControl->Nt!ZwOpenProcess->创建trap frame,PreviousMode为内核态->Nt!NtOpenProcess->用TCB里的信息测试访问权限,发现是内核态的请求,验证通过,返回Handle

而假如调用NtXXXX
DeviceIoControl ->Ntdll!NtDeviceIoControlFile ->创建trap frame,PreviousMode为用户态 -> Nt!NtDeviceIoControlFile
->你的Device Driver  XxxDispatchDeviceControl->Nt!NtOpenProcess->用TCB里的信息测试访问权限,发现是用户态的请求,打开失败

而Nt!NtXXXX主要是供内核自己和hal之类的组件调用的,这些调用不需要创建trap frame,因而更快一点
有的调用的目的就是操作trap frame,如ZwSetContextThread/NtSetContextThread,最好都不要用,
而是用PsSetContextThread
2009-8-16 16:47
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
非常感谢 leftup 兄 辛苦了 打了那么多
系统调用流程基本上都懂  一些细节和设计方面有点模糊
就是说如果我的驱动在内核 我直接调用NT*函数,它没有像zw*那样那样建立trap frame设置PreviousMode为内核态再调用nt* 那么复杂  那么既然这样 我干脆全用nt系列的就是了? 不是又快又好?
还有就是:
zw*的流程是什么样的 (reactos上能看到它的实现吧?)
nt*是否确定被导出,是可用的
2009-8-16 17:25
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
leftup 兄 怎么联系你?
2009-8-16 17:26
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
驱动在内核不是重点,因为kernel里的所有代码都在内核态,但是为什么你在用户态调用一个系统调用,进入内核,有一些访问的要求会被拒绝呢?
调用NtXXXX时被调用函数查看PreviousMode是用户态,很多AccessCheck会通不过,这就有点像服务端Impersonate客户端一样
而调用ZwXXXX时被调用函数查看PreviousMode是核心态,很多AccessCheck会直接通过而不检查ACL,Privilege之类的
简单来说NtXXXX函数都是通过PreviousMode来区分调用者是代表用户态还是核心态的
2009-8-16 17:57
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
这个我知道啊

我的意思是说我直接用nt 的不是更好么? 只要它导出了我为什么不用呢?
用他有什么好处 又有什么坏处?
2009-8-17 11:37
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
高人也!我好崇拜你哦
2009-8-17 15:40
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
....不知道你说的什么意思
2009-8-17 15:54
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
9
nt*函数可以使用,但由于她不会更改prevmode,所以若你当前mode是user mode,就不能使用kernel mode的buffer。
2009-8-17 16:01
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
nt*函数可以使用,但由于她不会更改prevmode,所以若你当前mode是user mode,就不能使用kernel mode的buffer。

那我的驱动在内核的话 要怎样在能安全稳定的使用呢?
2009-8-17 16:31
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
11
可以创造或者“借用”USER MODE BUFFER
2009-8-17 18:01
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
既然想调用NtXXXX,那就直接从User mode 调用就行了
用不着驱动了
2009-8-17 19:01
0
雪    币: 462
活跃值: (53)
能力值: ( LV9,RANK:460 )
在线值:
发帖
回帖
粉丝
13
看最新的WDK文档,里面加了一节内容
“Using Nt and Zw Versions of the Native System Services Routines”,
或者看这里http://blogs.msdn.com/wdkdocs/archive/2009/06/30/kernel-programming-nt-and-zw-versions-of-the-native-system-services-routines.aspx,
以及这里http://www.osronline.com/article.cfm?id=257
2009-8-18 12:54
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
既然想调用NtXXXX,那就直接从User mode 调用就行了
用不着驱动了

leftup  兄 我说的是内核的nt函数。。。
2009-8-18 15:06
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
感谢zhzhtst提供的资料!
2009-8-18 15:59
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
还有个问题想请教一下 mj 等大牛
内核中什么时候会出现调用NtXxx函数 ,而PreviousMode为UserMode的情况?
2009-8-18 16:26
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
如果PreviousMode是UserMode,那就和从用户态调用没多大区别
那干嘛非得从内核调用,难到内核的就香一点
跑到内核为了干点从用户态能办到的事,好像没什么意义
2009-8-18 16:57
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
讲得很透彻
以前我一直不知道Zw是什么意思,原来本来就是没什么意思
2009-8-18 17:08
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
看下这个贴吧  http://bbs.pediy.com/showthread.php?t=55142&highlight=Nt+%E5%86%85%E6%A0%B8+%E6%A0%B8%E6%80%81+%E6%80%81%E8%B0%83+%E8%B0%83%E7%94%A8+%E5%87%BD%E6%95%B0+%E6%95%B0

我的问题就跟他差不多
2009-8-18 17:11
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学习中。。。。。。。。
2009-8-19 14:00
0
游客
登录 | 注册 方可回帖
返回
//