内核模式驱动程序通过在 Ntoskrnl.exe 动态链接库 (DLL) 中调用 Nt 和 Zw 入口点来使用本机系统服务例程。 此 DLL 包含这些例程的实际实现。 若要访问这些入口点,驱动程序静态链接到 Windows 驱动程序工具包(WDK)中提供的 Ntoskrnl.lib 库。 在 Ntoskrnl.lib 中实现的例程是一些存根,可在运行时动态链接到 Ntoskrnl.exe 中的入口点。
WDK 文档描述了 Ntoskrnl.exe中的 Zw 入口点的一部分,但不是全部。 有关驱动程序可以调用的 Zw 例程的说明,请参阅 ZwXxx 例程。
大多数记录的 Zw 例程在 WDK 的 Wdm.h 头文件中定义,但在其他头文件(如 Ntddk.h 和 Ntifs.h)中定义了一些例程。
通常,用户模式应用程序不会调用 Nt 和 Zw 例程。 相反,应用程序可能会调用 Win32 例程(例如 CreateFile),然后调用本机系统服务例程(如 NtCreateFile 或 ZwCreateFile)来执行请求的作。 但是,用户模式应用程序可能会直接调用 Nt 或 Zw 例程来执行 Win32 例程不支持的作。
用户模式应用程序通过调用 Ntdll.dll 动态链接库中的入口点来使用本机系统服务例程。 这些入口点将对 Nt 和 Zw 例程的调用转换为被重定向到内核模式的系统调用。 若要访问这些入口点,用户模式应用程序静态链接到 WDK 中提供的 Ntdll.lib 库。 在 Ntdll.lib 中实现的例程是存根,它们动态链接到运行时 Ntdll.dll 中的入口点。
Windows SDK 文档介绍了 Ntdll.lib 中 Nt 入口点的一些(但并非全部)。 大多数记录的 Nt 例程在 Windows SDK 的 Winternl.h 头文件中定义。 本文档很少提及 Zw 入口点,Windows SDK 中没有头文件包含 Zw 例程的定义。
除几处小例外外,Ntdll.dll 中 Nt 例程的每个入口点都有一个与 Zw 例程对应的入口点。 WDK 和 Windows SDK 的文档建议应用程序开发人员避免调用未记录的 Nt 入口点,并警告 Zw 入口点可能在将来版本的 Windows 中从 Ntdll.dll 消失。 应用程序开发人员在从用户模式调用 Zw 例程时,应做好准备以应对这种情况。
有关应用程序可以调用的 Nt 例程的说明,请参阅 Winternl、 winternl.h 标头和 杂项 Low-Level 客户端支持。 Windows SDK 文档中 Nt 例程的一些参考页将例程标记为“已弃用”,建议读者使用等效的 Win32 例程,而不是弃用 的 Nt 例程。
用户模式应用程序无法调用 Ntoskrnl.exe中的入口点,内核模式驱动程序无法调用 Ntdll.dll中的入口点。