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