我用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”,
或者看这里d05K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6K6i4K6u0W2L8i4y4V1L8W2)9J5k6h3y4G2L8g2)9J5c8Y4N6V1K9$3c8G2j5%4y4Q4x3V1k6S2M7X3y4Z5K9i4k6W2i4K6u0r3x3U0l9H3z5g2)9J5c8U0l9$3i4K6u0r3x3K6m8Q4x3V1k6C8k6i4u0F1k6h3I4Q4x3X3c8H3M7X3!0Y4M7X3q4E0L8h3W2F1k6#2)9J5k6r3&6@1i4K6u0V1j5h3&6V1i4K6u0V1P5Y4N6Q4x3X3c8$3k6i4u0K6K9h3!0F1M7#2)9J5k6r3!0X3i4K6u0V1N6r3S2W2i4K6u0V1L8X3q4@1K9i4k6W2i4K6u0V1M7%4W2K6N6r3g2E0i4K6u0V1M7$3g2J5N6X3W2U0k6i4y4Q4x3X3c8J5L8%4g2@1K9h3&6W2M7#2)9J5k6h3q4K6M7s2S2Q4c8f1k6Q4b7V1y4Q4z5p5x3`.
以及这里ae5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3!0K6M7X3!0F1L8r3W2F1k6g2)9J5k6h3y4G2L8g2)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3X3g2U0k6X3#2Q4x3@1k6A6k6q4)9K6c8o6t1#2y4H3`.`.