From 83563c1980249fcb187b357487677ae3eaeb60a2 Mon Sep 17 00:00:00 2001 From: Diavolo Date: Sat, 24 Sep 2022 14:16:20 +0200 Subject: [PATCH] protobuf shutdown --- src/client/component/rcon.cpp | 2 -- src/client/dllmain.cpp | 51 ++++++++++++++++++++++++++++++++++- src/client/game/symbols.hpp | 2 ++ src/client/std_include.hpp | 6 +++++ 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/client/component/rcon.cpp b/src/client/component/rcon.cpp index c146ee8..736f4e0 100644 --- a/src/client/component/rcon.cpp +++ b/src/client/component/rcon.cpp @@ -8,8 +8,6 @@ #include "crypto_key.hpp" #include "key_catcher.hpp" -#include - namespace rcon { namespace { utils::cryptography::ecc::key key; diff --git a/src/client/dllmain.cpp b/src/client/dllmain.cpp index a402e4b..53271eb 100644 --- a/src/client/dllmain.cpp +++ b/src/client/dllmain.cpp @@ -1,17 +1,66 @@ #include "std_include.hpp" #include "loader/component_loader.hpp" +namespace { +LONG WINAPI exception_handler(PEXCEPTION_POINTERS exception_info) { + if (exception_info->ExceptionRecord->ExceptionCode == 0x406D1388) { + return EXCEPTION_CONTINUE_EXECUTION; + } + + if (exception_info->ExceptionRecord->ExceptionCode < 0x80000000 || + exception_info->ExceptionRecord->ExceptionCode == 0xE06D7363) { + return EXCEPTION_CONTINUE_SEARCH; + } + + MINIDUMP_EXCEPTION_INFORMATION exception_information = { + GetCurrentThreadId(), exception_info, FALSE}; + const auto type = MiniDumpIgnoreInaccessibleMemory // + | MiniDumpWithHandleData // + | MiniDumpScanMemory // + | MiniDumpWithProcessThreadData // + | MiniDumpWithFullMemoryInfo // + | MiniDumpWithThreadInfo; + + const auto file_name = + std::format("minidumps\\mw3-server-freezer_{}", game::Sys_Milliseconds()); + const auto file_handle = CreateFileA( + file_name.data(), GENERIC_WRITE | GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, CREATE_ALWAYS, + FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, nullptr); + + if (!MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), + file_handle, static_cast(type), + &exception_information, nullptr, nullptr)) { + char buf[4096]{}; + sprintf_s(buf, "An exception 0x%08X occurred at location 0x%p\n", + exception_info->ExceptionRecord->ExceptionCode, + exception_info->ExceptionRecord->ExceptionAddress); + MessageBoxA(nullptr, buf, "Fatal Error", MB_ICONERROR); + } + + CloseHandle(file_handle); + TerminateProcess(GetCurrentProcess(), + exception_info->ExceptionRecord->ExceptionCode); + + return EXCEPTION_CONTINUE_SEARCH; +} +} // namespace + BOOL APIENTRY DllMain(HMODULE /*hModule*/, DWORD ul_reason_for_call, LPVOID /*lpReserved*/ ) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { - std::srand(uint32_t(time(nullptr))); + AddVectoredExceptionHandler(0, exception_handler); + + std::srand(std::uint32_t(time(nullptr))); + component_loader::post_start(); component_loader::post_unpack(); } else if (ul_reason_for_call == DLL_PROCESS_DETACH) { component_loader::pre_destroy(); + google::protobuf::ShutdownProtobufLibrary(); } return TRUE; diff --git a/src/client/game/symbols.hpp b/src/client/game/symbols.hpp index 2032c4e..c1e00d1 100644 --- a/src/client/game/symbols.hpp +++ b/src/client/game/symbols.hpp @@ -7,6 +7,8 @@ namespace game { WEAK symbol Sys_ShowConsole{0x515CD0}; WEAK symbol Sys_CreateConsole{0x51B770}; WEAK symbol Sys_Error{0x434000}; +WEAK symbol Sys_Milliseconds{0x4BB3E0}; + WEAK symbol Conbuf_AppendText{0x4F7300}; WEAK symbol Com_Error{0x4A6660}; WEAK symbol ConcatArgs{0x539060}; diff --git a/src/client/std_include.hpp b/src/client/std_include.hpp index 28fdc6b..3b8907c 100644 --- a/src/client/std_include.hpp +++ b/src/client/std_include.hpp @@ -11,6 +11,8 @@ #include #include +#include + #include #include #include @@ -20,12 +22,16 @@ #include #include #include +#include #pragma comment(lib, "ntdll.lib") #pragma comment(lib, "ws2_32.lib") +#pragma comment(lib, "dbghelp.lib") using namespace std::literals; +#include + // clang-format off #include "game/structs.hpp" #include "game/game.hpp"