附录A 无责任书评

从摇篮到坟墓 Windows 的完全学习

侯捷/1996.08.12整理

侯俊杰先生邀请我为他呕心沥血的新作深入浅出MFC写点东西。我未写文章久矣,但是你知道,要拒绝一个和你住在同一个大脑同一个躯壳的人日日夜夜旦旦夕夕的请求,是很困难的。不,简直是不可能。于是,我只好重作冯妇!

事实上也不全然是因为躲不过日日夜夜的轰炸,一部份原因是,当初我还在杂志上主持无责任书评时,就有读者来信希望书评偶而变换口味,其中一个建议就是谈谈如何养成Windows 程序设计的全面性技术。说到全面性,那又是一个 impossible mission!真的,Windows 程序技术的领域实在是太广了,我们从来不会说游戏软件设计、多媒体程序设计、通讯软件设计... 是属于DOS程序技术的范畴,但,它们通常都被理所当然地归类属于Windows 程序设计领域。为什么?因为几乎所有的题目都拜倒在 Windows 作业系统的大伞之下,几乎每一种技术都被涵盖在千百计(并且以惊人速度继续增加中)的Windows API 之中。

我的才智实不足以涵盖这么大面积的学问,更遑论从中精挑细选经典之作介绍给你。那么,本文题目大剌剌的「完全学习」又怎么说?呃,我指的是 Windows 操作系统的核心观念以及程序设计的本质学能这一路,至于游戏、多媒体、通讯、Web Server、数据库、统统被我归类为「应用」领域。而Visual Basic、Delphi、Java 虽也都可以开发 Windows程序,却又被我屏弃在C/C++ 的主流之外。

以下谨就我的视野,分门别类地把我心目中认为必备的相关好书介绍出来。你很容易就可以从我所列出的书名中看出我的浅薄:在操作系统方面,我只涉猎 Windows 3.1和Windows 95(Windows NT 4.0是我的下一波焦点),在 Application Framework 方面,我只涉猎 MFC(OWL 和 Java 是我的下一个猎物)。

Windows 操作系统

Windows Internals / Matt Pietrek / Addison Wesley

最能够反应操作系统奥秘的,就是操作系统内部数据结构以及 API 的内部动作了。本书借着对这两部份所做的逆向工程,剖析Windows 的核心。

一个设计良好的应用程序接口(API)应该是一个不必让程序员担心的黑盒子。本书的主要立意并不在为了对API运作原理的讨论而获得更多程序写作方面的利益(虽然那其实是个必然的额外收获),而是藉由API伪代码,揭露出Windows 操作系统的运作原理。时光渐渐过去,程序员渐渐成长,我们开始对How感到不足而想知道Why了,这就是本书要给我们的东西。

本书不谈Windows官方手册上已有的信息,它谈「新信息」。如何才能获得手册上没有记载的信息?呵,原始代码说明一切。看原始代码当然是不错,问题是 Windows 的原始代码刻正锁在美国WA,Redmond(微软公司总部所在地)的保险库里,搞不好就在比尔.盖兹的桌下。我们唯一能够取得的Windows 原始代码大概只是SDK 磁盘上的defwnd.c 和defdlg.c(这是DefWindowProc 和DefDlgProc 的原始代码),以及 DDK 磁盘中的一大堆驱动程序原始代码。那么作者如何获得比你我更多的秘密呢?

Matt Pietrek 是软件反组译逆向工程的个中翘楚。本书藉由一个他自己开发的反组译工具,把获得的结果再以C虚拟代码表现出来。我们在书中看到许许多多的Windows API伪代码都是这么来的。Pietrek 还有一个很有名的产品叫做BoundsChecker,和SOFT- ICE/W(功能强大的 Windows Debugger,以企鹅为形象)搭配销售。

本书主要探讨Windows 3.1 386加强模式,必要时也会提及标准模式以及 Windows 3.0。书中并没有涵盖虚拟驱动程序、虚拟机器、网络 API、多媒体、DDE/OLE、dialog/control等主题,而是集中在 Windows 启动程序、内存管理系统、窗口管理系统、消息管理系统、排程管理系统、绘图系统身上。本书对读者有三大要求 :

  • 对Intel CPU 的保护模式寻址方式、segmentation、selector 已有基本认识。

  • 拥有Windows SDK 手册。

  • 对操作系统有基础观念,例如什么是多任务,什么是虚拟内存...等等。

作者常借用面向对象的观念解释 Windows,如果你懂 C++ 语言,知道类与对象,知道成员函数和成员变量的意义与其精神,对他的比喻当能心领神会。

对系统感兴趣的人,本书一定让你如鱼得水。你唯一可能的抱怨就是:一大堆 API 函数的伪代码令人心烦气燥。文字瀚海图片沙漠的情形也一再考验读者的定力与耐力。然而小瑕不掩大瑜。我向来认为酿了一瓶好酒的人不必声嘶力竭地广告它,这本书就是一瓶好酒。作者Pietrek自1993/10 起已登上Microsoft Systems Journal 的Windows Q&A 主持人宝座,没两把刷子的人上这位子可是如坐针毡。现在他又主持同一本刊物的另一个专栏:Under The Hood。Dr. Dobb's Journal 的 Undocumented Corner 专栏也时有 Pietrek的踪影。

Undocumented Windows/Andrew Schulman,David Maxey,Matt Pietrek/ Addison Wesley