2019-12-16 18:36:52 +01:00
|
|
|
#include "pch.h"
|
|
|
|
#include "restart_elevated.h"
|
2020-12-15 13:16:09 +01:00
|
|
|
|
|
|
|
#include <common/utils/elevation.h>
|
2019-12-16 18:36:52 +01:00
|
|
|
|
2019-12-26 17:26:11 +01:00
|
|
|
enum State
|
|
|
|
{
|
|
|
|
None,
|
|
|
|
RestartAsElevated,
|
2021-02-10 14:48:43 +01:00
|
|
|
RestartAsElevatedOpenSettings,
|
2019-12-26 17:26:11 +01:00
|
|
|
RestartAsNonElevated
|
2019-12-16 18:36:52 +01:00
|
|
|
};
|
|
|
|
static State state = None;
|
|
|
|
|
2021-02-10 14:48:43 +01:00
|
|
|
void schedule_restart_as_elevated(bool openSettings)
|
2019-12-26 17:26:11 +01:00
|
|
|
{
|
2021-02-10 14:48:43 +01:00
|
|
|
state = openSettings ? RestartAsElevatedOpenSettings : RestartAsElevated;
|
2019-12-16 18:36:52 +01:00
|
|
|
}
|
|
|
|
|
2021-02-10 14:48:43 +01:00
|
|
|
|
2019-12-26 17:26:11 +01:00
|
|
|
void schedule_restart_as_non_elevated()
|
|
|
|
{
|
|
|
|
state = RestartAsNonElevated;
|
2019-12-16 18:36:52 +01:00
|
|
|
}
|
|
|
|
|
2019-12-26 17:26:11 +01:00
|
|
|
bool is_restart_scheduled()
|
|
|
|
{
|
|
|
|
return state != None;
|
2019-12-16 18:36:52 +01:00
|
|
|
}
|
|
|
|
|
2019-12-26 17:26:11 +01:00
|
|
|
bool restart_if_scheduled()
|
|
|
|
{
|
|
|
|
// Make sure we have enough room, even for the long (\\?\) paths
|
|
|
|
constexpr DWORD exe_path_size = 0xFFFF;
|
|
|
|
auto exe_path = std::make_unique<wchar_t[]>(exe_path_size);
|
|
|
|
GetModuleFileNameW(nullptr, exe_path.get(), exe_path_size);
|
|
|
|
switch (state)
|
|
|
|
{
|
|
|
|
case RestartAsElevated:
|
|
|
|
return run_elevated(exe_path.get(), {});
|
2021-02-10 14:48:43 +01:00
|
|
|
case RestartAsElevatedOpenSettings:
|
|
|
|
return run_elevated(exe_path.get(), L"--open-settings");
|
2019-12-26 17:26:11 +01:00
|
|
|
case RestartAsNonElevated:
|
2020-05-21 19:44:32 +02:00
|
|
|
return run_non_elevated(exe_path.get(), L"--dont-elevate", NULL);
|
2019-12-26 17:26:11 +01:00
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
2019-12-16 18:36:52 +01:00
|
|
|
}
|
2020-01-09 18:17:42 +01:00
|
|
|
|
|
|
|
bool restart_same_elevation()
|
|
|
|
{
|
|
|
|
constexpr DWORD exe_path_size = 0xFFFF;
|
|
|
|
auto exe_path = std::make_unique<wchar_t[]>(exe_path_size);
|
|
|
|
GetModuleFileNameW(nullptr, exe_path.get(), exe_path_size);
|
2020-05-29 19:02:37 +02:00
|
|
|
return run_same_elevation(exe_path.get(), L"--dont-elevate", nullptr);
|
2020-01-09 18:17:42 +01:00
|
|
|
}
|