Delphi源代码分析的图书目录
序 i
前言 I
第一部分 Delphi内核深入剖析(I) 1
第1章 最小化Delphi内核 3
1.1 MiniDExe如何实现内核最小化 3
1.1.1 MiniDExe中的System.pas单元 4
1.1.2 MiniDExe中的SysInit.pas单元 5
1.1.3 MiniDExe中的项目文件MiniDExe.dpr 6
1.2 一些其他的内核优化 6
1.3 为什么要研究最小化内核 7
第2章 基本数据类型的实现 9
2.1 基本数据类型 9
2.2 变量与常量 11
2.2.1 全局变量与局部变量 11
2.2.2 动态分配的内存 12
2.2.3 换一个方式来理解 13
2.2.4 常量 14
2.3 数据结构的实现 16
2.3.1 简单类型 16
2.3.2 字符串 16
2.3.3 构造类型 26
2.3.4 指针类型 28
2.3.5 过程类型 28
2.4 数据结构相关的例程 29
2.4.1 标准Pascal的内置例程 30
2.4.2 字符串操作例程 31
2.5 变量的类型检测与强制转换 47
2.6 引用-计数-写复制与类型信息 48
2.6.1 引用计数与增加引用 48
2.6.2 “增加引用”何时发生 49
2.6.3 增加引用的操作是依赖类型信息来实现的 51
2.6.4 写复制与值参数的备份 53
第3章 BASM(Borland汇编语言)精要 55
3.1 BASM概念简要 55
3.2 表达式的类别与类型 56
3.3 数据定义和数据类型强制转换 57
3.4 例程入口参数及调用约定 61
3.5 例程和API的调用与流程控制 62
3.6 完全汇编例程与内嵌汇编例程 65
3.7 汇编例程中的返回值约定 66
3.8 其他 67
第4章 初始化与结束化过程 71
4.1 变量的初始化与结束化 71
4.1.1 初始化的必要性 72
4.1.2 如何初始化 73
4.1.3 如何结束化 74
4.2 例程的初始化与结束化 76
4.3 单元初始化与结束化 77
4.4 模块初始化与结束化 79
4.4.1 模块入口代码 79
4.4.2 编译器决定的程序执行流程 80
第5章 面向Windows开发的基本实现 83
5.1 Win32应用程序:EXE 83
5.1.1 适应Win32应用程序的最简化内核 83
5.1.2 初始化例程_InitExe() 85
5.1.3 内部模块表管理例程 86
5.1.4 .EXE启动例程_StartExe() 87
5.1.5 应用程序的结束化控制 88
5.2 32位的DOS:控制台应用程序 91
5.2.1 控制台应用程序的模块入口代码 91
5.2.2 控制台应用程序的最小化实现 92
5.2.3 控制台应用程序的Delphi实现 93
5.2.4 文件操作例程与控制台应用程序 94
5.2.5 控制台的开启与关闭 97
5.2.6 CRT单元与Input、Output的重载 98
5.3 动态链接库:DLL 99
5.3.1 丢失的DllMain() 99
5.3.2 _InitLib()例程 101
5.3.3 _StartLib()例程 101
5.3.4 .DLL的结束化过程 102
5.3.5 DllProc与DllMain()的不同 105
5.3.6 动态链接库的内核最小化 106
5.4 Delphi的动态链接库:包 108
5.4.1 包的主要规则 108
5.4.2 Delphi中的包与普通DLL的区别 110
5.4.3 包的DllMain() 111
5.4.4 包的载入例程LoadPackage() 112
5.4.5 真正的初始化例程InitializePackage() 112
5.4.6 包的卸载例程UnloadPackage() 115
5.4.7 包的基本输出例程 115
5.4.8 内部例程_PackageLoad()与_PackageUnload() 116
5.4.9 包的内核最小化 117
5.5 其他 118
5.5.1 初始化上下文中OuterContext域的使用 118
5.5.2 入口代码中的堆栈使用深入分析(内存现场) 119
5.5.3 再论入口代码 123
第6章 Delphi的积木艺术(PE) 127
6.1 PE文件结构概要 127
6.1.1 文件头 129
6.1.2 节表 131
6.1.3 节 132
6.1.4 PE文件与内存映射 134
6.1.5 有关相对虚地址的计算 138
6.2 Delphi的PE文件头中一些重要的域 142
6.3 Delphi的PE文件中一些重要的节 144
6.3.1 线程局部存储(.tls和.rdata) 144
6.3.2 资源节(.rsrc) 145
6.3.3 导入、导出表(.idata和.edata) 146
6.3.4 数据节与代码节(DATA、BSS和CODE) 154
6.3.5 重定位节(.reloc) 157
6.4 3.5K的秘密 159
6.4.1 Delphi的PE文件头部 159
6.4.2 Delphi的PE文件的节及其默认对齐 160
6.4.3 还可能更小吗 160
6.4.4 3.5K代码的内存映射 161
6.5 入口点 162
第二部分 Delphi内核深入剖析(II) 167
第7章 Delphi的内存管理器 169
7.1 Delphi的内存管理器实现框架 169
7.2 内存页管理 171
7.3 堆 172
7.4 MemoryManager及相关例程 172
7.5 GetMem.inc中的重要例程 174
7.5.1 堆块及其管理例程 175
7.5.2 虚地址空间(Address space)管理 178
7.5.3 已提交的内存空间(Committed space)管理 179
7.5.4 用户调用例程(actually calls)的实现 180
7.5.5 初始化、结束化与其他辅助例程 194
7.6 遍历全部内存块 195
7.7 共享内存管理器 197
7.8 第三方内存管理器 200
7.9 小结 201
第8章 错误和异常 203
8.1 错误 203
8.2 断言 206
8.3 Windows与Delphi中的异常处理机制概要 209
8.4 编译器对异常处理机制的实现 212
8.4.1 最小化内核的启示 212
8.4.2 从操作系统的角度来理解编译器行为 216
8.4.3 try..finally/except..end语法关键字与内部例程 219
8.5 基本(except型)异常处理 221
8.5.1 异常触发(Raise) 221
8.5.2 多层(嵌套)的异常处理 222
8.5.3 异常展开(Unwind) 223
8.5.4 异常响应(Notify) 227
8.5.5 顶层异常处理 229
8.6 使用面向对象技术的异常类 233
8.6.1 异常列表、RaiseFrame与ExceptionRecord 233
8.6.2 未知异常映射:ExceptObjProc 235
8.6.3 不使用SysUtils.pas单元的应用程序 236
8.6.4 _RaiseExcept()、_RaiseAgain()与_DoneExcept()例程 238
8.6.5 异常对象 241
8.6.6 异常类型检测的依赖性问题 247
第9章 多线程的实现及调度 251
9.1 操作系统的进程与线程 252
9.1.1 线程的启动过程 253
9.1.2 主线程与用户线程启动过程的比较 255
9.1.3 线程有哪些独立元素 256
9.2 操作系统的线程调度概要 257
9.3 基本的多线程应用 258
9.4 线程变量(线程局部存储) 261
9.4.1 线程局部存储(TLS)的实质 262
9.4.2 编译器的准备工作 263
9.4.3 静态TLS:EXE模块中的TLS 265
9.4.4 动态TLS:DLL模块中的TLS 266
9.5 再论FS段 268
9.6 线程类(TThread) 272
9.6.1 线程执行体(Execute) 275
9.6.2 线程与主线程的同步(Synchronize) 277
9.6.3 控制台应用的多线程同步(第三方的WakeMainThread例程) 287
9.6.4 线程中止和结束(Terminate) 292
9.7 线程同步对象 297
9.7.1 线程同步方法 298
9.7.2 Delphi中的线程同步类 306
9.7.3 线程对象的WaitFor()方法 311
9.8 多线程环境下的内存管理器 312
第10章 资源的管理和使用 315
10.1 资源字符串 315
10.1.1 隐含的调用:LoadResString()例程 315
10.1.2 _InitResStrings()例程 317
10.1.3 _InitResStringImports()例程 319
10.1.4 _InitImports()例程 320
10.2 Delphi编译的PE文件的默认资源 322
10.2.1 PACKAGEINFO资源 323
10.2.2 PACKAGEOPTIONS资源 324
10.2.3 DVCLAL资源 326
10.2.4 DESCRIPTION资源 327
10.3 其他 327
第11章 突破Delphi在应用开发上的限制 329
11.1 开发DOS保护模式程序 329
11.2 开发Windows9x上的驱动程序 335
11.2.1 Delphi编译的.OBJ文件 335
11.2.2 第三方的链接器处理Delphi的.OBJ文件的问题 336
11.2.3 在Delphi中编写VxD驱动程序代码 337
11.2.4 链接目标文件并输出VxD驱动程序 338
11.3 开发WinNT/2000上的驱动程序 339
11.4 其他 342
术语表 343
参考书目 347