// Copyright 2018 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include #include #include #include #include #include "Common/CommonFuncs.h" #include "Common/StringUtil.h" #include "UpdaterCommon/UI.h" #include "UpdaterCommon/UpdaterCommon.h" // Refer to docs/autoupdate_overview.md for a detailed overview of the autoupdate process int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { if (lstrlenW(pCmdLine) == 0) { MessageBoxW(nullptr, L"This updater is not meant to be launched directly. Configure Auto-Update in " "Dolphin's settings instead.", L"Error", MB_ICONERROR); return 1; } // Test for write permissions bool need_admin = false; auto path = GetModuleName(hInstance); if (!path) { UI::Error("Failed to get updater filename."); return 1; } FILE* test_fh = _wfopen((std::filesystem::path(*path).parent_path() / "Updater.log").c_str(), L"w"); if (test_fh == nullptr) need_admin = true; else fclose(test_fh); if (need_admin) { if (IsUserAnAdmin()) { MessageBox(nullptr, L"Failed to write to directory despite administrator priviliges.", L"Error", MB_ICONERROR); return 1; } // Relaunch the updater as administrator ShellExecuteW(nullptr, L"runas", path->c_str(), pCmdLine, NULL, SW_SHOW); return 0; } std::vector args = CommandLineToUtf8Argv(pCmdLine); return RunUpdater(args) ? 0 : 1; }