diff --git a/dll/base.cpp b/dll/base.cpp index 6e01a93e..2e84c438 100644 --- a/dll/base.cpp +++ b/dll/base.cpp @@ -432,7 +432,8 @@ static int WINAPI Mine_WSAConnect( SOCKET s, const sockaddr *addr, int namelen, } } -inline bool file_exists (const std::string& name) { +inline bool file_exists (const std::string& name) +{ struct stat buffer; return (stat (name.c_str(), &buffer) == 0); } @@ -472,14 +473,11 @@ static void unredirect_crackdll() DetourTransactionCommit(); } -HMODULE crack_dll_handle; -static void load_dll() +HMODULE crack_dll_handle{}; +static void load_crack_dll() { - std::string path = get_full_program_path(); - path += "crack"; - //path += PATH_SEPARATOR; - path += DLL_NAME; - PRINT_DEBUG("Crack file %s", path.c_str()); + std::string path(get_full_program_path() + "crack" + DLL_NAME); + PRINT_DEBUG("searching for crack file '%s'", path.c_str()); if (file_exists(path)) { redirect_crackdll(); crack_dll_handle = LoadLibraryW(utf8_decode(path).c_str()); @@ -600,9 +598,11 @@ HINTERNET WINAPI Mine_WinHttpOpenRequest( #include "dll/settings_parser.h" static bool network_functions_attached = false; -BOOL WINAPI DllMain( HINSTANCE, DWORD dwReason, LPVOID ) { +BOOL WINAPI DllMain( HINSTANCE, DWORD dwReason, LPVOID ) +{ switch ( dwReason ) { case DLL_PROCESS_ATTACH: + PRINT_DEBUG("experimental DLL_PROCESS_ATTACH"); if (!settings_disable_lan_only()) { PRINT_DEBUG("Hooking lan only functions"); DetourTransactionBegin(); @@ -622,11 +622,12 @@ BOOL WINAPI DllMain( HINSTANCE, DWORD dwReason, LPVOID ) { DetourTransactionCommit(); network_functions_attached = true; } - load_dll(); + load_crack_dll(); load_dlls(); - break; + break; case DLL_PROCESS_DETACH: + PRINT_DEBUG("experimental DLL_PROCESS_DETACH"); if (network_functions_attached) { DetourTransactionBegin(); DetourUpdateThread( GetCurrentThread() ); @@ -644,15 +645,20 @@ BOOL WINAPI DllMain( HINSTANCE, DWORD dwReason, LPVOID ) { return TRUE; } + #else + void set_whitelist_ips(uint32_t *from, uint32_t *to, unsigned num_ips) { } + #endif #else + void set_whitelist_ips(uint32_t *from, uint32_t *to, unsigned num_ips) { } + #endif diff --git a/dll/dll.cpp b/dll/dll.cpp index 272e0615..2bf6c41f 100644 --- a/dll/dll.cpp +++ b/dll/dll.cpp @@ -151,9 +151,10 @@ STEAMAPI_API HSteamUser SteamAPI_GetHSteamUser() return CLIENT_HSTEAMUSER; } -STEAMAPI_API ISteamClient *g_pSteamClientGameServer; -#ifndef STEAMCLIENT_DLL -ISteamClient *g_pSteamClientGameServer; +#ifndef STEAMCLIENT_DLL // api +ISteamClient *g_pSteamClientGameServer{}; +#else // client +STEAMAPI_API ISteamClient *g_pSteamClientGameServer{}; #endif static Steam_Client *steamclient_instance; @@ -198,9 +199,9 @@ bool steamclient_has_ipv6_functions() static void *create_client_interface(const char *ver) { std::lock_guard lock(global_mutex); - if (strstr(ver, "SteamClient") == ver) { - void *steam_client; + void *steam_client = nullptr; + if (strstr(ver, "SteamClient") == ver) { if (strcmp(ver, "SteamClient007") == 0) { steam_client = (ISteamClient007 *)get_steam_client(); } else if (strcmp(ver, "SteamClient008") == 0) { @@ -233,14 +234,13 @@ static void *create_client_interface(const char *ver) steam_client = (ISteamClient *)get_steam_client(); steamclient_has_ipv6_functions_flag = true; } else { + PRINT_DEBUG("requested unknown steamclient version '%s'", ver); steam_client = (ISteamClient *)get_steam_client(); steamclient_has_ipv6_functions_flag = true; } - - return steam_client; - } else { - return NULL; } + + return steam_client; } STEAMAPI_API void * S_CALLTYPE SteamInternal_CreateInterface( const char *ver ) @@ -308,7 +308,7 @@ STEAMAPI_API ESteamAPIInitResult S_CALLTYPE SteamAPI_InitFlat( SteamErrMsg *pOut // SteamAPI_Init must be called before using any other API functions. If it fails, an // error message will be output to the debugger (or stderr) with further information. -static HSteamPipe user_steam_pipe; +static HSteamPipe user_steam_pipe = 0; STEAMAPI_API steam_bool S_CALLTYPE SteamAPI_Init() { PRINT_DEBUG_ENTRY(); @@ -369,8 +369,10 @@ STEAMAPI_API void S_CALLTYPE SteamAPI_Shutdown() get_steam_client()->clientShutdown(); get_steam_client()->BReleaseSteamPipe(user_steam_pipe); get_steam_client()->BShutdownIfAllPipesClosed(); + user_steam_pipe = 0; --global_counter; + old_user_instance = NULL; old_friends_interface = NULL; old_utils_interface = NULL; @@ -392,6 +394,7 @@ STEAMAPI_API void S_CALLTYPE SteamAPI_Shutdown() old_video_instance = NULL; old_parental_instance = NULL; old_unified_instance = NULL; + if (global_counter == 0) { destroy_client(); } @@ -448,7 +451,7 @@ STEAMAPI_API void S_CALLTYPE SteamAPI_ReleaseCurrentThreadMemory() STEAMAPI_API void S_CALLTYPE SteamAPI_WriteMiniDump( uint32 uStructuredExceptionCode, void* pvExceptionInfo, uint32 uBuildID ) { PRINT_DEBUG_TODO(); - PRINT_DEBUG(" The app is writing a crash dump! [XXXXXXXXXXXXXXXXXXXXXXXXXXX]"); + PRINT_DEBUG(" app is writing a crash dump! [XXXXXXXXXXXXXXXXXXXXXXXXXXX]"); } STEAMAPI_API void S_CALLTYPE SteamAPI_SetMiniDumpComment( const char *pchMsg ) @@ -580,7 +583,7 @@ STEAMAPI_API void Steam_RunCallbacks( HSteamPipe hSteamPipe, bool bGameServerCal // register the callback funcs to use to interact with the steam dll STEAMAPI_API void Steam_RegisterInterfaceFuncs( void *hModule ) { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG_TODO(); } // returns the HSteamUser of the last user to dispatch a callback @@ -613,7 +616,7 @@ STEAMAPI_API HSteamPipe SteamAPI_GetHSteamPipe() // sets whether or not Steam_RunCallbacks() should do a try {} catch (...) {} around calls to issuing callbacks STEAMAPI_API void SteamAPI_SetTryCatchCallbacks( bool bTryCatchCallbacks ) { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG_TODO(); } // backwards compat export, passes through to SteamAPI_ variants @@ -649,181 +652,181 @@ STEAMAPI_API ISteamClient *SteamClient() { STEAMAPI_API ISteamUser *SteamUser() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_user_instance, get_steam_client_old()->GetISteamUser(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_user)) } STEAMAPI_API ISteamFriends *SteamFriends() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_friends_interface, get_steam_client_old()->GetISteamFriends(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_friends )) } STEAMAPI_API ISteamUtils *SteamUtils() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_utils_interface, get_steam_client_old()->GetISteamUtils(SteamAPI_GetHSteamPipe(), old_utils)) } STEAMAPI_API ISteamMatchmaking *SteamMatchmaking() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_matchmaking_instance, get_steam_client_old()->GetISteamMatchmaking(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_matchmaking)) } STEAMAPI_API ISteamUserStats *SteamUserStats() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_userstats_instance, get_steam_client_old()->GetISteamUserStats(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_userstats)) } STEAMAPI_API ISteamApps *SteamApps() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_apps_instance, get_steam_client_old()->GetISteamApps(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_apps)) } STEAMAPI_API ISteamMatchmakingServers *SteamMatchmakingServers() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_matchmakingservers_instance, get_steam_client_old()->GetISteamMatchmakingServers(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_matchmaking_servers)) } STEAMAPI_API ISteamNetworking *SteamNetworking() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_networking_instance, get_steam_client_old()->GetISteamNetworking(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_networking)) } STEAMAPI_API ISteamRemoteStorage *SteamRemoteStorage() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_remotestorage_instance, get_steam_client_old()->GetISteamRemoteStorage(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_remote_storage_interface)) } STEAMAPI_API ISteamScreenshots *SteamScreenshots() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_screenshots_instance, get_steam_client_old()->GetISteamScreenshots(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_screenshots)) } STEAMAPI_API ISteamHTTP *SteamHTTP() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_http_instance, get_steam_client_old()->GetISteamHTTP(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_http)) } STEAMAPI_API ISteamController *SteamController() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_controller_instance, get_steam_client_old()->GetISteamController(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_controller)) } STEAMAPI_API ISteamUGC *SteamUGC() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_ugc_instance, get_steam_client_old()->GetISteamUGC(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_ugc_interface )) } STEAMAPI_API ISteamAppList *SteamAppList() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_applist_instance, get_steam_client_old()->GetISteamAppList(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_applist)) } STEAMAPI_API ISteamMusic *SteamMusic() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_music_instance, get_steam_client_old()->GetISteamMusic(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_music)) } STEAMAPI_API ISteamMusicRemote *SteamMusicRemote() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_musicremote_instance, get_steam_client_old()->GetISteamMusicRemote(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_music_remote)) } STEAMAPI_API ISteamHTMLSurface *SteamHTMLSurface() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_htmlsurface_instance, get_steam_client_old()->GetISteamHTMLSurface(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_html_surface)) } STEAMAPI_API ISteamInventory *SteamInventory() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_inventory_instance, get_steam_client_old()->GetISteamInventory(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_inventory)) } STEAMAPI_API ISteamVideo *SteamVideo() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_video_instance, get_steam_client_old()->GetISteamVideo(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_video)) } STEAMAPI_API ISteamParentalSettings *SteamParentalSettings() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_parental_instance, get_steam_client_old()->GetISteamParentalSettings(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), "")) } STEAMAPI_API ISteamUnifiedMessages *SteamUnifiedMessages() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_unified_instance, get_steam_client_old()->GetISteamUnifiedMessages(SteamAPI_GetHSteamUser(), SteamAPI_GetHSteamPipe(), old_unified_messages)) } STEAMAPI_API ISteamGameServer *SteamGameServer() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_gameserver_instance, get_steam_clientserver_old()->GetISteamGameServer(SteamGameServer_GetHSteamUser(), SteamGameServer_GetHSteamPipe(), old_gameserver )) } STEAMAPI_API ISteamUtils *SteamGameServerUtils() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_gamserver_utils_instance, get_steam_clientserver_old()->GetISteamUtils(SteamGameServer_GetHSteamPipe(), old_utils )) } STEAMAPI_API ISteamNetworking *SteamGameServerNetworking() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_gamserver_networking_instance, get_steam_clientserver_old()->GetISteamNetworking(SteamGameServer_GetHSteamUser(), SteamGameServer_GetHSteamPipe(), old_networking )) } STEAMAPI_API ISteamGameServerStats *SteamGameServerStats() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_gamserver_stats_instance, get_steam_clientserver_old()->GetISteamGameServerStats(SteamGameServer_GetHSteamUser(), SteamGameServer_GetHSteamPipe(), old_gameserver_stats )) } STEAMAPI_API ISteamHTTP *SteamGameServerHTTP() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_gamserver_http_instance, get_steam_clientserver_old()->GetISteamHTTP(SteamGameServer_GetHSteamUser(), SteamGameServer_GetHSteamPipe(), old_http )) } STEAMAPI_API ISteamInventory *SteamGameServerInventory() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_gamserver_inventory_instance, get_steam_clientserver_old()->GetISteamInventory(SteamGameServer_GetHSteamUser(), SteamGameServer_GetHSteamPipe(), old_inventory )) } STEAMAPI_API ISteamUGC *SteamGameServerUGC() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_gamserver_ugc_instance, get_steam_clientserver_old()->GetISteamUGC(SteamGameServer_GetHSteamUser(), SteamGameServer_GetHSteamPipe(), old_ugc_interface )) } STEAMAPI_API ISteamApps *SteamGameServerApps() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_gamserver_apps_instance, get_steam_clientserver_old()->GetISteamApps(SteamGameServer_GetHSteamUser(), SteamGameServer_GetHSteamPipe(), old_apps )) } STEAMAPI_API ISteamMasterServerUpdater *SteamMasterServerUpdater() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); CACHE_OLDSTEAM_INSTANCE(old_gamserver_masterupdater_instance, get_steam_clientserver_old()->GetISteamMasterServerUpdater(SteamGameServer_GetHSteamUser(), SteamGameServer_GetHSteamPipe(), old_masterserver_updater)) } @@ -994,7 +997,7 @@ STEAMAPI_API uint64 SteamGameServer_GetSteamID() STEAMAPI_API ISteamClient *SteamGameServerClient() { - PRINT_DEBUG_ENTRY(); + PRINT_DEBUG("old"); if (!get_steam_clientserver_old()->IsServerInit()) return NULL; return (ISteamClient *)SteamInternal_CreateInterface(old_client); } @@ -1016,11 +1019,11 @@ STEAMAPI_API void S_CALLTYPE SteamAPI_SetBreakpadAppID( uint32 unAppID ) } struct cb_data { - int cb_id; - std::vector result; + int cb_id{}; + std::vector result{}; }; -static std::queue client_cb; -static std::queue server_cb; +static std::queue client_cb{}; +static std::queue server_cb{}; static void cb_add_queue_server(std::vector result, int callback) { @@ -1183,28 +1186,32 @@ HSteamPipe flat_gs_hsteampipe() //VR stuff STEAMAPI_API void *VR_Init(int *error, int type) { + PRINT_DEBUG_TODO(); if (error) *error = 108; //HmdError_Init_HmdNotFound return NULL; } STEAMAPI_API void *VR_GetGenericInterface( const char *pchInterfaceVersion, int *peError ) { + PRINT_DEBUG_TODO(); return NULL; } STEAMAPI_API const char *VR_GetStringForHmdError( int error ) { + PRINT_DEBUG_TODO(); return ""; } STEAMAPI_API steam_bool VR_IsHmdPresent() { + PRINT_DEBUG_TODO(); return false; } STEAMAPI_API void VR_Shutdown() { - + PRINT_DEBUG_TODO(); } STEAMAPI_API steam_bool SteamAPI_RestartApp( uint32 appid ) @@ -1320,11 +1327,13 @@ STEAMCLIENT_API void Breakpad_SteamSetSteamID( uint64 ulSteamID ) STEAMCLIENT_API void Breakpad_SteamWriteMiniDumpSetComment( const char *pchMsg ) { PRINT_DEBUG_TODO(); + PRINT_DEBUG(" app is writing a crash dump comment! [XXXXXXXXXXXXXXXXXXXXXXXXXXX]"); } STEAMCLIENT_API void Breakpad_SteamWriteMiniDumpUsingExceptionInfoWithBuildId( int a, int b ) { PRINT_DEBUG_TODO(); + PRINT_DEBUG(" app is writing a crash dump! [XXXXXXXXXXXXXXXXXXXXXXXXXXX]"); } STEAMCLIENT_API bool Steam_BConnected( HSteamUser hUser, HSteamPipe hSteamPipe ) diff --git a/dll/settings.cpp b/dll/settings.cpp index 49e08fdb..51679116 100644 --- a/dll/settings.cpp +++ b/dll/settings.cpp @@ -22,7 +22,7 @@ std::string Settings::sanitize(const std::string &name) { // https://github.com/microsoft/referencesource/blob/51cf7850defa8a17d815b4700b67116e3fa283c2/mscorlib/system/io/path.cs#L88C9-L89C1 // https://github.com/microsoft/referencesource/blob/51cf7850defa8a17d815b4700b67116e3fa283c2/mscorlib/system/io/pathinternal.cs#L32 - static const char InvalidFileNameChars[] = { + constexpr const static char InvalidFileNameChars[] = { '\"', '<', '>', '|', '\0', (char)1, (char)2, (char)3, (char)4, (char)5, (char)6, (char)7, (char)8, (char)9, (char)10, (char)11, (char)12, (char)13, (char)14, (char)15, (char)16, (char)17, (char)18, (char)19, (char)20, @@ -31,25 +31,31 @@ std::string Settings::sanitize(const std::string &name) ':', '*', '?', /*'\\', '/',*/ }; + if (name.empty()) return {}; + // we have to use utf-32 because Windows (and probably Linux) allows some chars that need at least 32 bits, // such as this one (U+1F5FA) called "World Map": https://www.compart.com/en/unicode/U+1F5FA // utf-16 encoding for these characters require 2 ushort, but we would like to iterate // over all chars in a linear fashion - std::u32string unicode_name; + std::u32string unicode_name{}; utf8::utf8to32( name.begin(), utf8::find_invalid(name.begin(), name.end()), // returns an iterator pointing to the first invalid octet - std::back_inserter(unicode_name)); + std::back_inserter(unicode_name) + ); - unicode_name.erase(std::remove(unicode_name.begin(), unicode_name.end(), '\n'), unicode_name.end()); - unicode_name.erase(std::remove(unicode_name.begin(), unicode_name.end(), '\r'), unicode_name.end()); + auto rm_itr = std::remove_if(unicode_name.begin(), unicode_name.end(), [](decltype(unicode_name[0]) ch) { + return ch == '\n' || ch == '\r'; + }); + if (unicode_name.end() != rm_itr) { + unicode_name.erase(rm_itr, unicode_name.end()); + } auto InvalidFileNameChars_last_it = std::end(InvalidFileNameChars); - for (auto& i : unicode_name) - { - auto found_it = std::find(std::begin(InvalidFileNameChars), InvalidFileNameChars_last_it, i); + for (auto& uch : unicode_name) { + auto found_it = std::find(std::begin(InvalidFileNameChars), InvalidFileNameChars_last_it, uch); if (found_it != InvalidFileNameChars_last_it) { // if illegal - i = ' '; + uch = ' '; } } diff --git a/dll/steam_client.cpp b/dll/steam_client.cpp index b96aca26..1c6aa746 100644 --- a/dll/steam_client.cpp +++ b/dll/steam_client.cpp @@ -223,12 +223,12 @@ Steam_Client::~Steam_Client() delete ugc_bridge; ugc_bridge = nullptr; + delete network; network = nullptr; delete run_every_runcb; run_every_runcb = nullptr; delete callbacks_server; callbacks_server = nullptr; delete callbacks_client; callbacks_client = nullptr; delete callback_results_server; callback_results_server = nullptr; delete callback_results_client; callback_results_client = nullptr; - delete network; network = nullptr; } void Steam_Client::userLogIn() diff --git a/helpers/common_helpers.cpp b/helpers/common_helpers.cpp index 486e419a..77e199f1 100644 --- a/helpers/common_helpers.cpp +++ b/helpers/common_helpers.cpp @@ -103,13 +103,15 @@ bool common_helpers::ends_with_i(const std::wstring_view &target, const std::wst std::string common_helpers::string_strip(const std::string_view &str) { static constexpr const char whitespaces[] = " \t\r\n"; + + if (str.empty()) return {}; size_t start = str.find_first_not_of(whitespaces); size_t end = str.find_last_not_of(whitespaces); if (start == std::string::npos) return {}; - if (start == end) { + if (start == end) { // happens when string is 1 char auto c = str[start]; for (auto c_white = whitespaces; *c_white; ++c_white) { if (c == *c_white) return {}; @@ -184,6 +186,8 @@ void common_helpers::consume_bom(std::ifstream &input) std::string common_helpers::to_lower(const std::string_view &str) { + if (str.empty()) return {}; + std::string _str(str.size(), '\0'); std::transform(str.begin(), str.end(), _str.begin(), [](char c) { return std::tolower(c); }); return _str; @@ -191,6 +195,8 @@ std::string common_helpers::to_lower(const std::string_view &str) std::wstring common_helpers::to_lower(const std::wstring_view &wstr) { + if (wstr.empty()) return {}; + std::wstring _wstr(wstr.size(), '\0'); std::transform(wstr.begin(), wstr.end(), _wstr.begin(), [](wchar_t c) { return std::tolower(c); }); return _wstr; @@ -198,6 +204,8 @@ std::wstring common_helpers::to_lower(const std::wstring_view &wstr) std::string common_helpers::to_upper(const std::string_view &str) { + if (str.empty()) return {}; + std::string _str(str.size(), '\0'); std::transform(str.begin(), str.end(), _str.begin(), [](char c) { return std::toupper(c); }); return _str; @@ -205,6 +213,8 @@ std::string common_helpers::to_upper(const std::string_view &str) std::wstring common_helpers::to_upper(const std::wstring_view &wstr) { + if (wstr.empty()) return {}; + std::wstring _wstr(wstr.size(), '\0'); std::transform(wstr.begin(), wstr.end(), _wstr.begin(), [](wchar_t c) { return std::toupper(c); }); return _wstr; diff --git a/tools/steamclient_loader/win/ColdClientLoader.cpp b/tools/steamclient_loader/win/ColdClientLoader.cpp index 87c93601..72bab18a 100644 --- a/tools/steamclient_loader/win/ColdClientLoader.cpp +++ b/tools/steamclient_loader/win/ColdClientLoader.cpp @@ -76,10 +76,7 @@ static std::vector get_pe_header(const std::wstring &filepath) } } -static std::vector collect_dlls_to_inject( - const std::wstring &extra_dlls_folder, - bool is_exe_32, - std::wstring &failed_dlls) +static std::vector collect_dlls_to_inject(const std::wstring &extra_dlls_folder, bool is_exe_32, std::wstring &failed_dlls) { const auto load_order_file = std::filesystem::path(extra_dlls_folder) / "load_order.txt"; std::vector dlls_to_inject{};