| Index: sandbox/win/src/target_process.cc
|
| ===================================================================
|
| --- sandbox/win/src/target_process.cc (revision 153543)
|
| +++ sandbox/win/src/target_process.cc (working copy)
|
| @@ -7,6 +7,7 @@
|
| #include "base/basictypes.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/win/pe_image.h"
|
| +#include "base/win/startup_information.h"
|
| #include "base/win/windows_version.h"
|
| #include "sandbox/win/src/crosscall_server.h"
|
| #include "sandbox/win/src/crosscall_client.h"
|
| @@ -130,29 +131,26 @@
|
| // object.
|
| DWORD TargetProcess::Create(const wchar_t* exe_path,
|
| const wchar_t* command_line,
|
| - const wchar_t* desktop,
|
| + const base::win::StartupInformation& startup_info,
|
| base::win::ScopedProcessInformation* target_info) {
|
| exe_name_.reset(_wcsdup(exe_path));
|
|
|
| // the command line needs to be writable by CreateProcess().
|
| scoped_ptr_malloc<wchar_t> cmd_line(_wcsdup(command_line));
|
| - scoped_ptr_malloc<wchar_t> desktop_name(desktop ? _wcsdup(desktop) : NULL);
|
|
|
| // Start the target process suspended.
|
| DWORD flags =
|
| CREATE_SUSPENDED | CREATE_UNICODE_ENVIRONMENT | DETACHED_PROCESS;
|
|
|
| + if (startup_info.has_extended_startup_info())
|
| + flags |= EXTENDED_STARTUPINFO_PRESENT;
|
| +
|
| if (base::win::GetVersion() < base::win::VERSION_WIN8) {
|
| // Windows 8 implements nested jobs, but for older systems we need to
|
| // break out of any job we're in to enforce our restrictions.
|
| flags |= CREATE_BREAKAWAY_FROM_JOB;
|
| }
|
|
|
| - STARTUPINFO startup_info = {sizeof(STARTUPINFO)};
|
| - if (desktop) {
|
| - startup_info.lpDesktop = desktop_name.get();
|
| - }
|
| -
|
| base::win::ScopedProcessInformation process_info;
|
|
|
| if (!::CreateProcessAsUserW(lockdown_token_,
|
| @@ -164,7 +162,7 @@
|
| flags,
|
| NULL, // Use the environment of the caller.
|
| NULL, // Use current directory of the caller.
|
| - &startup_info,
|
| + startup_info.startup_info(),
|
| process_info.Receive())) {
|
| return ::GetLastError();
|
| }
|
|
|