OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/crash/app/breakpad_win.h" | 5 #include "components/crash/app/breakpad_win.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <shellapi.h> | 8 #include <shellapi.h> |
9 #include <tchar.h> | 9 #include <tchar.h> |
10 #include <userenv.h> | 10 #include <userenv.h> |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 } else { | 368 } else { |
369 NtTerminateProcessPtr real_terminate_proc = | 369 NtTerminateProcessPtr real_terminate_proc = |
370 reinterpret_cast<NtTerminateProcessPtr>( | 370 reinterpret_cast<NtTerminateProcessPtr>( |
371 static_cast<char*>(g_real_terminate_process_stub)); | 371 static_cast<char*>(g_real_terminate_process_stub)); |
372 real_terminate_proc(::GetCurrentProcess(), content::RESULT_CODE_KILLED); | 372 real_terminate_proc(::GetCurrentProcess(), content::RESULT_CODE_KILLED); |
373 } | 373 } |
374 } | 374 } |
375 return EXCEPTION_CONTINUE_SEARCH; | 375 return EXCEPTION_CONTINUE_SEARCH; |
376 } | 376 } |
377 | 377 |
| 378 #ifndef _WIN64 |
378 static NTSTATUS WINAPI HookNtTerminateProcess(HANDLE ProcessHandle, | 379 static NTSTATUS WINAPI HookNtTerminateProcess(HANDLE ProcessHandle, |
379 NTSTATUS ExitStatus) { | 380 NTSTATUS ExitStatus) { |
380 if (g_breakpad && | 381 if (g_breakpad && |
381 (ProcessHandle == ::GetCurrentProcess() || ProcessHandle == NULL)) { | 382 (ProcessHandle == ::GetCurrentProcess() || ProcessHandle == NULL)) { |
382 NT_TIB* tib = reinterpret_cast<NT_TIB*>(NtCurrentTeb()); | 383 NT_TIB* tib = reinterpret_cast<NT_TIB*>(NtCurrentTeb()); |
383 void* address_on_stack = _AddressOfReturnAddress(); | 384 void* address_on_stack = _AddressOfReturnAddress(); |
384 if (address_on_stack < tib->StackLimit || | 385 if (address_on_stack < tib->StackLimit || |
385 address_on_stack > tib->StackBase) { | 386 address_on_stack > tib->StackBase) { |
386 g_surrogate_exception_record.ExceptionAddress = _ReturnAddress(); | 387 g_surrogate_exception_record.ExceptionAddress = _ReturnAddress(); |
387 g_surrogate_exception_record.ExceptionCode = DBG_TERMINATE_PROCESS; | 388 g_surrogate_exception_record.ExceptionCode = DBG_TERMINATE_PROCESS; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 DWORD dummy = 0; | 434 DWORD dummy = 0; |
434 CHECK(::VirtualProtect(terminate_process_func_address, | 435 CHECK(::VirtualProtect(terminate_process_func_address, |
435 5, | 436 5, |
436 old_protect, | 437 old_protect, |
437 &dummy)); | 438 &dummy)); |
438 CHECK(::VirtualProtect(g_real_terminate_process_stub, | 439 CHECK(::VirtualProtect(g_real_terminate_process_stub, |
439 sidestep::kMaxPreambleStubSize, | 440 sidestep::kMaxPreambleStubSize, |
440 old_protect, | 441 old_protect, |
441 &old_protect)); | 442 &old_protect)); |
442 } | 443 } |
| 444 #endif |
443 | 445 |
444 static void InitPipeNameEnvVar(bool is_per_user_install) { | 446 static void InitPipeNameEnvVar(bool is_per_user_install) { |
445 scoped_ptr<base::Environment> env(base::Environment::Create()); | 447 scoped_ptr<base::Environment> env(base::Environment::Create()); |
446 if (env->HasVar(kPipeNameVar)) { | 448 if (env->HasVar(kPipeNameVar)) { |
447 // The Breakpad pipe name is already configured: nothing to do. | 449 // The Breakpad pipe name is already configured: nothing to do. |
448 return; | 450 return; |
449 } | 451 } |
450 | 452 |
451 // Check whether configuration management controls crash reporting. | 453 // Check whether configuration management controls crash reporting. |
452 bool crash_reporting_enabled = true; | 454 bool crash_reporting_enabled = true; |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 extern "C" void __declspec(dllexport) __cdecl | 690 extern "C" void __declspec(dllexport) __cdecl |
689 UnregisterNonABICompliantCodeRange(void* start) { | 691 UnregisterNonABICompliantCodeRange(void* start) { |
690 ExceptionHandlerRecord* record = | 692 ExceptionHandlerRecord* record = |
691 reinterpret_cast<ExceptionHandlerRecord*>(start); | 693 reinterpret_cast<ExceptionHandlerRecord*>(start); |
692 | 694 |
693 CHECK(RtlDeleteFunctionTable(&record->runtime_function)); | 695 CHECK(RtlDeleteFunctionTable(&record->runtime_function)); |
694 } | 696 } |
695 #endif | 697 #endif |
696 | 698 |
697 } // namespace breakpad | 699 } // namespace breakpad |
OLD | NEW |