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

Unified Diff: chrome_elf/chrome_elf_util.cc

Issue 154653002: Breakpad coverage for chrome_elf start up (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reg key checks Created 6 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: chrome_elf/chrome_elf_util.cc
diff --git a/chrome_elf/chrome_elf_util.cc b/chrome_elf/chrome_elf_util.cc
new file mode 100644
index 0000000000000000000000000000000000000000..db0884449515cb6b6b3f944bf0a6465884107f28
--- /dev/null
+++ b/chrome_elf/chrome_elf_util.cc
@@ -0,0 +1,92 @@
+// Copyright 2014 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_elf/chrome_elf_util.h"
+
+#include "base/strings/string16.h"
+#include "base/win/registry.h"
robertshield 2014/02/11 22:26:58 To double check: this doesn't add any new dependen
Cait (Slow) 2014/02/12 19:15:41 It does :( I've removed it, and reinvented a few w
+
+namespace {
+
+const wchar_t kRegPathClients[] = L"Software\\Google\\Update\\Clients";
+const wchar_t kRegPathClientState[] = L"Software\\Google\\Update\\ClientState";
+const wchar_t kRegPathClientStateMedium[] =
+ L"Software\\Google\\Update\\ClientStateMedium";
+const wchar_t kRegValueUsageStats[] = L"usagestats";
+const wchar_t kRegValuePV[] = L"pv";
+
+const wchar_t kCanaryGuid[] =
+ L"4EA16AC7-FD5A-47C3-875B-DBF4A2008C20";
+const wchar_t kChromeSingleInstallGuid[] =
+ L"8A69D345-D564-463c-AFF1-A69D9E530F96";
+const wchar_t kChromeMultiInstallGuid[] =
+ L"4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D";
+
+bool ReadKeyValue(bool system_install, const wchar_t* key_path,
+ const wchar_t* guid, const wchar_t* value_to_read,
+ DWORD* value_out) {
+ base::win::RegKey key;
robertshield 2014/02/11 22:26:58 nit: declare |key| next to where it is used.
Cait (Slow) 2014/02/12 19:15:41 Done.
+ *value_out = 0;
+ bool have_value = false;
+
+ base::string16 full_key_path = base::string16(key_path).append(1, L'\\')
+ .append(guid);
robertshield 2014/02/11 22:26:58 This would be one less copy: base::string16 full_
Cait (Slow) 2014/02/12 19:15:41 Done.
+
+ LONG result = key.Open(system_install? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
+ full_key_path.c_str(), KEY_QUERY_VALUE);
robertshield 2014/02/11 22:26:58 could shorten the last few lines to: return key.O
+
+ if (result != ERROR_SUCCESS) {
+ return false;
+ }
+
+ return key.ReadValueDW(value_to_read, value_out) == ERROR_SUCCESS;
+}
+
+} // namespace
+
+bool IsCanary(LPWSTR exe_path) {
+ wchar_t* found = wcsstr(exe_path, L"Google\\Chrome SxS");
+ return !!found;
+}
+
+bool IsSystemInstall(LPWSTR exe_path) {
+ bool found = wcsncmp(exe_path, L"C:\\Program Files", 15) == 0;
robertshield 2014/02/11 22:26:58 We can't use shell apis to get the thing the syste
Cait (Slow) 2014/02/12 19:15:41 Unfortunately this check will be one of the first
robertshield 2014/02/12 21:12:37 GetEnvironmentVariable is a kernel32 function.
+ return found;
+}
+
+bool IsMultiInstall(LPWSTR exe_path) {
+ DWORD value = 0;
+ return ReadKeyValue(IsSystemInstall(exe_path), kRegPathClients,
+ kChromeMultiInstallGuid, kRegValuePV, &value);
+}
+
+bool AreUsageStatsEnabled() {
+ DWORD out_value = 0;
+ wchar_t exe_path[MAX_PATH] = {};
+ if (!GetModuleFileNameW(NULL, exe_path, MAX_PATH))
+ return false;
+
+ bool system_install = IsSystemInstall(exe_path);
+ bool is_canary = IsCanary(exe_path);
robertshield 2014/02/11 22:26:58 is_canary is only used once, could drop the temp v
Cait (Slow) 2014/02/12 19:15:41 Done.
+
+ const wchar_t* chrome_guid = IsMultiInstall(exe_path) ?
+ kChromeMultiInstallGuid : kChromeSingleInstallGuid;
+
+ if (is_canary) {
+ return ReadKeyValue(false /*user level install*/, kRegPathClientState,
+ kCanaryGuid, kRegValueUsageStats, &out_value) &&
+ out_value == 1;
+ } else if (system_install) {
+ return (ReadKeyValue(system_install, kRegPathClientStateMedium,
+ chrome_guid, kRegValueUsageStats, &out_value) ||
+ ReadKeyValue(system_install, kRegPathClientState,
+ chrome_guid, kRegValueUsageStats, &out_value)) &&
+ out_value == 1;
+ } else { // user-level install:
+ return ReadKeyValue(system_install, kRegPathClientState,
+ chrome_guid, kRegValueUsageStats, &out_value) &&
+ out_value == 1;
+ }
+ return false;
+}

Powered by Google App Engine
This is Rietveld 408576698