标题：Windows内核情景分析
图书信息
作　者：毛德操 著  出 版 社： 电子工业出版社
出版时间： 2009-5-1
页　数：1492页
开　本： 16开
I S B N ： 9787121081149
分类： 图书 >> 计算机/windows >> 内核
定价：￥190.00元
宣传语
历时3年，近1500页篇幅，毛德操老师重磅著作
内容简介
本书可供大学有关专业的高年级学生和研究生用做教学参考，也可供广大的软件工程师，特别是从事系统软件研发的工程师用于工作参考或用做进修教材。
专家评价
操作系统是最基础、最核心的计算机软件。长期处于技术垄断地位的Windows操作系统，其源程序代码是不公开的，可看成一个“黑盒子”。毛德操先生这本书，通过分析ReactOS的源程序代码，介绍了Windows操作系统内核的结构及其各种机制，使读者能深入理解Windows操作系统内核这个“黑盒子”的各个方面，这对于打破Windows的技术垄断，开发具有自主知识产权的新型操作系统，实现Windows与Linux操作系统的高度互操作，具有重大的实际价值。毛德操先生在剖析Windows、Linux等操作系统内核的结构与机制方面，走在了国际学术界的前列。
——中国开源软件推进联盟主席 陆首群 
虽然当前以Linux为代表的开源软件为中国发展自主操作系统提供了很好的支撑，但学习和借鉴Windows也有重要价值。在这个时候，毛德操先生所著的《Windows 内核情景分析》出版了，它为广大读者打开了通向Windows内核的大门。与其说本书是一部单纯的学术著作，不如说这更是一篇实践经验的总结。本书正是毛德操先生近年来领导开发“兼容内核（Unified Kernel）”项目的一篇经验总结。早在2004年毛先生就提出了开发“兼容内核”的倡议，他提出开发一个既能支持Linux应用软件运行、也能支持Windows应用软件运行的内核，这与开源项目Wine有异曲同工之妙。
——中国工程院院士 倪光南
推荐序
操作系统是最基础、最核心的计算机软件。长期处于技术垄断地位的Windows操作系统，其源程序代码是不公开的，可看成一个“黑盒子”。毛德操先生这本书，通过分析ReactOS的源程序代码，介绍了Windows操作系统内核的结构及其各种机制，使读者能深入理解Windows操作系统内核这个“黑盒子”的各个方面，这对于打破Windows的技术垄断，开发具有自主知识产权的新型操作系统，实现Windows与Linux操作系统的高度互操作，具有重大的实际价值。毛德操先生在剖析Windows、Linux等操作系统内核的结构与机制方面，走在了国际学术界的前列。本书的出版具有重要的学术价值。
中国开源软件推进联盟
陆首群 
2009年2月24日
序
多年来，Windows垄断了中国桌面操作系统，中国学校中也开设了很多Windows课程，但令人遗憾的是，由于Windows的源代码不开放，这些课程往往只能使学生了解Windows的外特性和操作方法，却不能使学生了解和掌握Windows的内核。
有人会问：难道中国人真的需要深入到操作系统的内核，去掌握它的核心技术吗？有人说：微软花了上千亿美元开发出Windows操作系统，中国人花1000元人民币就能买到，为什么还要自己去研究和开发呢？一些外国咨询公司也为中国政府支招，如麦肯锡公司在2002年所做的《中国软件产业发展战略研究报告》就主张中国不必发展操作系统，而应像印度那样，主要发展面向出口的离岸外包业务。这样的观点前些年在中国相当流行，影响了不少人。
2008年10月，有一个事件震惊了中国：微软宣称将对其认为是使用盗版Windows和Office的电脑实行了“黑屏”。用户面对“黑屏”束手无策，这才意识到，自己的电脑被微软操控了！中国信息安全的软肋由此暴露无遗。
事实上，在信息安全方面我国历来要求使用“自主可控”的软件和硬件，“黑屏”事件更使广大用户有了切肤之痛，认识到自主可控的重要性。现在，世界上许多国家也有了这种共识，如俄国、欧洲和拉丁美洲的一些国家都在发展基于开源软件Linux的自主操作系统。在这方面，目前中国的重大进展是起动了“核高基”重大专项，这是按照《国家中长期科学和技术发展规划纲要（2006－2020年）》所部署的，旨在发展“核心电子器件、高端通用芯片及基础软件产品”。其中的“基础软件产品”中最重要的就是操作系统。这样，持续多年的中国要不要发展自主操作系统的争议终于有了定论。通过“核高基”专项，中国有望在今后三个五年计划内实现自主操作系统的产业化，将来中国的信息系统再不会被人“黑屏”了。
当然，中国发展自主操作系统的意义不仅仅是为了保障信息安全。作为一个有13亿人口的大国，中国拥有自主操作系统将产生巨大的经济效益，并带动其下游的整个软件和信息服务业的发展。
虽然当前以Linux为代表的开源软件为中国发展自主操作系统提供了很好的支撑，但学习和借鉴Windows也有重要价值。在这个时候，毛德操先生所著的《Windows内核情景分析》出版了，它为广大读者打开了通向Windows内核的大门。
正如作者所说，“对于操作系统内核这么复杂的软件，是一定要结合具体的代码（哪怕只是用来描述算法的伪代码）才能说清楚的”。在Windows源代码不开放的情况下，作者不得不主要地基于开源的ReactOS来作分析。ReactOS被誉为“开源Windows”，它的目标是研发一个开源的Windows内核，这对于打破微软的技术垄断很有好处。我们认为，在当前的实际条件下，作者基于ReactOS源代码并辅以部分由微软公开的源代码来编写本书，是一条切实可行的途径。
与其说本书是一部单纯的学术著作，不如说这更是一篇实践经验的总结。本书正是毛德操先生近年来领导开发“兼容内核（Unified Kernel）”项目的一篇经验总结。早在2004年毛先生就提出了开发“兼容内核”的倡议，他提出开发一个既能支持Linux应用软件运行、也能支持Windows应用软件运行的内核，这与开源项目Wine有异曲同工之妙。Wine是通过在Linux内核的外面加一个适配层，使得Windows应用软件的二进制代码可以直接在Linux内核上运行，但这样做难免带来性能的下降，或难以做到完全兼容。相比之下，“兼容内核”采取了更为直接的技术途径，也有可能做得更好。
不过，这些年这个倡议也受到了不少质疑。有人认为没有必要，有人怀疑做不出来，有人认为缺乏学术价值等等。尽管这些质疑似乎也有这样那样的道理，但如果为广大用户着想，那么谁也不能否认“兼容内核”的价值——一个既能运行Windows应用软件又能运行Linux应用软件的操作系统，而且又是低价的、自主可控的，这无疑是广大用户的福音！
应当感谢国家发改委和浙江省科技厅支持了“兼容内核”这个开源项目。在中国，像他们这样勇于支持软件业自主创新的行动还不是很多，因而值得大书特书。正是通过领导“兼容内核”的开发工作，作者取得了剖析Windows内核的实践经验，因此这本书将能很好地指导操作系统和其他许多软件的开发实践。
本书是毛德操和胡希明先生所著的《Linux内核源代码情景分析》的姊妹篇。前一篇在短短的时间里印刷了四次，深受广大读者欢迎，因此可以预见，本书也将收到类似于前一篇的欢迎程度。
中国工程院院士 
倪光南 
2009年3月9日
前言
世上有这么一些人，这些人对于感兴趣的事物绝不满足于仅仅知其然，而非得要知其所以然才能舒服。这些人里面，如果感兴趣的是计算机操作系统、特别是Windows操作系统，那么从这本书里应该能获得对于许多问题的答案。其实，笔者本人也是这个人群中的一员，笔者阅读、分析过Linux内核的源代码，自然就也很想读一下Windows内核的源代码，把Windows内核搞搞清楚。以笔者之见，对于像操作系统内核这么复杂的软件，想要搞搞清楚，就非得要深入到程序代码中去不可。事实上，笔者有这个愿望已经很多年了，可是Windows内核的代码是不公开的，即便是退而求其次，要找一些深入介绍Windows内核的书籍，也是寥寥无几，而且看了以后也往往不得要领，觉得实在是语焉不详甚至模棱两可。确实，与程序代码相比，任何自然语言都只能说是模糊而不确切的。幸而现在有了ReactOS这个开源项目，这个项目的目标是要研发出一个开源的Windows内核。该项目的参与者们想必对Windows内核下了很深的功夫，在代码中极力模仿Windows，力求忠实于Windows，然而却又是自己的实现。读着ReactOS的代码，笔者常常回想起一些著作中的有关章节或片段，以前看的时候只好不求甚解，现在看到代码才真的明白了。由此又生出感慨，对于操作系统内核这么复杂的软件，是一定要结合具体的代码（哪怕只是用来描述算法的伪代码）才能说清楚的。把内核的代码封锁起来不让人研究，实际上是对于人类的“知的权利”的蔑视。而对于ReactOS代码的作者们，笔者则一来是感激，二来是佩服和尊敬，进而觉得应该把自己的理解和体会写出来与读者分享。本书所引的代码基本上都出自ReactOS的0.3.3版，读者可以自行下载一份代码，结合本书加以阅读。
与ReactOS密切相关的另一个开源项目是Wine，这个项目的宗旨是在Linux内核的外面做上一个适配层，由一个服务进程和一些动态连接库相结合构成的适配层，使得Windows应用软件的二进制代码可以直接（不经过移植和重新编译就）在Linux内核上运行。一言以蔽之，就是“核内差异核外补”。Windows应用软件本来是要在Windows内核上运行的，而Windows内核与Linux内核显然有着不小的差异，Wine的目的就是在核外（用户空间）加以补偿和虚拟，使Windows应用软件得以在Linux内核上运行。在某种意义上，这甚至比ReactOS要做的更难，因为这是要在一个不同的基础上、不同的环境中重构一个虚拟的Windows内核，没有对于Windows内核的真正深刻的理解，这显然是不可能的。笔者曾听到（看到）一些对ReactOS有所怀疑的说法，说是ReactOS的人怎么能对Windows内核理解得那么深刻？是不是他们拿到了Windows内核的源代码，而只是在依样重画一遍葫芦？Wine的存在和成功（也许是部分的成功）正好回答了这个问题，正好可以作为佐证。要说对于Windows内核的理解，Wine的作者们丝毫不比ReactOS的作者们差，而Wine的代码与Windows内核却相去甚远、泾渭分明。既然Wine可以一行行代码从头写来，ReactOS又有何不可？
不过，笔者以为，与其研发一个开源的Windows内核，还不如把Linux内核改造成一个“兼容内核（Unified Kernel）”，一个既能支持Linux应用软件运行，也能支持Windows应用软件运行的内核。这对于Linux操作系统的普及有着莫大的好处。因为许多用户已经习惯了Windows操作系统和Windows应用软件的使用，要使这些用户改用Linux操作系统，就得为其提供一种平滑过渡的方案，最重要的是使用户可以继续使用那些已经在上面投入了种种资源，也已经习惯了的Windows应用软件。虽然Wine在功能上也能起到相似或者基本相同的作用，但是在核外通过服务进程补偿内核差异的做法难免带来性能的下降，要避免性能的下降，就得在内核中补偿内核的差异。笔者的这个主张得到了浙大网新科技股份有限公司的支持，并为此组建了一个研发兼容内核的团队，后来还得到了国家发改委和浙江省科技厅的项目支持。作为一个开源项目，兼容内核的开发目前正在进行之中。笔者由衷地感谢浙大网新科技股份有限公司的支持。此外，无论是兼容内核的开发还是本书的写作，笔者都得到了中国开源软件促进会陆首群主席和倪光南院士的鼓励和支持，在此一并致谢。
所以，驱使笔者写作本书的动力不仅仅是对Windows内核的研究和介绍，更多地还来自开发兼容内核的需要。从某种意义上说，本书是兼容内核项目的副产品；如果没有兼容内核项目，恐怕就不会有这本书。事实上，起初电子工业出版社向笔者约稿时，笔者的打算是写一本五六百页的Windows与Linux的比较研究。可是，开始写了以后就觉得不妥，因为既然有了“Linux内核源代码情景分析”，就不宜再重复那本书中写过的内容，而应该把篇幅都集中在Windows上。另一方面，更为重要的是，参加兼容内核研发的人对于Linux内核都是比较了解的，而对于Windows内核则往往所知甚少，因而迫切需要有一本对于Windows内核的情景分析。于是本书的写作计划一改再改，篇幅愈来愈大，时间愈拖愈长，最后历时三年才完成了本书的写作，而篇幅已经达到了一千多页。为此，笔者要特别感谢电子工业出版社的朱沭红、白涛两位编辑，感谢她（他）们的耐心和热情，更感谢她（他）们对本书的精心编辑。
在本书的写作过程中，微软开放了一个缩微的“Windows研究性内核（Windows Research Kernel，即WRK）”的源代码，供高校用于教学目的。就微软而言，这当然是个进步，值得欢迎；但是这并不说明WRK是开源的。首先，WRK的公开范围只是高校，而并不面向公众，其许可证中明文规定分发的范围只是“within your educational institution”。而且，许可证虽然允许在文章、书籍中引用代码中的片段，却规定“The total amount of source code in each of your snippets should not exceed 50 lines”，即每个片段的长度不能超过50行。更重要的是，WRK其实只是专供教学用的模型，而不是实用意义上的操作系统。笔者认为，实际上WRK离Windows比ReactOS（离Windows）更远。这样，即便不考虑许可证所加的限制，如果采用WRK的代码写作本书，则本书一半以上的篇幅恐怕就不能存在了。这样考虑下来，笔者决定还是采用ReactOS的代码。
然而，ReactOS又毕竟不是Windows本身，并且Windows的有些功能和机制（例如文件系统中的Notify机制）在ReactOS中迄今尚未实现。所以，笔者衷心希望有朝一日微软会公开整个Windows内核的代码，到那时候，如果各方面的条件允许的话，笔者愿意再来写一本“正宗”的Windows内核源代码情景分析。
当然，我们之所以要研究Windows内核，并不单纯是为了满足知的欲望。操作系统内核在整个软件产业链中处于上游乃至源头的位置，对操作系统内核的深入理解对于其他软件的开发，特别是系统软件的开发有着重要的影响。我的朋友胡希明教授常常用中医和西医来比喻两种软件开发的模式，中医当然也能治病，但是有些病却只能采用西医的方法才能奏效。而西医的最根本的基础则是对于人体的解剖。实际上，现在中医也要拍片透视照X光了。
搞电影的人说电影是遗憾的艺术，因为一旦拍成就不能再改了，所以常常留下遗憾。其实，留下遗憾的工作又岂止拍电影。本书尚未付印，但是笔者已经有了遗憾，有些内容本来是应该加以研究并写入本书的，但是笔者的时间和精力已经不允许了。对于Windows内核这么复杂和庞大的系统，笔者自觉不可能对每一个细节的理解都能正确，所以本书中谬误之处在所难免，只是笔者再没有时间和精力细细去抠了，这也是令人遗憾的。
目录
上 册
第1章 概述 1
1.1 Windows操作系统发展简史 1
1.2 用户空间和系统空间 3
1.3 Windows内核 4
1.4 开源项目ReactOS及其代码 9
1.5 Windows内核函数的命名 10
第2章 系统调用 12
2.1 内核与系统调用 12
2.2 系统调用的内核入口KiSystemService() 22
2.3 系统调用的函数跳转 29
2.4 系统调用的返回 32
2.5 快速系统调用 35
2.6 从内核中发起系统调用 42
第3章 内存管理 44
3.1 内存区间的动态分配 47
3.1.1 内核对用户空间的管理 48
3.1.2 内核对于物理页面的管理 60
3.1.3 虚存页面的映射 67
3.1.4 Hyperspace的临时映射 78
3.1.5 系统空间的映射 86
3.1.6 系统调用NtAllocateVirtualMemory() 90
3.2 页面异常 97
3.3 页面的换出 107
3.4 共享映射区（Section） 115
3.5 系统空间的缓冲区管理 133
第4章 对象管理 136
4.1 对象与对象目录 136
4.2 对象类型 148
4.3 句柄和句柄表 162
4.4 对象的创建 169
4.5 几个常用的内核函数 179
4.5.1 ObReferenceObjectByHandle() 179
4.5.2 ObReferenceObjectByPointer() 187
4.5.3 ObpLookupEntryDirectory() 188
4.5.4 ObpLookupObjectName() 192
4.5.5 ObOpenObjectByName() 209
4.5.6 ObReferenceObjectByName() 213
4.5.7 ObDereferenceObject() 214
4.6 对象的访问控制 218
4.7 句柄的遗传和继承 218
4.8 系统调用NtDuplicateObject() 223
4.9 系统调用NtClose() 233
第5章 进程与线程 241
5.1 概述 241
5.2 Windows进程的用户空间 253
5.3 系统调用NtCreateProcess() 273
5.4 系统调用NtCreateThread() 284
5.5 Windows的可执行程序映像 300
5.6 Windows的进程创建和映像装入 305
5.7 Windows DLL的装入和连接 329
5.8 Windows的APC机制 358
5.9 Windows线程的调度和切换 381
5.9.1 x86系统结构与线程切换 382
5.9.2 几个重要的数据结构 385
5.9.3 线程的切换 388
5.9.4 线程的调度 395
5.10 线程和进程的优先级 409
5.11 线程本地存储TLS 421
5.12 进程挂靠 434
5.13 Windows的跨进程操作 442
5.14 Windows线程间的相互作用 450
第6章 进程间通信 467
6.1 概述 467
6.2 共享内存区（Section） 469
6.3 线程的等待/唤醒机制 470
6.4 信号量（Semaphore） 499
6.5 互斥门（Mutant） 505
6.6 事件（Event） 512
6.7 命名管道（Named Pipe）和信插（Mailslot） 516
6.8 本地过程调用（LPC） 521
6.9 视窗报文（Message） 555
第7章 视窗报文 556
7.1 视窗线程与Win32k扩充系统调用 556
7.2 视窗报文的接收 566
7.3 Win32k的用户空间回调机制 590
7.4 用户空间的外挂函数 602
7.5 视窗报文的发送 615
7.6 键盘输入线程 628
7.7 鼠标器输入线程 642
7.8 默认的报文处理 662
第8章 结构化异常处理 665
8.1 结构化异常处理的程序框架 666
8.2 系统空间的结构化异常处理 683
8.3 用户空间的结构化异常处理 710
8.4 软异常 720
下 册
第9章 设备驱动 729
9.1 Windows的设备驱动框架 729
9.2 一个“老式”驱动模块的实例 745
9.3 DPC函数及其执行 769
9.4 内核劳务线程 778
9.5 一组PnP设备驱动模块的实例 783
9.6 中断处理 817
9.7 一个过滤设备驱动模块的示例 828
9.8 设备驱动模块的装载 830
9.9 磁盘的设备驱动堆叠 858
9.9.1 类驱动disk.sys 860
9.10 磁盘的Miniport驱动模块 887
9.11 命名管道与Mailslot 896
9.12 MDL 918
9.13 同步I/O与异步I/O 932
9.14 IRP请求的完成与返回 946
第10章 网络操作 957
10.1 概述 957
10.2 NDIS及其实现 959
10.3 Windows的网络驱动堆叠 974
10.3.1 NIC驱动 975
10.3.2 LAN驱动模块 997
10.3.3 TCP/IP驱动模块 1014
10.3.4 AFD驱动与Winsock 1035
10.4 Socket的无连接通信 1062
10.5 Socket的有连接通信 1089
10.6 Winsock的实现 1093
第11章 文件操作 1099
11.1 Win32 API函数CreateFileW() 1099
11.2 NT路径名 1109
11.3 文件路径名的解析 1119
11.4 FAT32文件系统 1144
11.5 文件系统驱动的装载和初始化 1169
11.6 文件卷的安装 1175
11.7 文件的创建 1199
11.8 缓存管理 1214
11.9 文件的读写 1237
11.10 NTFS文件系统简介 1252
第12章 操作系统的安全性 1278
12.1 概述 1278
12.2 证章 1289
12.3 安全描述块和ACL 1305
12.4 访问权限检查 1322
第13章 注册表 1351
13.1 注册表操作 1351
13.2 注册表的初始化和装载 1369
13.3 库函数RtlQueryRegistryValues() 1376
第14章 系统管理进程与服务进程 1394
14.1 系统管理进程Smss 1394
14.2 Windows子系统的服务进程Csrss 1408
14.3 服务管理进程Services 1424
14.4 服务进程Svchost 1449
跋 1464
参考文献 1466