Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Side by Side Diff: chrome/installer/setup/setup_main.cc

Issue 6045005: Add support for reporting crashes in the Chrome installer. This basically inv... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/chrome_installer.gypi ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 <windows.h> 5 #include <windows.h>
6 #include <msi.h> 6 #include <msi.h>
7 #include <shellapi.h> 7 #include <shellapi.h>
8 #include <shlobj.h> 8 #include <shlobj.h>
9 9
10 #include <string> 10 #include <string>
11 11
12 #include "base/at_exit.h" 12 #include "base/at_exit.h"
13 #include "base/basictypes.h" 13 #include "base/basictypes.h"
14 #include "base/command_line.h" 14 #include "base/command_line.h"
15 #include "base/file_util.h" 15 #include "base/file_util.h"
16 #include "base/file_version_info.h"
16 #include "base/path_service.h" 17 #include "base/path_service.h"
17 #include "base/process_util.h" 18 #include "base/process_util.h"
18 #include "base/scoped_handle_win.h" 19 #include "base/scoped_handle_win.h"
19 #include "base/string_number_conversions.h" 20 #include "base/string_number_conversions.h"
20 #include "base/string_util.h" 21 #include "base/string_util.h"
21 #include "base/utf_string_conversions.h" 22 #include "base/utf_string_conversions.h"
22 #include "base/values.h" 23 #include "base/values.h"
24 #include "base/win_util.h"
23 #include "base/win/windows_version.h" 25 #include "base/win/windows_version.h"
26 #include "breakpad/src/client/windows/handler/exception_handler.h"
24 #include "chrome/common/chrome_switches.h" 27 #include "chrome/common/chrome_switches.h"
25 #include "chrome/installer/setup/install.h" 28 #include "chrome/installer/setup/install.h"
26 #include "chrome/installer/setup/setup_constants.h" 29 #include "chrome/installer/setup/setup_constants.h"
27 #include "chrome/installer/setup/setup_util.h" 30 #include "chrome/installer/setup/setup_util.h"
28 #include "chrome/installer/setup/uninstall.h" 31 #include "chrome/installer/setup/uninstall.h"
29 #include "chrome/installer/util/browser_distribution.h" 32 #include "chrome/installer/util/browser_distribution.h"
30 #include "chrome/installer/util/delete_after_reboot_helper.h" 33 #include "chrome/installer/util/delete_after_reboot_helper.h"
31 #include "chrome/installer/util/delete_tree_work_item.h" 34 #include "chrome/installer/util/delete_tree_work_item.h"
32 #include "chrome/installer/util/google_update_settings.h" 35 #include "chrome/installer/util/google_update_settings.h"
33 #include "chrome/installer/util/google_update_constants.h" 36 #include "chrome/installer/util/google_update_constants.h"
(...skipping 11 matching lines...) Expand all
45 48
46 #include "installer_util_strings.h" // NOLINT 49 #include "installer_util_strings.h" // NOLINT
47 50
48 using installer::Product; 51 using installer::Product;
49 using installer::ProductPackageMapping; 52 using installer::ProductPackageMapping;
50 using installer::Products; 53 using installer::Products;
51 using installer::Package; 54 using installer::Package;
52 using installer::Packages; 55 using installer::Packages;
53 using installer::MasterPreferences; 56 using installer::MasterPreferences;
54 57
58 const wchar_t kChromePipeName[] = L"\\\\.\\pipe\\ChromeCrashServices";
59 const wchar_t kGoogleUpdatePipeName[] = L"\\\\.\\pipe\\GoogleCrashServices\\";
60 const wchar_t kSystemPrincipalSid[] = L"S-1-5-18";
61
62 const MINIDUMP_TYPE kLargerDumpType = static_cast<MINIDUMP_TYPE>(
63 MiniDumpWithProcessThreadData | // Get PEB and TEB.
64 MiniDumpWithUnloadedModules | // Get unloaded modules when available.
65 MiniDumpWithIndirectlyReferencedMemory); // Get memory referenced by stack.
66
55 namespace { 67 namespace {
56 68
57 // This method unpacks and uncompresses the given archive file. For Chrome 69 // This method unpacks and uncompresses the given archive file. For Chrome
58 // install we are creating a uncompressed archive that contains all the files 70 // install we are creating a uncompressed archive that contains all the files
59 // needed for the installer. This uncompressed archive is later compressed. 71 // needed for the installer. This uncompressed archive is later compressed.
60 // 72 //
61 // This method first uncompresses archive specified by parameter "archive" 73 // This method first uncompresses archive specified by parameter "archive"
62 // and assumes that it will result in an uncompressed full archive file 74 // and assumes that it will result in an uncompressed full archive file
63 // (chrome.7z) or uncompressed archive patch file (chrome_patch.diff). If it 75 // (chrome.7z) or uncompressed archive patch file (chrome_patch.diff). If it
64 // is patch file, it is applied to the old archive file that should be 76 // is patch file, it is applied to the old archive file that should be
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 VLOG(1) << "Install distribution: Chrome"; 707 VLOG(1) << "Install distribution: Chrome";
696 installations->AddDistribution(BrowserDistribution::CHROME_BROWSER, prefs); 708 installations->AddDistribution(BrowserDistribution::CHROME_BROWSER, prefs);
697 } 709 }
698 710
699 if (prefs.install_chrome_frame()) { 711 if (prefs.install_chrome_frame()) {
700 VLOG(1) << "Install distribution: Chrome Frame"; 712 VLOG(1) << "Install distribution: Chrome Frame";
701 installations->AddDistribution(BrowserDistribution::CHROME_FRAME, prefs); 713 installations->AddDistribution(BrowserDistribution::CHROME_FRAME, prefs);
702 } 714 }
703 } 715 }
704 716
717 // Returns the Custom information for the client identified by the exe path
718 // passed in. This information is used for crash reporting.
719 google_breakpad::CustomClientInfo* GetCustomInfo(const wchar_t* exe_path) {
720 std::wstring product;
721 std::wstring version;
722 scoped_ptr<FileVersionInfo>
723 version_info(FileVersionInfo::CreateFileVersionInfo(FilePath(exe_path)));
724 if (version_info.get()) {
725 version = version_info->product_version();
726 product = version_info->product_short_name();
727 }
728
729 if (version.empty())
730 version = L"0.1.0.0";
731
732 if (product.empty())
733 product = L"Chrome installer";
robertshield 2010/12/22 19:02:00 microscopic nit: "Chrome Installer" here and on li
ananta 2010/12/22 19:13:01 Done.
734
735 static google_breakpad::CustomInfoEntry ver_entry(L"ver", version.c_str());
736 static google_breakpad::CustomInfoEntry prod_entry(L"prod", product.c_str());
737 static google_breakpad::CustomInfoEntry plat_entry(L"plat", L"Win32");
738 static google_breakpad::CustomInfoEntry type_entry(L"ptype",
739 L"Chrome installer");
740 static google_breakpad::CustomInfoEntry entries[] = {
741 ver_entry, prod_entry, plat_entry, type_entry };
742 static google_breakpad::CustomClientInfo custom_info = {
743 entries, arraysize(entries) };
744 return &custom_info;
745 }
746
747 // Initialize crash reporting for this process. This involves connecting to
748 // breakpad, etc.
749 google_breakpad::ExceptionHandler* InitializeCrashReporting(
750 bool system_install) {
751 // Only report crashes if the user allows it.
752 if (!GoogleUpdateSettings::GetCollectStatsConsent())
753 return NULL;
754
755 // Get the alternate dump directory. We use the temp path.
756 FilePath temp_directory;
757 if (!file_util::GetTempDir(&temp_directory) || temp_directory.empty())
758 return NULL;
759
760 wchar_t exe_path[MAX_PATH * 2] = {0};
761 GetModuleFileName(NULL, exe_path, arraysize(exe_path));
762
763 // Build the pipe name. It can be either:
764 // System-wide install: "NamedPipe\GoogleCrashServices\S-1-5-18"
765 // Per-user install: "NamedPipe\GoogleCrashServices\<user SID>"
766 std::wstring user_sid = kSystemPrincipalSid;
767
768 if (system_install) {
769 user_sid = kSystemPrincipalSid;
robertshield 2010/12/22 19:02:00 Don't need this line since the user_sid is initial
ananta 2010/12/22 19:13:01 Done.
770 } else {
771 if (!win_util::GetUserSidString(&user_sid)) {
772 return NULL;
773 }
774 }
775
776 std::wstring pipe_name = kGoogleUpdatePipeName;
777 pipe_name += user_sid;
778
779 google_breakpad::ExceptionHandler* breakpad =
780 new google_breakpad::ExceptionHandler(
781 temp_directory.ToWStringHack(), NULL, NULL, NULL,
782 google_breakpad::ExceptionHandler::HANDLER_ALL, kLargerDumpType,
783 pipe_name.c_str(), GetCustomInfo(exe_path));
784 return breakpad;
785 }
786
705 } // namespace 787 } // namespace
706 788
707 int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance, 789 int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance,
708 wchar_t* command_line, int show_command) { 790 wchar_t* command_line, int show_command) {
709 // The exit manager is in charge of calling the dtors of singletons. 791 // The exit manager is in charge of calling the dtors of singletons.
710 base::AtExitManager exit_manager; 792 base::AtExitManager exit_manager;
711 CommandLine::Init(0, NULL); 793 CommandLine::Init(0, NULL);
712 794
713 const MasterPreferences& prefs = 795 const MasterPreferences& prefs =
714 installer::MasterPreferences::ForCurrentProcess(); 796 installer::MasterPreferences::ForCurrentProcess();
715 installer::InitInstallerLogging(prefs); 797 installer::InitInstallerLogging(prefs);
716 798
717 const CommandLine& cmd_line = *CommandLine::ForCurrentProcess(); 799 const CommandLine& cmd_line = *CommandLine::ForCurrentProcess();
718 VLOG(1) << "Command Line: " << cmd_line.command_line_string(); 800 VLOG(1) << "Command Line: " << cmd_line.command_line_string();
719 801
720 VLOG(1) << "multi install is " << prefs.is_multi_install(); 802 VLOG(1) << "multi install is " << prefs.is_multi_install();
721 bool system_install = false; 803 bool system_install = false;
722 prefs.GetBool(installer::master_preferences::kSystemLevel, &system_install); 804 prefs.GetBool(installer::master_preferences::kSystemLevel, &system_install);
723 VLOG(1) << "system install is " << system_install; 805 VLOG(1) << "system install is " << system_install;
724 806
807 google_breakpad::scoped_ptr<google_breakpad::ExceptionHandler> breakpad(
808 InitializeCrashReporting(system_install));
809
725 ProductPackageMapping installations(prefs.is_multi_install(), system_install); 810 ProductPackageMapping installations(prefs.is_multi_install(), system_install);
726 PopulateInstallations(prefs, &installations); 811 PopulateInstallations(prefs, &installations);
727 812
728 // Check to make sure current system is WinXP or later. If not, log 813 // Check to make sure current system is WinXP or later. If not, log
729 // error message and get out. 814 // error message and get out.
730 if (!InstallUtil::IsOSSupported()) { 815 if (!InstallUtil::IsOSSupported()) {
731 LOG(ERROR) << "Chrome only supports Windows XP or later."; 816 LOG(ERROR) << "Chrome only supports Windows XP or later.";
732 installations.packages()[0]->WriteInstallerResult( 817 installations.packages()[0]->WriteInstallerResult(
733 installer::OS_NOT_SUPPORTED, IDS_INSTALL_OS_NOT_SUPPORTED_BASE, NULL); 818 installer::OS_NOT_SUPPORTED, IDS_INSTALL_OS_NOT_SUPPORTED_BASE, NULL);
734 return installer::OS_NOT_SUPPORTED; 819 return installer::OS_NOT_SUPPORTED;
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 // to pass through, since this is only returned on uninstall which is 916 // to pass through, since this is only returned on uninstall which is
832 // never invoked directly by Google Update. 917 // never invoked directly by Google Update.
833 return_code = InstallUtil::GetInstallReturnCode(install_status); 918 return_code = InstallUtil::GetInstallReturnCode(install_status);
834 } 919 }
835 } 920 }
836 921
837 VLOG(1) << "Installation complete, returning: " << return_code; 922 VLOG(1) << "Installation complete, returning: " << return_code;
838 923
839 return return_code; 924 return return_code;
840 } 925 }
OLDNEW
« no previous file with comments | « chrome/chrome_installer.gypi ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698