《WindowsNT高级编程技术》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:(美)Jeffrey Richter著;郑全战等译
  • 出 版 社:北京:清华大学出版社
  • 出版年份:1994
  • ISBN:7302016275
  • 页数:497 页
图书介绍:本书讲述Windows NT编程的特性、进程和线程管理、存储器管理、动态链接库、文件系统和文件I/O、UNICODE等特性比较。

第一章 进程与线程 1

1.1 Windows NT Executive对象 2

1.2 创建进程:CreateProcess函数 3

1.2.1 lpszImageName 4

1.2.2 lpszCommandLine 4

1.2.3 lpsaProcess,lpsaThread,fInheritHandles 5

1.2.4 fdwCreate 6

1.2.5 lpvEnvironment 7

译者序 7

目录 7

1.2.6 lpszCurDir 8

1.2.7 lpsiStartInfo 8

鸣谢 9

前言 11

1.2.8 lppiProcInfo 11

1.3 终止进程 13

1.3.1 ExitProcess函数 13

1.3.2 TerminateProcess函数 13

1.3.3 进程的结束 14

1.4 何时创建线程 14

1.5 何时不用创建线程 16

1.6 线程的生命周期 17

1.6.1 产生线程:CreateThread函数 17

1.6.2 幸存的WinMain函数 19

1.6.3 终止线程 21

1.7 识别自己的身份 23

1.8 Windows NT如何调度线程 26

1.8.1 进程优先级类 27

1.8.2 修改进程优先级类 28

1.8.3 设定线程相对优先级 29

1.8.4 挂起及恢复线程 30

1.9 子进程 31

1.9.1 运行分离的子进程 32

1.10 查看系统内部 32

1.11 进程、线程和C运行时库 37

第二章 堆内存管理 40

2.1 我所知的CPU 40

2.2 全局和局部堆API 42

2.2.1 可移植到Win32的16位Windows函数 45

2.2.2 有语义变化的函数 46

2.2.3 应该避免使用的函数 47

2.3.1 应用程序保护 48

2.2.4 已经不再使用的函数 48

2.3 创建自己的Win32堆 48

2.3.2 有效的内存管理 49

2.3.3 局部访问 49

2.3.4 Win32堆API 50

2.3.4.1 HeapCreate 50

2.3.4.2 GetProcessHeap 51

2.3.4.3 HeapAlloc 51

2.3.4.4 HeapSize 52

2.3.4.5 HeapReAlloc 52

2.3.4.6 HeapFree 53

2.3.4.7 HeapDestroy 53

2.4 在C++中使用堆 53

3.1 使用虚拟内存 58

第三章 虚拟内存管理 58

3.1.1 保留地址空间 59

3.1.2 提交内存 60

3.1.3 保留地址空间同时提交内存 61

3.1.4 使用地址空间 61

3.1.5 释放地址空间 62

3.1.6 虚拟内存分配示例应用程序 64

3.1.7 修改保护属性 74

3.1.8 确定地址空间状态 75

3.1.9 虚拟内存映像示例程序 76

3.1.10 系统状态示例应用程序 87

3.1.11 不把内存切换到页面文件中 93

3.1.12 虚拟内存统计 93

3.1.12.1 虚拟内存状态示例程序 94

3.2 设计强壮的应用程序 99

第四章 内存映射文件 101

4.1 操纵文件数据:样例学习 101

4.1.1 方法1:一个文件,一个缓冲区 101

4.1.2 方法2:二个文件,一个缓冲区 102

4.1.3 方法3:一个文件,两个缓冲区 102

4.1.4 方法4:一个文件,0缓冲区(无需缓冲) 102

4.2 使用内存映射文件 103

4.3 内存映射文件讨论 106

4.3.1 文件倒置示例应用程序 107

4.3.2 映射文件的一点麻烦 111

4.4 用内存映射文件共享数据 112

4.4.1 如何利用内存映射文件共享内存 113

4.4.2 内存映射文件共享示例应用程序 115

4.5 如何用内存映射文件管理可执行文件和DLL 122

第五章 线程同步 124

5.1 线程同步概述 124

5.1.1 最坏的事情之一 124

5.2 临界区 125

5.2.1 创建临界区 127

5.2.2 使用临界区 128

5.2.3 用临界区同步GDI对象 133

5.2.4 临界区示例应用程序 134

5.3 用Windows NT对象进行同步 145

5.3.1 互斥量 148

5.3.1.1 使用互斥量来代替临界区 149

5.3.1.2 互斥量示例应用程序 153

5.3.2 信号量 161

5.3.2.1 超级市场示例应用程序 162

5.3.3 事件 184

5.3.3.1 人工重置事件 185

5.3.3.2 Bucket of Balls示例应用程序 186

5.3.3.3 自动重置事件 202

5.3.3.4 文档统计示例应用程序 202

5.4 线程挂起 210

5.4.1 Sleep 210

5.4.2 异步文件I/O 210

5.4.3 WaitForInputIdle 210

5.4.4 MsgWaitForMultipleObjects 211

5.4.5 WaitForDebugEvent 212

5.4.6 Interlocked函数族 212

第六章 Win32子系统环境 214

6.1 多任务 214

6.1.1 抢占式调度 215

6.2 Windows NT的客户/服务器结构 217

6.2.1 进程线程和代理线程是如何一起工作的 218

