| Index: base/process_util_win.cc
|
| ===================================================================
|
| --- base/process_util_win.cc (revision 99780)
|
| +++ base/process_util_win.cc (working copy)
|
| @@ -237,8 +237,19 @@
|
| startup_info.wShowWindow = options.start_hidden ? SW_HIDE : SW_SHOW;
|
| PROCESS_INFORMATION process_info;
|
|
|
| + DWORD flags = 0;
|
| +
|
| + if (options.job_handle) {
|
| + flags |= CREATE_SUSPENDED;
|
| +
|
| + // If this code is run under a debugger, the launched process is
|
| + // automatically associated with a job object created by the debugger.
|
| + // The CREATE_BREAKAWAY_FROM_JOB flag is used to prevent this.
|
| + flags |= CREATE_BREAKAWAY_FROM_JOB;
|
| + }
|
| +
|
| if (options.as_user) {
|
| - DWORD flags = CREATE_UNICODE_ENVIRONMENT;
|
| + flags |= CREATE_UNICODE_ENVIRONMENT;
|
| void* enviroment_block = NULL;
|
|
|
| if (!CreateEnvironmentBlock(&enviroment_block, options.as_user, FALSE))
|
| @@ -256,12 +267,23 @@
|
| } else {
|
| if (!CreateProcess(NULL,
|
| const_cast<wchar_t*>(cmdline.c_str()), NULL, NULL,
|
| - options.inherit_handles, 0, NULL, NULL,
|
| + options.inherit_handles, flags, NULL, NULL,
|
| &startup_info, &process_info)) {
|
| return false;
|
| }
|
| }
|
|
|
| + if (options.job_handle) {
|
| + if (0 == AssignProcessToJobObject(options.job_handle,
|
| + process_info.hProcess)) {
|
| + LOG(ERROR) << "Could not AssignProcessToObject.";
|
| + KillProcess(process_info.hProcess, kProcessKilledExitCode, true);
|
| + return false;
|
| + }
|
| +
|
| + ResumeThread(process_info.hThread);
|
| + }
|
| +
|
| // Handles must be closed or they will leak.
|
| CloseHandle(process_info.hThread);
|
|
|
|
|