本周末研究了一下如何枚举系统中的进程
一、在ring3层:
比较常见的方法是利用PROCESSENTRY32 结构体,此结构体中包含了进程的各种信息。
首先,用 CreateToolhelp32Snapshot 将当前系统的进程、线程、DLL、堆的信息保存到一个缓冲区,这就是一个系统快照。如果你只是对进程信息感兴趣,那么只要包含 TH32CS_SNAPPROCESS 标志即可。
然后,调用一次 Process32First 函数,从快照中获取第一个进程,重复调用 Process32Next,直到函数返回 FALSE 为止。这样将遍历快照中进程列表。这两个函数都带两个参数,它们分别是快照句柄和一个 PROCESSENTRY32 结构。
注意:在调用 Process32First() 之前,要将 PROCESSENTRY32 结构的 dwSize 成员设置成 sizeof(PROCESSENTRY32)。否则,Process32First()总返回错误。
下面是核心代码:
PROCESSENTRY32 pe32;
memset(&pe32,0,sizeof(PROCESSENTRY32));
…… HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(INVALID_HANDLE_VALUE==handle) { goto Exit0; }
pe32.dwSize=sizeof(PROCESSENTRY32);
bRet=Process32First(handle,&pe32);
if(!bRet) { goto Exit0; }
do {
wsprintf(buffer,"%-10s %-20d",pe32.szExeFile,pe32.th32ProcessID);
m_plist->InsertString (i++,buffer);
}while(Process32Next(handle,&pe32));
得到的结果如下图所示: