ToolHelp32 函数
来源:互联网 发布:xmind7 for mac破解版 编辑:程序博客网 时间:2024/06/05 21:51
ToolHelp32 库函数在 KERNEL32.dll 中,它们都是标准的 API 函数。但是 Windows NT 4.0 不提供这些函。 ToolHelp32 库中有各种各样的函数可以用来枚举系统中的进程、线程以及获取内存和模块信息。
其中枚举进程 只需用如下三个的函数:CreateToolhelp32Snapshot
使用 ToolHelp32 函数:
第一步 是用 CreateToolhelp32Snapshot
其次 是调用一次 Process32First 函数,从快照中获取进程列表,然后重复调用 Process32Next,直到函数返回 FALSE 为止。这样将遍历快照中进程列表。这两个函数都带两个参数,它们分别是快照句柄和一个PROCESSENTRY32 结构。 调用完 Process32First 或 Process32Next 之后,PROCESSENTRY32 中将包含系统中某个进程的关键信息。其中进程 ID 就存储在此结构的 th32ProcessID。此 ID 可以被传给 OpenProcess() API 以获得该进程的句柄。对应的可执行文件名及其存放路径存放在 szExeFile 结构成员中。在该结构中还可以找到其它一些有用的信息。
下面的代码是计算程序中“SMSS.EXE”进程的个数的代码:
void CEnumProcessDlg::OnEnumprocess()
{
}
#include <windows.h>
#include <tlhelp32.h> //toolhelp API 头文件
#include "stdio.h"
int main()
{
}
本篇文章主要讲述进程查看程序利用的主要API——Toolhelp。Toolhelp API位于Toolhelp.DLL中。包含13个函数和5个结构体。利用这些函数你可以编写既适合自己需要,又适合自己实际平台的调试工具。具体函数声明如下表:
函数功能
CreateToolhelp32Snapshot
CloseToolhelp32Snapshot
Heap32First
Heap32Next
Heap32ListFirst
Heap32ListNext
Module32First
Module32Next
Process32First
Process32Next
Thread32First
Thread32Next
Toolhelp32ReadProcessMem
利用这些函数即可编写一个获得当前系统进程、线程、DLL、堆的信息。但是有几点需要注意,也是CE帮助文档中重点强调的。
CreateToolhelp32Snapshot
每一个应用程序实例在运行起来后都会在当前系统下产生一个进程,大多数应用程序均拥有可视界面,用户可以通过标题栏上的关闭按钮关闭程序。但是也有为数不少的在后台运行的程序是没有可视界面的,对于这类应用程序用户只能通过CTRL+ALT+DEL热键呼出"关闭程序"对话框显示出当前系统进程列表,从中可以结束指定的任务。显然,该功能在一些系统监控类软件中还是非常必需的,其处理过程大致可以分为两步:借助系统快照实现对系统当前进程的枚举和根据枚举结果对进程进行管理。本文下面即将对此过程的实现进行介绍。 当前进程的枚举 要对当前系统所有已开启的进程进行枚举,就必须首先获得那些加载到内存的进程当前相关状态信息。在Windows操作系统下,这些进程的当前状态信息不能直接从进程本身获取,系统已为所有保存在系统内存中的进程、线程以及模块等的当前状态的信息制作了一个只读副本--系统快照,用户可以通过对系统快照的访问完成对进程当前状态的检测。在具体实现时,系统快照句柄的获取是通过Win32 API函数CreateToolhelp32Snapshot
其中,参数dwFlags:指定将要创建包含哪一类系统信息的快照句柄,本程序中只需要检索系统进程信息,因此可将其设置为TH32CS_SNAPPROCESS;
BOOL WINAPI Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);
以上两个函数分别用于获得系统快照中第一个和下一个进程的信息,并将获取得到的信息保存在指针lppe所指向的PROCESSENTRY32结构中。
函数第一个参数hSnapshot为由CreateToolhelp32Snapshot
第二个参数lppe为指向结构PROCESSENTRY32的指针,PROCESSENTRY32结构可对进程作一个较为全面的描述,其定义如下:
typedef struct tagPROCESSENTRY32
{ DWORD dwSize; // 结构大小;
// PROCESSENTRY32结构对象
// 创建快照句柄 HANDLE hSnapshot = CreateToolhelp32Snapshot
// 先搜索系统中第一个进程的信息
// 下面对系统中的所有进程进行枚举,并保存其信息
do{
// 关闭快照句柄
在得到各枚举进程的标识号后就可以实现对进程的管理了,由于被管理进程在当前进程之外,因此必须首先通过OpenProcess()函数来获取一个已经存在的进程对象的句柄,然后才可以通过该句柄对指定的进程进行管理和控制。在OpenProcess()函数的调用时把进程标识号作为参数传入,OpenProcess()函数的原型声明如下:
HANDLE OpenProcess(DWORD dwDesiredAccess, // 访问标志 BOOL bInheritHandle, // 处理继承的标志 DWORD dwProcessId // 进程标识号); 如果函数执行成功将返回由进程标识号指定的进程对象句柄。下面同样也对其给出一个简单的应用示例,在此示例中根据所获取的进程对象句柄通过TerminateProcess()函数将指定的进程终止:
// 获得此时列表框中的所选项的数据,即该项对应的进程的ID值
int index = m_ctlwndList.GetCurSel();
// 获得此时列表框中的选项,即该项对应的进程的ID值
DWORD data = m_ctlwndList.GetItemData(index);
// 利用进程的ID值,打开该进程,获得进程句柄
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE,data);
// 检测句柄的有效性,如有效则终止该进程
if (hProcess) TerminateProcess(hProcess,0);
由于需要在调用TerminateProcess()函数终止进程时确保进程句柄可有效使用,因此在前面调用OpenProcess()时,需要指定其访问标致为PROCESS_TERMINATE。
小结 本文主要对系统快照以及通过借助系统快照而对系统当前进程进行枚举、管理的实现方法做了简要介绍。在本文只讨论了包含有进程信息的系统快照,感兴趣的读者完全可以用类似的方法实现对包含有线程、堆或是摸块等信息的系统快照的应用。
- ToolHelp32 函数
- ToolHelp32 函数
- 使用 ToolHelp32 库枚举进程
- 使用 ToolHelp32 库枚举进程
- 使用 ToolHelp32 库枚举进程(转)
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- glBlendFunc()混合
- @property详解
- TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞
- Java基础知识——IO流(一)
- SSD(Solid StateDisk)和HDD(Hard Disk Driver) Simulator Research 固态硬盘和硬磁盘模拟器调研(修改)
- ToolHelp32 函数
- NSOperation的用法
- flex 循环遍历
- Tslib arm 6410 开发板的移植(带源码)
- 设计师 网址 导航
- VC 通过进程名 杀掉进程 (KillProcessFromName注释版)
- Facebook : Corona中的推测执行
- 默认浏览器设置问题
- 关于QT的内存申请和释放