本文主要是介绍PSAPI—Enumerate Process,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
PSAPI: 枚举系统Process
PSAPI提供了一系列函数来查看系统中的各种信息,包括Process,Modules,Device Driver等等,MSDN上介绍的很详细。
今天就记录一下使用PSAPI来枚举系统中的所有Process。
主要使用的函数就这几个:
EnumProcess(),OpenProcess(),CloseHandle(),GetModuleBaseName()和EnumProcessModules()。
1.使用EnumProcess()取得系统中的所有Process ID
如MSDN上所言,由于很难预测系统当前的Process个数,因此推荐使用一个较大的数组;
2.使用OpenProcess()取得Process Handle
需要对进程具有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限,对于有些系统进程可能会失败,比如System Idle Process
3.使用EnumProcessModules()取得可执行程序HMODULE句柄
取得Handle后,就可以使用EnumProcessModules()取得可执行程序HMODULE句柄了,这个函数可以返回Process载入的所有Module,这里传入大小为1的数组即可,它总是代表了可执行程序的句柄。
4.使用GetModuleBaseName()获得Process名字
取得Process的可执行程序名字,不包含路径;
5.CloseHandle()关闭进程句柄
这一步不要忘了。
最后贴下示例程序代码:
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
int main()
{
DWORD vecProcessID[2048]; // sufficient most of time
DWORD cbNeeded, dwSize;
dwSize = sizeof(vecProcessID);
// if cbNeeded >= sizeof(vecProcessID) try again with a larger array
if(EnumProcesses(vecProcessID, dwSize, &cbNeeded)){
HANDLE hProcess;
HMODULE hMod; // we only need the first module handle here
dwSize = cbNeeded/sizeof(vecProcessID[0]);
for(DWORD i = 0; i < dwSize; i++){
char name[MAX_PATH] = "<Unknown>";
hProcess = OpenProcess(
PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
FALSE, vecProcessID[i]);
if(hProcess != NULL){
if(EnumProcessModules(hProcess, &hMod, sizeof(hMod),
&cbNeeded)){
GetModuleBaseName(hProcess, hMod, name, sizeof(name)-1);
}
else{
printf("EnumProcessModules[%u] Error:%u/n",
vecProcessID[i], GetLastError());
}
CloseHandle(hProcess);
}
printf("%u/t%s/n", vecProcessID[i], name);
}
}
return 0;
}
这篇关于PSAPI—Enumerate Process的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!