WINDOWS核心编程-----框架

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 第一部分 程序员必读
    • 第1章 对程序错误的处理 1
      • 1.1 定义自己的错误代码 4
      • 1.2 ErrorShow示例应用程序 5
    • 第2章 Unicode 11
      • 2.1 字符集 11
        • 2.1.1 单字节与双字节字符集 11
        • 2.1.2 Unicode:宽字节字符集 12
      • 2.2 为什么使用Unicode 13
      • 2.3 Windows 2000与Unicode 13
      • 2.4 Windows 98与Unicode 13
      • 2.5 Windows CE与Unicode 14
      • 2.6 需要注意的问题 14
      • 2.7 对COM的简单说明 14
      • 2.8 如何编写Unicode源代码 15
        • 2.8.1 C运行期库对Unicode的支持 15
        • 2.8.2 Windows定义的Unicode数据类型 17
        • 2.8.3 Windows中的Unicode函数和ANSI
        • 2.8.4 Windows字符串函数 19
      • 2.9 成为符合ANSI和Unicode的应用程序 19
        • 2.9.1 Windows字符串函数 19
        • 2.9.2 资源 22
        • 2.9.3 确定文本是ANSI文本还是Unicode
        • 2.9.4 在Unicode与ANSI之间转换字符串 23
    • 第3章 内核对象 27
      • 3.1 什么是内核对象 27
        • 3.1.1 内核对象的使用计数 27
        • 3.1.2 安全性 28
      • 3.2 进程的内核对象句柄表 30
        • 3.2.1 创建内核对象 30
        • 3.2.2 关闭内核对象 32
      • 3.3 跨越进程边界共享内核对象 32
        • 3.3.1 对象句柄的继承性 32
        • 3.3.2 改变句柄的标志 35
        • 3.3.3 命名对象 36
        • 3.3.4 终端服务器的名字空间 39
        • 3.3.5 复制对象句柄 39
  • 第二部分 编程的具体方法
    • 第4章 进程 45
      • 4.1 编写第一个Windows应用程序 46
        • 4.1.1 进程的实例句柄 49
        • 4.1.2 进程的前一个实例句柄 50
        • 4.1.3 进程的命令行 50
        • 4.1.4 进程的环境变量 51
        • 4.1.5 进程的亲缘性 54
        • 4.1.6 进程的错误模式 54
        • 4.1.7 进程的当前驱动器和目录 54
        • 4.1.8 进程的当前目录 55
        • 4.1.9 系统版本 56
      • 4.2 CreateProcess函数 58
        • 4.2.1 pszApplicationName和
        • 4.2.2 psa Process、psa Thread和
        • 4.2.3 fdwCreate 62
        • 4.2.4 pvEnvironment 64
        • 4.2.5 pszCurDir 64
        • 4.2.6 psiStartInfo 64
        • 4.2.7 ppiProcInfo 67
      • 4.3 终止进程的运行 69
        • 4.3.1 主线程的进入点函数返回 69
        • 4.3.2 ExitProcess函数 69
        • 4.3.3 TerminateProcess函数 70
        • 4.3.4 进程终止运行时出现的情况 71
      • 4.4 子进程 72
      • 4.5 枚举系统中运行的进程 73
    • 第5章 作业 91
      • 5.1 对作业进程的限制 93
      • 5.2 将进程放入作业 99
      • 5.3 终止作业中所有进程的运行 99
      • 5.4 查询作业统计信息 100
      • 5.5 作业通知信息 103
      • 5.6 JobLab示例应用程序 104
    • 第6章 线程的基础知识 121
      • 6.1 何时创建线程 121
      • 6.2 何时不能创建线程 122
      • 6.3 编写第一个线程函数 123
      • 6.4 CreateThread函数 124
        • 6.4.1 psa 124
        • 6.4.2 cbStack 124
        • 6.4.3 pfnStartAddr和pvParam 125
        • 6.4.4 fdwCreate 126
        • 6.4.5 pdwThreadID 126
      • 6.5 终止线程的运行 127
        • 6.5.1 线程函数返回 127
        • 6.5.2 ExitThread函数 127
        • 6.5.3 TerminateThread函数 127
        • 6.5.4 在进程终止运行时撤消线程 128
        • 6.5.5 线程终止运行时发生的操作 128
      • 6.6 线程的一些性质 129
      • 6.7 C/C++运行期库的考虑 131
        • 6.7.1 Oops—错误地调用了Create Thread 138
        • 6.7.2 不应该调用的C/C++运行期库函数 138
      • 6.8 对自己的ID概念应该有所了解 139
    • 第7章 线程的调度、优先级和亲缘性 142
      • 7.1 暂停和恢复线程的运行 143
      • 7.2 暂停和恢复进程的运行 144
      • 7.3 睡眠方式 145
      • 7.4 转换到另一个线程 145
      • 7.5 线程的运行时间 146
      • 7.6 运用环境结构 148
      • 7.7 线程的优先级 152
      • 7.8 对优先级的抽象说明 153
      • 7.9 程序的优先级 156
        • 7.9.1 动态提高线程的优先级等级 158
        • 7.9.2 为前台进程调整调度程序 159
        • 7.9.3 Scheduling Lab示例应用程序 160
        • 7.10 亲缘性 167
    • 第8章 用户方式中线程的同步 172
      • 8.1 原子访问:互锁的函数家族 172
      • 8.2 高速缓存行 177
      • 8.3 高级线程同步 178
      • 8.4 关键代码段 180
        • 8.4.1 关键代码段准确的描述 182
        • 8.4.2 关键代码段与循环锁 185
        • 8.4.3 关键代码段与错误处理 185
        • 8.4.4 非常有用的提示和技巧 186
    • 第9章 线程与内核对象的同步 190
      • 9.1 等待函数 191
      • 9.2 成功等待的副作用 194
      • 9.3 事件内核对象 195
      • 9.4 等待定时器内核对象 204
        • 9.4.1 让等待定时器给APC项排队 207
        • 9.4.2 定时器的松散特性 209
      • 9.5 信标内核对象 210
      • 9.6 互斥对象内核对象 211
        • 9.6.1 释放问题 213
        • 9.6.2 互斥对象与关键代码段的比较 214
        • 9.6.3 Queue示例应用程序 214
      • 9.7 线程同步对象速查表 223
      • 9.8 其他的线程同步函数 224
        • 9.8.1 异步设备I/O 224
        • 9.8.2 WaitForInputIdle 224
        • 9.8.3 MsgWaitForMultipleObjects (Ex) 225
        • 9.8.4 WaitForDebugEvent 225
        • 9.8.5 SingleObjectAndWait 226
    • 第10章 线程同步工具包 228
      • 10.1 实现关键代码段:Optex 228
      • 10.2 创建线程安全的数据类型和反信标 239
      • 10.3 单个写入程序/多个阅读程序的保护 251
      • 10.4 实现一个WaitForMultipleExpressions
    • 第11章 线程池的使用 274
      • 11.1 方案1:异步调用函数 275
      • 11.2 方案2:按规定的时间间隔调用函数 277
      • 11.3 方案3:当单个内核对象变为已通知状态
      • 11.4 方案4:当异步I/O请求完成运行时调用
    • 第12章 纤程 287
      • 12.1 纤程的操作 287
      • 12.2 Counter示例应用程序 289
  • 第三部分 内 存 管 理
    • 第13章 Windows的内存结构 299
      • 13.1 进程的虚拟地址空间 299
      • 13.2 虚拟地址空间如何分区 300
        • 13.2.1 NuLL 指针分配的分区—适用于
        • 13.2.2 MS-DOS/16位Windows 应用程序兼容
        • 13.2.3 用户方式分区—适用于Windows 2000
        • 13.2.4 64 KB禁止进入的分区—仅适用
        • 13.2.5 共享的MMF分区—仅适用于
        • 13.2.6 内核方式分区—适用于Windows
      • 13.3 地址空间中的区域 303
      • 13.4 提交地址空间区域中的物理存储器 304
      • 13.5 物理存储器与页文件 304
      • 13.6 保护属性 307
        • 13.6.1 Copy-On-Write 访问 308
        • 13.6.2 特殊的访问保护属性的标志 309
      • 13.7 综合使用所有的元素 309
        • 13.7.1 区域的内部情况 312
        • 13.7.2 与Windows 98地址空间的差别 315
      • 13.8 数据对齐的重要性 319
    • 第14章 虚拟内存 323
      • 14.1 系统信息 323
      • 14.2 虚拟内存的状态 330
      • 14.3 确定地址空间的状态 336
        • 14.3.1 VMQuery函数 337
        • 14.3.2 虚拟内存表示例应用程序 343
    • 第15章 在应用程序中使用虚拟内存 354
      • 15.1 在地址空间中保留一个区域 354
      • 15.2 在保留区域中的提交存储器 355
      • 15.3 同时进行区域的保留和内存的提交 356
      • 15.4 何时提交物理存储器 357
      • 15.5 回收虚拟内存和释放地址空间区域 358
        • 15.5.1 何时回收物理存储器 359
        • 15.5.2 虚拟内存分配的示例应用程序 360
      • 15.6 改变保护属性 368
      • 15.7 清除物理存储器的内容 369
      • 15.8 地址窗口扩展—适用于
  • 第16章 线程的堆栈 385
      • 16.1 Windows 98下的线程堆栈 387
      • 16.2 C/C++运行期库的堆栈检查函数 389
      • 16.3 Summation示例应用程序 390
    • 第17章 内存映射文件 397
      • 17.1 内存映射的可执行文件和DLL
        • 17.1.1 可执行文件或DLL的多个实例
        • 17.1.2 在可执行文件或DLL的多个实
        • 17.1.3 AppInst示例应用程序 404
      • 17.2 内存映射数据文件 409
        • 17.2.1 方法 1:一个文件,一个缓存 409
        • 17.2.2 方法 2:两个文件,一个缓存 409
        • 17.2.3 方法 3:一个文件,两个缓存 410
        • 17.2.4 方法 4:一个文件,零缓存 410
      • 17.3 使用内存映射文件 410
        • 17.3.1 步骤 1:创建或打开文件内核
        • 17.3.2 步骤 2:创建一个文件映射内核
        • 17.3.3 步骤 3:将文件数据映射到进程
        • 17.3.4 步骤4:从进程的地址空间中撤消
        • 17.3.5 步骤 5和步骤 6:关闭文件映射对象
        • 17.3.6 文件倒序示例应用程序 418
      • 17.4 使用内存映射文件来处理大文件 426
      • 17.5 内存映射文件与数据视图的相关性 427
      • 17.6 设定内存映射文件的基地址 428
      • 17.7 实现内存映射文件的具体方法 429
      • 17.8 使用内存映射文件在进程之间共享
      • 17.9 页文件支持的内存映射文件 431
      • 17.10 稀疏提交的内存映射文件 438
    • 第18章 堆栈 451
      • 18.1 进程的默认堆栈 451
      • 18.2 为什么要创建辅助堆栈 452
        • 18.2.1 保护组件 452
        • 18.2.2 更有效的内存管理 453
        • 18.2.3 进行本地访问 453
        • 18.2.4 减少线程同步的开销 453
        • 18.2.5 迅速释放堆栈 453
      • 18.3 如何创建辅助堆栈 454
        • 18.3.1 从堆栈中分配内存块 455
        • 18.3.2 改变内存块的大小 456
        • 18.3.3 了解内存块的大小 456
        • 18.3.4 释放内存块 457
        • 18.3.5 撤消堆栈 457
        • 18.3.6 用C++程序来使用堆栈 457
      • 18.4 其他堆栈函数 460
  • 第四部分 动态链接库
    • 第19章 DLL基础 463
      • 19.1 DLL与进程的地址空间 464
      • 19.2 DLL的总体运行情况 465
      • 19.3 创建DLL模块 467
        • 19.3.1 输出的真正含义是什么 469
        • 19.3.2 创建用于非Visual C++工具的DLL 471
      • 19.4 创建可执行模块 472
      • 19.5 运行可执行模块 474
    • 第20章 DLL的高级操作技术 477
      • 20.1 DLL模块的显式加载和
        • 20.1.1 显式加载DLL模块 478
        • 20.1.2 显式卸载DLL模块 479
        • 20.1.3 显式链接到一个输出符号 480
      • 20.2 DLL的进入点函数 481
        • 20.2.1 DLL_PROCESS_ATTACH通知 482
        • 20.2.2 DLL_PROCESS_DETACH通知 483
        • 20.2.3 DLL_THREAD_ATTACH通知 485
        • 20.2.4 DLL_THREAD_DETACH通知 485
        • 20.2.5 顺序调用DllMain 486
        • 20.2.6 DllMain与C/C++运行期库 488
      • 20.3 延迟加载DLL 489
      • 20.4 函数转发器 499
      • 20.5 已知的DLL 499
      • 20.6 DLL转移 500
      • 20.7 改变模块的位置 501
      • 20.8 绑定模块 506
    • 第21章 线程本地存储器 509
      • 21.1 动态TLS 509
      • 21.2 静态TLS 513
    • 第22章 插入DLL和挂接API 515
      • 22.1 插入DLL:一个例子 515
      • 22.2 使用注册表来插入DLL 517
      • 22.3 使用Windows挂钩来插入DLL 518
      • 22.4 使用远程线程来插入DLL 531
        • 22.4.1 Inject Library 示例应用程序 534
        • 22.4.2 Image Walk DLL 541
      • 22.5 使用特洛伊DLL来插入DLL 544
      • 22.6 将DLL作为调试程序来插入 544
      • 22.7 用Windows 98上的内存映射文件
      • 22.8 用CreateProcess插入代码 544
      • 22.9 挂接API的一个示例 545
        • 22.9.1 通过改写代码来挂接API 546
        • 22.9.2 通过操作模块的输入节来挂接API 546
        • 22.9.3 LastMsgBoxInfo示例应用程序 549
  • 第五部分 结构化异常处理
    • 第23章 结束处理程序 565
      • 23.1 通过例子理解结束处理程序 566
      • 23.2 Funcenstein1 566
      • 23.3 Funcenstein2 566
      • 23.4 Funcenstein3 568
      • 23.5 Funcfurter1 568
      • 23.6 突击测验:FuncaDoodleDoo 569
      • 23.7 Funcenstein4 570
      • 23.8 Funcarama1 571
      • 23.9 Funcarama2 572
      • 23.10 Funcarama3 572
      • 23.11 Funcarama4:最终的边界 573
      • 23.12 关于finally块的说明 574
      • 23.13 Funcfurter2 575
      • 23.14 SEH结束处理示例程序 576
    • 第24章 异常处理程序和软件异常 578
      • 24.1 通过例子理解异常过滤器和异常处理
        • 24.1.1 Funcmeister1 578
        • 24.1.2 Funcmeister2 579
      • 24.2 EXCEPTION_EXECUTE_HANDLER 580
        • 24.2.1 一些有用的例子 581
        • 24.2.2 全局展开 583
        • 24.2.3 暂停全局展开 585
      • 24.3 EXCEPTION_CONTINUE_
      • 24.4 EXCEPTION_CONTINUE_
      • 24.5 Get Exception Code 589
      • 24.6 Get Exception Information 592
      • 24.7 软件异常 595
    • 第25章 未处理异常和C++异常 598
      • 25.1 即时调试 600
      • 25.2 关闭异常消息框 601
        • 25.2.1 强制进程终止运行 601
        • 25.2.2 包装一个线程函数 601
        • 25.2.3 包装所有的线程函数 601
        • 25.2.4 自动调用调试程序 602
      • 25.3 程序员自己调用UnhandledException
      • 25.4 UnhandledExceptionFilter函数的一些
      • 25.5 异常与调试程序 604
      • 25.6 C++异常与结构性异常的对比 618
  • 第六部分 窗 口
    • 第26章 窗口消息 623
      • 26.1 线程的消息队列 623
      • 26.2 将消息发送到线程的消息队列中 625
      • 26.3 向窗口发送消息 626
      • 26.4 唤醒一个线程 630
        • 26.4.1 队列状态标志 630
        • 26.4.2 从线程的队列中提取消息的
        • 26.4.3 利用内核对象或队列状态标
      • 26.5 通过消息发送数据 636
      • 26.6 Windows如何处理ANSI/Unicode
    • 第27章 硬件输入模型和局部输入状态 645
      • 27.1 原始输入线程 645
      • 27.2 局部输入状态 646
        • 27.2.1 键盘输入与焦点 647
        • 27.2.2 鼠标光标管理 649
      • 27.3 将虚拟输入队列同局部输入状态挂接
        • 27.3.1 LISLab 示例程序 652
        • 27.3.2 LISWatch 示例程序 666
  • 第七部分 附 录
  • 附录A 建立环境 675
  • 附录B 消息分流器、子控件宏和API宏 686
  • 总结


