遍历 进程 遍历 线程 遍历 DLL模块 C++代码 示例

遍历进程


// 初始化Process列表

void InitProcessList()

{


    // 创建进程快照

    HANDLE hProcessSnap = 0;

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

    if (hProcessSnap == INVALID_HANDLE_VALUE)

    {

扫描二维码关注公众号,回复: 2302550 查看本文章

        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 ? 32: 64);


        // 运行平台

        szTemp.Format(L"%d", process.th32ParentProcessID);


        // 进程路径

        DWORD dwSize = MAX_PATH;

        WCHAR szName[MAX_PATH] = {};

        BOOL bRet= QueryFullProcessImageName(hProcess, 0, szName, &dwSize);

    } while (Process32Next(hProcessSnap,&process));

}

遍历线程


// 初始化Thread列表

void InitThreadList(DWORD PID)

{


    // 创建线程快照

    HANDLE hThreadSnap = 0;

    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

    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 = 0;

    BOOL bRet = EnumProcessModulesEx(hProcess, NULL, 0, &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 = { 0 };


    // 遍历模块列表

    int nCount = dwBuffSize / sizeof(HMODULE);

    for (int i = 0; i < nCount; ++i)

    {


        // 根据进程句柄和模块句柄,获取模块信息

        GetModuleInformation(hProcess, pModuleHandlerArr, &stcModuleInfo, sizeof(stcModuleInfo));


        // 根据进程句柄和模块句柄,获取模块的路径(包括模块名)

        GetModuleFileNameEx(hProcess, pModuleHandlerArr, 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 = 0;


    // 获取窗口名

    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;

}

猜你喜欢

转载自blog.csdn.net/yedehei_lt/article/details/80656818