From f6a9ab360fa90a0edc596821ac08de38f8fe9a01 Mon Sep 17 00:00:00 2001 From: Frank Richter Date: Sun, 24 Nov 2024 05:05:43 +0100 Subject: [PATCH] Use SHGetKnownFolderPath to obtain rerelease homedir --- inc/system/system.h | 4 ++++ src/common/files.c | 2 +- src/windows/system.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/inc/system/system.h b/inc/system/system.h index d98b50dac..d75046d35 100644 --- a/inc/system/system.h +++ b/inc/system/system.h @@ -92,3 +92,7 @@ void Sys_BackTrace(void **output, size_t count, size_t offset); extern cvar_t *sys_basedir; extern cvar_t *sys_libdir; extern cvar_t *sys_homedir; + +#ifdef _WIN32 +bool Sys_GetRereleaseHomeDir(char *path, size_t path_length); +#endif diff --git a/src/common/files.c b/src/common/files.c index 3422635c0..d95b5c219 100644 --- a/src/common/files.c +++ b/src/common/files.c @@ -3980,7 +3980,7 @@ static void FS_FindBaseDir(void) #ifdef _WIN32 if (com_rerelease->integer == RERELEASE_MODE_YES) { char homedir[MAX_OSPATH]; - if (ExpandEnvironmentStringsA("%userprofile%\\Saved Games\\NightDive Studios\\Quake II", homedir, sizeof(homedir) - 2)) { + if (Sys_GetRereleaseHomeDir(homedir, sizeof(homedir) - 2)) { FS_NormalizePath(homedir); Cvar_Set("homedir", homedir); } diff --git a/src/windows/system.c b/src/windows/system.c index 8a4f36821..233171e3c 100644 --- a/src/windows/system.c +++ b/src/windows/system.c @@ -37,6 +37,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma message("No Xbox support") #endif +#if defined(_WIN32) +#include +#include +#endif + HINSTANCE hGlobalInstance; #if USE_WINSVC @@ -1287,6 +1292,33 @@ const sys_getinstalledgamepath_func_t gamepath_funcs[] = { NULL }; +// Locate rerelease home dir +bool Sys_GetRereleaseHomeDir(char *path, size_t path_length) +{ + bool result = false; + PWSTR saved_games_path = NULL; + HRESULT hr = SHGetKnownFolderPath(&FOLDERID_SavedGames, KF_FLAG_CREATE | KF_FLAG_INIT, NULL, &saved_games_path); + if (!SUCCEEDED(hr)) + { + Com_WPrintf("Failed to retrieve Saved Games path (%.8x)\n", hr); + goto done; + } + + if (WideCharToMultiByte(CP_UTF8, 0, saved_games_path, -1, path, (int)path_length, NULL, NULL) == 0) + { + DWORD err = GetLastError(); + Com_WPrintf("Failed to convert Saved Games path (%d)\n", err); + goto done; + } + + Q_strlcat(path, "\\NightDive Studios\\Quake II", path_length); + result = true; + +done: + CoTaskMemFree(saved_games_path); + return result; +} + /* ========================================================================