OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/process/launch.h" | 5 #include "base/process/launch.h" |
6 | 6 |
7 #include <fcntl.h> | 7 #include <fcntl.h> |
8 #include <io.h> | 8 #include <io.h> |
9 #include <shellapi.h> | 9 #include <shellapi.h> |
10 #include <windows.h> | 10 #include <windows.h> |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 if (options.force_breakaway_from_job_) | 265 if (options.force_breakaway_from_job_) |
266 flags |= CREATE_BREAKAWAY_FROM_JOB; | 266 flags |= CREATE_BREAKAWAY_FROM_JOB; |
267 | 267 |
268 PROCESS_INFORMATION temp_process_info = {}; | 268 PROCESS_INFORMATION temp_process_info = {}; |
269 | 269 |
270 LPCTSTR current_directory = options.current_directory.empty() | 270 LPCTSTR current_directory = options.current_directory.empty() |
271 ? nullptr | 271 ? nullptr |
272 : options.current_directory.value().c_str(); | 272 : options.current_directory.value().c_str(); |
273 | 273 |
274 string16 writable_cmdline(cmdline); | 274 string16 writable_cmdline(cmdline); |
| 275 const char16* executable_path = !options.real_path.empty() ? |
| 276 options.real_path.value().c_str() : nullptr; |
275 if (options.as_user) { | 277 if (options.as_user) { |
276 flags |= CREATE_UNICODE_ENVIRONMENT; | 278 flags |= CREATE_UNICODE_ENVIRONMENT; |
277 void* enviroment_block = nullptr; | 279 void* enviroment_block = nullptr; |
278 | 280 |
279 if (!CreateEnvironmentBlock(&enviroment_block, options.as_user, FALSE)) { | 281 if (!CreateEnvironmentBlock(&enviroment_block, options.as_user, FALSE)) { |
280 DPLOG(ERROR); | 282 DPLOG(ERROR); |
281 return Process(); | 283 return Process(); |
282 } | 284 } |
283 | 285 |
284 BOOL launched = CreateProcessAsUser( | 286 BOOL launched = CreateProcessAsUser( |
285 options.as_user, nullptr, &writable_cmdline[0], nullptr, nullptr, | 287 options.as_user, executable_path, &writable_cmdline[0], nullptr, |
286 inherit_handles, flags, enviroment_block, current_directory, | 288 nullptr, inherit_handles, flags, enviroment_block, current_directory, |
287 startup_info, &temp_process_info); | 289 startup_info, &temp_process_info); |
288 DestroyEnvironmentBlock(enviroment_block); | 290 DestroyEnvironmentBlock(enviroment_block); |
289 if (!launched) { | 291 if (!launched) { |
290 DPLOG(ERROR) << "Command line:" << std::endl << UTF16ToUTF8(cmdline) | 292 DPLOG(ERROR) << "Command line:" << std::endl << UTF16ToUTF8(cmdline) |
291 << std::endl; | 293 << std::endl; |
292 return Process(); | 294 return Process(); |
293 } | 295 } |
294 } else { | 296 } else { |
295 if (!CreateProcess(nullptr, &writable_cmdline[0], nullptr, nullptr, | 297 if (!CreateProcess(executable_path, &writable_cmdline[0], nullptr, nullptr, |
296 inherit_handles, flags, nullptr, current_directory, | 298 inherit_handles, flags, nullptr, current_directory, |
297 startup_info, &temp_process_info)) { | 299 startup_info, &temp_process_info)) { |
298 DPLOG(ERROR) << "Command line:" << std::endl << UTF16ToUTF8(cmdline) | 300 DPLOG(ERROR) << "Command line:" << std::endl << UTF16ToUTF8(cmdline) |
299 << std::endl; | 301 << std::endl; |
300 return Process(); | 302 return Process(); |
301 } | 303 } |
302 } | 304 } |
303 base::win::ScopedProcessInformation process_info(temp_process_info); | 305 base::win::ScopedProcessInformation process_info(temp_process_info); |
304 | 306 |
305 if (options.job_handle) { | 307 if (options.job_handle) { |
306 if (0 == AssignProcessToJobObject(options.job_handle, | 308 if (0 == AssignProcessToJobObject(options.job_handle, |
307 process_info.process_handle())) { | 309 process_info.process_handle())) { |
308 DLOG(ERROR) << "Could not AssignProcessToObject."; | 310 DLOG(ERROR) << "Could not AssignProcessToObject."; |
309 Process scoped_process(process_info.TakeProcessHandle()); | 311 Process scoped_process(process_info.TakeProcessHandle()); |
310 scoped_process.Terminate(kProcessKilledExitCode, true); | 312 scoped_process.Terminate(kProcessKilledExitCode, true); |
311 return Process(); | 313 return Process(); |
312 } | 314 } |
313 | 315 |
314 ResumeThread(process_info.thread_handle()); | 316 ResumeThread(process_info.thread_handle()); |
315 } | 317 } |
316 | 318 |
317 if (options.wait) | 319 if (options.wait) |
318 WaitForSingleObject(process_info.process_handle(), INFINITE); | 320 WaitForSingleObject(process_info.process_handle(), INFINITE); |
319 | 321 |
320 return Process(process_info.TakeProcessHandle()); | 322 return Process(process_info.TakeProcessHandle()); |
321 } | 323 } |
322 | 324 |
323 Process LaunchElevatedProcess(const CommandLine& cmdline, | 325 Process LaunchElevatedProcess(const CommandLine& cmdline, |
324 const LaunchOptions& options) { | 326 const LaunchOptions& options) { |
325 const string16 file = cmdline.GetProgram().value(); | 327 const string16 file = !options.real_path.empty() ? |
| 328 options.real_path.value() : cmdline.GetProgram().value(); |
326 const string16 arguments = cmdline.GetArgumentsString(); | 329 const string16 arguments = cmdline.GetArgumentsString(); |
327 | 330 |
328 SHELLEXECUTEINFO shex_info = {}; | 331 SHELLEXECUTEINFO shex_info = {}; |
329 shex_info.cbSize = sizeof(shex_info); | 332 shex_info.cbSize = sizeof(shex_info); |
330 shex_info.fMask = SEE_MASK_NOCLOSEPROCESS; | 333 shex_info.fMask = SEE_MASK_NOCLOSEPROCESS; |
331 shex_info.hwnd = GetActiveWindow(); | 334 shex_info.hwnd = GetActiveWindow(); |
332 shex_info.lpVerb = L"runas"; | 335 shex_info.lpVerb = L"runas"; |
333 shex_info.lpFile = file.c_str(); | 336 shex_info.lpFile = file.c_str(); |
334 shex_info.lpParameters = arguments.c_str(); | 337 shex_info.lpParameters = arguments.c_str(); |
335 shex_info.lpDirectory = nullptr; | 338 shex_info.lpDirectory = nullptr; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 | 370 |
368 bool GetAppOutput(const StringPiece16& cl, std::string* output) { | 371 bool GetAppOutput(const StringPiece16& cl, std::string* output) { |
369 return GetAppOutputInternal(cl, false, output); | 372 return GetAppOutputInternal(cl, false, output); |
370 } | 373 } |
371 | 374 |
372 void RaiseProcessToHighPriority() { | 375 void RaiseProcessToHighPriority() { |
373 SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); | 376 SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); |
374 } | 377 } |
375 | 378 |
376 } // namespace base | 379 } // namespace base |
OLD | NEW |