Windows 任務管理器無法顯示某些惡意/隱藏進程。本文基於 ToolHelp32 API 實作一個進程管理器,能枚舉系統**所有**進程(含隱藏進程),顯示 PID、執行緒數、優先權、父進程 ID 等詳細資訊,並支援強制終止指定進程(含系統保護進程需提權)。附完整 MFC 對話框專案原始碼。
| API | 用途 |
|---|---|
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) | 建立系統進程快照句柄 |
Process32First/Next(hSnap, &PROCESSENTRY32) | 遍歷快照中的進程項目 |
OpenProcess(PROCESS_TERMINATE, FALSE, pid) | 取得進程句柄以終止 |
TerminateProcess(hProcess, 0) | 強制結束進程 |
關鍵結構 PROCESSENTRY32:
th32ProcessID (PID)cntThreads (執行緒數)pcPriClassBase (基礎優先權)th32ParentProcessID (父進程 PID)szExeFile (映像檔名)介面放置:List Control (報表模式、完整列選取)、按鈕「獲取進程」、「終止進程」。
DWORD m_ProcessIndex[50]; // 存放列表項對應 PID
void CShowAllProcessDlg::OnGetProcess() {
m_list.DeleteAllItems();
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == INVALID_HANDLE_VALUE) return;
PROCESSENTRY32 pe = {sizeof(PROCESSENTRY32)};
if (Process32First(hSnap, &pe)) {
int n = 0;
do {
m_list.InsertItem(n, pe.szExeFile);
m_list.SetItemText(n, 1, _itoa(pe.th32ProcessID, buf, 10));
m_list.SetItemText(n, 2, _itoa(pe.cntThreads, buf, 10));
m_list.SetItemText(n, 3, _itoa(pe.pcPriClassBase, buf, 10));
m_ProcessIndex[n] = pe.th32ProcessID;
n++;
} while (Process32Next(hSnap, &pe));
}
CloseHandle(hSnap);
}
void CShowAllProcessDlg::OnStopProcess() {
int n = m_list.GetSelectionMark();
if (n == -1) return;
DWORD pid = m_ProcessIndex[n];
HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
if (hProc) {
if (TerminateProcess(hProc, 0))
AfxMessageBox(_T("進程已終止"));
else
AfxMessageBox(_T("終止失敗:權限不足或進程受保護"));
CloseHandle(hProc);
} else {
AfxMessageBox(_T("無法開啟進程"));
}
OnGetProcess(); // 刷新
}
#include "TLHELP32.H" 並連結 kernel32.lib。Process32First/Next 前,**務必設定 pe.dwSize = sizeof(PROCESSENTRY32)**,否則失敗。SeDebugPrivilege 權限 (調用 AdjustTokenPrivileges)。
專案 VC6 編譯通過,原始碼附件下載。可作為安全工具、系統監控模組的基礎框架擴展。