自编写CE进程查看程序(转)

news/2024/7/20 14:04:02 标签: c/c++, 内存管理
在我以前所著文章《 模拟器和远程调试工具(二) 》中讲述了PB自带的远程调试工具"Remote Process Viewer"。利用这个工具可以在开发平台上查看实际平台上正运行的进程的一些信息,这些信息包括进程ID、句柄、基地址、包含的线程数量、以及每个线程的信息(如线程ID、线程优先级、访问键),另外还有整个进程加载的每个DLL的信息(DLL文件名、ID、使用计数、基地址、大小、路径等)。这个调试工具对于用模拟器调试程序,或者用串口、网卡连接实际平台调试程序来说非常有效。但是在有些情况下这个调试工具又显露出它的缺点。
  开发Windows CE下运行的软件没有必要时刻让开发平台和实际平台连接,毕竟不是所有程序、所有功能都需要单步跟踪或者实时查看内存变量状态。而要使用"Remote Process Viewer",就必须先将开发平台同实际平台连接起来,有时不但没必要,反而浪费时间。为此,我特意编写了一个类似"Remote Process Viewer"的调试工具,只不过把它的"Remote"去掉了。这个工具名为"CEInfo",在VCKBASE网站上可以找到,另外在VCKBASE出版的《VC知识库5周年精华珍藏版光盘》上也可以找到。因为我这里只有National x86 CPU,所以此软件是基于x86指令集编译的。可以运行在所有支持x86指令集的CPU上,包括PB的模拟器。下面图1是这个工具的主界面。

2005113044251157.jpg
图1 CEInfo主界面

  本篇文章主要讲述进程查看程序利用的主要API--Toolhelp。Toolhelp API位于Toolhelp.DLL中。包含13个函数和5个结构体。利用这些函数你可以编写既适合自己需要,又适合自己实际平台的调试工具。具体函数声明如下表:
 
函数功能
CreateToolhelp32Snapshot 创建系统快照,在参数2中指定快照的对象,对象包括进程、线程、DLL、堆。因为系统内这些对象的生存期可能非常短,所以形成快照后的数据不一定完全反映真实情况。函数返回快照的句柄。
CloseToolhelp32Snapshot 关闭快照对象。参数为句柄。
Heap32First函数获得指定进程中指定堆内部的第一个块的信息。信息包括块的首地址、块大小、块标志等。
Heap32Next与上一个函数结合使用,获得下一个块的信息。
Heap32ListFirst函数获得指定进程中第一个堆的信息。
Heap32ListNext与上一个函数结合使用,获得下一个堆的信息。
Module32First函数获得指定进程中第一个模块(DLL)的信息。信息包括模块的ID、引用计数、首地址、大小、路径等。
Module32Next 与上一个函数结合使用,获得下一个模块的信息。
Process32First函数获得当前系统快照对象中第一个进程信息。
Process32Next与上一个函数结合使用,获得下一个进程的信息。
Thread32First函数获得指定进程中第一个线程的信息。信息包括线程ID、优先级、创建此线程的ID、访问键。
Thread32Next与上一个函数结合使用,获得下一个线程的信息。
Toolhelp32ReadProcessMemory 函数获得指定进程中指定内存区域的数据。

注:要了解进程、线程、堆,请参见我的文章《Windows CE进程、线程、内存管理》。

  利用这些函数即可编写一个获得当前系统进程、线程、DLL、堆的信息。编写这样的程序应该不难。所以我没必要讲的更加详细。但是有几点需要注意,也是CE帮助文档中重点强调的。
  CreateToolhelp32Snapshot函数将当前系统的进程、线程、DLL、堆的信息全部复制到一个缓冲区里。所以在执行此函数后再调用其它Toolhelp函数,所得到的信息未必是准确的。比如得到的线程句柄在使用时异常,得到模块地址时模块已经释放。
  根据上面所说,我们得到的信息未必是准确的,那么就应该在代码中加入异常处理。(我编写的"CEInfo"就没有加入异常处理,因为我只查看系统信息)
关闭快照对象只能用CloseToolhelp32Snapshot,不能用CloseHandle。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126798/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-126798/


http://www.niftyadmin.cn/n/1442008.html

相关文章

Day_01 MyBatis

文章目录01-分模块构建工程(掌握)02-聚合项目之maven-parent(掌握)03-聚合项目之dao模块(掌握)04-聚合项目之service模块(掌握)05-聚合项目之controller模块(掌握)06-原始JDBC存在的问题(掌握)07-MyBatis概述(掌握)08-MyBatis入门案例(掌握)09-mapper映射文件说明(掌握)10-添加…

JavaScript高阶函数的应用

定义 高阶函数是指至少满足下列条件之一的函数: 函数可以作为参数被传递; 函数可以作为返回值输出。 JavaScript语言中的函数显然满足高阶函数的条件,在实际开发中,无论是将函数当作参数传递,还是让函数的执行结果返回…

关于“电脑一天耗几度电? ”的几个误区(转)

1、电源的最大功耗或额定功耗不等同于实际工作功功耗即标称300w的电源不一定任何时候的工作功耗为300w,要看电脑的实际配置2、电源的最大功耗和额定功耗是有区别的最大功耗>额定功耗一般情况下:最大功耗>电脑的峰值功耗>额定功耗>全速运行功…

Codeforces 601C Kleofáš and the n-thlon(dp)

题目链接&#xff1a;Codeforces 601C Kleofš and the n-thlon 解题思路 dp[i][j]表示到第i场比赛时&#xff0c;得分为j的人数期望。dp[i][j] sum { dp[i-1][j-x] ~ dp[i-1][j-x] | 1 ≤ x ≤ m && x ! rank[i] } 代码 #include <cstdio> #include <cs…

day 71-72 cookie 和session

拓展知识 request---->请求信息 属性&#xff1a; request.path            # 获取访问文件路径 request.method属性         #获取请求中使用的HTTP方式&#xff08;POST/GET&#xff09; request.body            #含所有请求体信息…

“网游大盗”通过修改注册表盗密码(转)

在今天的病毒中I-Worm/Banwarum.a“扮卧底”变种a和Trojan/PSW.GamePass.bn“网游大盗”变种bn值得关注。病毒名称&#xff1a;I-Worm/Banwarum.a中文名&#xff1a;“扮卧底”变种a病毒长度&#xff1a;可变病毒类型&#xff1a;网络蠕虫危害等级&#xff1a;★★影响平台&…

Codeforces 601D Acyclic Organic Compounds(dfs+字典树合并)

题目链接&#xff1a;Codeforces 601D Acyclic Organic Compounds 代码 #include <cstdio> #include <cstring> #include <vector> #include <algorithm>using namespace std; const int maxn 300005; const int SIGMA_SIZE 26; typedef long long…

Day_02 MyBatis

文章目录01-给SQL语句传参(掌握)02-输入映射概述(了解)03-输入映射之简单类型(掌握)04-输入映射之零散简单类型(掌握)05-输入映射之实体类型(掌握)06-输入映射之Map(掌握)07-输出映射概述(了解)08-输出映射之简单类型(掌握)09-输出映射之实体类型(掌握)10-输出映射之Map(掌握)1…