| Index: base/process/launch_win.cc
|
| diff --git a/base/process/launch_win.cc b/base/process/launch_win.cc
|
| index da913efba749089592644c627c2dc226dbfa6182..2e333c34fd7ccb207d71b1e5d49f41e45999304c 100644
|
| --- a/base/process/launch_win.cc
|
| +++ b/base/process/launch_win.cc
|
| @@ -9,6 +9,7 @@
|
| #include <windows.h>
|
| #include <userenv.h>
|
| #include <psapi.h>
|
| +#include <Shellapi.h>
|
|
|
| #include <ios>
|
|
|
| @@ -195,6 +196,41 @@ bool LaunchProcess(const CommandLine& cmdline,
|
| return LaunchProcess(cmdline.GetCommandLineString(), options, process_handle);
|
| }
|
|
|
| +bool LaunchElevatedProcess(const CommandLine& cmdline,
|
| + const LaunchOptions& options,
|
| + ProcessHandle* process_handle) {
|
| + const std::wstring file = cmdline.GetProgram().value();
|
| + const std::wstring arguments = cmdline.GetArgumentsString();
|
| +
|
| + SHELLEXECUTEINFO shex_info = {0};
|
| + shex_info.cbSize = sizeof(shex_info);
|
| + shex_info.fMask = SEE_MASK_NOCLOSEPROCESS;
|
| + shex_info.hwnd = GetActiveWindow();
|
| + shex_info.lpVerb = L"runas";
|
| + shex_info.lpFile = file.c_str();
|
| + shex_info.lpParameters = arguments.c_str();
|
| + shex_info.lpDirectory = NULL;
|
| + shex_info.nShow = options.start_hidden ? SW_HIDE : SW_SHOW;
|
| + shex_info.hInstApp = NULL;
|
| +
|
| + if (!ShellExecuteEx(&shex_info)) {
|
| + DPLOG(ERROR);
|
| + return false;
|
| + }
|
| +
|
| + if (options.wait)
|
| + WaitForSingleObject(shex_info.hProcess, INFINITE);
|
| +
|
| + // If the caller wants the process handle give it to them, otherwise just
|
| + // close it. Closing it does not terminate the process.
|
| + if (process_handle)
|
| + *process_handle = shex_info.hProcess;
|
| + else
|
| + CloseHandle(shex_info.hProcess);
|
| +
|
| + return true;
|
| +}
|
| +
|
| bool SetJobObjectLimitFlags(HANDLE job_object, DWORD limit_flags) {
|
| JOBOBJECT_EXTENDED_LIMIT_INFORMATION limit_info = {0};
|
| limit_info.BasicLimitInformation.LimitFlags = limit_flags;
|
|
|