进程快照

利用进程快照实现对系统所有有进程列表,特定进程的线程数、子进程数以及引用模块信息的统计:

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;

 

posted on 2015-07-22 12:04  粪斗的渣渣  阅读(1290)  评论(0编辑  收藏  举报