Windows API编程----枚举系统进程

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)
", szProcessName, processID);
    CloseHandle(hProcess);
}
原文地址:https://www.cnblogs.com/dongling/p/5563405.html