前 言
Microsoft Windows是一个复杂的操作系统。它提供的特性非常丰富,对任何个人而言,要想完全透彻地理解整个系统几乎不可能。其复杂性也使我们很难确定应该把主要精力集中在哪些地方。万丈高楼平地起,就我个人而言,我始终倾向于从最底层开始,深刻理解系统的基本构件。一旦掌握了最基本的东西,就很容易向自己的知识库中逐步添加更多高层的东西。所以本书将集中介绍Windows的基本构件和基础概念,对于构架和实现Windows应用程序来说,这些都是必须掌握的。简而言之,本书是向读者介绍各个Windows特性,并介绍如何通过C和C++语言来了解并使用这些特性。
虽然本书不会涵盖某些Windows概念,比如组件对象模型(Component Object Model ,后面简称为COM),但COM是在进程、线程、内存管理、DLL、线程本地存储区以及Unicode等基本构件的基础上构建的。如果了解了这些基本构件,那么要理解COM就相当于理解如何使用这些基本构件。对于那些试图跳过这些基本构件,悉心钻研COM体系结构的朋友,我深表同情。要完善知识库,他们还有很长一段路要走,这必然会对他们的代码和软件开发进度产生很大的负面影响。
Microsoft .NET Framework的公共语言运行时(Common Language Runtime,CLR)是本书未涉及的另一种技术(感兴趣的朋友可以阅读我的另一本专著《框架设计:CLR via C#》)。不过,CLR是作为动态链接库(dynamic link library,DLL)中的一个COM对象来实现的,它需要被载入到进程中,它需要使用线程来执行代码,它需要处理Unicode字符串,它还需要在内存中对这些字符串进行管理。因此,本书所介绍的基本构件仍然有助于软件开发人员编写托管代码。此外,借助于CLR的平台调用(Platform Invocation,P/Invoke)技术,我们可以调用本书所介绍的各种Windows API。
如此一来,本书的宗旨是介绍每一个Windows开发人员都应该掌握的基本的Windows构件(至少在我看来如此)。在介绍每一个构件的时候,我还会描述系统是如何使用这些构件的,我们自己的应用程序如何充分利用这些构件。在很多章中,我会介绍如何创建自己的构件。我们自己的构件一般都实现为普通函数或C++类,它们把一些Windows构件组合在一起,从而创造出一个整体,其结果远远大于各部分之和。
64位Windows操作系统
Microsoft发售支持x86 CPU体系结构的32位Windows操作系统已经有多年的历史。如今,Microsoft还提供支持x64和IA-64 CPU体系结构的64位Windows操作系统。基于这些64位CPU体系结构的计算机迅速为市场所接受。事实上,在不远的将来,所有台式机和服务器都将使用64位CPU。为此,Microsoft已发表声明,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。事实上,Microsoft已经修改了32位Windows的源代码,使其既可以编译生成32位系统,也可以编译生成64位系统。两个系统使用同一个源代码库,所以新的特性和缺陷的修复会同时应用于这两个系统。
因为内核使用相同的代码和基本概念,所以在两个平台上的Windows API是一样的。这意味着我们不必重新设计或实现应用程序,就能让它在64位Windows操作系统上运行。我们只需要对源代码做少许改动,然后重新构建应用程序即可。
为了保持向后兼容性,64位Windows操作系统是可以执行32位应用程序的。但是,如果应用程序是作为64位应用程序来生成的,那么它的性能会有显著的提高。
因为移植32位代码非常容易,所以64位Windows操作系统中已经有很多的设备驱动程序、工具和应用程序了。遗憾的是,Visual Studio是32位的,而且Microsoft似乎还并不急于将其移植为64位的。不过,好消息是32位的Visual Studio在64位Windows操作系统上的确运行得非常好,只不过其数据结构的地址空间有限。而且,我们还可以用Visual Studio来调试64位应用程序。
并不需要学习太多新知识。大多数数据类型仍然保持32位宽度,这是很多读者很高兴看到的。它们是INT,DWORD,LONG和BOOL等。事实上,大多数情况下我们只需要担心指针和句柄,因为它们现在变成64位了。
对于如何将现有源代码修改为64位,Microsoft已经提供了相当丰富的信息,所以我们不打算在本书中深入这些细节。不过,在我写每一章的时候,我都会考虑到64位Windows操作系统。在适当的时候,我会加入64位Windows的特定信息。同时,我还在64位Windows中编译和测试了本书中的所有示例程序。所以,如果读者效仿书中的示例程序和我的做法,那么创建一个能够为32位或64位Windows编译的源代码库应该完全不成问题。
《Windows核心编程(第5版)》中有哪些新内容
在过去,本书曾经被冠以“Advanced NT”,“Advanced Windows”和“Programming Application for Microsoft 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 Error Reporting系统,此系统改变了我们必须考虑应用程序错误报告和应用程序恢复的方式。
.除了新的结构和更深入的介绍,我还增加了大量新的内容。第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实用工具 前几版中一直都有的这个特殊示例程序已经被增强,可以显示进程拥有者、命令行和UAD相关详情。
LockCop实用工具 这个示例程序是新增的。它显示了系统中有哪些进程正在运行。一旦选定了一个进程,这个工具就会列出进程中的所有线程,以及每个线程是被哪种同步机制阻塞,同时明确地指出死锁的情况。
API拦截 我介绍了一些更新后的C++类,这些类使得对进程中的一个或所有模块进行API拦截变得相当简单。我的代码甚至拦截了应用程序在运行的时候对LoadLibrary和GetProcAddress的调用,这进一步加强了对API的拦截。
结构化异常处理有所增强 我重写并重新组织了结构化异常处理的内容。我进一步介绍了未处理异常,并针对如何根据自己的需求自定义Windows Error Reporting系统。
示例代码和系统需求
本书的示例程序可以从本书配套网页下载,网址如下:
http://www.wintellect.com/books.aspx
为了构建示例程序,读者朋友需要安装Visual Studio 2005或更新版本,Microsoft Platform SDK for Windows Vista和Windows Server 2008(有些版本的Visual Studio自带这个SDK)。此外,要运行示例程序,还需要一台已安装Windows Vista(或更新的版本)的计算机(或虚拟机)。
本书支持
我们已经尽力确保本书及其配套内容的准确性。我们会将收集到的勘误或改动添加到一个勘误表中,读者可以从以下网址下载这个勘误表:
http://www.wintellect.com/books.aspx
问题和评论
有关本书或者网络配套内容的任何评论、问题或想法,或者通过访问上述网址仍然未能解决的疑惑,请通过电子邮件发送给Microsoft Press:
mspinput@microsoft.com
或者将信件寄到以下地址:
Microsoft Press
Attn:Windows via C/C++ Edition
One Microsoft Way
Redmond,WA 98052-6399
请注意,上述地址并不提供对Microsoft软件产品的支持。
玉不琢,不成器
——《Windows核心编程(第5版)》出版前言
在刚刚过去的第29届奥运会上,气势恢弘、美轮美奂的开幕式,精彩纷呈、欢呼不断的赛场,让我们度过了多少个激动人心的不眠之夜!开幕式上,以宏伟气势演绎的各种形式的“和”给人留下深刻的印象,同时也凸现了我们这个时代的主旋律。是的,“事成于和睦,力生于团结。”电影《赤壁》中,饰演周瑜的梁朝伟同样也以一个简单的动作强调了“和”的重要作用。
值此《Windows核心编程(第5版)》出版之际,心里也同样洋溢着一样的情结。作为此书的出版者,我们得到了很多方面的支持,从拿到选题、遴选译者,再到后期的反复审稿,来自社内领导和同仁、来自兄弟出版社、来自微软公司、来自译者、来自读者的支持和热情,大大增强了我们出好书,出精品书的信心和决心,能得到这么多的支持和关注,实乃三生有幸!在此特别向各位表示由衷的感谢!
正所谓“玉不琢,不成器“,一本经典著作,不仅要内容精确,还少不了版式和其他细节的精心编排。
优秀译者是高品质译著的源泉 甄选译者的时候,很多读者朋友踊跃报名,他们都希望能参与此书的工作,为Windows编程领域做出贡献。在此,向他们表示由衷的感谢。他们当中,有70后的资深程序员,也有80后的高手程序员,也有朝气蓬勃的在校学生。考虑到质量和时间的因素,最后确定由微软中国研发集团服务器及开发工具事业部的葛子昂主译,周靖和廖敏参与。优秀译者是高品质译著的源泉,这一点在本书上得以充分的验证。他们在翻译过程中,秉承一贯的严谨风格,在字里行间进行认真的推敲,并认真对代码进行了相应的调试和实践。葛子昂作为主译,不仅精心规划进度,还牺牲了休息时间主动承担了大部分工作,责无旁贷地对全书进行统稿,他对本书的认真程度,让人钦佩。兄弟出版社朋友对本书翻译的参与,也使我大受鼓舞。从他们身上,能够深切地体会到他们的敬业精神,他们是真正的爱书人,全心全意为读者着想的人。为读者奉献更丰盛的技术图书盛宴,促进技术图书的健康发展,这是我们共同的心愿。
来自微软的支持 微软出版社和微软最有价值专家(MVP)项目组对本书给与大力支持,特别是陈芃和Sisley,他们组织相关技术专家对本书进行审阅,刘彦博、蒋晟和王涛等MVP在第一时间给与我们最宝贵的意见。
大人物的推荐序 本书由Windows Internals(深入解析Windows操作系统)作者提笔所写,他对本书的内容和结构给与了充分的肯定。
精美、雅致的版式 在版式设计方面,我们突破技术类图书的常规,精心设计了页眉和章首页,为读者提供更赏心悦目的阅读感受。
Jeffrey照片和亲笔签名 Microsoft Press的陈 帮我们穿针引线,引入Jeffrey的“大头照”、家庭照和亲笔签名,这些都会在书中呈现出来。此外,Jeffrey还计划在2009年4月访问中国,届时欢迎读者朋友参与他的见面会,与他一起探讨和体验Windows编程乐趣。
索引 为方便读者查阅,我们在译文相应部分添加了原书页码,同时保留原书索引,并将其附于书后。
读后感分享 对于一本好书,很多读者都有自己的心得和感想,并希望和同道中人切磋,这一点,我们将成立一个专门的书友会,读者可以在其中畅所欲言,在《Windows核心编程》书友会这个大家庭中共同成长。详情请关注我社网站首页上的公告。
作为出版工作者,我们要感谢来自译者和读者的支持和鼓励,没有他们,就没有佳作的诞生。关于本书的任何意见和建议,欢迎发送邮件到wenkq@tup.tsinghua.edu.cn,我们一直在聆听大家的心声。
清华大学出版社