Chromium Code Reviews| Index: chrome/installer/setup/setup_util.cc |
| diff --git a/chrome/installer/setup/setup_util.cc b/chrome/installer/setup/setup_util.cc |
| index 233287bf519375396cf4082baa66791711886c63..96fa306622bb04a0a367b3995c3c6b6a6bf4a1f9 100644 |
| --- a/chrome/installer/setup/setup_util.cc |
| +++ b/chrome/installer/setup/setup_util.cc |
| @@ -11,6 +11,8 @@ |
| #include <algorithm> |
| #include <iterator> |
| +#include <limits> |
| +#include <memory> |
| #include <set> |
| #include <string> |
| @@ -36,6 +38,7 @@ |
| #include "chrome/installer/setup/user_hive_visitor.h" |
| #include "chrome/installer/util/app_registration_data.h" |
| #include "chrome/installer/util/google_update_constants.h" |
| +#include "chrome/installer/util/install_util.h" |
| #include "chrome/installer/util/installation_state.h" |
| #include "chrome/installer/util/master_preferences.h" |
| #include "chrome/installer/util/master_preferences_constants.h" |
| @@ -47,6 +50,24 @@ namespace installer { |
| namespace { |
| +// Event log providers registry location. |
| +constexpr wchar_t kEventLogProvidersRegPath[] = |
| + L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\"; |
| + |
| +// TODO(grt): use install_static::InstallDetails::Get().install_full_name() when |
| +// InstallDetails is initialized in the installer. |
| +base::string16 InstallFullName() { |
| + base::string16 reg_path(kEventLogProvidersRegPath); |
|
grt (UTC plus 2)
2016/12/16 13:03:58
remove
pastarmovj
2016/12/16 14:58:12
Done.
|
| +#if defined(GOOGLE_CHROME_BUILD) |
| + reg_path = L"Chrome"; |
| + if (InstallUtil::IsChromeSxSProcess()) |
| + reg_path.append(L" SxS"); |
| +#else |
| + reg_path = L"Chromium"; |
| +#endif |
| + return reg_path; |
| +} |
| + |
| // Returns true if product |type| cam be meaningfully installed without the |
| // --multi-install flag. |
| bool SupportsSingleInstall(BrowserDistribution::Type type) { |
| @@ -660,6 +681,58 @@ void RecordUnPackMetrics(UnPackStatus unpack_status, |
| ->Add(status); |
| } |
| +void RegisterEventLogProvider(const base::FilePath& install_directory, |
| + const base::Version& version) { |
| + base::string16 reg_path(kEventLogProvidersRegPath); |
| + reg_path.append(InstallFullName()); |
| + VLOG(1) << "Registering Chrome's event log provider at " << reg_path; |
| + |
| + std::unique_ptr<WorkItemList> work_item_list(WorkItem::CreateWorkItemList()); |
| + work_item_list->set_log_message("Register event log provider"); |
| + |
| + work_item_list->AddCreateRegKeyWorkItem(HKEY_LOCAL_MACHINE, reg_path, |
| + WorkItem::kWow64Default); |
| + // Speicifes the number of event categories defined in the dll. |
| + work_item_list->AddSetRegValueWorkItem( |
| + HKEY_LOCAL_MACHINE, reg_path, WorkItem::kWow64Default, L"CategoryCount", |
| + static_cast<DWORD>(1), true); |
| + // Specifies the event type emitted by this event source. |
| + work_item_list->AddSetRegValueWorkItem( |
| + HKEY_LOCAL_MACHINE, reg_path, WorkItem::kWow64Default, L"TypesSupported", |
| + static_cast<DWORD>(EVENTLOG_ERROR_TYPE | EVENTLOG_INFORMATION_TYPE | |
| + EVENTLOG_WARNING_TYPE), |
| + true); |
| + |
| + const base::FilePath provider( |
| + install_directory.AppendASCII(version.GetString()) |
| + .Append(FILE_PATH_LITERAL("eventlog_provider.dll"))); |
| + |
| + static constexpr const wchar_t* kFileKeys[] = { |
| + L"CategoryMessageFile", L"EventMessageFile", L"ParameterMessageFile", |
| + }; |
| + for (const wchar_t* file_key : kFileKeys) { |
| + work_item_list->AddSetRegValueWorkItem(HKEY_LOCAL_MACHINE, reg_path, |
| + WorkItem::kWow64Default, file_key, |
| + provider.value(), true); |
| + } |
| + |
| + // if the operation fails we log the error but still continue because none of |
| + // these are critical for the proper operation of the browser. |
| + if (!work_item_list->Do()) |
| + work_item_list->Rollback(); |
| +} |
| + |
| +void DeRegisterEventLogProvider() { |
| + base::string16 reg_path(kEventLogProvidersRegPath); |
| + reg_path.append(InstallFullName()); |
| + |
| + // TODO(http://crbug.com/668120): If the Event Viewer is open the provider dll |
| + // will fail to get deleted. This doesn't fail the uninstallation altogether |
| + // but leaves files behind. |
| + InstallUtil::DeleteRegistryKey(HKEY_LOCAL_MACHINE, reg_path, |
| + WorkItem::kWow64Default); |
| +} |
| + |
| ScopedTokenPrivilege::ScopedTokenPrivilege(const wchar_t* privilege_name) |
| : is_enabled_(false) { |
| HANDLE temp_handle; |