標籤:
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);}
Windows API編程----枚舉系統進程