From a4b598aa152515b8eaf60e87b387c945c8d07fd3 Mon Sep 17 00:00:00 2001 From: TellowKrinkle Date: Mon, 5 Dec 2022 23:51:16 -0600 Subject: [PATCH] Updater: Preserve non-standard exe names on update --- updater/Windows/WindowsUpdater.cpp | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/updater/Windows/WindowsUpdater.cpp b/updater/Windows/WindowsUpdater.cpp index 753d3ada8d..64f702fd01 100644 --- a/updater/Windows/WindowsUpdater.cpp +++ b/updater/Windows/WindowsUpdater.cpp @@ -453,7 +453,7 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi const int parent_process_id = StringUtil::FromChars(StringUtil::WideStringToUTF8String(argv[1])).value_or(0); const std::string destination_directory = StringUtil::WideStringToUTF8String(argv[2]); const std::string zip_path = StringUtil::WideStringToUTF8String(argv[3]); - std::wstring program_to_launch(argv[4]); + const std::wstring program_to_launch(argv[4]); argv.reset(); if (parent_process_id <= 0 || destination_directory.empty() || zip_path.empty() || program_to_launch.empty()) @@ -493,7 +493,6 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi return 1; } - DeleteFileW(program_to_launch.c_str()); // In case the new exe has a different name, delete the old one to prevent confusion if (!updater.CommitUpdate()) { progress.ModalError( @@ -504,22 +503,26 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi updater.CleanupStagingDirectory(); updater.RemoveUpdateZip(); - progress.ModalInformation("Update complete."); - - if (GetFileAttributesW(program_to_launch.c_str()) == INVALID_FILE_ATTRIBUTES) + // Rename the new executable to match the existing one + if (std::string actual_exe = updater.FindPCSX2Exe(); !actual_exe.empty()) { - // New executable doesn't match old, try to find the real one... - if (std::string actual_exe = updater.FindPCSX2Exe(); !actual_exe.empty()) + const std::string full_path = destination_directory + FS_OSPATH_SEPARATOR_STR + actual_exe; + progress.DisplayFormattedInformation("Moving '%s' to '%S'", full_path.c_str(), program_to_launch.c_str()); + const bool ok = MoveFileExW(StringUtil::UTF8StringToWideString(full_path).c_str(), + program_to_launch.c_str(), MOVEFILE_REPLACE_EXISTING); + if (!ok) { - std::string full_path = destination_directory + FS_OSPATH_SEPARATOR_STR + actual_exe; - program_to_launch = StringUtil::UTF8StringToWideString(full_path); - } - else - { - progress.ModalError("Couldn't find PCSX2 in update package, please re-download a fresh version from GitHub."); + progress.DisplayFormattedModalError("Failed to rename '%s' to %S", full_path.c_str(), program_to_launch.c_str()); return 1; } } + else + { + progress.ModalError("Couldn't find PCSX2 in update package, please re-download a fresh version from GitHub."); + return 1; + } + + progress.ModalInformation("Update complete."); progress.DisplayFormattedInformation("Launching '%s'...", StringUtil::WideStringToUTF8String(program_to_launch).c_str());