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 |