标签:
1.该函数可以检索系统中的每个进程的标识符(进程ID)
BOOL WINAPI EnumProcesses(
_Out_ DWORD *pProcessIds, _In_ DWORD cb, _Out_ DWORD *pBytesReturned );
cb为pProcessIds指向的内存空间的字节数,(*pBytesReturned)/sizeof(DWORD)即为pProcessIds中返回的进程ID的个数。
2.检索制定进程中的每个模块的句柄
BOOL WINAPI EnumProcessModules(
_In_ HANDLE hProcess,
_Out_ HMODULE *lphModule,
_In_ DWORD cb,
_Out_ LPDWORD lpcbNeeded
);
hProcess: 进程句柄
lphModule: 接收module句柄的数组
cb: lphModule数组的字节数
lpcbNeeded: 在lphModule 数组中存储所有module句柄所需的字节数(可以先将lphModule设置为NULL,cb设置为0,来调用该函数,然后用lpcbNeeded中存储的字节数来分配lphModule的空间,然后再重新调用EnumProcessModules)
3.检索制定的Module的 base name
DWORD WINAPI GetModuleBaseName(
_In_ HANDLE hProcess,
_In_opt_ HMODULE hModule,
_Out_ LPTSTR lpBaseName,
_In_ DWORD nSize
);
hProcess: 包含 Module 的进程的句柄
hModule: 要检索的Module的句柄;如果该参数为NULL,该函数返回调用该函数的进程的名字
lpBaseName: 用来接收Module名字的buffer;buffer空间不够的话,base name就被截断
nSize:lpBaseName buffer的空间大小
返回值:调用成功,则返回copy到lpBaseName中的字符串的长度;调用失败,则返回0
示例程序:
#include<iostream>
#include<Windows.h>
#include<Psapi.h>
using namespace std;
void PrintProcessNameAndID(DWORD processID);
int main(int argc, char* argv[])
{
//获得进程标识符列表
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
return 1;
//计算返回进程标识符的个数
cProcesses = cbNeeded / sizeof(DWORD);
for (i = 0; i < cProcesses; i++)
{
PrintProcessNameAndID(aProcesses[i]);
}
system("pause");
return 0;
}
void PrintProcessNameAndID(DWORD processID)
{
char szProcessName[MAX_PATH] = "unknown";
//得到进程句柄
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
if (NULL != hProcess)
{
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
{
GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName));
}
else return;
}
else
return;
printf("%s (Process ID:%u)\n", szProcessName, processID);
CloseHandle(hProcess);
}
标签:
原文地址:http://www.cnblogs.com/dongling/p/5563405.html