前言
Windows是一个复杂的操作系统。它提供的特性非常丰富,对任何个人而言,要想完全透彻地理解整个系统几乎不可能。其复杂性也使我们很难确定应该把主要精力集中在哪些地方。万丈高楼平地起,就我个人而言,我始终倾向于从最底层开始,深刻理解系统的基本构件。一旦掌握了最基本的东西,就很容易向自己的知识库中逐步添加更多高层的东西。所以本书将集中介绍Windows的基本构件和基础概念,对于建构和实现Windows应用程序来说,这些都是必须掌握的。简而言之,本书介绍了各种Windows特性,以及如何通过C和C++语言来使用这些特性。
虽然本书不会涵盖某些Windows概念,比如组件对象模型(Component Object Model,COM),但COM是在进程、线程、内存管理、DLL、线程本地存储区以及Unicode等基本构件的基础上构建的。如果了解了这些基本构件,那么要理解COM就相当于理解如何使用这些基本构件。对于那些试图跳过这些基本构件,悉心钻研COM体系结构的朋友,我深表同情。要完善知识库,他们还有很长一段路要走,这必然会对他们的代码和软件开发进度产生很大的负面影响。
微软的.NET Framework的公共语言运行时(Common Language Runtime,CLR)是本书未涉及的另一种技术(感兴趣的读者可以阅读我的另一本专著《CLR via C#》第4版)。然而,CLR是作为动态链接库(DLL)中的COM对象实现的,它在一个进程中加载,并使用线程来执行代码,以操作在内存中托管的Unicode字符串。所以,本书所介绍的基本构件同样有助于软件开发人员编写托管代码。另外,借助于CLR的平台调用(Platform Invocation,P/Invoke)技术,可以调用本书所介绍的各种Windows API。
所以,这就是本书的全部,每个Windows开发人员(至少在我看来)都应密切关注的基本Windows构件。讨论每个构件时,我还描述了系统如何使用这些模块,以及你自己的应用程序如何最好地利用这些构件。我在很多章中展示了如何创建自己的构件。这些构件通常以通用函数或C++类的形式实现,它们将一组Windows构件组合在一起,形成一个远远大于其各部分之和的整体。
64位Windows操作系统
微软发售支持x86 CPU体系结构的32位Windows操作系统已有多年历史。如今,微软还提供支持x64和IA-64 CPU体系结构的64位Windows操作系统。基于这些64位CPU体系结构的计算机迅速为市场所接受。事实上,在不远的将来,所有台式机和服务器都将使用64位CPU。为此,微软已发表声明,Windows Server 2008将是最后一款32位版本的Windows操作系统!对于开发人员而言,现在是时候集中精力让自己的应用程序能在64位Windows操作系统上正常运行了。本书全面覆盖相关的知识,让开发人员的应用程序能够在64位Windows操作系统(同时也包括32位Windows)上正常运行。
应用程序从64位地址空间所获得的最大的好处是能轻松处理大量数据,因为应用程序的进程不再受限于2GB可用地址空间。即使应用程序并不需要所有这些空间,Windows本身也可以利用这个显然大得多的地址空间(约8TB)来加快运行速度。
下面简单列出了对于64位Windows操作系统需要关注的内容。
64位Windows内核是32位Windows内核的移植版本。这意味着以前所学的32位Windows所有细节和难点均适用于64位Windows。事实上,微软已修改了32位Windows的源代码,使其既可以编译生成32位系统,也可以编译生成64位系统。两个系统使用同一个源代码库,所以新特性和bug修复会同时应用于两个系统。
由于内核使用相同的代码和基本概念,所以在两个平台上的Windows API是一样的。这意味着我们不必重新设计或实现应用程序,就能让它在64位Windows操作系统上运行。只需要对源代码做少许改动,然后重新生成应用程序即可。
为了保持向后兼容性,64位Windows操作系统是可以执行32位应用程序的。但是,如果应用程序是作为64位应用程序来生成的,那么它的性能会有显著的提高。
因为移植32位代码非常容易,所以64位Windows操作系统中已经有很多的设备驱动程序、工具和应用程序了。遗憾的是,Visual Studio是32位的,而且微软似乎还并不急于将其移植为64位的。不过,好消息是32位的Visual Studio在64位Windows操作系统上的确运行得非常好,只不过其数据结构的地址空间有限。而且,我们还可以用Visual Studio来调试64位应用程序。
并不需要学习太多新知识。大多数数据类型仍然保持32位宽度,这是很多读者很高兴看到的。它们是INT、DWORD、LONG和BOOL等。事实上,大多数情况下我们只需要担心指针和句柄,因为它们现在变成64位了。
对于如何将现有源代码修改为64位,微软已经提供了相当丰富的信息,所以不打算在本书深入这些细节。不过,在我写每一章的时候,我都会考虑到64位Windows操作系统。
在适当的时候,我会加入64位Windows的特定信息。同时,我还在64位Windows中编译和测试了本书中的所有示例程序。所以,如果读者效仿书中的示例程序和我的做法,那么创建一个能够为32位或64位Windows编译的源代码库应该完全不成问题。
《Windows核心编程(第5版)》中有哪些新内容
在过去,本书曾经被冠以“Advanced NT”“Advanced Windows”和“Programming Application for Windows”等名字。为保持这个传统,本书的第5版也有一个新的书名,即Windows via C/C++。新的书名表示本书是为打算理解Windows的C和C++程序员设计的。第5版全面覆盖了Windows XP,Windows Vista和Windows Server 2008中的170个新增函数和Windows特性。
有些章已全部重写,例如第11章,这一章解释了如何使用新的线程池API。第4版原有的各章都已大幅修订,以突出新特性。例如,第4章现已包含了对用户账户控制(User Account Control)的介绍,第8章现在介绍了新的同步机制。
同时,我还更全面地介绍了C/C++运行库如何与操作系统交互,特别强调安全性和异常处理。最后,第5版新增两章内容,解释了I/O操作的工作原理以及如何深入理解新的Windows错误报告(WER)系统,此系统改变了应用程序错误报告和应用程序恢复的方式。
除了新的结构和更深入的介绍,这一版还新增了大量内容。第5版着重在以下几个方面进行了更深入的讲解。
Windows Vista和Windows Server 2008新特性 当然,除非本书涵盖了Windows XP、Windows Vista、Windows Server 2008和C/C++运行库的所有新特性,否则它就算不上是真正的修订。第5版着重强调安全字符串函数、内核对象的变化(例如命名空间和边界描述符)、线程和进程属性列表、线程和I/O优先级调度、取消同步I/O、向量异常处理等方面的最新信息。
64位Windows支持 本书旨在解决64位Windows的特定问题,所有示例程序都在64位Windows上生成并测试过。
使用C++语言 示例程序使用C++语言,所需要的代码更少,而且C++的逻辑更清楚,也更容易理解。
可重用的代码 我尽量让源代码既通用,又可重用。这样一来,读者只需对单独的函数或整个C++类稍作改动或根本无需改动,就能在自己的应用程序中使用它们。C++语言的使用进一步增强了代码的可重用性。
ProcessInfo实用工具 前几版一直都有的这个特殊示例程序已被增强,可以显示进程所有者、命令行和UAC相关详情。
LockCop实用工具 这个示例程序是新增的。它显示了系统中有哪些进程正在运行。一旦选定了一个进程,这个工具就会列出进程中的所有线程,以及每个线程是被哪种同步机制阻塞,同时明确指出死锁的情况。
API拦截 我介绍了更新后的一些C++类,它们使对进程中的一个或所有模块进行API拦截(API hooking)变得相当简单。我的代码甚至拦截了对LoadLibrary和GetProcAddress的运行时调用,使你的API挂勾得以强制执行。
结构化异常处理有所增强 我重写并重新组织了结构化异常处理(SEH)的内容。对未处理异常进行了更多的讨论,并讨论了如何根据自己的需求自定义Windows错误报告。
示例代码和系统需求
本书示例程序可从本书中文版网站下载,网址如下:
https://bookzhou.com
为了构建示例程序,读者需要安装Visual Studio 2005或更新版本,Microsoft Platform SDK for Windows Vista和Windows Server 2008(有些版本的Visual Studio自带这个SDK)。
此外,要运行示例程序,还需要一台已安装Windows Vista(或更新的版本)的计算机(或虚
拟机)。
本书支持
我们已经尽力确保本书及其配套内容的准确性。我们会将收集到的勘误或改动添加到一个勘误表中,读者可从以下网址下载这个勘误表:
https://bookzhou.com
问题和评论
有关本书或者网络配套内容的任何评论、问题或想法,或者通过访问上述网址仍然未能解决的疑惑,请通过电子邮件发送给微软出版社:
mspinput@microsoft.com