根据进程名获取其加载的所有可执行模块
来源:互联网 发布:怎样卸载苹果软件 编辑:程序博客网 时间: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;}
- 根据进程名获取其加载的所有可执行模块
- Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄
- 根据线程ID找出其所在的模块名
- 根据Handle获取进程名的方法
- linux 根据进程名查看其占用的端口
- linux 根据进程名查看其占用的端口
- linux 根据进程名查看其占用的端口
- linux 根据进程名查看其占用的端口
- linux 根据进程名查看其占用的端口
- 枚举进程加载的所有的模块
- 根据进程ID获取进程名的方式
- 根据计算机名获取其IP
- 根据相同的class名获取所有的节点
- 根据进程名获取窗体名
- 根据计算机名获取该计算机的所有IP
- Java根据包名获取指定接口的所有实现
- 获取其他进程加载模块的详细信息
- 根据进程名获取进程id
- C++编程学习50个经典网站 强力推荐
- QT中用Qpainter的drawText方法程序crash的可能原因
- linux ls -l 详解[转]
- alv使用标准按钮调用excel查看数据时,需要开通对vba工程对象模型的访问
- 在VC中使用switch语句时遇到“error C2360: initialization of 'k' is skipped by 'case' label”的编译错误。
- 根据进程名获取其加载的所有可执行模块
- 稻盛和夫:经营为何需要哲学
- Iptables 完成端口映射
- 二叉树后序遍历非递归算法
- 为指定联系人设定指定铃声
- MAC下使用Tomcat+eclipse+mysql+git+jdk开发网游后台程序经验总结
- linux配置双网卡绑定,以实现冗余和负载均衡
- apt-get出现E:Encountered a section with no Package: header, E:Problem with MergeList /var/lib/apt/list
- QT4.6中将QImage保存为JPG格式