Windows Native API编程 专栏说明
# 引言
Windows的底层(low-level)用户模式(user-mode)编程通常涉及使用有文档记录的Windows API(应用程序接口),这些API从子系统动态链接库(DLL)中导出,例如Kernel32.dll、user32.dll、advapi32.dll、kernelbase.dll等。这些API的底层大多隐藏着系统调用(system calls),通过这些系统调用可访问内核(kernel)。在Windows(或其他任何操作系统)中,任何有实际价值的操作都必须与内核交互以完成系统级任务,例如分配内存、创建进程和线程、执行I/O操作等。
原生API(Native API)由几个动态链接库(DLL)实现,用于实现向内核的过渡。其中最重要的是NtDll.dll——一个系统级的用户模式动态链接库(user-mode DLL),承担着这一关键角色。本专栏将围绕该动态链接库的API展开,重点介绍如何通过调用系统调用将处理器切换到内核模式(kernel-mode)以执行所需操作。专栏中还会讨论其他一些API,它们本身虽不属于系统调用,但仍是NtDll的一部分,值得深入了解。这些函数大多以Rtl(运行时库,Runtime Library)为前缀。
举一个简单的例子,有文档记录的Windows API函数CreateFile(由kernel32.dll提供)会调用NtDll.Dll中的NtCreateFile,以请求内核执行相关操作。大多数原生API(Native API)都没有官方文档——这也是本专栏编写的初衷。
另一个用于调用系统调用的动态链接库(DLL)是Win32u.dll,它通过图形设备接口(Graphics Device Interface,GDI)提供用户界面服务和图形功能支持,来自User32.dll和Gdi32.Dll的调用会通过Win32u.dll传递到内核,但本系专栏暂不讨论这些API。
# 1.1 本专栏适合哪些读者
本专栏面向所有希望了解NtDll.dll提供的Windows原生API(Native API)的读者。无论你是出于纯粹的好奇心、逆向工程(reverse engineering)需求,还是希望在应用程序和工具中使用这些API,都能从中获益。
读者应具备扎实的Windows基础知识,例如对进程(processes)、线程(threads)、虚拟内存(virtual memory)和动态链接库(DLLs)有深入理解。同时,建议读者熟悉有文档记录的Windows API。如需获取相关背景知识,可参考相关书籍。本专栏中涉及的各类Windows概念,在深入讲解原生API(Native API)细节之前,仅会进行简要说明。
# 1.2 注意事项
本专栏中的大部分信息源于我自己的研究,部分内容来自开发社区其他研究者的成果。你应将这些信息视为“合理推测”——我在研究和测试过程中可能存在疏漏。即使某部分信息当前是正确的,也未必适用于所有Windows版本。更重要的是,即使现在正确,在未来的Windows版本中也可能失效。
原生API(Native API)未提供官方文档是有原因的——微软不对该API的稳定性做任何保证,这意味着它可能随时发生变化,且用户无权就此提出异议。不过在实际使用中,该API的稳定性较高,因为微软的一些工具(如任务管理器(Task Manager)和Sysinternals工具集)都广泛使用了这些API。
# 1.3 配套源码
链接: https://pan.baidu.com/s/15koc2R6NR2z0DDzxkHbBTg
提取码: n5m5