我用depend查看ntoskrnl.exe,发现里面导出了竟50哥NT*函数,然后查看ms网站,显示:Windows Driver Kit: Kernel-Mode Driver Architecture
NtOpenProcess
Do not call this routine from kernel-mode code.
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
看最新的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