| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/app/breakpad_win.h" | 5 #include "chrome/app/breakpad_win.h" |
| 6 | 6 |
| 7 #include <shellapi.h> | 7 #include <shellapi.h> |
| 8 #include <tchar.h> | 8 #include <tchar.h> |
| 9 #include <userenv.h> | 9 #include <userenv.h> |
| 10 #include <windows.h> | 10 #include <windows.h> |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 | 98 |
| 99 EXCEPTION_POINTERS g_surrogate_exception_pointers = {0}; | 99 EXCEPTION_POINTERS g_surrogate_exception_pointers = {0}; |
| 100 EXCEPTION_RECORD g_surrogate_exception_record = {0}; | 100 EXCEPTION_RECORD g_surrogate_exception_record = {0}; |
| 101 CONTEXT g_surrogate_context = {0}; | 101 CONTEXT g_surrogate_context = {0}; |
| 102 | 102 |
| 103 typedef NTSTATUS (WINAPI* NtTerminateProcessPtr)(HANDLE ProcessHandle, | 103 typedef NTSTATUS (WINAPI* NtTerminateProcessPtr)(HANDLE ProcessHandle, |
| 104 NTSTATUS ExitStatus); | 104 NTSTATUS ExitStatus); |
| 105 char* g_real_terminate_process_stub = NULL; | 105 char* g_real_terminate_process_stub = NULL; |
| 106 | 106 |
| 107 static size_t g_client_id_offset = 0; | 107 static size_t g_client_id_offset = 0; |
| 108 static size_t g_printer_info_offset = 0; |
| 108 static size_t g_num_switches_offset = 0; | 109 static size_t g_num_switches_offset = 0; |
| 109 static size_t g_switches_offset = 0; | 110 static size_t g_switches_offset = 0; |
| 110 static size_t g_dynamic_keys_offset = 0; | 111 static size_t g_dynamic_keys_offset = 0; |
| 111 typedef std::map<std::wstring, google_breakpad::CustomInfoEntry*> | 112 typedef std::map<std::wstring, google_breakpad::CustomInfoEntry*> |
| 112 DynamicEntriesMap; | 113 DynamicEntriesMap; |
| 113 DynamicEntriesMap* g_dynamic_entries = NULL; | 114 DynamicEntriesMap* g_dynamic_entries = NULL; |
| 114 // Allow for 128 entries. POSIX uses 64 entries of 256 bytes, so Windows needs | 115 // Allow for 128 entries. POSIX uses 64 entries of 256 bytes, so Windows needs |
| 115 // 256 entries of 64 bytes to match. See CustomInfoEntry::kValueMaxLength in | 116 // 256 entries of 64 bytes to match. See CustomInfoEntry::kValueMaxLength in |
| 116 // Breakpad. | 117 // Breakpad. |
| 117 const size_t kMaxDynamicEntries = 256; | 118 const size_t kMaxDynamicEntries = 256; |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 L"profile-type", GetProfileType().c_str())); | 451 L"profile-type", GetProfileType().c_str())); |
| 451 | 452 |
| 452 if (g_deferred_crash_uploads) | 453 if (g_deferred_crash_uploads) |
| 453 g_custom_entries->push_back( | 454 g_custom_entries->push_back( |
| 454 google_breakpad::CustomInfoEntry(L"deferred-upload", L"true")); | 455 google_breakpad::CustomInfoEntry(L"deferred-upload", L"true")); |
| 455 | 456 |
| 456 if (!special_build.empty()) | 457 if (!special_build.empty()) |
| 457 g_custom_entries->push_back(google_breakpad::CustomInfoEntry( | 458 g_custom_entries->push_back(google_breakpad::CustomInfoEntry( |
| 458 L"special", UTF16ToWide(special_build).c_str())); | 459 L"special", UTF16ToWide(special_build).c_str())); |
| 459 | 460 |
| 461 // Add empty values for the prn_info-*. We'll put the actual values when we |
| 462 // collect them at this location. |
| 463 g_printer_info_offset = g_custom_entries->size(); |
| 464 // one-based index for the name suffix. |
| 465 for (size_t i = 1; i <= kMaxReportedPrinterRecords; ++i) { |
| 466 g_custom_entries->push_back( |
| 467 google_breakpad::CustomInfoEntry( |
| 468 base::StringPrintf(L"prn-info-%d", i).c_str(), L"")); |
| 469 } |
| 470 |
| 460 // Read the id from registry. If reporting has never been enabled | 471 // Read the id from registry. If reporting has never been enabled |
| 461 // the result will be empty string. Its OK since when user enables reporting | 472 // the result will be empty string. Its OK since when user enables reporting |
| 462 // we will insert the new value at this location. | 473 // we will insert the new value at this location. |
| 463 std::wstring guid = | 474 std::wstring guid = |
| 464 base::UTF16ToWide(breakpad::GetBreakpadClient()->GetCrashGUID()); | 475 base::UTF16ToWide(breakpad::GetBreakpadClient()->GetCrashGUID()); |
| 465 g_client_id_offset = g_custom_entries->size(); | 476 g_client_id_offset = g_custom_entries->size(); |
| 466 g_custom_entries->push_back( | 477 g_custom_entries->push_back( |
| 467 google_breakpad::CustomInfoEntry(L"guid", guid.c_str())); | 478 google_breakpad::CustomInfoEntry(L"guid", guid.c_str())); |
| 468 | 479 |
| 469 // Add empty values for the command line switches. We will fill them with | 480 // Add empty values for the command line switches. We will fill them with |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 return; | 646 return; |
| 636 | 647 |
| 637 if (!g_custom_entries) | 648 if (!g_custom_entries) |
| 638 return; | 649 return; |
| 639 | 650 |
| 640 base::wcslcpy((*g_custom_entries)[g_client_id_offset].value, | 651 base::wcslcpy((*g_custom_entries)[g_client_id_offset].value, |
| 641 client_id, | 652 client_id, |
| 642 google_breakpad::CustomInfoEntry::kValueMaxLength); | 653 google_breakpad::CustomInfoEntry::kValueMaxLength); |
| 643 } | 654 } |
| 644 | 655 |
| 656 extern "C" void __declspec(dllexport) __cdecl SetPrinterInfo( |
| 657 const wchar_t* printer_info) { |
| 658 if (!g_custom_entries) |
| 659 return; |
| 660 std::vector<string16> info; |
| 661 base::SplitString(printer_info, L';', &info); |
| 662 DCHECK_LE(info.size(), kMaxReportedPrinterRecords); |
| 663 info.resize(kMaxReportedPrinterRecords); |
| 664 for (size_t i = 0; i < info.size(); ++i) { |
| 665 base::wcslcpy((*g_custom_entries)[g_printer_info_offset + i].value, |
| 666 info[i].c_str(), |
| 667 google_breakpad::CustomInfoEntry::kValueMaxLength); |
| 668 } |
| 669 } |
| 670 |
| 645 // NOTE: This function is used by SyzyASAN to annotate crash reports. If you | 671 // NOTE: This function is used by SyzyASAN to annotate crash reports. If you |
| 646 // change the name or signature of this function you will break SyzyASAN | 672 // change the name or signature of this function you will break SyzyASAN |
| 647 // instrumented releases of Chrome. Please contact syzygy-team@chromium.org | 673 // instrumented releases of Chrome. Please contact syzygy-team@chromium.org |
| 648 // before doing so! | 674 // before doing so! |
| 649 extern "C" void __declspec(dllexport) __cdecl SetCrashKeyValueImpl( | 675 extern "C" void __declspec(dllexport) __cdecl SetCrashKeyValueImpl( |
| 650 const wchar_t* key, const wchar_t* value) { | 676 const wchar_t* key, const wchar_t* value) { |
| 651 // CustomInfoEntry limits the length of key and value. If they exceed | 677 // CustomInfoEntry limits the length of key and value. If they exceed |
| 652 // their maximum length the underlying string handling functions raise | 678 // their maximum length the underlying string handling functions raise |
| 653 // an exception and prematurely trigger a crash. Truncate here. | 679 // an exception and prematurely trigger a crash. Truncate here. |
| 654 std::wstring safe_key(std::wstring(key).substr( | 680 std::wstring safe_key(std::wstring(key).substr( |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 previous_filter = SetUnhandledExceptionFilter(filter); | 1032 previous_filter = SetUnhandledExceptionFilter(filter); |
| 1007 } | 1033 } |
| 1008 | 1034 |
| 1009 void StringVectorToCStringVector(const std::vector<std::wstring>& wstrings, | 1035 void StringVectorToCStringVector(const std::vector<std::wstring>& wstrings, |
| 1010 std::vector<const wchar_t*>* cstrings) { | 1036 std::vector<const wchar_t*>* cstrings) { |
| 1011 cstrings->clear(); | 1037 cstrings->clear(); |
| 1012 cstrings->reserve(wstrings.size()); | 1038 cstrings->reserve(wstrings.size()); |
| 1013 for (size_t i = 0; i < wstrings.size(); ++i) | 1039 for (size_t i = 0; i < wstrings.size(); ++i) |
| 1014 cstrings->push_back(wstrings[i].c_str()); | 1040 cstrings->push_back(wstrings[i].c_str()); |
| 1015 } | 1041 } |
| OLD | NEW |