diff options
| author | Shawn Hoffman <godisgovernment@gmail.com> | 2023-03-09 18:23:12 -0800 |
|---|---|---|
| committer | Shawn Hoffman <godisgovernment@gmail.com> | 2023-03-11 12:58:33 -0800 |
| commit | 0a8725e4a97de50b1e267a67492e0cd0c4275010 (patch) | |
| tree | 428c33e498ddbcca3ca70ac7c4b2ae02d0e72d85 /Source/Core/WinUpdater/WinUI.cpp | |
| parent | de0bc06856bb4d1c36a62c84bc4f8e245138c090 (diff) | |
updater: add test for update flow
currently windows-only
Diffstat (limited to 'Source/Core/WinUpdater/WinUI.cpp')
| -rw-r--r-- | Source/Core/WinUpdater/WinUI.cpp | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/Source/Core/WinUpdater/WinUI.cpp b/Source/Core/WinUpdater/WinUI.cpp index 1671f43457..8e3e7c375d 100644 --- a/Source/Core/WinUpdater/WinUI.cpp +++ b/Source/Core/WinUpdater/WinUI.cpp @@ -3,12 +3,14 @@ #include "UpdaterCommon/UI.h" +#include <cstdlib> #include <string> #include <thread> #include <Windows.h> #include <CommCtrl.h> #include <ShObjIdl.h> +#include <ShlObj.h> #include <shellapi.h> #include <wrl/client.h> @@ -251,11 +253,34 @@ void Stop() ui_thread.join(); } +bool IsTestMode() +{ + return std::getenv("DOLPHIN_UPDATE_SERVER_URL") != nullptr; +} + void LaunchApplication(std::string path) { - // Indirectly start the application via explorer. This effectively drops admin priviliges because - // explorer is running as current user. - ShellExecuteW(nullptr, nullptr, L"explorer.exe", UTF8ToWString(path).c_str(), nullptr, SW_SHOW); + const auto wpath = UTF8ToWString(path); + if (IsUserAnAdmin()) + { + // Indirectly start the application via explorer. This effectively drops admin privileges + // because explorer is running as current user. + ShellExecuteW(nullptr, nullptr, L"explorer.exe", wpath.c_str(), nullptr, SW_SHOW); + } + else + { + std::wstring cmdline = wpath; + STARTUPINFOW startup_info{.cb = sizeof(startup_info)}; + PROCESS_INFORMATION process_info; + if (IsTestMode()) + SetEnvironmentVariableA("DOLPHIN_UPDATE_TEST_DONE", "1"); + if (CreateProcessW(wpath.c_str(), cmdline.data(), nullptr, nullptr, TRUE, 0, nullptr, nullptr, + &startup_info, &process_info)) + { + CloseHandle(process_info.hThread); + CloseHandle(process_info.hProcess); + } + } } void Sleep(int sleep) |
