遍历进程、线程、DLL模块、窗口列表

遍历进程

// 初始化Process列表
void InitProcessList()
{

    // 创建进程快照
    HANDLE hProcessSnap = 0;
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    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 ? 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[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 = 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;
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值