首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

自製進程管理器:突破任務管理器盲區,枚舉全系統進程與強制終止

     編輯:關於VC++

Windows 任務管理器無法顯示某些惡意/隱藏進程。本文基於 ToolHelp32 API 實作一個進程管理器,能枚舉系統**所有**進程(含隱藏進程),顯示 PID、執行緒數、優先權、父進程 ID 等詳細資訊,並支援強制終止指定進程(含系統保護進程需提權)。附完整 MFC 對話框專案原始碼。

核心 API 與結構

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 (映像檔名)

實作步驟

1. 建立 MFC 對話框專案

介面放置:List Control (報表模式、完整列選取)、按鈕「獲取進程」、「終止進程」。

2. 成員變數

DWORD m_ProcessIndex[50]; // 存放列表項對應 PID

3. 獲取進程列表

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);
}

4. 終止選中進程

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)**,否則失敗。
  • 系統關鍵進程 (csrss.exe, smss.exe 等) 無法終止,需捕獲錯誤碼友善提示。
  • 若需終止受保護進程,必須啟用 SeDebugPrivilege 權限 (調用 AdjustTokenPrivileges)。

運行效果

進程管理器截圖

專案 VC6 編譯通過,原始碼附件下載。可作為安全工具、系統監控模組的基礎框架擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved