| 方法 | 優點 | 缺點 |
|---|---|---|
| ToolHelp32 (CreateToolhelp32Snapshot) | 使用簡單、支持進程/模塊/線程/堆快照 | 需載入tlhelp32.h、舊版Windows 9x/NT4需單獨分發DLL |
| PSAPI (EnumProcesses) | 系統自帶、無額外依賴 | 僅獲取PID,需OpenProcess再查詢詳情 |
| WMI (Win32_Process) | 支持遠程查詢、SQL-like過濾 | 性能較差、依賴WMI服務 |
| NtQuerySystemInformation | 內核級、獲取最完整信息 | 未文檔化、版本兼容風險 |
#include
#include
#include
#include
struct ProcessInfo {
DWORD pid;
DWORD ppid;
std::wstring exeName;
std::wstring exePath;
};
std::vector EnumProcesses() {
std::vector result;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == INVALID_HANDLE_VALUE) return result;
PROCESSENTRY32W pe32 = { sizeof(pe32) };
if (Process32FirstW(hSnap, &pe32)) {
do {
ProcessInfo info;
info.pid = pe32.th32ProcessID;
info.ppid = pe32.th32ParentProcessID;
info.exeName = pe32.szExeFile;
// 獲取完整路徑(需OpenProcess權限)
HANDLE hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, info.pid);
if (hProc) {
WCHAR path[MAX_PATH];
DWORD len = MAX_PATH;
if (QueryFullProcessImageNameW(hProc, 0, path, &len))
info.exePath = path;
CloseHandle(hProc);
}
result.push_back(info);
} while (Process32NextW(hSnap, &pe32));
}
CloseHandle(hSnap);
return result;
}
利用th32ParentProcessID構建父子關係樹,適用於任務管理器式顯示。
// 切換快照標誌為TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32
MODULEENTRY32W me32 = { sizeof(me32) };
if (Module32FirstW(hSnap, &me32)) {
do {
// 檢查me32.szModule、me32.modBaseAddr、me32.modBaseSize
// 對比已知合法模塊列表發現異常DLL
} while (Module32NextW(hSnap, &me32));
}
TH32CS_SNAPTHREAD配合THREADENTRY32獲取線程入口地址、優先級、CPU時間。
CreateToolhelp32Snapshot需包含TH32CS_SNAPALL或編譯為64位程序