From 9a931242079c7d37c92813131e1b7f27232dd4bb Mon Sep 17 00:00:00 2001 From: Asher Baker Date: Wed, 13 Sep 2017 11:23:25 +0000 Subject: [PATCH] Dont break old versions with new gamedata --- accelerator.games.txt | 41 +++++++++++++++------------ extension/extension.cpp | 63 +++++++++++++++++++++++++++-------------- 2 files changed, 65 insertions(+), 39 deletions(-) diff --git a/accelerator.games.txt b/accelerator.games.txt index daad4d2..c225fd7 100644 --- a/accelerator.games.txt +++ b/accelerator.games.txt @@ -52,24 +52,6 @@ } } } - - "csgo" - { - "Signatures" - { - "GetSpew" - { - "library" "engine" - "windows" "\x55\x8B\xEC\x51\x53\x56\x57\x8B\xFA\x8B\xD9" - "linux" "\x55\x89\xE5\x57\x56\x53\x83\xEC\x2C\x8B\x5D\x08\xE8\x2A\x2A\x2A\x2A\x89\xC2\xA1\x2A\x2A\x2A\x2A" - } - } - - "Keys" - { - "UseFastcall" "yes" - } - } "hl2mp" { @@ -94,4 +76,27 @@ } } } + + "csgo" + { + "Keys" + { + "UseFastcall" "yes" + } + + "Signatures" + { + "GetSpew" + { + "library" "engine" + "linux" "\x55\x89\xE5\x57\x56\x53\x83\xEC\x2C\x8B\x5D\x08\xE8\x2A\x2A\x2A\x2A\x89\xC2\xA1\x2A\x2A\x2A\x2A" + } + + "GetSpewFastcall" + { + "library" "engine" + "windows" "\x55\x8B\xEC\x51\x53\x56\x57\x8B\xFA\x8B\xD9" + } + } + } } diff --git a/extension/extension.cpp b/extension/extension.cpp index ceb512a..0104aff 100644 --- a/extension/extension.cpp +++ b/extension/extension.cpp @@ -46,8 +46,8 @@ IGameConfig *gameconfig; typedef void (*GetSpew_t)(char *buffer, unsigned int length); GetSpew_t GetSpew; #if defined _WINDOWS -typedef void(__fastcall *GetSpewf_t)(char *buffer, unsigned int length); -GetSpewf_t GetSpewf; +typedef void(__fastcall *GetSpewFastcall_t)(char *buffer, unsigned int length); +GetSpewFastcall_t GetSpewFastcall; #endif char spewBuffer[65536]; // Hi. @@ -135,6 +135,7 @@ static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, if (GetSpew) { GetSpew(spewBuffer, sizeof(spewBuffer)); + if (my_strlen(spewBuffer) > 0) { sys_write(extra, "-------- CONSOLE HISTORY BEGIN --------\n", 40); sys_write(extra, spewBuffer, my_strlen(spewBuffer)); @@ -290,18 +291,19 @@ static bool dumpCallback(const wchar_t* dump_path, fprintf(extra, "%s", steamInf); fprintf(extra, "\n-------- CONFIG END --------\n"); - if (GetSpew || GetSpewf) { - if (GetSpew) + if (GetSpew || GetSpewFastcall) { + if (GetSpew) { GetSpew(spewBuffer, sizeof(spewBuffer)); - else if (GetSpewf) - GetSpewf(spewBuffer, sizeof(spewBuffer)); + } else if (GetSpewFastcall) { + GetSpewFastcall(spewBuffer, sizeof(spewBuffer)); + } if (strlen(spewBuffer) > 0) { fprintf(extra, "-------- CONSOLE HISTORY BEGIN --------\n%s-------- CONSOLE HISTORY END --------\n", spewBuffer); } } - fclose(extra); + fclose(extra); return succeeded; } @@ -476,24 +478,43 @@ bool Accelerator::SDK_OnLoad(char *error, size_t maxlength, bool late) threader->MakeThread(&uploadThread); - char gameconfigError[256]; - if (!gameconfs->LoadGameConfigFile("accelerator.games", &gameconfig, gameconfigError, sizeof(gameconfigError))) { - smutils->LogMessage(myself, "WARNING: Failed to load gamedata file, console output and command line will not be included in crash reports: %s", gameconfigError); - } else if (!gameconfig->GetMemSig("GetSpew", (void **)&GetSpew)) { - smutils->LogMessage(myself, "WARNING: GetSpew not found in gamedata, console output will not be included in crash reports."); - } else if (!GetSpew) { - smutils->LogMessage(myself, "WARNING: Sigscan for GetSpew failed, console output will not be included in crash reports."); - } + do { + char gameconfigError[256]; + if (!gameconfs->LoadGameConfigFile("accelerator.games", &gameconfig, gameconfigError, sizeof(gameconfigError))) { + smutils->LogMessage(myself, "WARNING: Failed to load gamedata file, console output and command line will not be included in crash reports: %s", gameconfigError); + break; + } + + bool useFastcall = false; + #if defined _WINDOWS - const char *fastcall = gameconfig->GetKeyValue("UseFastcall"); - if (fastcall && !strcmp(fastcall, "yes")) - { - GetSpewf = (GetSpewf_t)GetSpew; - GetSpew = nullptr; - } + const char *fastcall = gameconfig->GetKeyValue("UseFastcall"); + if (fastcall && strcmp(fastcall, "yes") == 0) { + useFastcall = true; + } + + if (useFastcall && !gameconfig->GetMemSig("GetSpewFastcall", (void **)&GetSpewFastcall)) { + smutils->LogMessage(myself, "WARNING: GetSpewFastcall not found in gamedata, console output will not be included in crash reports."); + break; + } #endif + if (!useFastcall && !gameconfig->GetMemSig("GetSpew", (void **)&GetSpew)) { + smutils->LogMessage(myself, "WARNING: GetSpew not found in gamedata, console output will not be included in crash reports."); + break; + } + + if (!GetSpew +#if defined _WINDOWS + && !GetSpewFastcall +#endif + ) { + smutils->LogMessage(myself, "WARNING: Sigscan for GetSpew failed, console output will not be included in crash reports."); + break; + } + } while(false); + #if defined _LINUX google_breakpad::MinidumpDescriptor descriptor(dumpStoragePath); handler = new google_breakpad::ExceptionHandler(descriptor, NULL, dumpCallback, NULL, true, -1);