summaryrefslogtreecommitdiff
path: root/Source/Core/WinUpdater/WinUI.cpp
diff options
context:
space:
mode:
authorShawn Hoffman <godisgovernment@gmail.com>2023-03-09 18:23:12 -0800
committerShawn Hoffman <godisgovernment@gmail.com>2023-03-11 12:58:33 -0800
commit0a8725e4a97de50b1e267a67492e0cd0c4275010 (patch)
tree428c33e498ddbcca3ca70ac7c4b2ae02d0e72d85 /Source/Core/WinUpdater/WinUI.cpp
parentde0bc06856bb4d1c36a62c84bc4f8e245138c090 (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.cpp31
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)