前言

windows核心编程学习心得

目 录
译者序
前言

第一部分 程序员必读

第1章 对程序错误的处理 1

1.1 定义自己的错误代码 4

1.2 ErrorShow示例应用程序 5

第2章 Unicode 11

2.1 字符集 11

2.1.1 单字节与双字节字符集 11
2.1.2 Unicode:宽字节字符集 12

2.2 为什么使用Unicode 13

2.3 Windows 2000与Unicode 13

2.4 Windows 98与Unicode 13

2.5 Windows CE与Unicode 14

2.6 需要注意的问题 14

2.7 对COM的简单说明 14

2.8 如何编写Unicode源代码 15

2.8.1 C运行期库对Unicode的支持 15
2.8.2 Windows定义的Unicode数据类型 17
2.8.3 Windows中的Unicode函数和ANSI
       函数	17
2.8.4 Windows字符串函数 19

2.9 成为符合ANSI和Unicode的应用程序 19

2.9.1 Windows字符串函数 19
2.9.2 资源 22
2.9.3 确定文本是ANSI文本还是Unicode
      文本	22
2.9.4 在Unicode与ANSI之间转换字符串 23

第3章 内核对象 27

3.1 什么是内核对象 27

3.1.1 内核对象的使用计数 27
3.1.2 安全性 28

