NT系统被设计成为支持子系统(封装),它可以执行在不同平台上的代码。包括但不限于:POSIX,OS/2和Win32,为了管理这些子系统,NT内核输出了大量名为Native API的API函数,子系统服务将这些函数包装为他们自己的函数。例如:CreateFile和fopen都被映射到NtCreateFile.
那么子系统管理程序运行在哪个子系统中?为了避免先有鸡还是先有蛋的问题,NT系统同样支持原生的Native应用程序。这些native应用程序是独立于子系统的
现在,所有的子系统应用程序都需要注册它们自己的子系统服务,显然,Kernel32是一个Win32应用程序,csrss注册WIN32子系统,然后通知子系统管理器SMSS,因此,一个native应用程序是无法调用其中数千种API的,同时它也无法使用一些基本的DLL中的函数例如kernel32,user32,gdi32等,其它任何调用了这三者的DLL中的函数的DLL也无法被使用。事实上,加载者在其入口点没有被加载前,并不允许加载决大多数的win32 DLL。因此,native应用程序被限制只许使用一个DLL:ntdll.dll,这个DLL供应所有NATIVE和运行函数。但是想想,既然所有WIN32函数最后都是去调用ntdll.dll中的函数来实现的(除了GUI部分),这些函数就已经足够了,不是吗?
现在你知道native应用程序是什么了,下一部分我将介绍更多关于native的信息