拍摄指定进程以及这些进程使用的堆,模块和线程的快照函数:
HANDLE CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
CreateToolhelp32Snapshot() MSDN
检索有关系统快照中遇到的第一个进程的信息
BOOL Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
检索有关系统快照中记录的下一个进程的信息
BOOL Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
关闭打开的对象句柄
BOOL CloseHandle(
HANDLE hObject
);
系统进程快照
#include<iostream>
#include<Windows.h>
#include<TlHelp32.h> // 系统进程函数头文件
using namespace std;
int main(int argc, char* argv[])
{
// 拍摄指定进程以及这些进程使用的堆,模块和线程的快照,返回操作句柄
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// 如果句柄值 等于 INVALID_HANDLE_VALUE 则该句柄是错误的
if (hSnapshot == INVALID_HANDLE_VALUE)
{
return 0;
}
// 描述在拍摄快照时系统地址空间中驻留的进程列表中的结构体
PROCESSENTRY32 process_entry;
// 在使用这个结构体之前,需要对 dwSize成员进行赋值,表明结构体大小。
process_entry.dwSize = sizeof(PROCESSENTRY32);
// 通过使用Process32First()函数,获取到第一个进程信息
if (!Process32First(hSnapshot, &process_entry))
{
return 0;
}
// 打印进程 ID 和 进程名称
cout << process_entry.th32ProcessID << " " << process_entry.szExeFile << endl;
// 使用Process32Next()函数,进行进程枚举
while(Process32Next(hSnapshot, &process_entry))
{
// 打印进程 ID 和 进程名称
cout << process_entry.th32ProcessID << " " << process_entry.szExeFile << endl;
}
// 关闭句柄
CloseHandle(hSnapshot);
}
当前进程模块信息
#include<iostream>
#include<Windows.h>
#include<TlHelp32.h>
using namespace std;
int main(int argc, char* argv[])
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
if (hSnapshot == INVALID_HANDLE_VALUE)
{
return 0;
}
MODULEENTRY32 module_entry;
module_entry.dwSize = sizeof(MODULEENTRY32);
if (!Module32First(hSnapshot, &module_entry))
{
return 0;
}
printf("%p %s\n", module_entry.modBaseAddr, module_entry.szModule);
while(Module32Next(hSnapshot, &module_entry))
{
printf("%p %s\n", module_entry.modBaseAddr, module_entry.szModule);
}
CloseHandle(hSnapshot);
}
文章时间2019年12月17日10:27:11