15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/sandbox_init.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/sandbox_win.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sandbox_types.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InitializeSandbox(sandbox::SandboxInterfaceInfo* sandbox_info) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sandbox::BrokerServices* broker_services = sandbox_info->broker_services; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (broker_services) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!InitBrokerServices(broker_services)) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IMPORTANT: This piece of code needs to run as early as possible in the 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process because it will initialize the sandbox broker, which requires the 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process to swap its window station. During this time all the UI will be 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // broken. This has to run before threads and windows are created. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!command_line.HasSwitch(switches::kNoSandbox)) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_winsta = !command_line.HasSwitch( 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kDisableAltWinstation); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Precreate the desktop and window station used by the renderers. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::TargetPolicy* policy = broker_services->CreatePolicy(); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sandbox::ResultCode result = policy->CreateAlternateDesktop(use_winsta); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(sandbox::SBOX_ERROR_FAILED_TO_SWITCH_BACK_WINSTATION != result); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy->Release(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line.HasSwitch(switches::kNoSandbox)) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sandbox::TargetServices* target_services = sandbox_info->target_services; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InitTargetServices(target_services); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 47