3.2 进程的内核对象句柄表 30

3.2.1 创建内核对象 30
3.2.2 关闭内核对象 32

3.3 跨越进程边界共享内核对象 32

3.3.1 对象句柄的继承性 32
3.3.2 改变句柄的标志 35
3.3.3 命名对象 36
3.3.4 终端服务器的名字空间 39
3.3.5 复制对象句柄 39

第二部分 编程的具体方法

第4章 进程 45

4.1 编写第一个Windows应用程序 46

4.1.1 进程的实例句柄 49
4.1.2 进程的前一个实例句柄 50
4.1.3 进程的命令行 50
4.1.4 进程的环境变量 51
4.1.5 进程的亲缘性 54
4.1.6 进程的错误模式 54
4.1.7 进程的当前驱动器和目录 54
4.1.8 进程的当前目录 55
4.1.9 系统版本 56

4.2 CreateProcess函数 58

4.2.1 pszApplicationName和
       pszCommandLine	59
4.2.2 psa Process、psa Thread和
       binherit Handles	60
4.2.3 fdwCreate 62
4.2.4 pvEnvironment 64
4.2.5 pszCurDir 64
4.2.6 psiStartInfo 64
4.2.7 ppiProcInfo 67

4.3 终止进程的运行 69

4.3.1 主线程的进入点函数返回 69
4.3.2 ExitProcess函数 69
4.3.3 TerminateProcess函数 70
4.3.4 进程终止运行时出现的情况 71

