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.
5 #include "chrome_frame/crash_server_init.h"
10 #include "version.h" // NOLINT
12 const wchar_t kChromePipeName
[] = L
"\\\\.\\pipe\\ChromeCrashServices";
13 const wchar_t kGoogleUpdatePipeName
[] = L
"\\\\.\\pipe\\GoogleCrashServices\\";
14 const wchar_t kSystemPrincipalSid
[] = L
"S-1-5-18";
16 const MINIDUMP_TYPE kLargerDumpType
= static_cast<MINIDUMP_TYPE
>(
17 MiniDumpWithProcessThreadData
| // Get PEB and TEB.
18 MiniDumpWithUnloadedModules
| // Get unloaded modules when available.
19 MiniDumpWithIndirectlyReferencedMemory
); // Get memory referenced by stack.
21 extern "C" IMAGE_DOS_HEADER __ImageBase
;
23 // Builds a string representation of the user's SID and places it in user_sid.
24 bool GetUserSidString(std::wstring
* user_sid
) {
28 TOKEN_USER token_user
;
29 BYTE buffer
[SECURITY_MAX_SID_SIZE
];
33 if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY
, &token
)) {
35 if (GetTokenInformation(token
, TokenUser
, &token_info_buffer
.token_user
,
36 sizeof(token_info_buffer
), &out_size
)) {
37 wchar_t* user_sid_value
= NULL
;
38 if (token_info_buffer
.token_user
.User
.Sid
&&
39 ConvertSidToStringSid(token_info_buffer
.token_user
.User
.Sid
,
41 *user_sid
= user_sid_value
;
42 LocalFree(user_sid_value
);
43 user_sid_value
= NULL
;
54 bool IsRunningSystemInstall() {
55 wchar_t exe_path
[MAX_PATH
* 2] = {0};
56 GetModuleFileName(reinterpret_cast<HMODULE
>(&__ImageBase
),
60 bool is_system
= false;
62 wchar_t program_files_path
[MAX_PATH
] = {0};
63 if (SUCCEEDED(SHGetFolderPath(NULL
, CSIDL_PROGRAM_FILES
, NULL
,
64 SHGFP_TYPE_CURRENT
, program_files_path
))) {
65 if (wcsstr(exe_path
, program_files_path
) == exe_path
) {
73 google_breakpad::CustomClientInfo
* GetCustomInfo() {
74 static google_breakpad::CustomInfoEntry
ver_entry(
75 L
"ver", TEXT(CHROME_VERSION_STRING
));
76 static google_breakpad::CustomInfoEntry
prod_entry(L
"prod", L
"ChromeFrame");
77 static google_breakpad::CustomInfoEntry
plat_entry(L
"plat", L
"Win32");
78 static google_breakpad::CustomInfoEntry
type_entry(L
"ptype", L
"chrome_frame");
79 static google_breakpad::CustomInfoEntry entries
[] = {
80 ver_entry
, prod_entry
, plat_entry
, type_entry
};
81 static google_breakpad::CustomClientInfo custom_info
= {
82 entries
, ARRAYSIZE(entries
) };
86 google_breakpad::ExceptionHandler
* InitializeCrashReporting(
87 CrashReportingMode mode
) {
88 wchar_t temp_path
[MAX_PATH
+ 1] = {0};
89 DWORD path_len
= ::GetTempPath(MAX_PATH
, temp_path
);
91 std::wstring pipe_name
;
92 if (mode
== HEADLESS
) {
93 // This flag is used for testing, connect to the test crash service.
94 pipe_name
= kChromePipeName
;
96 // Otherwise, build a pipe name corresponding to either user or
97 // system-level Omaha.
98 pipe_name
= kGoogleUpdatePipeName
;
99 if (IsRunningSystemInstall()) {
100 pipe_name
+= kSystemPrincipalSid
;
102 std::wstring user_sid
;
103 if (GetUserSidString(&user_sid
)) {
104 pipe_name
+= user_sid
;
106 // We don't think we're a system install, but we couldn't get the
107 // user SID. Try connecting to the system-level crash service as a
108 // last ditch effort.
109 pipe_name
+= kSystemPrincipalSid
;
114 google_breakpad::ExceptionHandler
* breakpad
=
115 new google_breakpad::ExceptionHandler(
116 temp_path
, NULL
, NULL
, NULL
,
117 google_breakpad::ExceptionHandler::HANDLER_ALL
, kLargerDumpType
,
118 pipe_name
.c_str(), GetCustomInfo());