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 16namespace { 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. 21void 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 28void PureCall() { 29 __debugbreak(); 30 _exit(1); 31} 32#pragma optimize("", on) 33 34} // namespace 35 36namespace content { 37 38void 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. 52void 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 59void SetupCRT(const base::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