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)38 int 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()58 int 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