标签:
利用进程快照实现对系统所有有进程列表,特定进程的线程数、子进程数以及引用模块信息的统计:
1. CreateToolhelp32Snapshot:系统为所有保存在系统内存中的进程、线程以及模块等的当前状态的信息制作了一个只读副本--系统快照,用户可以通过CreateToolhelp32Snapshot获取系统的快照句柄,完成对进程当前状态的检测。第一个参数设置不同时可以分别获取特定进程的添加模块,系统的所有进程以及线程等等。
DWORD dwFlags;
DWORD th32ProcessID;
HANDLE HANDLE hSnapshot= CreateToolhelp32Snapshot(dwFlags,th32ProcessID);
2.当第一个参数设定为TH32CS_SNAPMODULE或TH32CS_SNAPMODULE32时,获取h32ProcessID进程加载的所有模块信息,TH32CS_SNAPPROCESS=0时,取当前进程;当第一个参数取其他值时,第二个参数都会被忽略。
BOOL Module32First()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
作用:从Snapshot得到第一个Module记录信息
BOOL Module32Next()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
作用:从Snapshot得到下一个Module记录信息
3.当第一个参数设定为TH32CS_SNAPPROCESS时,获取系统所有进程,第二个参数被忽略。
BOOL Process32First()函数
参数:HANDLE hSnapshot 传入的Snapshot句柄
参数:LPPROCESSENTRY32 lppe 指向PROCESSENTRY32结构的指针
作用:从Snapshot得到第一个进程记录信息
BOOL Process32Next()函数
参数:HANDLE hSnapshot 传入的Snapshot句柄
参数:LPPROCESSENTRY32 lppe 指向PROCESSENTRY32结构的指针
作用:从Snapshot得到下一个进程记录信息
4.当第一个参数设定为TH32CS_SNAPTHREAD时,获取系统所有线程。
BOOL Thread32First()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPTHREADENTRY32 lpte指向一个 THREADENTRY32结构的指针
作用:从Snapshot得到第一个Thread记录信息
BOOL Thread32Next()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPTHREADENTRY32 lpte指向一个 THREADENTRY32结构的指针
作用:从Snapshot得到下一个Thread记录信息
//获取本进程的子线程数和进程数
qint64 i64Pid=qApp->applicationPid();//include<QCoreApplication>,就可以用qApp代表本进程,获取相关的信息
int ThreadCnt=0;
int SubProcessCnt=0;
HANDLE Thread_handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (Thread_handle!= INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(PROCESSENTRY32);//使用之前要分配sizeof(PROCESSENTRY32)大小
if(Process32First(Thread_handle,&pe32))
{
do
{
if (pe32.th32ProcessID==i64Pid)
{
ThreadCnt=pe32.cntThreads;
}
if (pe32.th32ParentProcessID==i64Pid)
{
SubProcessCnt++;
}
} while (Process32Next(Thread_handle,&pe32));
}
}
CloseHandle(Thread_handle);
//获取本进程包含的模块
QMap<qint64,QString> ModulInfo;
HANDLE Thread_handle=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
if (Thread_handle!= INVALID_HANDLE_VALUE)
{
MODULEENTRY32 pme;
pme.dwSize = sizeof( MODULEENTRY32 );
if (Module32First(Thread_handle,&pme))
{
do
{
ModulInfo.insert((int)pme.modBaseAddr,QString::fromUtf16(pme.szExePath));
} while (Module32NextW(Thread_handle,&pme));
}
}
CloseHandle(Thread_handle);
Thread_handle=INVALID_HANDLE_VALUE;
标签:
原文地址:http://www.cnblogs.com/singlebutterfly/p/4665547.html