1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome_elf/chrome_elf_util.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <windows.h>
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/macros.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/string16.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kRegPathClientState[] = L"Software\\Google\\Update\\ClientState";
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kRegPathClientStateMedium[] =
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    L"Software\\Google\\Update\\ClientStateMedium";
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kRegPathChromePolicy[] = L"SOFTWARE\\Policies\\Google\\Chrome";
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kRegPathChromePolicy[] = L"SOFTWARE\\Policies\\Chromium";
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // defined(GOOGLE_CHROME_BUILD)
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kRegValueUsageStats[] = L"usagestats";
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kUninstallArgumentsField[] = L"UninstallArguments";
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kMetricsReportingEnabled[] =L"MetricsReportingEnabled";
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kAppGuidCanary[] =
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    L"{4ea16ac7-fd5a-47c3-875b-dbf4a2008c20}";
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kAppGuidGoogleChrome[] =
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    L"{8A69D345-D564-463c-AFF1-A69D9E530F96}";
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const wchar_t kAppGuidGoogleBinaries[] =
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}";
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ReadKeyValueString(bool system_install, const wchar_t* key_path,
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        const wchar_t* guid, const wchar_t* value_to_read,
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        base::string16* value_out) {
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HKEY key = NULL;
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value_out->clear();
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::string16 full_key_path(key_path);
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  full_key_path.append(1, L'\\');
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  full_key_path.append(guid);
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (::RegOpenKeyEx(system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     full_key_path.c_str(), 0,
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     KEY_QUERY_VALUE | KEY_WOW64_32KEY, &key) !=
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     ERROR_SUCCESS) {
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const size_t kMaxStringLength = 1024;
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wchar_t raw_value[kMaxStringLength] = {};
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DWORD size = sizeof(raw_value);
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DWORD type = REG_SZ;
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LONG result = ::RegQueryValueEx(key, value_to_read, 0, &type,
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  reinterpret_cast<LPBYTE>(raw_value), &size);
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (result == ERROR_SUCCESS) {
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (type != REG_SZ || (size & 1) != 0) {
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      result = ERROR_NOT_SUPPORTED;
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    } else if (size == 0) {
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      *raw_value = L'\0';
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    } else if (raw_value[size / sizeof(wchar_t) - 1] != L'\0') {
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if ((size / sizeof(wchar_t)) < kMaxStringLength)
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        raw_value[size / sizeof(wchar_t)] = L'\0';
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      else
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        result = ERROR_MORE_DATA;
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (result == ERROR_SUCCESS)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    *value_out = raw_value;
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::RegCloseKey(key);
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return result == ERROR_SUCCESS;
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ReadKeyValueDW(bool system_install, const wchar_t* key_path,
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    base::string16 guid, const wchar_t* value_to_read,
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    DWORD* value_out) {
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HKEY key = NULL;
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  *value_out = 0;
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::string16 full_key_path(key_path);
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  full_key_path.append(1, L'\\');
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  full_key_path.append(guid);
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (::RegOpenKeyEx(system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     full_key_path.c_str(), 0,
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     KEY_QUERY_VALUE | KEY_WOW64_32KEY, &key) !=
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     ERROR_SUCCESS) {
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DWORD size = sizeof(*value_out);
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DWORD type = REG_DWORD;
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LONG result = ::RegQueryValueEx(key, value_to_read, 0, &type,
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  reinterpret_cast<BYTE*>(value_out), &size);
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::RegCloseKey(key);
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return result == ERROR_SUCCESS && size == sizeof(*value_out);
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool IsCanary(const wchar_t* exe_path) {
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return wcsstr(exe_path, L"Chrome SxS\\Application") != NULL;
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool IsSystemInstall(const wchar_t* exe_path) {
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wchar_t program_dir[MAX_PATH] = {};
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DWORD ret = ::GetEnvironmentVariable(L"PROGRAMFILES", program_dir,
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       arraysize(program_dir));
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (ret && ret < MAX_PATH && !wcsncmp(exe_path, program_dir, ret))
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return true;
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ret = ::GetEnvironmentVariable(L"PROGRAMFILES(X86)", program_dir,
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 arraysize(program_dir));
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (ret && ret < MAX_PATH && !wcsncmp(exe_path, program_dir, ret))
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return true;
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool IsMultiInstall(bool is_system_install) {
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::string16 args;
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!ReadKeyValueString(is_system_install, kRegPathClientState,
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          kAppGuidGoogleChrome, kUninstallArgumentsField,
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          &args)) {
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return args.find(L"--multi-install") != base::string16::npos;
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool AreUsageStatsEnabled(const wchar_t* exe_path) {
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool enabled = true;
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool controlled_by_policy = ReportingIsEnforcedByPolicy(&enabled);
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (controlled_by_policy && !enabled)
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool system_install = IsSystemInstall(exe_path);
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::string16 app_guid;
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (IsCanary(exe_path)) {
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    app_guid = kAppGuidCanary;
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  } else {
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    app_guid = IsMultiInstall(system_install) ? kAppGuidGoogleBinaries :
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                kAppGuidGoogleChrome;
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DWORD out_value = 0;
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (system_install &&
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ReadKeyValueDW(system_install, kRegPathClientStateMedium, app_guid,
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     kRegValueUsageStats, &out_value)) {
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return out_value == 1;
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return ReadKeyValueDW(system_install, kRegPathClientState, app_guid,
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        kRegValueUsageStats, &out_value) && out_value == 1;
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ReportingIsEnforcedByPolicy(bool* breakpad_enabled) {
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HKEY key = NULL;
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DWORD value = 0;
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  BYTE* value_bytes = reinterpret_cast<BYTE*>(&value);
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DWORD size = sizeof(value);
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DWORD type = REG_DWORD;
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, kRegPathChromePolicy, 0,
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) {
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (::RegQueryValueEx(key, kMetricsReportingEnabled, 0, &type,
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          value_bytes, &size) == ERROR_SUCCESS) {
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      *breakpad_enabled = value != 0;
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ::RegCloseKey(key);
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return size == sizeof(value);
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (::RegOpenKeyEx(HKEY_CURRENT_USER, kRegPathChromePolicy, 0,
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) {
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (::RegQueryValueEx(key, kMetricsReportingEnabled, 0, &type,
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          value_bytes, &size) == ERROR_SUCCESS) {
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      *breakpad_enabled = value != 0;
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ::RegCloseKey(key);
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return size == sizeof(value);
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool IsNonBrowserProcess() {
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef bool (*IsSandboxedProcessFunc)();
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IsSandboxedProcessFunc is_sandboxed_process_func =
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      reinterpret_cast<IsSandboxedProcessFunc>(
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          GetProcAddress(GetModuleHandle(NULL), "IsSandboxedProcess"));
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool is_sandboxed_process =
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      is_sandboxed_process_func && is_sandboxed_process_func();
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(robertshield): Drop the command line check when we drop support for
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // enabling chrome_elf in unsandboxed processes.
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  wchar_t* command_line = GetCommandLine();
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool has_process_type_flag = command_line && wcsstr(command_line, L"--type");
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return (has_process_type_flag || is_sandboxed_process);
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
210