4.4 子进程 72

4.5 枚举系统中运行的进程 73

第5章 作业 91

5.1 对作业进程的限制 93

5.2 将进程放入作业 99

5.3 终止作业中所有进程的运行 99

5.4 查询作业统计信息 100

5.5 作业通知信息 103

5.6 JobLab示例应用程序 104

第6章 线程的基础知识 121

6.1 何时创建线程 121

6.2 何时不能创建线程 122

6.3 编写第一个线程函数 123

6.4 CreateThread函数 124

6.4.1 psa 124
6.4.2 cbStack 124
6.4.3 pfnStartAddr和pvParam 125
6.4.4 fdwCreate 126
6.4.5 pdwThreadID 126

6.5 终止线程的运行 127

6.5.1 线程函数返回 127
6.5.2 ExitThread函数 127
6.5.3 TerminateThread函数 127
6.5.4 在进程终止运行时撤消线程 128
6.5.5 线程终止运行时发生的操作 128

6.6 线程的一些性质 129

6.7 C/C++运行期库的考虑 131

6.7.1 Oops—错误地调用了Create Thread 138
6.7.2 不应该调用的C/C++运行期库函数 138

6.8 对自己的ID概念应该有所了解 139

第7章 线程的调度、优先级和亲缘性 142

7.1 暂停和恢复线程的运行 143