6.3 线程信息 219

6.4 非序列化输入 225

6.4.1 Windows NT怎样使输入非序列化 225

6.4.1.1 共享线程输入队列 226

6.5 局部输入状态 228

6.5.1 键盘输入和焦点 229

6.5.2 鼠标光标管理 232

6.5.3 局部输入状态实验示例程序 233

6.6 线程队列和消息处理 248

6.6.1 发送消息给线程的消息队列 248

6.6.2 发送消息给窗口 249

6.6.3 用消息发送数据 252

6.6.4 拷贝数据示例应用程序 254

第七章 动态连接库 260

7.1 动态连接库如何从16位Windows变到Windows NT 260

7.1.1 16位Windows如何向应用程序提供DLL 260

7.1.2 Windows NT如何提供DLL给进程使用 261

7.1.3 进程间使用DLL局部堆共享数据 262

7.2 LibMain、DllEntryPoint、DllMain的比较 263

7.2.1 进程和线程的装入和卸下规则 265

7.2.2 DLL和C运行库 266

7.3 划分进程地址空间 268

7.3.1 DLL的基址 269

7.4 EXE或DLL的段 275

7.5 模拟GetModuleUsage函数:ModUse示例程序 278

7.6 禁止运行应用程序的多个实例:MultInst示范程序 285

7.7 从DLL中输出函数 286

7.8 从DLL输出数据 288

7.9 动态连接库和钩子函数 290

7.10 其它进程产生的子类窗口 292

7.10.1 Program Manager Restore示例程序 293

7.11 16位Windows的GlobalNotify函数 304

7.12 GMEM_SHARE和GMEM_DDESHARE标志 304

第八章 线程局部存储 306

8.1 动态线程局部存储 307

8.1.1 使用动态线程局部存储 308

8.1.2 动态线程局部存储示例应用程序 310

8.2 静态线程局部存储 318

8.2.1 静态局部存储示例应用程序 319

第九章 文件系统和文件输入输出 327

9.1 Windows NT的文件约定 328

9.2 系统和卷操作 329

9.2.1 获得卷的特定信息 332

9.2.2 磁盘信息查看示例应用程序 336

9.3 目录操作 343

9.3.1 获得当前目录 343

9.3.2 改变当前目录 344

9.3.3 获得系统目录 344

9.3.4 获得目录路径 345

9.3.5 创建和删除目录 345

9.4 拷贝、删除、移动及改名文件 345

9.4.1 拷贝一个文件 346

9.4.2 删除一个文件 346

9.4.3 移动一个文件 346

9.4.3.1 MoveFile和MoveFileEx的差别 347

9.4.4 改名文件 348

9.5 创建、打开和关闭文件 349

9.6 同步读写文件 353

9.6.1 定位文件指针 354

9.6.2 设置文件尾 355

9.6.3 强制缓冲的数据写入磁盘 356

9.6.4 锁定及解锁文件的某区域 356

9.7 异步读写文件 358

9.7.1 同时执行多个异步文件I/O操作 363

9.7.2 告警异步文件I/O 364

9.7.3 告警I/O示例应用程序 366

9.8 操纵文件属性 377

9.8.1 文件标志 377

9.8.3 文件时间戳 378

9.8.2 文件大小 378

9.9 搜寻文件 381

9.9.1 目录漫游示例应用程序 384

9.10 文件系统变化通知 392

9.10.1 文件变化示例应用程序 393

第十章 结构化异常处理 407

10.1 终止处理程序 408

10.1.1 SEH终止示例应用程序 419

10.2 异常过滤程序和异常处理程序 427

10.2.1 EXCEPTION_EXECUTE_HANDLER 429

10.2.2 EXCEPTION_CONTINUE_EXECUTION 430

10.2.2.1 谨慎使用EXCEPTION_CONTINUE_EXECUTION 431

10.2.3 EXCEPTION_CONTINUE_SEARCH 432

10.2.4 全局展开 433

10.2.5 关于异常过滤程序的进一步讨论 437

10.2.6 SEH异常情况应用程序示例 444

10.3 软件异常情况 454

10.3.1 在C++构造函数中的软件异常情况 456

10.3.2 SEH软件异常情况应用程序示例 456

10.3.3 停止全局展开 467

10.3.4 未处理的异常情况 468

10.3.5 没有调试器附属时的未处理异常情况 468

10.3.6 不显示异常情况消息框 470

10.3.7 自己调用UnhandledExceptionFilter 472

10.3.8 未处理的核心态异常情况 472

第十一章 UNICODE 474

11.1 字符集 474

11.1.1 单字节与双字节字符集 474

11.1.2 Unicode:宽字节字符集 475

11.2 为什么你要使用Unicode 476

11.3 如何编写Unicode源代码 476

11.3.1 C运行时库中对Unicode的支持 477

11.3.2 Win32定义的Unicode数据类型 481

11.3.3 Win32中的Unicode和ANSI函数 482

11.4 把你的应用程序转换为能够识别ANSI和UNICODE 484

11.4.1 Win32中的字符串函数 484

11.4.2 资源 486

11.4.3 在Unicode和ANSI间转换字符串 487

11.4.4 窗口类和过程 490

附录A 消息拆析器 492

A.1 消息拆析器 493

A.2 子控制宏 496

A.3 API宏 497