| Index: base/process/launch_win.cc
|
| diff --git a/base/process/launch_win.cc b/base/process/launch_win.cc
|
| index 0c831cf7b4a8a481917b9d9e85a76542dce81fc7..de05255d90aaa3fecbf50c386c361920ae02571d 100644
|
| --- a/base/process/launch_win.cc
|
| +++ b/base/process/launch_win.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include <fcntl.h>
|
| #include <io.h>
|
| +#include <shellapi.h>
|
| #include <windows.h>
|
| #include <userenv.h>
|
| #include <psapi.h>
|
| @@ -239,6 +240,41 @@ bool LaunchProcess(const CommandLine& cmdline,
|
| return rv;
|
| }
|
|
|
| +bool LaunchElevatedProcess(const CommandLine& cmdline,
|
| + const LaunchOptions& options,
|
| + ProcessHandle* process_handle) {
|
| + const string16 file = cmdline.GetProgram().value();
|
| + const string16 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;
|
|
|