| Index: chrome_elf/chrome_elf_util.cc
|
| diff --git a/chrome_elf/chrome_elf_util.cc b/chrome_elf/chrome_elf_util.cc
|
| index a3fd727e9d2ebdf54d795bf3bd3b76e0d97bca86..29c42ee338471345709d7d09ae8854d743c2a065 100644
|
| --- a/chrome_elf/chrome_elf_util.cc
|
| +++ b/chrome_elf/chrome_elf_util.cc
|
| @@ -5,11 +5,13 @@
|
| #include "chrome_elf/chrome_elf_util.h"
|
|
|
| #include <assert.h>
|
| -#include <windows.h>
|
| #include <stddef.h>
|
| +#include <windows.h>
|
|
|
| #include "base/macros.h"
|
| #include "base/strings/string16.h"
|
| +#include "chrome_elf/chrome_elf_constants.h"
|
| +#include "chrome_elf/chrome_elf_reg.h"
|
|
|
| ProcessType g_process_type = ProcessType::UNINITIALIZED;
|
|
|
| @@ -26,7 +28,7 @@ const wchar_t kRegPathChromePolicy[] = L"SOFTWARE\\Policies\\Chromium";
|
|
|
| const wchar_t kRegValueUsageStats[] = L"usagestats";
|
| const wchar_t kUninstallArgumentsField[] = L"UninstallArguments";
|
| -const wchar_t kMetricsReportingEnabled[] =L"MetricsReportingEnabled";
|
| +const wchar_t kMetricsReportingEnabled[] = L"MetricsReportingEnabled";
|
|
|
| const wchar_t kAppGuidCanary[] =
|
| L"{4ea16ac7-fd5a-47c3-875b-dbf4a2008c20}";
|
| @@ -35,94 +37,22 @@ const wchar_t kAppGuidGoogleChrome[] =
|
| const wchar_t kAppGuidGoogleBinaries[] =
|
| L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}";
|
|
|
| -bool ReadKeyValueString(bool system_install, const wchar_t* key_path,
|
| - const wchar_t* guid, const wchar_t* value_to_read,
|
| - base::string16* value_out) {
|
| - HKEY key = NULL;
|
| - value_out->clear();
|
| -
|
| - base::string16 full_key_path(key_path);
|
| - full_key_path.append(1, L'\\');
|
| - full_key_path.append(guid);
|
| -
|
| - if (::RegOpenKeyEx(system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
| - full_key_path.c_str(), 0,
|
| - KEY_QUERY_VALUE | KEY_WOW64_32KEY, &key) !=
|
| - ERROR_SUCCESS) {
|
| - return false;
|
| - }
|
| -
|
| - const size_t kMaxStringLength = 1024;
|
| - wchar_t raw_value[kMaxStringLength] = {};
|
| - DWORD size = sizeof(raw_value);
|
| - DWORD type = REG_SZ;
|
| - LONG result = ::RegQueryValueEx(key, value_to_read, 0, &type,
|
| - reinterpret_cast<LPBYTE>(raw_value), &size);
|
| -
|
| - if (result == ERROR_SUCCESS) {
|
| - if (type != REG_SZ || (size & 1) != 0) {
|
| - result = ERROR_NOT_SUPPORTED;
|
| - } else if (size == 0) {
|
| - *raw_value = L'\0';
|
| - } else if (raw_value[size / sizeof(wchar_t) - 1] != L'\0') {
|
| - if ((size / sizeof(wchar_t)) < kMaxStringLength)
|
| - raw_value[size / sizeof(wchar_t)] = L'\0';
|
| - else
|
| - result = ERROR_MORE_DATA;
|
| - }
|
| - }
|
| -
|
| - if (result == ERROR_SUCCESS)
|
| - *value_out = raw_value;
|
| -
|
| - ::RegCloseKey(key);
|
| -
|
| - return result == ERROR_SUCCESS;
|
| -}
|
| -
|
| -bool ReadKeyValueDW(bool system_install, const wchar_t* key_path,
|
| - base::string16 guid, const wchar_t* value_to_read,
|
| - DWORD* value_out) {
|
| - HKEY key = NULL;
|
| - *value_out = 0;
|
| -
|
| - base::string16 full_key_path(key_path);
|
| - full_key_path.append(1, L'\\');
|
| - full_key_path.append(guid);
|
| -
|
| - if (::RegOpenKeyEx(system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
|
| - full_key_path.c_str(), 0,
|
| - KEY_QUERY_VALUE | KEY_WOW64_32KEY, &key) !=
|
| - ERROR_SUCCESS) {
|
| - return false;
|
| - }
|
| -
|
| - DWORD size = sizeof(*value_out);
|
| - DWORD type = REG_DWORD;
|
| - LONG result = ::RegQueryValueEx(key, value_to_read, 0, &type,
|
| - reinterpret_cast<BYTE*>(value_out), &size);
|
| -
|
| - ::RegCloseKey(key);
|
| -
|
| - return result == ERROR_SUCCESS && size == sizeof(*value_out);
|
| -}
|
| -
|
| } // namespace
|
|
|
| bool IsCanary(const wchar_t* exe_path) {
|
| - return wcsstr(exe_path, L"Chrome SxS\\Application") != NULL;
|
| + return ::wcsstr(exe_path, L"Chrome SxS\\Application") != NULL;
|
| }
|
|
|
| bool IsSystemInstall(const wchar_t* exe_path) {
|
| wchar_t program_dir[MAX_PATH] = {};
|
| DWORD ret = ::GetEnvironmentVariable(L"PROGRAMFILES", program_dir,
|
| arraysize(program_dir));
|
| - if (ret && ret < MAX_PATH && !wcsncmp(exe_path, program_dir, ret))
|
| + if (ret && ret < MAX_PATH && !::wcsncmp(exe_path, program_dir, ret))
|
| return true;
|
|
|
| ret = ::GetEnvironmentVariable(L"PROGRAMFILES(X86)", program_dir,
|
| arraysize(program_dir));
|
| - if (ret && ret < MAX_PATH && !wcsncmp(exe_path, program_dir, ret))
|
| + if (ret && ret < MAX_PATH && !::wcsncmp(exe_path, program_dir, ret))
|
| return true;
|
|
|
| return false;
|
| @@ -130,12 +60,16 @@ bool IsSystemInstall(const wchar_t* exe_path) {
|
|
|
| bool IsMultiInstall(bool is_system_install) {
|
| base::string16 args;
|
| - if (!ReadKeyValueString(is_system_install, kRegPathClientState,
|
| - kAppGuidGoogleChrome, kUninstallArgumentsField,
|
| - &args)) {
|
| +
|
| + base::string16 full_key_path(kRegPathClientState);
|
| + full_key_path.append(1, L'\\');
|
| + full_key_path.append(kAppGuidGoogleChrome);
|
| + if (!nt::GetRegValue_SZ((is_system_install ? nt::HKLM : nt::HKCU),
|
| + full_key_path.c_str(), kUninstallArgumentsField,
|
| + &args))
|
| return false;
|
| - }
|
| - return args.find(L"--multi-install") != base::string16::npos;
|
| +
|
| + return (args.find(L"--multi-install") != base::string16::npos);
|
| }
|
|
|
| bool AreUsageStatsEnabled(const wchar_t* exe_path) {
|
| @@ -156,41 +90,42 @@ bool AreUsageStatsEnabled(const wchar_t* exe_path) {
|
| }
|
|
|
| DWORD out_value = 0;
|
| +
|
| + // If system_install, first try kRegPathClientStateMedium.
|
| + base::string16 full_key_path(kRegPathClientStateMedium);
|
| + full_key_path.append(1, L'\\');
|
| + full_key_path.append(app_guid);
|
| if (system_install &&
|
| - ReadKeyValueDW(system_install, kRegPathClientStateMedium, app_guid,
|
| - kRegValueUsageStats, &out_value)) {
|
| - return out_value == 1;
|
| + nt::GetRegValue_DWORD(nt::HKLM, full_key_path.c_str(),
|
| + kRegValueUsageStats, &out_value)) {
|
| + return (out_value == 1);
|
| }
|
|
|
| - return ReadKeyValueDW(system_install, kRegPathClientState, app_guid,
|
| - kRegValueUsageStats, &out_value) && out_value == 1;
|
| + // Second, try kRegPathClientState.
|
| + full_key_path = kRegPathClientState;
|
| + full_key_path.append(1, L'\\');
|
| + full_key_path.append(app_guid);
|
| + return (nt::GetRegValue_DWORD((system_install ? nt::HKLM : nt::HKCU),
|
| + full_key_path.c_str(), kRegValueUsageStats,
|
| + &out_value) &&
|
| + out_value == 1);
|
| }
|
|
|
| bool ReportingIsEnforcedByPolicy(bool* breakpad_enabled) {
|
| - HKEY key = NULL;
|
| DWORD value = 0;
|
| - BYTE* value_bytes = reinterpret_cast<BYTE*>(&value);
|
| - DWORD size = sizeof(value);
|
| - DWORD type = REG_DWORD;
|
| -
|
| - if (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, kRegPathChromePolicy, 0,
|
| - KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) {
|
| - if (::RegQueryValueEx(key, kMetricsReportingEnabled, 0, &type,
|
| - value_bytes, &size) == ERROR_SUCCESS) {
|
| - *breakpad_enabled = value != 0;
|
| - }
|
| - ::RegCloseKey(key);
|
| - return size == sizeof(value);
|
| +
|
| + // First, try HKLM.
|
| + if (nt::GetRegValue_DWORD(nt::HKLM, kRegPathChromePolicy,
|
| + kMetricsReportingEnabled, &value)) {
|
| + *breakpad_enabled = (value != 0);
|
| + return true;
|
| }
|
|
|
| - if (::RegOpenKeyEx(HKEY_CURRENT_USER, kRegPathChromePolicy, 0,
|
| - KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) {
|
| - if (::RegQueryValueEx(key, kMetricsReportingEnabled, 0, &type,
|
| - value_bytes, &size) == ERROR_SUCCESS) {
|
| - *breakpad_enabled = value != 0;
|
| - }
|
| - ::RegCloseKey(key);
|
| - return size == sizeof(value);
|
| + // Second, try HKCU.
|
| + if (nt::GetRegValue_DWORD(nt::HKCU, kRegPathChromePolicy,
|
| + kMetricsReportingEnabled, &value)) {
|
| + *breakpad_enabled = (value != 0);
|
| + return true;
|
| }
|
|
|
| return false;
|
|
|