天天看點

周遊程序、線程、DLL子產品、視窗清單

周遊程序

// 初始化Process清單
void InitProcessList()
{

    // 建立程序快照
    HANDLE hProcessSnap = ;
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
    {
        OutputDebugString(L"建立程序快照失敗");
        return;
    }
    // 建立結構體用來儲存程序資訊
    PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)};

    // 擷取第一個程序
    Process32First(hProcessSnap, &process);
    do
    {
        // 使用OpenProcess時必須保證本程式是管理者身份運作,并且擁有seDebug權限
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process.th32ProcessID);

        if (hProcess == INVALID_HANDLE_VALUE)
        {
            OutputDebugString(L"擷取程序詳細資訊失敗,");
        }

        BOOL Is32 = FALSE;
        IsWow64Process(hProcess, &Is32);

        CString szTemp; // 格式化資訊

        // 程序名
        process.szExeFile;

        // PID
        szTemp.Format(L"%d", process.th32ProcessID);

        // 運作平台
        szTemp.Format(L"%d位程式", Is32 ? : );

        // 運作平台
        szTemp.Format(L"%d", process.th32ParentProcessID);

        // 程序路徑
        DWORD dwSize = MAX_PATH;
        WCHAR szName[MAX_PATH] = {};
        BOOL bRet= QueryFullProcessImageName(hProcess, , szName, &dwSize);
    } while (Process32Next(hProcessSnap,&process));
}
           

周遊線程

// 初始化Thread清單
void InitThreadList(DWORD PID)
{

    // 建立線程快照
    HANDLE hThreadSnap = ;
    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, );
    if (hThreadSnap == INVALID_HANDLE_VALUE) return;

    // 用來儲存線程資訊
    THREADENTRY32 stcTe32 = { sizeof(THREADENTRY32) };

    // 擷取第一個線程
    Thread32First(hThreadSnap, &stcTe32);

    CString szTemp;
    do
    {
        // 篩選指定程序下的線程,插入到線程清單控件中
        if (stcTe32.th32OwnerProcessID == PID)
        {
            // 目前線程ID
            szTemp.Format(L"%d", stcTe32.th32ThreadID);

            // 所屬程序ID
            szTemp.Format(L"%d", stcTe32.th32OwnerProcessID);

            // 線程優先級
            szTemp.Format(L"%d", stcTe32.tpBasePri);

        }
    } while (Thread32Next(hThreadSnap, &stcTe32));

}
           

周遊DLL子產品

// 初始化DLL清單
void InitModuleList(DWORD PID)
{

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID);
    if (hProcess == INVALID_HANDLE_VALUE || !hProcess)return;

    DWORD dwBuffSize = ;
    BOOL bRet = EnumProcessModulesEx(hProcess, NULL, , &dwBuffSize, LIST_MODULES_ALL);
    HMODULE * pModuleHandlerArr = (HMODULE*) new char[dwBuffSize];

    bRet = EnumProcessModulesEx(hProcess, pModuleHandlerArr, dwBuffSize, &dwBuffSize, LIST_MODULES_ALL);

    // 子產品名稱
    TCHAR szModuleName[MAX_PATH];

    // 儲存子產品資訊
    MODULEINFO stcModuleInfo = {  };

    // 周遊子產品清單
    int nCount = dwBuffSize / sizeof(HMODULE);
    for (int i = ; i < nCount; ++i)
    {

        // 根據程序句柄和子產品句柄,擷取子產品資訊
        GetModuleInformation(hProcess, pModuleHandlerArr[i], &stcModuleInfo, sizeof(stcModuleInfo));

        // 根據程序句柄和子產品句柄,擷取子產品的路徑(包括子產品名)
        GetModuleFileNameEx(hProcess, pModuleHandlerArr[i], szModuleName, MAX_PATH);

        // 基址
        CString szTemp;
        szTemp.Format(L"%08X", stcModuleInfo.lpBaseOfDll);

        // 入口點
        szTemp.Format(L"%08X", stcModuleInfo.EntryPoint);

        // 記憶體大小
        szTemp.Format(L"%d", stcModuleInfo.SizeOfImage);

        // 子產品路徑
        szModuleName;

    }

    // 釋放數組
    delete[] pModuleHandlerArr;
    pModuleHandlerArr = nullptr;
}
           

周遊視窗清單

// 初始化視窗清單
void InitWindowList()
{
    EnumWindows(&CProcessManage::EnumWindowsProc, NULL);
}

// 視窗函數回調
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{

    static int nCount = ;

    // 擷取視窗名
    WCHAR szWindowName[MAXBYTE]={}, szClassName[MAXBYTE]={};

    ::GetWindowText(hwnd,szWindowName, MAXBYTE);

    // 擷取視窗類名
    ::GetClassName(hwnd, szClassName,MAXBYTE);

    // 判斷視窗是否隐藏
    BOOL bIsShow = ::IsWindowVisible(hwnd);

    CString szTemp = szWindowName;
    if (bIsShow && !szTemp.IsEmpty())
    {
        // 視窗名稱
        szWindowName;

        // 類名
        szClassName;
    }

    return TRUE;
}