库和标头

内核模式驱动程序通过调用 Ntoskrnl.exe 动态链接库中的 NtZw 入口点 (DLL) 来使用本机系统服务例程。 此 DLL 包含这些例程的实际实现。 若要访问这些入口点,驱动程序会静态链接到 Ntoskrnl.lib 库,该库在 Windows 驱动程序工具包 (WDK) 中可用。 在 Ntoskrnl.lib 中实现的例程是动态链接到运行时Ntoskrnl.exe入口点的存根。

WDK 文档介绍了Ntoskrnl.exe中的一些(但不是全部 )Zw 入口点。 有关可由驱动程序调用的 Zw 例程的说明,请参阅 ZwXxx 例程

大多数记录的 Zw 例程在 WDK 的 Wdm.h 头文件中定义,但有些例程在其他头文件(如 Ntddk.h 和 Ntifs.h)中定义。

通常,用户模式应用程序不调用 NtZw 例程。 相反,应用程序可能会调用 Win32 例程(例如 CreateFile),后者随后调用本机系统服务例程(如 NtCreateFileZwCreateFile)来执行请求的操作。 但是,用户模式应用程序可以直接调用 NtZw 例程来执行 Win32 例程不支持的操作。

用户模式应用程序通过调用Ntdll.dll动态链接库中的入口点来使用本机系统服务例程。 这些入口点将对 NtZw 例程的调用转换为捕获到内核模式的系统调用。 若要访问这些入口点,用户模式应用程序会静态链接到 WDK 中提供的 Ntdll.lib 库。 在 Ntdll.lib 中实现的例程是可在运行时动态链接到 Ntdll.dll 中的入口点的存根。

Windows SDK 文档介绍了 Ntdll.lib 中的一些(但不是全部) Nt 入口点。 大多数记录的 Nt 例程都在 Windows SDK 的 Winternl.h 头文件中定义。 本文档很少提及 Zw 入口点,Windows SDK 中没有头文件包含 Zw 例程的定义。

如果出现几个次要异常, Nt 例程Ntdll.dll中的每个入口点都有 Zw 例程的匹配入口点。 WDK 和 Windows SDK 的文档建议应用程序开发人员避免调用未记录的 Nt 入口点,并警告 Zw 入口点可能会在将来的 Windows 版本中从Ntdll.dll消失。 从用户模式调用 Zw 例程的应用程序开发人员应为此做好准备。

有关可由应用程序调用的 Nt 例程的说明,请参阅 Winternlwinternl.h 标头杂项Low-Level客户端支持。 Windows SDK 文档中 Nt 例程的一些参考页将例程标记为“已弃用”,并建议读者使用等效的 Win32 例程,而不是已弃用的 Nt 例程。

用户模式应用程序无法调用 Ntoskrnl.exe 中的入口点,内核模式驱动程序无法调用 Ntdll.dll 中的入口点。