1 // Copyright (c) 2011 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 "content/public/app/startup_helper_win.h" 6 7 #include <crtdbg.h> 8 #include <new.h> 9 10 #include "base/base_switches.h" 11 #include "base/command_line.h" 12 #include "base/win/windows_version.h" 13 #include "sandbox/win/src/process_mitigations.h" 14 #include "sandbox/win/src/sandbox_factory.h" 15 16 namespace { 17 18 #pragma optimize("", off) 19 // Handlers for invalid parameter and pure call. They generate a breakpoint to 20 // tell breakpad that it needs to dump the process. 21 void InvalidParameter(const wchar_t* expression, const wchar_t* function, 22 const wchar_t* file, unsigned int line, 23 uintptr_t reserved) { 24 __debugbreak(); 25 _exit(1); 26 } 27 28 void PureCall() { 29 __debugbreak(); 30 _exit(1); 31 } 32 #pragma optimize("", on) 33 34 } // namespace 35 36 namespace content { 37 38 void InitializeSandboxInfo(sandbox::SandboxInterfaceInfo* info) { 39 info->broker_services = sandbox::SandboxFactory::GetBrokerServices(); 40 if (!info->broker_services) { 41 info->target_services = sandbox::SandboxFactory::GetTargetServices(); 42 } else { 43 // Ensure the proper mitigations are enforced for the browser process. 44 sandbox::ApplyProcessMitigationsToCurrentProcess( 45 sandbox::MITIGATION_DEP | 46 sandbox::MITIGATION_DEP_NO_ATL_THUNK); 47 } 48 } 49 50 // Register the invalid param handler and pure call handler to be able to 51 // notify breakpad when it happens. 52 void RegisterInvalidParamHandler() { 53 _set_invalid_parameter_handler(InvalidParameter); 54 _set_purecall_handler(PureCall); 55 // Also enable the new handler for malloc() based failures. 56 _set_new_mode(1); 57 } 58 59 void SetupCRT(const CommandLine& command_line) { 60 #if defined(_CRTDBG_MAP_ALLOC) 61 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); 62 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); 63 #else 64 if (!command_line.HasSwitch(switches::kDisableBreakpad)) { 65 _CrtSetReportMode(_CRT_ASSERT, 0); 66 } 67 #endif 68 } 69 70 } // namespace content 71