1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "components/nacl/loader/nacl_helper_win_64.h" 6 7 #include <string> 8 #include <utility> 9 10 #include "base/check.h" 11 #include "base/command_line.h" 12 #include "base/message_loop/message_pump_type.h" 13 #include "base/power_monitor/power_monitor.h" 14 #include "base/power_monitor/power_monitor_device_source.h" 15 #include "base/process/launch.h" 16 #include "base/process/memory.h" 17 #include "base/strings/string_util.h" 18 #include "base/task/single_thread_task_executor.h" 19 #include "base/timer/hi_res_timer_manager.h" 20 #include "base/win/process_startup_helper.h" 21 #include "components/nacl/broker/nacl_broker_listener.h" 22 #include "components/nacl/common/nacl_switches.h" 23 #include "components/nacl/loader/nacl_listener.h" 24 #include "components/nacl/loader/nacl_main_platform_delegate.h" 25 #include "content/public/app/sandbox_helper_win.h" 26 #include "content/public/common/content_switches.h" 27 #include "content/public/common/main_function_params.h" 28 #include "content/public/common/sandbox_init.h" 29 #include "mojo/core/embedder/embedder.h" 30 #include "sandbox/policy/sandbox.h" 31 #include "sandbox/win/src/sandbox_types.h" 32 33 extern int NaClMain(const content::MainFunctionParams&); 34 35 namespace { 36 // main() routine for the NaCl broker process. 37 // This is necessary for supporting NaCl in Chrome on Win64. NaClBrokerMain(const content::MainFunctionParams & parameters)38int NaClBrokerMain(const content::MainFunctionParams& parameters) { 39 base::SingleThreadTaskExecutor io_task_executor(base::MessagePumpType::IO); 40 base::PlatformThread::SetName("CrNaClBrokerMain"); 41 42 mojo::core::Init(); 43 44 base::PowerMonitor::Initialize( 45 std::make_unique<base::PowerMonitorDeviceSource>()); 46 base::HighResolutionTimerManager hi_res_timer_manager; 47 48 NaClBrokerListener listener; 49 listener.Listen(); 50 51 return 0; 52 } 53 54 } // namespace 55 56 namespace nacl { 57 NaClWin64Main()58int NaClWin64Main() { 59 sandbox::SandboxInterfaceInfo sandbox_info = {nullptr}; 60 content::InitializeSandboxInfo(&sandbox_info); 61 62 const base::CommandLine& command_line = 63 *base::CommandLine::ForCurrentProcess(); 64 std::string process_type = 65 command_line.GetSwitchValueASCII(switches::kProcessType); 66 67 // Copy what ContentMain() does. 68 base::EnableTerminationOnHeapCorruption(); 69 base::EnableTerminationOnOutOfMemory(); 70 base::win::RegisterInvalidParamHandler(); 71 base::win::SetupCRT(command_line); 72 // Route stdio to parent console (if any) or create one. 73 if (command_line.HasSwitch(switches::kEnableLogging)) 74 base::RouteStdioToConsole(true); 75 76 // Initialize the sandbox for this process. 77 bool sandbox_initialized_ok = sandbox::policy::Sandbox::Initialize( 78 sandbox::policy::SandboxTypeFromCommandLine(command_line), &sandbox_info); 79 80 // Die if the sandbox can't be enabled. 81 CHECK(sandbox_initialized_ok) << "Error initializing sandbox for " 82 << process_type; 83 content::MainFunctionParams main_params(command_line); 84 main_params.sandbox_info = &sandbox_info; 85 86 if (process_type == switches::kNaClLoaderProcess) 87 return NaClMain(main_params); 88 89 if (process_type == switches::kNaClBrokerProcess) 90 return NaClBrokerMain(main_params); 91 92 CHECK(false) << "Unknown NaCl 64 process."; 93 return -1; 94 } 95 96 } // namespace nacl 97