7.2 暂停和恢复进程的运行 144

7.3 睡眠方式 145

7.4 转换到另一个线程 145

7.5 线程的运行时间 146

7.6 运用环境结构 148

7.7 线程的优先级 152

7.8 对优先级的抽象说明 153

7.9 程序的优先级 156

7.9.1 动态提高线程的优先级等级 158
7.9.2 为前台进程调整调度程序 159
7.9.3 Scheduling Lab示例应用程序 160
7.10 亲缘性 167

第8章 用户方式中线程的同步 172

8.1 原子访问:互锁的函数家族 172

8.2 高速缓存行 177

8.3 高级线程同步 178

8.4 关键代码段 180

8.4.1 关键代码段准确的描述 182
8.4.2 关键代码段与循环锁 185
8.4.3 关键代码段与错误处理 185
8.4.4 非常有用的提示和技巧 186

第9章 线程与内核对象的同步 190

9.1 等待函数 191

9.2 成功等待的副作用 194

9.3 事件内核对象 195

9.4 等待定时器内核对象 204

9.4.1 让等待定时器给APC项排队 207
9.4.2 定时器的松散特性 209

9.5 信标内核对象 210

9.6 互斥对象内核对象 211

9.6.1 释放问题 213
9.6.2 互斥对象与关键代码段的比较 214
9.6.3 Queue示例应用程序 214

9.7 线程同步对象速查表 223

9.8 其他的线程同步函数 224

9.8.1 异步设备I/O 224
9.8.2 WaitForInputIdle 224
9.8.3 MsgWaitForMultipleObjects (Ex) 225
9.8.4 WaitForDebugEvent 225
9.8.5 SingleObjectAndWait 226

第10章 线程同步工具包 228

10.1 实现关键代码段:Optex 228

10.2 创建线程安全的数据类型和反信标 239

10.3 单个写入程序/多个阅读程序的保护 251

10.4 实现一个WaitForMultipleExpressions

   函数	259

第11章 线程池的使用 274

11.1 方案1:异步调用函数 275

11.2 方案2:按规定的时间间隔调用函数 277

11.3 方案3:当单个内核对象变为已通知状态

       时调用函数	283

11.4 方案4:当异步I/O请求完成运行时调用

      函数	285

第12章 纤程 287

12.1 纤程的操作 287

12.2 Counter示例应用程序 289

第三部分 内 存 管 理

第13章 Windows的内存结构 299

13.1 进程的虚拟地址空间 299

13.2 虚拟地址空间如何分区 300

13.2.1 NuLL 指针分配的分区—适用于
         Windows 2000和Windows 98	300
13.2.2 MS-DOS/16位Windows 应用程序兼容
         分区—仅适用于Windows 98	301
13.2.3 用户方式分区—适用于Windows 2000
         和Windows 98	301
13.2.4 64 KB禁止进入的分区—仅适用
         于Windows 2000	302
13.2.5 共享的MMF分区—仅适用于
         Windows 98	303
13.2.6 内核方式分区—适用于Windows
         2000和Windows 98	303

13.3 地址空间中的区域 303

13.4 提交地址空间区域中的物理存储器 304

13.5 物理存储器与页文件 304

13.6 保护属性 307

13.6.1 Copy-On-Write 访问 308
13.6.2 特殊的访问保护属性的标志 309

13.7 综合使用所有的元素 309

13.7.1 区域的内部情况 312
13.7.2 与Windows 98地址空间的差别 315

13.8 数据对齐的重要性 319

第14章 虚拟内存 323

14.1 系统信息 323

14.2 虚拟内存的状态 330

14.3 确定地址空间的状态 336

14.3.1 VMQuery函数 337
14.3.2 虚拟内存表示例应用程序 343

第15章 在应用程序中使用虚拟内存 354

15.1 在地址空间中保留一个区域 354

15.2 在保留区域中的提交存储器 355

15.3 同时进行区域的保留和内存的提交 356

15.4 何时提交物理存储器 357

15.5 回收虚拟内存和释放地址空间区域 358

15.5.1 何时回收物理存储器 359
15.5.2 虚拟内存分配的示例应用程序 360

15.6 改变保护属性 368

15.7 清除物理存储器的内容 369

15.8 地址窗口扩展—适用于

         Windows 2000	372

第16章 线程的堆栈 385

16.1 Windows 98下的线程堆栈 387

16.2 C/C++运行期库的堆栈检查函数 389

16.3 Summation示例应用程序 390

第17章 内存映射文件 397

17.1 内存映射的可执行文件和DLL

       文件	397
17.1.1 可执行文件或DLL的多个实例
         不能共享静态数据	398
17.1.2 在可执行文件或DLL的多个实
         例之间共享静态数据	400
17.1.3 AppInst示例应用程序 404

17.2 内存映射数据文件 409

17.2.1 方法 1:一个文件,一个缓存 409
17.2.2 方法 2:两个文件,一个缓存 409
17.2.3 方法 3:一个文件,两个缓存 410
17.2.4 方法 4:一个文件,零缓存 410

17.3 使用内存映射文件 410

17.3.1 步骤 1:创建或打开文件内核
         对象	411
17.3.2 步骤 2:创建一个文件映射内核
         对象	412
17.3.3 步骤 3:将文件数据映射到进程
           的地址空间	414
17.3.4 步骤4:从进程的地址空间中撤消
         文件数据的映像	416
17.3.5 步骤 5和步骤 6:关闭文件映射对象
         和文件对象	417
17.3.6 文件倒序示例应用程序 418

17.4 使用内存映射文件来处理大文件 426

17.5 内存映射文件与数据视图的相关性 427

17.6 设定内存映射文件的基地址 428

17.7 实现内存映射文件的具体方法 429

17.8 使用内存映射文件在进程之间共享

   数据	431

17.9 页文件支持的内存映射文件 431

17.10 稀疏提交的内存映射文件 438

第18章 堆栈 451

18.1 进程的默认堆栈 451

18.2 为什么要创建辅助堆栈 452

18.2.1 保护组件 452
18.2.2 更有效的内存管理 453
18.2.3 进行本地访问 453
18.2.4 减少线程同步的开销 453
18.2.5 迅速释放堆栈 453

18.3 如何创建辅助堆栈 454

18.3.1 从堆栈中分配内存块 455
18.3.2 改变内存块的大小 456
18.3.3 了解内存块的大小 456
18.3.4 释放内存块 457
18.3.5 撤消堆栈 457
18.3.6 用C++程序来使用堆栈 457

18.4 其他堆栈函数 460

第四部分 动态链接库

第19章 DLL基础 463

19.1 DLL与进程的地址空间 464

19.2 DLL的总体运行情况 465

19.3 创建DLL模块 467

19.3.1 输出的真正含义是什么 469
19.3.2 创建用于非Visual C++工具的DLL 471

19.4 创建可执行模块 472

19.5 运行可执行模块 474

第20章 DLL的高级操作技术 477

20.1 DLL模块的显式加载和

      符号链接	477
20.1.1 显式加载DLL模块 478
20.1.2 显式卸载DLL模块 479
20.1.3 显式链接到一个输出符号 480

20.2 DLL的进入点函数 481

20.2.1 DLL_PROCESS_ATTACH通知 482
20.2.2 DLL_PROCESS_DETACH通知 483
20.2.3 DLL_THREAD_ATTACH通知 485
20.2.4 DLL_THREAD_DETACH通知 485
20.2.5 顺序调用DllMain 486
20.2.6 DllMain与C/C++运行期库 488

20.3 延迟加载DLL 489

20.4 函数转发器 499

20.5 已知的DLL 499

20.6 DLL转移 500

20.7 改变模块的位置 501

20.8 绑定模块 506

第21章 线程本地存储器 509

21.1 动态TLS 509

21.2 静态TLS 513

第22章 插入DLL和挂接API 515

22.1 插入DLL:一个例子 515

22.2 使用注册表来插入DLL 517

22.3 使用Windows挂钩来插入DLL 518

22.4 使用远程线程来插入DLL 531

22.4.1 Inject Library 示例应用程序 534
22.4.2 Image Walk DLL 541

22.5 使用特洛伊DLL来插入DLL 544

22.6 将DLL作为调试程序来插入 544

22.7 用Windows 98上的内存映射文件

      插入代码	544

