Chromium Code Reviews| Index: base/process/launch_win.cc |
| diff --git a/base/process/launch_win.cc b/base/process/launch_win.cc |
| index da913efba749089592644c627c2dc226dbfa6182..918e45dca5c20caf13e0df11e95181785b8e0b9b 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> |
| @@ -279,4 +280,36 @@ void RaiseProcessToHighPriority() { |
| SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); |
| } |
| +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, we won't close it. |
| + if (process_handle) |
|
mef
2013/12/18 21:02:10
don't you need to close it otherwise?
Drew Haven
2014/01/09 01:15:14
You know, this was just taken directly from the de
|
| + *process_handle = shex_info.hProcess; |
| + |
| + return true; |
| +} |
| + |
| } // namespace base |