首先谈一谈取得进程快照(枚举系统当前进程)的系统底层函数。一般我们会用到3个关键的函数:CreateToolhelp32Snapshot(),Process32First()和Process32Next()。顺带介绍一个OpenProcess函数。
他们的定义分别如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //系统快照要查看的信息类型
DWORD th32ProcessID //值0表示当前进程
);
BOOL WINAPI Process32First(
HANDLE hSnapshot, //CreateToolhelp32Snapshot()创建的快照句柄
LPPROCESSENTRY32 lppe //指向进程入口结构
);
BOOL WINAPI Process32Next(
HANDLE hSnapshot, //这里参数同Process32First
LPPROCESSENTRY32 lppe //同上
);
使用方法:
首先使用CreateToolhelp32Snapshot()创建系统快照句柄(hprocess是我们声明用来保存创建的快照句柄):hProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
然后调用Process32First()获得系统快照中的第一个进程信息(Report是BOOL型作为判断系统快照中下一条进程记录):report=Process32First(hProcess,pinfo);//report是bool值
接着用一个循环调用来遍历系统中所有运行的进程:
while(report)
{
hModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pinfo->th32ProcessID);
Module32First(hModule, minfo);
GetShortPathName(minfo->szExePath,shortpath,256);
printf("%s --- %sn",pinfo->szExeFile,shortpath);
report=Process32Next(hProcess, pinfo);
}
在这个过程中我们很可能使用OpenProcess函数:
(HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);)它是根据第三个参数dwProcessId来得到HANDLE的。
相关资料:
Msdn上的实现:
下面是操作的一段代码:
代码段1:
HANDLE hProcessSnap=NULL
PROCESSENTRY32 pe={0};
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==(HANDLE)-1) return;
pe.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,&pe))
{
do
{
//pe.szExeFile 中就是进程名称
}
while(Process32Next(hProcessSnap,&pe));
代码段2:
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
BOOL GetProcessList ()
{
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == (HANDLE)-1)
return (FALSE);
// Fill in the size of the structure before using it.
pe32.dwSize = sizeof(PROCESSENTRY32);
// Walk the snapshot of the processes, and for each process,
// display information.
if (Process32First(hProcessSnap, &pe32))
{
DWORD dwPriorityClass;
BOOL bGotModule = FALSE;
MODULEENTRY32 me32 = {0};
do
{
bGotModule = GetProcessModule(pe32.th32ProcessID,
pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));
if (bGotModule)
{
HANDLE hProcess;
// Get the actual priority class.
hProcess = OpenProcess (PROCESS_ALL_ACCESS,FALSE, pe32.th32ProcessID);
dwPriorityClass = GetPriorityClass (hProcess);
CloseHandle (hProcess);
// Print the process's information.
printf( "/nPriority Class Base/t%d/n", pe32.pcPriClassBase);
printf( "PID/t/t/t%d/n", pe32.th32ProcessID);
printf( "Thread Count/t/t%d/n", pe32.cntThreads);
printf( "Module Name/t/t%s/n", me32.szModule);
printf( "Full Path/t/t%s/n/n", me32.szExePath);
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE; // could not walk the list of processes
// Do not forget to clean up the snapshot object.
CloseHandle (hProcessSnap);
return (bRet);
}