22.8 用CreateProcess插入代码 544

22.9 挂接API的一个示例 545

22.9.1 通过改写代码来挂接API 546
22.9.2 通过操作模块的输入节来挂接API 546
22.9.3 LastMsgBoxInfo示例应用程序 549

第五部分 结构化异常处理

第23章 结束处理程序 565

23.1 通过例子理解结束处理程序 566

23.2 Funcenstein1 566

23.3 Funcenstein2 566

23.4 Funcenstein3 568

23.5 Funcfurter1 568

23.6 突击测验:FuncaDoodleDoo 569

23.7 Funcenstein4 570

23.8 Funcarama1 571

23.9 Funcarama2 572

23.10 Funcarama3 572

23.11 Funcarama4:最终的边界 573

23.12 关于finally块的说明 574

23.13 Funcfurter2 575

23.14 SEH结束处理示例程序 576

第24章 异常处理程序和软件异常 578

24.1 通过例子理解异常过滤器和异常处理

   程序	578
24.1.1 Funcmeister1 578
24.1.2 Funcmeister2 579

24.2 EXCEPTION_EXECUTE_HANDLER 580

24.2.1 一些有用的例子 581
24.2.2 全局展开 583
24.2.3 暂停全局展开 585

24.3 EXCEPTION_CONTINUE_

      EXECUTION	586

24.4 EXCEPTION_CONTINUE_

      SEARCH	588

24.5 Get Exception Code 589

24.6 Get Exception Information 592

24.7 软件异常 595

第25章 未处理异常和C++异常 598

25.1 即时调试 600

25.2 关闭异常消息框 601

25.2.1 强制进程终止运行 601
25.2.2 包装一个线程函数 601
25.2.3 包装所有的线程函数 601
25.2.4 自动调用调试程序 602

25.3 程序员自己调用UnhandledException

   Filter	602

25.4 UnhandledExceptionFilter函数的一些

   细节	603

25.5 异常与调试程序 604

25.6 C++异常与结构性异常的对比 618

第六部分 窗 口

第26章 窗口消息 623

26.1 线程的消息队列 623

26.2 将消息发送到线程的消息队列中 625

26.3 向窗口发送消息 626

26.4 唤醒一个线程 630

26.4.1 队列状态标志 630
26.4.2 从线程的队列中提取消息的
         算法	631
26.4.3 利用内核对象或队列状态标
         志唤醒线程	634

26.5 通过消息发送数据 636

26.6 Windows如何处理ANSI/Unicode

   字符和字符串	642

第27章 硬件输入模型和局部输入状态 645

27.1 原始输入线程 645

27.2 局部输入状态 646

27.2.1 键盘输入与焦点 647
27.2.2 鼠标光标管理 649

27.3 将虚拟输入队列同局部输入状态挂接

   在一起	651
27.3.1 LISLab 示例程序 652
27.3.2 LISWatch 示例程序 666

第七部分 附 录

附录A 建立环境 675

附录B 消息分流器、子控件宏和API宏 686


总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读【时空+大模型】ST-LLM(MDM2024)

论文阅读【时空大模型】ST-LLM(MDM2024) 论文链接:Spatial-Temporal Large Language Model for Traffic Prediction 代码仓库:https://github.com/ChenxiLiu-HNU/ST-LLM 发表于MDM2024(Mobile Data Management&#xf…

ArrayList----源码分析

源码中的简介: List接口的可调整数组实现。实现所有可选列表操作,并允许所有元素,包括null。除了实现List接口之外,这个类还提供了一些方法来操作内部用于存储列表的数组的大小。(这个类大致相当于Vector,只是它是不同…

TC软件许可优化解决方案

TC功能说明 Teamcenter 软件是西门子面向全球范围开发的数字化全生命周期管理(PLM)系统,将人员、产品、流程、知识有机联系在一起,以帮助企业实现数字化协同、数字化赋能、 数字化转型,从而推动企业产品创新与效率提升…

Delphi 里防止程序多次运行

Delphi 里防止程序多次运行 在dpr里加入以下红色部分代码 program Main; uses Vcl.Forms, Windows, SysUtils, uMain in uMain.pas {MainForm}; {$R *.res} Var hMutex:HWND; Ret:Integer; begin Application.Initialize; Application.MainFormOnTaskbar : T…

Java链表LinkedList经典题目

一.LinkedList的方法 首先先看一下链表的方法: 方法解释boolean add(E e)尾插void add(int index, E element)将 e 插入到 index 位置boolean addAll(Collection c)尾插 c 中的元素E remove(int index)删除 index 位置元素boolean remove(Object o)删除遇到的第一…

【EIScopus稳检索-高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024)

大会官网:www.icbdss.org 大会时间:2024年8月16-18日 大会地点:中国-上海 接受/拒稿通知:投稿后1-2周内 收录检索:EI,Scopus *所有参会者现场均可获取参会证明,会议通知(邀请函)&…

2022 RoboCom省赛题目解析

