根据进程名获取其加载的所有可执行模块

来源:互联网 发布:怎样卸载苹果软件 编辑:程序博客网 时间:2024/05/17 18:12

下面的一个方法,用于实现这样一个功能:获取指定进程的所有加载模块,指定进程的方式是传入进程名。

 

#include <Tlhelp32.h>#include <string>#include <map>#include <set> /*** @brief        :  枚举指定进程名的所有模块全路径* @remark       :  由于进程有多实例,所以注意第三个参数 bGetAllInstances 的用法* @param[in]    :  pwszProcName 进程名* @param[out]   :  mapExePath2ModlePaths 进程EXE全路径与其所有加载模块全路径列表,*                  所有路径都会被转成小写* @param[in]    :  bGetAllInstances 指定是否将所有同名进程实例的模块都传出* @return       :  0 成功,其他为 WIN32 错误码*/typedef std::map<std::wstring, std::set<std::wstring>> MAP_EXE_2_MOD;int EnumProcessModules(    /*[in]*/ LPCWSTR pwszProcName,    /*[out]*/ MAP_EXE_2_MOD& mapExePath2ModlePaths,    /*[in]*/ BOOL bGetAllInstances /*= FALSE */    ){    if (NULL == pwszProcName)    {        return ERROR_INVALID_PARAMETER;    }    // list all processes    HANDLE hSnapProc = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    if (INVALID_HANDLE_VALUE == hSnapProc)    {        return ::GetLastError();    }    PROCESSENTRY32W pe32 = {0};    pe32.dwSize = sizeof(pe32);    BOOL bEnumProc = ::Process32FirstW(hSnapProc, &pe32);    if (!bEnumProc)    {        ::CloseHandle(hSnapProc);        return ::GetLastError();    }    do    {        if (0 != ::_wcsnicmp(pwszProcName, ::PathFindFileNameW(pe32.szExeFile), MAX_PATH))        {            continue;        }        // list modules        HANDLE hSnapMod = ::CreateToolhelp32Snapshot(            TH32CS_SNAPMODULE,            pe32.th32ProcessID            );        if (INVALID_HANDLE_VALUE == hSnapMod)        {            continue;        }        MODULEENTRY32W me32 = {0};        me32.dwSize = sizeof(me32);        BOOL bEnumMod = ::Module32FirstW(hSnapMod, &me32);        if (!bEnumMod)        {            ::CloseHandle(hSnapMod);            continue;        }        WCHAR wszExePath[MAX_PATH * 4] = {0};        ::wcsncpy(wszExePath, me32.szExePath, MAX_PATH * 4);        ::wcslwr(wszExePath);        do        {            ::wcslwr(me32.szExePath);            mapExePath2ModlePaths[wszExePath].insert(std::wstring(me32.szExePath));            ::ZeroMemory(&me32, sizeof(me32));            me32.dwSize = sizeof(me32);        } while (bEnumMod = ::Module32NextW(hSnapMod, &me32));        if (!bGetAllInstances)        {            break;        }        ::CloseHandle(hSnapMod);        ::ZeroMemory(&pe32, sizeof(pe32));        pe32.dwSize = sizeof(pe32);    } while (bEnumProc = ::Process32NextW(hSnapProc, &pe32));    ::CloseHandle(hSnapProc);    return mapExePath2ModlePaths.empty() ? ERROR_FILE_NOT_FOUND : 0;}

原创粉丝点击