用word处理了一下:17页 ,太长了。
本次做的有点仓促,希望下次 做成若干个专题 (基础 ,线程高级(io, 同步),内存,进程共享, )
目录
第1部分必备知识
第1章错误处理
1.1 定义自己的错误代码
1.2 ErrorShow示例程序
/***********************************
getlasterror介绍了,
vs调试的方法: $err,hdr
***********************************/
第2章字符和字符串处理
2.1 字符编码
2.2 ANSI字符和Unicode字符与字符串数据类型
2.3 Windows中的Unicode函数和ANSI函数
/***********************************
2nd: strcpy_s(超过容量)没有成功 不仅仅是 “原子性”的,而且原来的内容不在了(why ?)--------
***********************************/
2.6 为何要用Unicode
//windows底层都是unicode..ascii会转换。
2.7 推荐的字符和字符串处理方式
/***********************************
2nd 大致说了 字符串标示 TCHAR, 字面值标示 _T"abc",指针标示 P**,not sizeof but _coutof (浅)...
***********************************/
2.8 Unicode与ANSI字符串转换
/***********************************
1.项目中的经验是:zcq 用wm_copy消息映射,解包的时候收到宽字符。 具体解法:qqm
***********************************/
//notepad具有此功能
第3章内核对象
3.1 何为内核对象
//我认为是所有creart* 的函数的对象而已
3.2 进程内核对象句柄表
/***********************************
基础:理解句柄从此开始
***********************************/
//closehandle并不一定会释放。
/***********************************
项目中,多次调用closehandle..引发堆错误。看来配对!!
***********************************/
3.3 跨进程边界共享内核对象
//这里的开篇请反复读-------------------
/***********************************
消息 信号 socket(1:1)....mailslot(1:n)
***********************************/
/***********************************
我现在的理解就是 creatprocess()将某个继承参数加上就是。
不解的是:既然子进程都可继承,
线程(我现在使用过的)要使用 句柄,都需要放到线程的参数里传过去,难道是作用域不同的缘故。
A: 线程共享资源。识别共同的内存地址。但是主线程的变量,子线程不传送过去,当然不识别。
ps:这里思路乱,希望大家喷之。
***********************************/
/***********************************
以下adv
***********************************/
第Ⅱ部分 工作机制
第4章进程
4.1 编写第一个Windows应用程序
//内核变量 都有句柄的索引。
/***********************************
联想到 进程的地址空间
***********************************/
/***********************************
这个会影响到 :dll的搜索目录(exe所在目录, 系统目录。。进程目录。。环境变量)
***********************************/
4.2 CreateProcess函数
//联想到 nms 日志系呕吐那个
//联想到 创建标志。。隐藏参数在此??----
4.3 终止进程
/***********************************
请再次阅读。
***********************************/
/***********************************
***********************************/
/***********************************
所有的线程退出,not only主线程
***********************************/
4.4 子进程
//类似waitpid..waitforsignleObject再次使用
/***********************************
adv
***********************************/
4.5 管理员以标准用户权限运行时
第5章作业
/***********************************
adv 比如vs 的编译系统的设计思想。。终止(cl.exe and 编译后的程序),
***********************************/
5.1 对作业中的进程施加限制
5.2 将进程放入作业中
5.3 终止作业中的所有线程查询作业统计信息
5.4 作业通知
5.6 Job Lab示例程序
第6章线程基础
6.1 何时创建线程
6.2 何时不应该创建线程
/***********************************
品
***********************************/
6.3 编写第一个线程函数
6.4 CreateThread函数
//默认,是
/***********************************
常用在此,
以前还以为线程可以从常数地址启动,到现在都没有验证成功。估计不行
如果线程可以加载按照参数地址,那么调试 MEMory leak in thread..难度减少一个数量级。
参数的封装,注意宽字符。
***********************************/
6.5 终止运行线程
/***********************************
NMS 中曾经尝试从一个异步返回的 CABACK中取得返回值。。但是证实不可能。
阻塞 与not 阻塞的矛盾。
***********************************/
/***********************************
我这里有个问题:就是到底是exit*还是 terminate*会释放掉 堆 in thread。
nms 使用terminate() 没有效果
***********************************/
/***********************************
反复阅读-------
关注线程对资源管理的影响。
***********************************/
6.6 线程内幕
/***********************************
一个图
反复阅读:
***********************************/
/***********************************
66 :后者有部分内存泄漏吗》但是使用PURIFY, vs vld发现没有?
***********************************/
6.8 了解自己的身份
/***********************************
***********************************/
第7章线程调度、优先级和关联性
7.1 线程的挂起和恢复
7.2 进程的挂起和恢复
7.3 睡眠
/***********************************
***********************************/
7.4 切换到另一个线程
7.5 在超线程CPU上切换到另一个线程
7.6 线程的执行时间
7.7 在实际上下文中谈CONTEXT结构
/***********************************
***********************************/
7.8 线程优先级
7.9 从抽象角度看优先级
7.10 优先级编程
7.11 关联性
/***********************************
在 日志的 共享缓冲区 大量使用了
在 设备列表的 操作上 大量使用了 同步操作。后详细
***********************************/
第8章 用户模式下的线程同步
8.1 原子访问:Interlocked系列函数
8.2 高速缓存行
8.3 高级线程同步需要避免使用的一种方法
8.4 关键段
8.4.1 关键段:细节
8.4.2 关键段和旋转锁
8.4.3 关键段和错误处理
8.5 Slim读/写锁
8.6 条件变量
8.6.1 Queue示例程序
8.6.2 在停止线程时的死锁问题
8.6.3 一些有用的窍门和技巧
第9章 用内核对象进行线程同步
9.1 等待函数
9.2 等待成功所引起的副作用
9.3 事件内核对象
9.4 可等待的计时器内核对象
9.4.1 让可等待的计时器添加APC调用
9.4.2 计时器的剩余问题
9.5 信号量内核对象
9.6 互斥量内核对象
9.6.1 遗弃问题
9.6.2 互斥量与关键段的比较
9.6.3 Queue示例程序
9.7 线程同步对象速查表
9.8 其他的线程同步函数
9.8.1 异步设备I/O
9.8.2 WaitForInputIdle函数
9.8.3 MsgWaitForMultipleObjects(Ex)函数
9.8.4 WaitForDebugEvent函数
9.8.5 SignalObjectAndWait函数
9.8.6 使用等待链遍历API来检测死锁
第10章 同步设备I/O与异步设备I/O
10.1 打开和关闭设备细看CreateFile函数
10.2 使用文件设备
10.2.1 取得文件的大小
10.2.2 设置文件指针的位置
10.2.3 设置文件尾
10.3 执行同步设备I/O
10.3.1 将数据刷新至设备
10.3.2 同步I/O的取消
10.4 异步设备I/O基础
10.4.1 OVERLAPPED结构
10.4.2 异步设备I/O的注意事项
10.4.3 取消队列中的设备I/O请求
10.5 接收I/O请求完成通知
10.5.1 触发设备内核对象
10.5.2 触发事件内核对象
10.5.3 可提醒I/O
10.5.4 I/O完成端口
/***********************************
待
***********************************/
10.5.5 模拟已完成的I/O请求
第11章 Windows线程池
/***********************************
前面说iocp 解决了线程io完成后的分发,这里解决的是批量 线程的创建和销毁。in pool
***********************************/
11.1 情形1:以异步方式调用函数
11.1.1 显式地控制工作项
11.1.2 Batch示例程序
11.2 情形2:每隔一段时间调用一个函数
11.3 情形3:在内核对象触发时调用一个函数
11.4 情形4:在异步I/O请求完成时调用一个函数
11.5 回调函数的终止操作
11.5.1 对线程池进行定制
11.5.2 得体地销毁线程池:清理组
第12章 纤程
第Ⅲ部分 内存管理
第13章 Windows内存体系结构
13.1 进程的虚拟地址空间
//
13.2 虚拟地址空间的分区
13.3 地址空间中的区域
13.4 给区域调拨物理存储器
//调补就是 virtualalloc
13.5 物理存储器和页交换文件
//系统的内存=真实+页交换文件
13.6 页面保护属性
/***********************************
这点在 线程 tls 应用
解决我对 dll的data区如何分配的问题
***********************************/
13.7 实例分析
/***********************************
图
大道理上说,windows 的进程分布空间 与linux 类之。
但是 大量的系统dll...还有各自的堆(源修养,linux max heap
图从0x40000开始到。。。 不仅仅exe..
***********************************/
13.8 数据对齐的重要性
第14章探索虚拟内存
14.1 系统信息
14.2 虚拟内存状态
14.3 NUMA机器中的内存管理
14.4 确定地址空间的状态
/***********************************
图
不仅仅是image,深入到block.....
紧接着13章的图 ,更加具体。
block的大小都是页的整数倍。
还有每个 image等都是 64k对齐的。。
联想到 今天学习到的海量内容 2层的1000阶 b+树。 能够2次io实现对1000 ^3 的字节定位。
(现在还不明白。。1000^2...)
***********************************/
第15章在应用程序中使用虚拟内存
15.1 预订地址空间区域
15.2 给区域调拨物理存储器
15.3 同时预订和调拨物理存储器
/***********************************
***********************************/
15.4 何时调拨物理存储器
/***********************************
反复阅读
***********************************/
15.5 撤销调拨物理存储器及释放区
/***********************************
反复阅读
***********************************/
/***********************************
***********************************/
15.6 改变保护属性
15.7 重置物理存储器的内容
15.8 地址窗口扩展
第16章线程栈
16.2 Summation示例程序
第17章内存映射文件
/***********************************
nms 共享使用。。待
***********************************/
17.1 映射到内存的可执行文件和DLL
17.2 映射到内存的数据文件
17.3 使用内存映射文件
17.6 File Reverse示例程序
17.7 用内存映射文件来处理大文件
17.8 内存映射文件和一致性
17.9 给内存映射文件指定基地址
17.10 内存映射文件的实现细节
第18章 堆
/***********************************
暂时无关
***********************************/
18.1 进程的默认堆
18.2 为什么要创建额外的堆
18.2.1 对组件进行保护
18.2.2 更有效的内存管理
18.2.3 使内存访问局部化
18.2.4 避免线程同步的开销
18.2.5 快速释放
18.3 如何创建额外的堆
18.3.1 从堆中分配内存块
18.3.2 调整内存块的大小
18.3.3 获得内存块的大小
18.3.4 释放内存块
18.3.5 销毁堆
18.3.6 在C++中使用堆
18.4 其他堆函数
第Ⅳ部分 动态链接库
第19章 DLL基础
19.1 DLL和进程的地址空间
19.2 纵观全局
/***********************************
图
lib....符号表----》导入表。
***********************************/
第20章 DLL高级技术
20.1 DLL模块的显式载入和符号链接
20.2 DLL的入口点函数
20.3 延迟载入DLL
20.4 函数转发器
20.5 已知的DLL
20.6 DLL重定向
/***********************************
-----------------------------作者强力推荐 todo in dll高级
***********************************/
20.7 模块的基地址重定位
20.8 模块的绑定
第21章线程局部存储区
/***********************************
看后,感觉: tls 与我们nms的内存泄漏没有关系
动态tls要显示使用
***********************************/
21.1 动态TLS
21.2 静态TLS0
第22章 DLL注入和API拦截
22.1 DLL注入的一个例子
22.2 使用注册表来注入DLL
22.3 使用Windows挂钩来注入DLL
22.4 使用远程线程来注入DLL
22.5 使用木马DLL来注入DLL
22.6 把DLL作为调试器来注入
22.7 使用CreateProcess来注入代码
22.8 API拦截的一个例子9
/***********************************
后面没有看
***********************************/
第Ⅴ部分 结构化异常处理
第23章 终止处理程序
第24章 异常处理程序与软件异常
24.1 通过实例理解异常过滤程序和异常处理程序
24.1.1 Funcmeister1函数
24.1.2 Funcmeister2函数
24.2 EXCEPTION_EXECUTE_HANDLER1
24.2.1 一些有用的例子
24.2.2 全局展开
24.2.3 停止全局展开
24.3 EXCEPTION_CONTINUE_EXECUTION
24.4 EXCEPTION_CONTINUE_SEARCH0
24.5 GetExceptionCode2
24.6 GetExceptionInformation6
24.7 软件异常
第25章 未处理异常、向量化异常处理与C++异常
25.1 UnhandledExceptionFilter函数详解
25.2 即时调试
25.3 电子表格示例程序
25.4 向量化异常和继续处理程序
25.6 异常与调试器
第26章 错误报告与应用程序恢复
26.1 Windows错误报告控制台
26.2 可编程的Windows错误报告
26.3 对进程中所有的问题报告进行定制
26.4 问题报告的创建与定制
26.4.1 创建一个自定义的问题报告
26.4.2 设置报告参数:WerReportSetParameter
26.4.3 将小型转储文件放入报告:WerReportAddDump8
26.4.4 将任意文件放入报告:WerReportAddFile9
26.4.5 修改对话框文本:WerReportSetUIOption0
26.4.6 提交错误报告:WerReportSubmit0
26.4.7 关闭问题报告:WerReportCloseHandle
26.4.8 Customized WER示例程序
26.5 应用程序的自动重启与恢复
26.5.1 应用程序的自动重启
26.5.2 对应用程序恢复的支持
第Ⅵ部分
附录A 构建环境
附录B 消息处理宏、子控件宏和API宏