题目解析&#xff1a;这就是一题很简单的模拟&#xff0c;直接上代码&#xff1b; #include<iostream> using namespace std; const int N 10010; int arr[N]; int main() {int n , m;cin >> n >> m;int sum 0;int res 0;for(int i 0; i < n;i ) cin…

系统服务综合作业01

题目&#xff1a; 现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 no…

力扣第228题“汇总区间”

在本篇文章中&#xff0c;我们将详细解读力扣第228题“汇总区间”。通过学习本篇文章&#xff0c;读者将掌握如何遍历和汇总区间&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力扣第228题“汇总区间”描…

程序使用多进程,打包.exe后,程序陷入死循环

最近写了一个深度学习程序&#xff0c;用cxfreezee打包exe后&#xff0c;在本地运行突然出现死循环&#xff0c;明明在pycharm运行一切正常。 排查了问题&#xff0c;怀疑是多进程的原因&#xff0c;解决办法&#xff1a; 在你的主程序前添加一行代码&#xff1a; if __name_…

Pandas数学函数大揭秘:让数据处理变得如此简单高效,轻松玩转数据分析新纪元!

1.导包 # 导包 import numpy as np import pandas as pd2.聚合函数 df pd.DataFrame(datanp.random.randint(0,100,size(5,3))) df01203550281552376231419335895434679917 # 列非空元素的数量 df.count()0 5 1 5 2 5 dtype: int64# 行非空元素的数量 df.count(ax…

搜索引擎算法工程师,在query理解方面,都有哪些方面的工作

一、什么是query理解&#xff1f; 通俗来讲&#xff0c;就是query整形。又可以理解为是一个转接头&#xff0c;把用户送来过来的奇奇怪怪的query&#xff08;或者说是在搜索引擎看来是奇奇怪怪的query&#xff09;转换为搜索引擎最想看到的query的。 在LLM当前能力的帮助下&a…

多输入多输出 | Matlab实现Transformer多输入多输出预测

多输入多输出 | Matlab实现Transformer多输入多输出预测 目录 多输入多输出 | Matlab实现Transformer多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现Transformer多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.da…

二分查找算法——部分OJ题详解

目录 关于二分查找算法 部分OJ题详解 704.二分查找 一&#xff0c;分析题目 二&#xff0c;细节处理 三&#xff0c;题目代码 四&#xff0c;*总结朴素模板 *34.在排序数组中查找元素的第一个和最后一个位置 一&#xff0c;查找左端点 二&#xff0c;处理左端点细…

什么是Stream流

文章目录 一、创建流1.1 流的类型1.2 创建 Stream 的常见操作 二、 中间操作2.1 流的映射2.2 流的过滤2.3 其他中间操作 三、 终端操作3.1 reduce() 的使用方法3.2 *short-circuiting* 方法3.3 其他的终端操作 参考资料 一、创建流 1.1 流的类型 在 Java 8 中, 集合接口有两个…

Socks5代理为何比HTTP代理快?

在网络世界中&#xff0c;代理服务器扮演着重要的角色&#xff0c;它们能够帮助我们访问被限制的网站、提高网络安全性以及优化网络性能。其中&#xff0c;Socks5代理和HTTP代理是两种常见的代理类型。然而&#xff0c;很多用户发现&#xff0c;相较于HTTP代理&#xff0c;Sock…

awk和xargs指令

ps -ef|grep "pytest"|awk {print $2}|xargs kill-9解释&#xff1a; ps -ef|grep “pytest”&#xff1a;表示找到pytest进程awk ‘{print $2}’&#xff1a;表示将第二个域打印出来&#xff0c;这里显示的就是进程号xargs kill-9&#xff1a;表示将前面的输出结果…

【两大3D转换SDK对比】HOOPS Exchange VS. CAD Exchanger

在现代工业和工程设计领域&#xff0c;CAD数据转换工具是确保不同软件系统间数据互通的关键环节。HOOPS Exchange和CAD Exchanger是两款备受关注的工具&#xff0c;它们在功能、支持格式、性能和应用场景等方面有着显著差异。 本文将从背景、支持格式、功能和性能、应用场景等…

MySQL 条件函数/加密函数/转换函数

条件函数 IF(): 如果条件为真&#xff0c;返回一个值&#xff0c;否则返回另一个值。 -- 示例&#xff1a;根据员工的薪水返回薪水等级 SELECT name, salary, IF(salary < 3000, Low, IF(salary BETWEEN 3000 AND 7000, Medium, High)) AS salary_level FROM employ…

嵌入式ARM控制器在AGV里的应用

随着ARM技术以及芯片加工工艺的迅猛发展&#xff0c; ARM工业计算机得到了越来越广泛的应用&#xff0c;尤其在工业智慧城市、智能设备以及工业自动化控制等领域。本文将为大家详细介绍ARM控制器在AGV控制系统中的应用&#xff0c;来供大家学习和参考&#xff0c;欢迎大家一起来…