如何枚举系统当前进程
编译 浙江大学 王向伟
首先, 调用 CreateToolhelp32Snapshot() 获得当前运行进程的快照,这个函数返回包含正在运行进程的快照句柄。其原形是:
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);
其中:
dwFlags表示要包含在快照的内容为TH32CS_SNAPPROCESS表示在快照中包含进程列表;
th32ProcessID是进程号,为0表示当前进程。
返回值是一个句柄,如果没有进程正在运行,则返回INVALID_HANDLE_VALUE(可用GetLastError()获得),反之可用BOOL
WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);获取返回的进程
如果Process32First返回TRUE,则第一个进程的信息已经在LPPROCESSENTRY32结构中,其余进程信息可用BOOL
WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe)获得
LPPROCESSENTRY32结构的定义如下:
typedef struct tagPROCESSENTRY32 {
DWORD
dwSize; //此结构的大小
DWORD
cntUsage; //进程的引用数,如果为0,则次进程已停止
DWORD
th32ProcessID; //进程号
ULONG_PTR
th32DefaultHeapID;
DWORD
th32ModuleID; //此进程引用的模块ID
DWORD
cntThreads; //此进程创建的线程数
DWORD
th32ParentProcessID; //父进程的ID
LONG pcPriClassBase; //这个进程创建的线程的基本优先权
DWORD
dwFlags; //保留
TCHAR
szExeFile[MAX_PATH];
} PROCESSENTRY32;
typedef PROCESSENTRY32 *PPROCESSENTRY32;
最后不要忘了调用:
CloseHandle();
另用函数是:
HANDLE OpenProcess(
DWORD
dwDesiredAccess, // access flag
BOOL
bInheritHandle, //
handle inheritance option
DWORD
dwProcessId // process identifier
);
用它可打开一个进程,打开进程后,可用:
BOOL TerminateProcess(
HANDLE
hProcess, // handle to the process
UINT
uExitCode // exit code for
the process
);
来关闭进程。
笔者用上述函数做了一个类似任务管理器的进程管理器可以枚举所有进程、关闭进程。细节请参见源代码。