-
-
[原创]Tool Help Library学习笔记(CreateToolhelp32Snapshot)
-
发表于: 2019-12-18 21:09 6381
-
参考链接:Tool Help Library
TH32CS_SNAPHEAPLIST
TH32CS_SNAPMODULE
TH32CS_SNAPPROCESS
TH32CS_SNAPTHREAD
Tool Help Library提供的库函数可以是开发者更容易的获取当前正在执行的程序的信息。这些函数的存在是为了简化工具的创建,特别是调试器。
快照是工具帮助库的核心。快照是驻留在系统内存中的一个或者多个列表的当前状态的只读副本:进程、线程、模块和堆。
整个处理过程是使用tool help functions访问这些快照列表,而不是直接访问从操作系统访问。当进程启动和结束、线程创建和销毁、可执行模块从系统内存加载和卸载、堆创建和销毁时,系统内存中的列表(lists)将发生变化。使用快照中的信息可以防止不一致。否则,对列表的更改可能导致线程不正确的遍历或者导致访问冲突(a GP fault)。比如,如果应用程序在创建或者终止其他线程时,遍历线程列表,应用程序用于遍历线程列表的信息可能会出错。
使用CreateToolhelp32Snapshot函数可以获取系统内存快照。调用这个函数时,可以通过指定一个或者多个以下值来控制快照的内容:
TH32CS_SNAPHEAPLIST
TH32CS_SNAPMODULE
TH32CS_SNAPPROCESS
TH32CS_SNAPTHREAD
TH32CS_SNAPHEAPLIST 和
TH32CS_SNAPMODULE 值是特定于进程的。当指时,快照中包含指定这些值时,快照中包含指定进程的堆和模块列表。如果指定zero作为进程表示符,则使用当前进程。
TH32CS_SNAPTHREAD 值总是创建一个系统范围的快照,即使流程标识符被传递给CreateToolhelp32Snapshot。
要枚举所有进程的堆或模块状态,需要指定
TH32CS_SNAPALL值和当前进程表示符。然后,对快照中的每个附加进程,再次调用CreateToolhelp32Snapshot,指定其进程标识符,以及
TH32CS_SNAPHEAPLIST或
TH32CS_SNAPMODULE值。
通过使用GetLastError函数,可以检索CreateToolhelp32Snapshot的扩展错误状态代码。
当进程使用完快照时,使用CloseHandle函数销毁快照。如果不销毁快照,则进程将泄漏内存,直到它退出,此时,系统将收回内存。
备注
快照句柄(handle)的作用类似于文件句柄,并且对于可以在其中使用它的进程和线程,句柄遵循同样的规则。创建快照时可以使用
TH32CS_INHERIT值可以指定句柄是可继承的(inheritable)。
包含流程列表的快照包含关于当前正在执行的每个流程的信息。可以使用Process32First函数来检索列表中第一个进程的信息。检索列表中的第一个进程之后,可以使用Process32Next函数遍历后续条目的进程列表。Process32First和Process32Next用快照中的某个进程信息填充PROCESSENTRY32结构。
可以使用GetLastError函数检索Process32First和Process32Next的扩展错误状态代码。
可以使用Toolhelp32ReadProcessMemory函数或者VirtualQueryEx函数将特定进程中的内存读如缓冲区。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: