| Index: chrome/installer/gcapi/gcapi.cc
|
| ===================================================================
|
| --- chrome/installer/gcapi/gcapi.cc (revision 80823)
|
| +++ chrome/installer/gcapi/gcapi.cc (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2009 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.
|
|
|
| @@ -8,12 +8,10 @@
|
| #include <atlcom.h>
|
| #include <windows.h>
|
| #include <sddl.h>
|
| -#define STRSAFE_NO_DEPRECATE
|
| +#include <stdlib.h>
|
| #include <strsafe.h>
|
| #include <tlhelp32.h>
|
|
|
| -#include <cstdlib>
|
| -
|
| #include "google_update_idl.h"
|
|
|
| namespace {
|
| @@ -158,31 +156,31 @@
|
| bool IsChromeInstalled(HKEY root_key) {
|
| wchar_t version[64];
|
| size_t size = _countof(version);
|
| - return ReadValueFromRegistry(root_key, kChromeRegClientsKey,
|
| - kChromeRegVersion, version, &size);
|
| + if (ReadValueFromRegistry(root_key, kChromeRegClientsKey, kChromeRegVersion,
|
| + version, &size))
|
| + return true;
|
| + return false;
|
| }
|
|
|
| -enum WindowsVersion {
|
| - VERSION_BELOW_XP_SP2,
|
| - VERSION_XP_SP2_UP_TO_VISTA, // "but not including"
|
| - VERSION_VISTA_OR_HIGHER,
|
| -};
|
| -WindowsVersion GetWindowsVersion() {
|
| - OSVERSIONINFOEX version_info = { sizeof version_info };
|
| - GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&version_info));
|
| +bool IsWinXPSp2OrLater(bool* is_vista_or_later) {
|
| + OSVERSIONINFOEX osviex = { sizeof(OSVERSIONINFOEX) };
|
| + int r = ::GetVersionEx((LPOSVERSIONINFO)&osviex);
|
| + // If this failed we're on Win9X or a pre NT4SP6 OS.
|
| + if (!r)
|
| + return false;
|
|
|
| - // Windows Vista is version 6.0.
|
| - if (version_info.dwMajorVersion >= 6)
|
| - return VERSION_VISTA_OR_HIGHER;
|
| + if (osviex.dwMajorVersion < 5)
|
| + return false;
|
|
|
| - // Windows XP is version 5.1. (5.2 is Windows Server 2003/XP Pro x64.)
|
| - if ((version_info.dwMajorVersion < 5) || (version_info.dwMinorVersion < 1))
|
| - return VERSION_BELOW_XP_SP2;
|
| + if (osviex.dwMajorVersion > 5) {
|
| + *is_vista_or_later = true;
|
| + return true; // way beyond Windows XP;
|
| + }
|
|
|
| - // For XP itself, we only support SP2 and above.
|
| - return ((version_info.dwMinorVersion > 1) ||
|
| - (version_info.wServicePackMajor >= 2)) ?
|
| - VERSION_XP_SP2_UP_TO_VISTA : VERSION_BELOW_XP_SP2;
|
| + if (osviex.dwMinorVersion >= 1 && osviex.wServicePackMajor >= 2)
|
| + return true; // Windows XP SP2 or better.
|
| +
|
| + return false; // Windows 2000, WinXP no Service Pack.
|
| }
|
|
|
| // Note this function should not be called on old Windows versions where these
|
| @@ -232,8 +230,9 @@
|
|
|
| bool IsRunningElevated() {
|
| // This method should be called only for Vista or later.
|
| - if ((GetWindowsVersion() < VERSION_VISTA_OR_HIGHER) ||
|
| - !VerifyAdminGroup())
|
| + bool is_vista_or_later = false;
|
| + IsWinXPSp2OrLater(&is_vista_or_later);
|
| + if (!is_vista_or_later || !VerifyAdminGroup())
|
| return false;
|
|
|
| HANDLE process_token;
|
| @@ -288,9 +287,9 @@
|
| DWORD *reasons) {
|
| DWORD local_reasons = 0;
|
|
|
| - WindowsVersion windows_version = GetWindowsVersion();
|
| + bool is_vista_or_later = false;
|
| // System requirements?
|
| - if (windows_version == VERSION_BELOW_XP_SP2)
|
| + if (!IsWinXPSp2OrLater(&is_vista_or_later))
|
| local_reasons |= GCCC_ERROR_OSNOTSUPPORTED;
|
|
|
| if (IsChromeInstalled(HKEY_LOCAL_MACHINE))
|
| @@ -301,8 +300,7 @@
|
|
|
| if (!VerifyHKLMAccess(kChromeRegClientsKey)) {
|
| local_reasons |= GCCC_ERROR_ACCESSDENIED;
|
| - } else if ((windows_version == VERSION_VISTA_OR_HIGHER) &&
|
| - !VerifyAdminGroup()) {
|
| + } else if (is_vista_or_later && !VerifyAdminGroup()) {
|
| // For Vista or later check for elevation since even for admin user we could
|
| // be running in non-elevated mode. We require integrity level High.
|
| local_reasons |= GCCC_ERROR_INTEGRITYLEVEL;
|
|
|