4#pragma comment(lib,"psapi.lib")
7 size_t _enum_modules(IN HANDLE hProcess, IN OUT HMODULE hMods[], DWORD hModsMax, IN DWORD filters)
9 if (hProcess ==
nullptr) {
12 const char err_msg[] =
"Could not enumerate modules. ";
15 if (!EnumProcessModulesEx(hProcess, hMods, hModsMax, &cbNeeded, filters)) {
16 throw std::runtime_error(err_msg);
24 if (!EnumProcessModules(hProcess, hMods, hModsMax, &cbNeeded)) {
25 throw std::runtime_error(err_msg);
29 const size_t modules_count = cbNeeded /
sizeof(HMODULE);
36 if (hProcess ==
nullptr) {
39 const size_t max_count = 1024 * 3;
40 size_t capacity = 1024;
43 modules.assign(capacity,
nullptr);
45 const size_t size_in_bytes = modules.size() *
sizeof(HMODULE);
46 if (size_in_bytes > MAXDWORD) {
47 throw std::runtime_error(
"Module buffer too large.");
49 const size_t count = _enum_modules(
52 static_cast<DWORD>(size_in_bytes),
56 if (count <= modules.size()) {
57 modules.resize(count);
60 if (count > max_count) {
61 throw std::runtime_error(
"Too many modules to enumerate safely.");
size_t enum_modules(IN HANDLE hProcess, OUT std::vector< HMODULE > &hMods, IN DWORD filters)
DWORD(__stdcall *_PssCaptureSnapshot)(HANDLE ProcessHandle