第一章 基础知识 1
1.1 保护模式概述 1
1.1.1 保护模式的渊源 1
1.1.2 什么是保护模式 1
1.2 分段机制和段描述符表 2
1.3 段页式寻址机制 7
1.4 保护模式下的异常 9
1.5 保护模式下的寄存器和新增指令集 9
1.6 介绍Soft -ICE for Windows 12
2.1 Windows 可执行文件首部的格式 15
第2章 Windows 内核数据结构 15
2.1.1 MS-ODS文件头 16
2.1.2 MS-Windows 文件头 17
2.1.3 Windows 代码段中的重定位信息 24
2.1.4 Windows 可执行文件实例剖析 25
2.2 Windows 的模块表 32
2.2.1 模块表 33
2.2.2 Windows 模块表实例剖析——DERNEL的模块表 36
2.3 Windows 的默认数据段 38
2.4 Windows 的任务数据库(TDB) 39
2.4.1 任务数据库TDB 39
2.4.2 任务数据库实例剖析——progman 的TDB 42
2.5 END 结构及INTWNDCLASS结构 45
2.4.3 PSP与 PDB 45
2.6 Windows中的重表——THHOOK 47
第3章 Windows内核引导过程 53
3.1 Windows启动过程的回顾 53
3.2 DERNEL 初始化过程概述 54
3.3 DRNL386 EXE的STUB程序 55
3.4 DRNL386 的STUB程序清单 55
3.5 BOOTSTRAP的执行过程 58
3.5.1 BOOTSTRAP1的执行过程 58
3.5.2 BOOTSTRAP2的执行过程 60
3.5.3 初始分全局堆——GlobalInit() 62
3.6 BOOTSTRAP源程序清单精选 64
3.5.4 创建模块表 64
第4章 Windows 的启动和终止 100
4.1 Windows 内核初始化的流程 100
4.1.1 Windows 内核初始化的实现流程 100
4.1.2 程序段0117:DI182 -DI19F 102
4.1.3 程序段0117:DIAB-D212 103
4.1.4 Windows 怎样满足同时打开很多文件的需要? 105
4.1.5 0117:D2CB-D·E6程序段 106
4.1.6 0117:D764-D769程序段 107
4.2 Windows 内核初始化程序清单 107
4.3 退出Windows 内核的过程 139
4.3.1 ExitWindows()例程 139
4.3.2 ExitKernel()例程 140
5.1 Windows 内存管理概述 144
第5章 Windows 内存管理机制 144
5.2 内存管理中的数据结构 146
5.2.1 ButgerMaater段 146
5.2.2 全局堆信息与全局场 146
5.2.3 局部堆与局部场 149
5.3 全局堆中内存埠的组织形式 154
5.3.1 空闲链表 154
5.3.2 LRU链表 154
5.4 全局内存分配标记的含义 157
5.5 Windows 的内存管理函数 158
5.5.1 全局堆内存管理函数 158
5.5.2 局部堆与局部场 159
5.6 GlobalAlloe() 160
5.6.1 CheckAllocValidty() 164
5.6.2 SubCheckAllocValidty() 167
5.6.3 SubGAlloc() 167
5.6.4 AllocMemory() 171
5.6.5 FindFreeLow () 178
5.6.6 AllocFreeLow() 179
5.6.7 MoveBlockNearBy() 185
5.6.8 CheckBlockNearBy() 185
5.6.9 MoveFreeLow() 186
5.6.10 StorageBackward() 189
2.6.11 MarkSwapPgge() 190
5.6.12 CheckFreeBorder() 191
5.6.13 ModiGlobalArena() 192
5.6.14 IsertIdleLink() 193
5.6.15 Sublnsert() 194
5.6.16 BreakIdleLink() 195
5.6.17 UnifyFreeBlock() 195
5.6.18 GrowHeap() 196
5.6.19 GetDPMIInfo() 200
5.6.20FreeDPMIBlock() 201
5.6.21 UnkinkWin386 Blick() 202
第6章 Windows模导体装载机制 205
6.1 模块的基本概念 205
6.2 实例和任务的概念 205
6.3 模块装载函数——Load Mldule() 207
6.4.1 检测指定模块是否已经装入内存的函数——CheckLoadingModule() 213
6.4 模块装载函数的重要辅助例程 213
6.4.2 为已装入模块创建新实例的函数——CreateNewInstance() 216
6.4.3 文件打开函数——OpenModuleFile() 221
6.4.4 模块表创建函数——CreateMDB() 222
6.4.5 模块标记检测函数——CheckModuleFlag() 225
6.4.6 TDB和DLL引用链表段的段的创建函数——CreaetTask() 227
6.4.7 任务数据库人创建函数——CreateTDB() 229
6.4.8 任务模块PDB的初始化函数——InitPDB() 235
6.4.9 模块内存分配函数——DoMlduleAlloc() 237
6.4.10段内存分配函数——AollocMlduleSeg() 240
6.4.11 引用DLL的装入函数——LoadImportDll() 243
6.4.12 段装载函数——LoadModuleSeg() 246
6.4.13 运行已装载模块的函数——RunNew Module() 249
6.4.14 模块初始化函数——InitModule() 251
6.4.15 库模块的初始化函数——InityDllModule() 254
6.4.16 应用程序模块的初始化函数——InitAppModule() 256
6.4.17 任务启动函数——StatNewTask() 259
6.5 段的装载 261
6.5.1 段装载函数——LoadSegment() 261
6.5.2 内存分配函数——FarMyAlloc() 263
6.5.3 段数据复制函数——CopySeg() 265
6.5.4 重复段创建函数——CreateIteratedSeg() 269
6.4.5 前序代码修改函数——PatchCodeHandle() 272
6.6 被装载模块的重定痊 277
6.6.1 System.drv中段选择符的重定位 278
6.6.2 Keyboard.drv中函数指针(段:偏移)的重定位 279
6.6.3 System.drv中函数指针(段:偏移)的重定位 279
6.6.4 System.drv中常量函数的重定位 279
6.7 缓存文件句柄对照表 289
6.8 模块的卸载过程 293
6.8.1 模块函数——DeleteModule() 296
6.9 自装载Windows的应用程序 298
6.9.1 为什么要引入自装载问题 298
6.9.2 如何创建一个自装载程序 298
6.9.3 装载函数 300
6.9.4 段重载函数——LoadAppSeg() 302
6.9.6 内存分配函数——MyAlloc() 305
6.9.5 硬件复位函数——EXITPROC() 305
6.9.7 所有者设置函数——SetOwner() 307
6.9.8 入口点获取函数——EntryAddrProc() 308
第7章 Windows任务的启动和关闭 310
7.1 Windows任务的启动代码 310
7.2 Windows中任务的启动 317
7.2.1 任务初始化函数Ⅰ——InitTask 317
7.2.2 任务启动函数 Ⅱ——WaitEvent 322
7.2.3 任务启动函数Ⅲ——InitApp() 322
7.2.4 TSR装载程序——LoadTSRApp() 322
7.4 Windows中任务的终止 327
7.4.1 任务终止函数——ExitTask() 327
7.3 任务的入口函数——WinMain() 327
第8章 Windows动态链接机制 333
8.1 动态链接机制 333
8.1.1 动态链接机制 333
8.1.2 动态链接库与应用程序的比较 334
8.1.3 动态链接与静态链接的比较 336
8.1.4 动态链接库的实例剖析 338
8.2 动态链接库的启动代码 342
8.3 动态链接库函数 348
8.3.1 库装载和卸载函数 348
8.3.2 库的初始化函数 353
8.3.3 库中引出函数入口点的获取函数 355
8.3.4 库清理函数 WEP() 375
8.4.1 IncExeUsage() 376
8.4 动态链接库引用次数的设置 376
8.4.2 DecExeUsage() 381
8.5 Windows的前置代码(Ptologs)和后续代码(Epilogs) 384
8.5.1 概述 384
8.5.2 应用程序的前置代码和后续代码 384
8.5.3 应用程序的灵巧回调(Smart CallBack) 385
8.5.4 DLL的前置代码和后续代码 386
8.5.5 实模式下的前置代码 387
8.5.6 保护蕈式下的前置代码 387
8.5.7 过程实例块的创建和释放函数 388
9.1 多任务机制 395
9.2 抢先式调度策略 395
第9章 Windows任务调度机制 395
9.3 非抢先式调度策略 396
9.3.1 事件 396
9.3.2 优先级 397
9.3.3 控制权的释放 397
9.4 源程序说明 399
9.4.1 WaitEvent() 399
9.4.2 Directedyield() 400
9.4.3 Yield() 401
9.4.4 UserYield() 401
9.4.5 OldYcild() 402
9.4.6 PostEvent() 403
9.4.7 SetPriority() 403
9.4.8 ReSchedule() 407
第10章 Windows消息驱动机制 422
10.1 Windows的消息结构 423
10.2 Windows的任务队列 424
10.3 Windows的系统队列 424
10.4 消息队列的创建 432
10.4.1 系统队列的创建——CreateSystemQueue 432
10.4.2 任务队列的创建——CreateTaskQueue 432
10.4.3 消息队列的创建——CreateQueue 433
10.5 Windows的消息类型 434
10.5.1 键盘消息——Qs_Key 435
10.5.2 鼠标消息——Qs_Mouse 436
10.5.3 时钟消息——Qs_Timer 437
10.5.4 屏幕重绘消息——Qs_Paint 441
10.5.5 传送消息——Qs_PoatMsg 442
10.5.6 发送消息——Qs_SendMsg 443
10.6 Windows的消息值 443
10.7 Windows的消息函数 444
10.7.1 消息标记获取函数 445
10.7.2 消息发送函数1 448
10.7.3 消息应答函数 460
10.7.4 消息获取函数 462
10.7.5 消息传递函数 476
10.7.6 消息发送函数2 481
附录DPMI功能调用 484
参考文献 496