From 57c71b8ee4765501bcf2530e4b7469d213f8a2ae Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Tue, 27 Dec 2022 14:12:46 +0100 Subject: [PATCH] Log loaded module information (base and base+imageSize) --- r5dev/public/utility/crashhandler.cpp | 43 +++++++++++++++++++++++++++ r5dev/public/utility/crashhandler.h | 1 + 2 files changed, 44 insertions(+) diff --git a/r5dev/public/utility/crashhandler.cpp b/r5dev/public/utility/crashhandler.cpp index 4bb82323..177a203c 100644 --- a/r5dev/public/utility/crashhandler.cpp +++ b/r5dev/public/utility/crashhandler.cpp @@ -101,6 +101,48 @@ void CCrashHandler::FormatRegisters() m_svBuffer.append("}\n"); } +//----------------------------------------------------------------------------- +// Purpose: formats all loaded modules (verbose) +//----------------------------------------------------------------------------- +void CCrashHandler::FormatModules() +{ + m_svBuffer.append("modules:\n{\n"); + + HMODULE hModule[4096]; + HANDLE hProcess = GetCurrentProcess(); + DWORD cbNeeded; + + BOOL result = K32EnumProcessModulesEx(hProcess, hModule, sizeof(hModule), &cbNeeded, LIST_MODULES_ALL); + if (result && cbNeeded <= sizeof(hModule) && cbNeeded >> 3) + { + char szModuleName[512]; + char* pszModuleName; + MODULEINFO modInfo; + + for (int i = 0, j = cbNeeded >> 3; j; i++, j--) + { + DWORD m = GetModuleFileNameA(hModule[i], szModuleName, sizeof(szModuleName)); + if ((m - 1) > (sizeof(szModuleName) - 2)) // Too small for buffer. + { + snprintf(szModuleName, sizeof(szModuleName), "module@%p", hModule[i]); + pszModuleName = szModuleName; + } + else + { + pszModuleName = strrchr(szModuleName, '\\') + 1; + } + + K32GetModuleInformation(hProcess, hModule[i], &modInfo, sizeof(modInfo)); + + m_svBuffer.append(fmt::format("\t{:15s}: [0x{:016X}, 0x{:016X}]\n", + pszModuleName, reinterpret_cast(modInfo.lpBaseOfDll), + static_cast((reinterpret_cast(modInfo.lpBaseOfDll) + modInfo.SizeOfImage)))); + } + } + + m_svBuffer.append("}\n"); +} + //----------------------------------------------------------------------------- // Purpose: formats the system information //----------------------------------------------------------------------------- @@ -455,6 +497,7 @@ long __stdcall ExceptionFilter(EXCEPTION_POINTERS* exceptionInfo) g_CrashHandler->FormatCrash(); g_CrashHandler->FormatCallstack(); g_CrashHandler->FormatRegisters(); + g_CrashHandler->FormatModules(); g_CrashHandler->FormatSystemInfo(); g_CrashHandler->FormatBuildInfo(); diff --git a/r5dev/public/utility/crashhandler.h b/r5dev/public/utility/crashhandler.h index b9be80e8..38cb3407 100644 --- a/r5dev/public/utility/crashhandler.h +++ b/r5dev/public/utility/crashhandler.h @@ -24,6 +24,7 @@ public: void FormatCrash(); void FormatCallstack(); void FormatRegisters(); + void FormatModules(); void FormatSystemInfo(); void FormatBuildInfo();