| Index: chrome_frame/crash_server_init.cc
|
| ===================================================================
|
| --- chrome_frame/crash_server_init.cc (revision 89645)
|
| +++ chrome_frame/crash_server_init.cc (working copy)
|
| @@ -1,22 +1,75 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| #include "chrome_frame/crash_server_init.h"
|
|
|
| +#include <sddl.h>
|
| +#include <Shlobj.h>
|
| +#include <stdlib.h>
|
| #include "version.h" // NOLINT
|
|
|
| const wchar_t kChromePipeName[] = L"\\\\.\\pipe\\ChromeCrashServices";
|
| const wchar_t kGoogleUpdatePipeName[] = L"\\\\.\\pipe\\GoogleCrashServices\\";
|
| const wchar_t kSystemPrincipalSid[] = L"S-1-5-18";
|
|
|
| -const wchar_t kFullMemoryCrashReport[] = L"full-memory-crash-report";
|
| -
|
| const MINIDUMP_TYPE kLargerDumpType = static_cast<MINIDUMP_TYPE>(
|
| MiniDumpWithProcessThreadData | // Get PEB and TEB.
|
| MiniDumpWithUnloadedModules | // Get unloaded modules when available.
|
| MiniDumpWithIndirectlyReferencedMemory); // Get memory referenced by stack.
|
|
|
| +extern "C" IMAGE_DOS_HEADER __ImageBase;
|
| +
|
| +// Builds a string representation of the user's SID and places it in user_sid.
|
| +bool GetUserSidString(std::wstring* user_sid) {
|
| + bool success = false;
|
| + if (user_sid) {
|
| + struct {
|
| + TOKEN_USER token_user;
|
| + BYTE buffer[SECURITY_MAX_SID_SIZE];
|
| + } token_info_buffer;
|
| +
|
| + HANDLE token = NULL;
|
| + if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) {
|
| + DWORD out_size;
|
| + if (GetTokenInformation(token, TokenUser, &token_info_buffer.token_user,
|
| + sizeof(token_info_buffer), &out_size)) {
|
| + wchar_t* user_sid_value = NULL;
|
| + if (token_info_buffer.token_user.User.Sid &&
|
| + ConvertSidToStringSid(token_info_buffer.token_user.User.Sid,
|
| + &user_sid_value)) {
|
| + *user_sid = user_sid_value;
|
| + LocalFree(user_sid_value);
|
| + user_sid_value = NULL;
|
| + success = true;
|
| + }
|
| + }
|
| + CloseHandle(token);
|
| + }
|
| + }
|
| +
|
| + return success;
|
| +}
|
| +
|
| +bool IsRunningSystemInstall() {
|
| + wchar_t exe_path[MAX_PATH * 2] = {0};
|
| + GetModuleFileName(reinterpret_cast<HMODULE>(&__ImageBase),
|
| + exe_path,
|
| + _countof(exe_path));
|
| +
|
| + bool is_system = false;
|
| +
|
| + wchar_t program_files_path[MAX_PATH] = {0};
|
| + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL,
|
| + SHGFP_TYPE_CURRENT, program_files_path))) {
|
| + if (wcsstr(exe_path, program_files_path) == exe_path) {
|
| + is_system = true;
|
| + }
|
| + }
|
| +
|
| + return is_system;
|
| +}
|
| +
|
| google_breakpad::CustomClientInfo* GetCustomInfo() {
|
| static google_breakpad::CustomInfoEntry ver_entry(
|
| L"ver", TEXT(CHROME_VERSION_STRING));
|
| @@ -31,22 +84,31 @@
|
| }
|
|
|
| google_breakpad::ExceptionHandler* InitializeCrashReporting(
|
| - const wchar_t* cmd_line) {
|
| - if (cmd_line == NULL) {
|
| - return NULL;
|
| - }
|
| -
|
| + CrashReportingMode mode) {
|
| wchar_t temp_path[MAX_PATH + 1] = {0};
|
| DWORD path_len = ::GetTempPath(MAX_PATH, temp_path);
|
|
|
| std::wstring pipe_name;
|
| - if (wcsstr(cmd_line, kFullMemoryCrashReport) != NULL) {
|
| + if (mode == HEADLESS) {
|
| + // This flag is used for testing, connect to the test crash service.
|
| pipe_name = kChromePipeName;
|
| } else {
|
| - // TODO(robertshield): Figure out if we're a per-user install and connect
|
| - // to the per-user named pipe instead.
|
| + // Otherwise, build a pipe name corresponding to either user or
|
| + // system-level Omaha.
|
| pipe_name = kGoogleUpdatePipeName;
|
| - pipe_name += kSystemPrincipalSid;
|
| + if (IsRunningSystemInstall()) {
|
| + pipe_name += kSystemPrincipalSid;
|
| + } else {
|
| + std::wstring user_sid;
|
| + if (GetUserSidString(&user_sid)) {
|
| + pipe_name += user_sid;
|
| + } else {
|
| + // We don't think we're a system install, but we couldn't get the
|
| + // user SID. Try connecting to the system-level crash service as a
|
| + // last ditch effort.
|
| + pipe_name += kSystemPrincipalSid;
|
| + }
|
| + }
|
| }
|
|
|
| google_breakpad::ExceptionHandler* breakpad =
|
|
|