第1章Windows初步 1
1.1操作系统必备功能 1
1.2 Windows的演化 2
1.3 Windows版本 2
1.3.1过时的Windows先前版本 2
1.3.2 Windows NT5和NT6 3
1.3.3处理器支持 3
1.4 Windows的市场角色 3
1.5 Windows、标准以及开放系统 4
1.6 Windows准则 5
1.7 32位和64位源代码可移植性 6
1.8标准C库:何时用它来处理文件 7
1.9使用本书所需的条件 7
1.9.1为什么使用C而不是C 7
1.9.2使用示例 7
1.10示例:一个简单的顺序文件复制程序 8
1.10.1使用C库的文件复制 9
1.10.2使用Windows的文件复制 11
1.10.3使用Windows便利函数的文件复制 12
1.11小结 13
1.11.1前瞻 14
1.11.2附加阅读 14
1.12习题 15
第2章 使用Windows文件系统和字符I/O 16
2.1 Windows文件系统 16
2.2文件命名 17
2.3文件的打开、读取、写入以及关闭 17
2.3.1文件的创建和打开 17
2.3.2关闭文件 19
2.3.3读文件 20
2.3.4写文件 21
2.4 Unicode和通用字符 21
2.4.1另一种通用字符串处理函数 22
2.4.2通用Main函数 23
2.4.3函数定义 23
2.5 Unicode策略 23
2.6示例:错误处理 23
2.7标准设备 25
2.8示例:将多个文件复制到标准输出 26
2.9示例:简单的文件加密 27
2.10文件和目录管理 29
2.10.1文件管理 29
2.10.2目录管理 31
2.11控制台I/O 32
2.12示例:打印和提示 33
2.13示例:打印当前目录 35
2.14小结 36
2.14.1前瞻 36
2.14.2附加阅读 36
2.15习题 36
第3章 高级文件、目录处理与注册表 38
3.1 64位文件系统 38
3.2文件指针 38
3.2.1 64位算术 39
3.2.2使用重叠结构来指定文件位置 40
3.3获得文件尺寸 41
3.4示例:随机记录更新 41
3.5文件属性和目录处理 45
3.5.1路径名 46
3.5.2其他用于获得文件和目录属性的方法 46
3.5.3临时文件名 47
3.6示例:列出文件属性 47
3.7示例:设置文件时间 50
3.8文件处理策略 51
3.9文件锁 52
3.9.1释放文件锁 54
3.9.2锁逻辑的后果 54
3.10注册表 55
3.11注册表管理 56
3.11.1项管理 57
3.11.2值和数据管理 58
3.12示例:列出注册表项及其内容 59
3.13小结 62
3.13.1前瞻 62
3.13.2附加阅读 62
3.14习题 62
第4章 异常处理 62
4.1异常及其处理程序 64
4.1.1 Try和Except块 64
4.1.2过滤表达式及其值 66
4.1.3异常代码 67
4.1.4小结:异常处理顺序 68
4.2浮点异常 69
4.3错误和异常 70
4.4示例:以异常方式处理错误 71
4.5终止处理程序 72
4.5.1离开try块 72
4.5.2非正常终止 73
4.5.3执行并离开终止处理程序 73
4.5.4组合finally和except块 73
4.5.5全局和局部解开 74
4.5.6终止处理程序:进程和线程终止 74
4.5.7 SEH和C++异常处理 74
4.6示例:使用终止处理程序来改进程序质量 74
4.7示例:使用过滤函数 77
4.8控制台控制处理程序 79
4.9示例:一个控制台控制处理程序 80
4.10向量化异常处理 82
4.11小结 82
4.12习题 83
第5章 内存管理、内存映射文件和DLL 84
5.1 Windows内存管理架构 84
5.2堆 86
5.3管理堆内存 88
5.3.1 HeapAlloc 88
5.3.2 HeapFree 89
5.3.3 HeapReAlloc 89
5.3.4 HeapSize 89
5.3.5更多关于序列化与异常标志的信息 90
5.3.6其他堆函数 90
5.3.7小结:堆管理 91
5.4示例:使用二叉搜索树对文件进行排序 91
5.5内存映射文件 95
5.5.1文件映射对象 96
5.5.2将对象映射到进程地址空间 97
5.5.3文件映射的限制 99
5.5.4小结:文件映射 100
5.6示例:使用映射文件进行顺序文件处理 100
5.7示例:对内存映射文件排序 102
5.8基指针 104
5.9示例:使用基指针 104
5.10动态链接库 108
5.10.1静态库和动态库 108
5.10.2隐式链接 109
5.10.3显式链接 111
5.11示例:显式链接文件转换函数 112
5.12 DLL进入点 113
5.13 DLL版本管理 114
5.14小结 115
5.14.1前瞻 115
5.14.2附加阅读 115
5.15习题 115
第6章 进程管理 117
6.1 Windows进程和线程 117
6.2进程创建 118
6.2.1指定可执行映像和命令行 120
6.2.2可继承句柄 121
6.3进程标识 122
6.4复制句柄 123
6.5进程的退出与终止 124
6.6等待进程终止 125
6.7环境块和字符串 125
6.8示例:并行模式搜索 126
6.9多处理器环境中的进程 129
6.10进程执行时间 130
6.11示例:进程执行时间 130
6.12生成控制台控制事件 131
6.13示例:简单的作业管理 132
6.13.1创建一个后台作业 132
6.13.2获取作业号 135
6.13.3列出背景作业 136
6.13.4在作业清单文件中查找作业 137
6.13.5作业对象 138
6.14示例:使用作业对象 139
6.15 小结 142
6.16习题 142
第7章 线程和调度 144
7.1线程概述 144
7.2线程基础 145
7.3线程管理 146
7.3.1 CreateThread 146
7.3.2 ExitThread 147
7.3.3 GetExitCodeThread 147
7.3.4线程标识 147
7.3.5更多线程管理函数 147
7.3.6挂起以及恢复线程 148
7.3.7等待线程终止 148
7.4在线程中使用C库 148
7.5示例:多线程的模式搜索 149
7.6性能影响 152
7.7老板/工人和其他线程模型 152
7.8示例:合并排序—利用多处理器 152
7.9程序并行性简介 157
7.10线程本地存储 158
7.11进程和线程优先级以及调度 159
7.12线程状态 160
7.13陷阱和常见错误 162
7.14计时等待 163
7.15 纤程 163
7.16小结 165
7.16.1前瞻 165
7.16.2附加阅读 165
7.17习题 165
第8章 线程同步 167
8.1线程同步之需 167
8.1.1临界代码区域 168
8.1.2临界代码区域问题的有瑕疵的解决方案 168
8.1.3 volatile存储 169
8.1.4内存架构和内存屏障 169
8.1.5互锁函数:介绍 171
8.1.6局部和全局存储 171
8.1.7小结:线程安全的代码 172
8.2线程同步对象 173
8.3 CRITICAL_SECTION对象 173
8.4用于保护共享变量的CRITCAL_SECTION 174
8.5示例:一个简单的生产者/消费者系统 176
8.6互斥量 180
8.6.1被放弃的互斥量 181
8.6.2互斥量、CRITICAL_SECTION以及死锁 181
8.6.3复习:互斥量与CRITICAL_SECTION对比 183
8.6.4堆锁 183
8.7信号量 183
8.7.1使用信号量 184
8.7.2信号量的限制 184
8.8事件 185
8.9示例:一个生产者/消费者系统 187
8.9.1复习:Windows同步对象 189
8.9.2消息和对象等待 190
8.10更多互斥量和CRITICAL_SECTION的指导原则 190
8.11更多互锁函数 191
8.12内存管理性能的考虑 192
8.13小结 192
8.13.1前瞻 192
8.13.2附加阅读 192
8.14习题 192
第9章锁、性能以及NT6增强 194
9.1同步性能影响 194
9.2用于性能试验的模型程序 197
9.3使用CS自旋数来调整多处理器性能 198
9.4 NT6轻量级读/写锁 199
9.5减少线程竞争的线程池 200
9.6 1/O完成端口 202
9.7 NT6线程池 203
9.7.1 CreateThreadpoolWork 203
9.7.2 SubmitThreadpoolWork 204
9.7.3 WaitForThreadpoolWork_Callbacks 204
9.7.4 CloseThreadpoolWork 204
9.7.5回调函数 204
9.7.6将回调提交给线程池 207
9.7.7线程池环境 207
9.7.8进程线程池 207
9.7.9其他线程池回调类型 208
9.8小结:锁性能 208
9.9再论并行性 208
9.9.1更好的基础以及扩展中的并行程序技术 209
9.9.2并行编程的可选方法 209
9.9.3并行性框架 209
9.9.4不要忘了挑战的存在 210
9.10处理器亲和性 210
9.10.1系统、进程与线程亲和性掩码 211
9.10.2查找处理器数量 212
9.11性能指导原则和陷阱 212
9.12小结 213
9.12.1前瞻 213
9.12.2附加阅读 213
9.13习题 213
第10章 高级线程同步 215
10.1条件变量模型和安全性能 215
10.1.1一起使用事件和互斥量 215
10.1.2条件变量模型 216
10.1.3条件变量模型的使用 218
10.2使用SignalObjectAndWait 219
10.3示例:阀值屏障对象 220
10.4队列对象 223
10.5示例:在多阶段管线中使用队列 226
10.6 Windows NT6条件变量 233
10.7异步过程调用 236
10.8异步过程调用的排队 236
10.9可报警的等待状态 237
10.10安全的线程取消 239
10.11为了应用程序的可移植而使用Pthreads 239
10.12线程堆栈和线程数 239
10.13关于设计、调试和测试的提示 240
10.14 Windows API之外 241
10.15 小结 241
10.15.1前瞻 242
10.15.2附加阅读 242
10.16习题 242
第11章 进程间通信 244
11.1匿名管道 244
11.2示例:使用匿名管道进行I/O重定向 245
11.3命名管道 247
11.3.1使用命名管道 248
11.3.2创建命名管道 248
11.3.3命名管道客户连接 249
11.3.4命名管道状态函数 250
11.3.5命名管道连接函数 250
11.3.6客户和服务器的命名管道连接 250
11.4命名管道事务函数 251
11.5示例:客户/服务器命令行处理程序 253
11.6关于客户/服务器命令行处理程序的注释 258
11.7邮槽 259
11.7.1使用邮槽 260
11.7.2创建和打开邮槽 260
11.8管道和邮槽的创建、连接和命名 261
11.9示例:客户可定位的服务器 262
11.10小结 264
11.11习题 264
第12章 使用Windows套接字进行网络编程 265
12.1 Windows套接字 265
12.1.1 Winsock初始化 266
12.1.2创建套接字 266
12.2套接字服务器函数 267
12.2.1绑定套接字 267
12.2.2将绑定的套接字置于侦听状态 268
12.2.3接受客户连接 268
12.2.4断开以及关闭套接字 268
12.2.5示例:准备并接受客户连接 269
12.3套接字客户函数 270
12.3.1连接服务器 270
12.3.2示例:客户连接服务器 270
12.3.3发送和接收数据 270
12.4命名管道和套接字之对比 271
12.4.1命名管道与套接字服务器之比较 271
12.4.2命名管道与套接字客户之比较 271
12.5示例:套接字消息接收函数 271
12.6示例:基于套接字的客户 272
12.7示例:基于套接字的、带有新特性的服务器 274
12.7.1主程序 275
12.7.2服务器线程 278
12.7.3运行套接字服务器 279
12.7.4安全注释 280
12.8进程内服务器 280
12.9面向行的消息、DLL进入点以及TLS 282
12.10示例:线程安全的套接字消息DLL 283
12.11示例:另一种线程安全的DLL策略 286
12.12数据报 289
12.12.1数据报广播 289
12.12.2使用数据报进行远程过程调用 289
12.13 Berkeley套接字和Windows套接字的比较 290
12.14 Windows套接字使用重叠I/O 290
12.15 Windows套接字的额外特性 290
12.16小结 290
12.16.1前瞻 290
12.16.2附加阅读 291
12.17习题 291
第13章Windows服务 293
13.1概述:编写Windows服务 293
13.2 main()函数 294
13.3 ServiceMain()函数 294
13.3.1注册服务控制处理程序 295
13.3.2设置服务状态 295
13.3.3 SERVICE_ STATUS结构 296
13.3.4服务特定的代码 297
13.4服务控制处理程序 297
13.5事件记录 298
13.6示例:服务“包装器” 298
13.7管理Windows服务 302
13.7.1打开SCM 303
13.7.2创建和删除服务 303
13.7.3启动服务 304
13.7.4控制服务 304
13.7.5查询服务状态 305
13.7.6小结:服务操作和管理 305
13.8示例:服务控制Shell 305
13.9与服务共享内核对象 309
13.10调试服务时的注意事项 309
13.11小结 310
13.11.1前瞻 310
13.11.2附加阅读 310
13.12习题 310
第14章 异步输入/输出与完成端口 311
14.1 Windows异步I/O概述 311
14.2重叠I/O 312
14.2.1重叠I/O的后果 312
14.2.2重叠结构 313
14.2.3重叠I/O状态 313
14.2.4取消重叠I/O操作 314
14.3示例:在一个文件句柄之上同步 314
14.4示例:使用重叠I/O和多缓冲区进行文件转换 315
14.5使用完成例程的扩展I/O 318
14.5.1 ReadFileEx、 WriteFileEx和完成例程 318
14.5.2可报警的等待函数 319
14.5.3完成例程的执行和可报警等待的返回 320
14.6示例:使用扩展I/O的文件转换 321
14.7使用线程的异步I/O 324
14.8可等待定时器 324
14.9示例:使用可等待定时器 325
14.9.1可等待定时器示例的注释 327
14.9.2线程池定时器 327
14.10 I/O完成端口 327
14.10.1管理I/O完成端口 328
14.10.2等待I/O完成端口 328
14.10.3邮发给I/O完成端口 329
14.10.4 1/O完成端口的替代 329
14.11示例:使用I/O完成端口的服务器 329
14.12小结 335
14.13习题 335
第15章Windows对象的安全 337
15.1安全属性 337
15.2安全性概述:安全描述符 338
15.2.1访问控制列表 338
15.2.2使用Windows对象安全性 339
15.2.3对象权限和对象访问 339
15.2.4安全描述符初始化 339
15.3安全描述符控制标志 339
15.4安全标识符 340
15.5管理ACL 341
15.6示例:NTFS文件的UNIX风格的权限 342
15.7示例:初始化安全属性 345
15.8安全描述符的读与更改 347
15.9示例:读取文件权限 349
15.10示例:更改文件权限 350
15.11给内核和通信对象施加安全 350
15.11.1给命名管道施加安全 350
15.11.2内核与私有对象的安全性 351
15.11.3 ACE掩码值 351
15.12示例:给进程及其线程施加安全 352
15.13其他安全特性的概述 352
15.13.1移除ACE 352
15.13.2绝对的和自相关的安全描述符 352
15.13.3系统ACL 352
15.13.4访问令牌信息 353
15.13.5 SID管理 353
15.14小结 353
15.14.1前瞻 353
15.14.2附加阅读 353
15.15习题 353
附录A使用示例程序 355
附录B源代码可移植性:Windows、UNIX和Linux 357
附录C性能结果 370
参考文献 379