| Index: base/system_info.cc
|
| diff --git a/base/system_info.cc b/base/system_info.cc
|
| deleted file mode 100644
|
| index 3df007e507c1fe1f7cd1447b76c05376cc9af325..0000000000000000000000000000000000000000
|
| --- a/base/system_info.cc
|
| +++ /dev/null
|
| @@ -1,467 +0,0 @@
|
| -// Copyright 2004-2009 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -
|
| -#include "omaha/base/system_info.h"
|
| -#include "base/basictypes.h"
|
| -#include "omaha/base/debug.h"
|
| -#include "omaha/base/logging.h"
|
| -#include "omaha/base/process.h"
|
| -#include "omaha/base/string.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -bool SystemInfo::OSWinXPSP2OrLater() {
|
| - OSVersionType os_type(OS_WINDOWS_UNKNOWN);
|
| - DWORD sp(0);
|
| -
|
| - HRESULT hr = CategorizeOS(&os_type, &sp);
|
| - if (FAILED(hr)) {
|
| - ASSERT(false, (_T("[CategorizeOS failed][0x%x]"), hr));
|
| - return false;
|
| - }
|
| -
|
| - return ((os_type == SystemInfo::OS_WINDOWS_XP && sp >= 2) ||
|
| - os_type > SystemInfo::OS_WINDOWS_XP);
|
| -}
|
| -
|
| -bool SystemInfo::IsRunningOnW2K() {
|
| - OSVERSIONINFO os_info = {0};
|
| - os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
| -
|
| - if (!::GetVersionEx(&os_info)) {
|
| - ASSERT(false, (_T("GetVersionEx")));
|
| - return false;
|
| - }
|
| -
|
| - return os_info.dwMajorVersion == 5 && os_info.dwMinorVersion == 0;
|
| -}
|
| -
|
| -bool SystemInfo::IsRunningOnXPOrLater() {
|
| - OSVersionType os_type(OS_WINDOWS_UNKNOWN);
|
| -
|
| - HRESULT hr = CategorizeOS(&os_type, NULL);
|
| - if (FAILED(hr)) {
|
| - ASSERT(false, (_T("[Failed to get os type][0x%x]"), hr));
|
| - return false;
|
| - }
|
| -
|
| - return os_type >= SystemInfo::OS_WINDOWS_XP;
|
| -}
|
| -
|
| -bool SystemInfo::IsRunningOnXPSP1OrLater() {
|
| - OSVersionType os_type(OS_WINDOWS_UNKNOWN);
|
| - DWORD sp(0);
|
| -
|
| - HRESULT hr = CategorizeOS(&os_type, &sp);
|
| - if (FAILED(hr)) {
|
| - ASSERT(false, (_T("[Failed to get os type][0x%x]"), hr));
|
| - return false;
|
| - }
|
| -
|
| - return ((os_type == SystemInfo::OS_WINDOWS_XP && sp >= 1) ||
|
| - os_type > SystemInfo::OS_WINDOWS_XP);
|
| -}
|
| -
|
| -
|
| -bool SystemInfo::IsRunningOnVistaOrLater() {
|
| - OSVersionType os_type(OS_WINDOWS_UNKNOWN);
|
| - DWORD sp(0);
|
| -
|
| - HRESULT hr = CategorizeOS(&os_type, &sp);
|
| - if (FAILED(hr)) {
|
| - ASSERT(false, (_T("[Failed to get os type][0x%x]"), hr));
|
| - return false;
|
| - }
|
| -
|
| - return (os_type >= OS_WINDOWS_VISTA);
|
| -}
|
| -
|
| -bool SystemInfo::IsRunningOnVistaRTM() {
|
| - OSVersionType os_type(OS_WINDOWS_UNKNOWN);
|
| - DWORD sp(0);
|
| -
|
| - HRESULT hr = CategorizeOS(&os_type, &sp);
|
| - if (FAILED(hr)) {
|
| - ASSERT(false, (_T("[Failed to get os type][0x%x]"), hr));
|
| - return false;
|
| - }
|
| -
|
| - return (os_type == SystemInfo::OS_WINDOWS_VISTA && sp == 0);
|
| -}
|
| -
|
| -HRESULT SystemInfo::CategorizeOS(OSVersionType* os_ver, DWORD* sp) {
|
| - static OSVersionType os_ver_cached(OS_WINDOWS_UNKNOWN);
|
| - // Hopefully, Windows doesn't release a SP that's kuint32max.
|
| - static DWORD sp_cached(kuint32max);
|
| -
|
| - ASSERT(os_ver, (_T("")));
|
| -
|
| - if (sp) {
|
| - *sp = 0;
|
| - }
|
| -
|
| - if (os_ver_cached == OS_WINDOWS_UNKNOWN || sp_cached == kuint32max) {
|
| - // Use GetVersionEx to get OS and Service Pack information.
|
| - OSVERSIONINFOEX osviex;
|
| - ::ZeroMemory(&osviex, sizeof(OSVERSIONINFOEX));
|
| - osviex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
| - BOOL r = ::GetVersionEx(reinterpret_cast<OSVERSIONINFO *>(&osviex));
|
| -
|
| - // If ::GetVersionEx fails when given an OSVERSIONINFOEX then we're running
|
| - // on NT4.0SP5 or earlier.
|
| - if (!r) {
|
| - os_ver_cached = OS_WINDOWS_9X_OR_NT;
|
| - } else {
|
| - switch (osviex.dwPlatformId) {
|
| - case VER_PLATFORM_WIN32_NT:
|
| - // Windows 7 beta 1 reports the same major version as Vista does.
|
| - if (osviex.dwMajorVersion == 6 && osviex.dwMinorVersion == 1) {
|
| - os_ver_cached = OS_WINDOWS_7;
|
| - } else if (osviex.dwMajorVersion == 6 && osviex.dwMinorVersion == 0) {
|
| - os_ver_cached = OS_WINDOWS_VISTA;
|
| - } else if (osviex.dwMajorVersion == 5 && osviex.dwMinorVersion == 2) {
|
| - os_ver_cached = OS_WINDOWS_SERVER_2003;
|
| - } else if (osviex.dwMajorVersion == 5 && osviex.dwMinorVersion == 1) {
|
| - os_ver_cached = OS_WINDOWS_XP;
|
| - } else if (osviex.dwMajorVersion == 5 && osviex.dwMinorVersion == 0) {
|
| - os_ver_cached = OS_WINDOWS_2000;
|
| - } else if (osviex.dwMajorVersion <= 4) {
|
| - os_ver_cached = OS_WINDOWS_9X_OR_NT;
|
| - break;
|
| - } else {
|
| - os_ver_cached = OS_WINDOWS_UNKNOWN;
|
| - break;
|
| - }
|
| - sp_cached = osviex.wServicePackMajor;
|
| - break;
|
| -
|
| - case VER_PLATFORM_WIN32_WINDOWS:
|
| - case VER_PLATFORM_WIN32s:
|
| - default:
|
| - os_ver_cached = OS_WINDOWS_9X_OR_NT;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - OPT_LOG(L1, (_T("[OS][version: %s][service pack: %d]"),
|
| - OSVersionTypeAsString(os_ver_cached),
|
| - sp_cached));
|
| - }
|
| -
|
| - ASSERT1(os_ver_cached != OS_WINDOWS_UNKNOWN && sp_cached != kuint32max);
|
| -
|
| - *os_ver = os_ver_cached;
|
| - if (sp) {
|
| - *sp = sp_cached;
|
| - }
|
| -
|
| - return S_OK;
|
| -}
|
| -
|
| -const wchar_t* SystemInfo::OSVersionTypeAsString(OSVersionType t) {
|
| - switch (t) {
|
| - case OS_WINDOWS_9X_OR_NT: return _T("OS_WINDOWS_9X_OR_NT");
|
| - case OS_WINDOWS_2000: return _T("OS_WINDOWS_2000");
|
| - case OS_WINDOWS_XP: return _T("OS_WINDOWS_XP");
|
| - case OS_WINDOWS_SERVER_2003: return _T("OS_WINDOWS_SERVER_2003");
|
| - case OS_WINDOWS_UNKNOWN: return _T("OS_WINDOWS_UNKNOWN");
|
| - case OS_WINDOWS_VISTA: return _T("OS_WINDOWS_VISTA");
|
| - case OS_WINDOWS_7: return _T("OS_WINDOWS_7");
|
| - default: return _T("<unknown>");
|
| - }
|
| -}
|
| -
|
| -// The following code which names the operating system comes from MSDN article
|
| -// "Getting the System Version"
|
| -#define kNullChar (_T('\0'))
|
| -bool SystemInfo::GetSystemVersion(int* major_version,
|
| - int* minor_version,
|
| - int* service_pack_major,
|
| - int* service_pack_minor,
|
| - TCHAR* name_buf,
|
| - size_t name_buf_len) {
|
| - ASSERT1(major_version);
|
| - ASSERT1(minor_version);
|
| - ASSERT1(service_pack_major);
|
| - ASSERT1(service_pack_minor);
|
| - ASSERT1(name_buf);
|
| - ASSERT1(0 < name_buf_len);
|
| -
|
| - // Clear the name to start with.
|
| - name_buf[0] = kNullChar;
|
| -
|
| - DWORD buf_len = MAX_PATH;
|
| - TCHAR buffer[MAX_PATH];
|
| - TCHAR format_buffer[64];
|
| -
|
| - buffer[0] = kNullChar;
|
| -
|
| - OSVERSIONINFOEX osvi;
|
| - BOOL ver_info_exists;
|
| -
|
| - // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
|
| - // If that fails, try using the OSVERSIONINFO structure.
|
| - ::ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
|
| - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
| -
|
| - ver_info_exists = ::GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&osvi));
|
| - if (!ver_info_exists) {
|
| - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
| - if (!::GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&osvi))) {
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - *major_version = osvi.dwMajorVersion;
|
| - *minor_version = osvi.dwMinorVersion;
|
| - *service_pack_major = osvi.wServicePackMajor;
|
| - *service_pack_minor = osvi.wServicePackMinor;
|
| -
|
| - switch (osvi.dwPlatformId) {
|
| - // Test for the Windows NT product family.
|
| - case VER_PLATFORM_WIN32_NT:
|
| -
|
| - // Test for the specific product family.
|
| - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
|
| - SafeStrCat(buffer,
|
| - _T("Microsoft Windows Server 2003 family, "),
|
| - buf_len);
|
| - }
|
| -
|
| - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) {
|
| - SafeStrCat(buffer, _T("Microsoft Windows XP "), buf_len);
|
| - }
|
| -
|
| - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) {
|
| - SafeStrCat(buffer, _T("Microsoft Windows 2000 "), buf_len);
|
| - }
|
| -
|
| - if (osvi.dwMajorVersion <= 4) {
|
| - SafeStrCat(buffer, _T("Microsoft Windows NT "), buf_len);
|
| - }
|
| -
|
| - // Test for specific product on Windows NT 4.0 SP6 and later.
|
| - if (ver_info_exists) {
|
| - // Test for the workstation type.
|
| - if (osvi.wProductType == VER_NT_WORKSTATION) {
|
| - if (osvi.dwMajorVersion == 4) {
|
| - SafeStrCat(buffer, _T("Workstation 4.0 "), buf_len);
|
| - } else if (osvi.wSuiteMask & VER_SUITE_PERSONAL) {
|
| - SafeStrCat(buffer, _T("Home Edition "), buf_len);
|
| - } else {
|
| - SafeStrCat(buffer, _T("Professional "), buf_len);
|
| - }
|
| - } else if (osvi.wProductType == VER_NT_SERVER ||
|
| - osvi.wProductType == VER_NT_DOMAIN_CONTROLLER) {
|
| - // server type.
|
| - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) {
|
| - if (osvi.wSuiteMask & VER_SUITE_DATACENTER) {
|
| - SafeStrCat(buffer, _T("Datacenter Edition "), buf_len);
|
| - } else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) {
|
| - SafeStrCat(buffer, _T("Enterprise Edition "), buf_len);
|
| - } else if (osvi.wSuiteMask == VER_SUITE_BLADE) {
|
| - SafeStrCat(buffer, _T("Web Edition "), buf_len);
|
| - } else {
|
| - SafeStrCat(buffer, _T("Standard Edition "), buf_len);
|
| - }
|
| - } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) {
|
| - if (osvi.wSuiteMask & VER_SUITE_DATACENTER) {
|
| - SafeStrCat(buffer, _T("Datacenter Server "), buf_len);
|
| - } else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) {
|
| - SafeStrCat(buffer, _T("Advanced Server "), buf_len);
|
| - } else {
|
| - SafeStrCat(buffer, _T("Server "), buf_len);
|
| - }
|
| - } else {
|
| - // Windows NT 4.0.
|
| - if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) {
|
| - SafeStrCat(buffer,
|
| - _T("Server 4.0, Enterprise Edition "),
|
| - buf_len);
|
| - } else {
|
| - SafeStrCat(buffer, _T("Server 4.0 "), buf_len);
|
| - }
|
| - }
|
| - }
|
| - } else {
|
| - // Test for specific product on Windows NT 4.0 SP5 and earlier.
|
| - HKEY hKey;
|
| - TCHAR product_type[64] = {0};
|
| - DWORD dwBufLen = arraysize(product_type);
|
| - LONG lRet;
|
| -
|
| - // TODO(omaha): should we use the RegKey API for consistency.
|
| - lRet = ::RegOpenKeyEx(
|
| - HKEY_LOCAL_MACHINE,
|
| - _T("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"),
|
| - 0,
|
| - KEY_QUERY_VALUE,
|
| - &hKey);
|
| - if (lRet != ERROR_SUCCESS) {
|
| - return false;
|
| - }
|
| -
|
| - lRet = ::RegQueryValueEx(hKey,
|
| - _T("ProductType"),
|
| - NULL,
|
| - NULL,
|
| - reinterpret_cast<byte *>(product_type),
|
| - &dwBufLen);
|
| - if ((lRet != ERROR_SUCCESS) || (dwBufLen > arraysize(product_type))) {
|
| - return false;
|
| - }
|
| -
|
| - ::RegCloseKey(hKey);
|
| -
|
| - if (::lstrcmpi(_T("WINNT"), product_type) == 0) {
|
| - SafeStrCat(buffer, _T("Workstation "), buf_len);
|
| - }
|
| - if (::lstrcmpi(_T("LANMANNT"), product_type) == 0) {
|
| - SafeStrCat(buffer, _T("Server "), buf_len);
|
| - }
|
| - if (::lstrcmpi(_T("SERVERNT"), product_type) == 0) {
|
| - SafeStrCat(buffer, _T("Advanced Server "), buf_len);
|
| - }
|
| -
|
| - ::wsprintf(format_buffer,
|
| - _T("%d.%d "),
|
| - osvi.dwMajorVersion,
|
| - osvi.dwMinorVersion);
|
| - SafeStrCat(buffer, format_buffer, buf_len);
|
| - }
|
| -
|
| - // Display service pack (if any) and build number.
|
| - if (osvi.dwMajorVersion == 4 &&
|
| - ::lstrcmpi(osvi.szCSDVersion, _T("Service Pack 6")) == 0) {
|
| - HKEY hKey;
|
| - LONG lRet;
|
| -
|
| - // Test for SP6 versus SP6a.
|
| - lRet = ::RegOpenKeyEx(
|
| - HKEY_LOCAL_MACHINE,
|
| - _T("SOFTWARE\\Microsoft\\Windows NT\\")
|
| - _T("CurrentVersion\\Hotfix\\Q246009"),
|
| - 0,
|
| - KEY_QUERY_VALUE,
|
| - &hKey);
|
| - if (lRet == ERROR_SUCCESS) {
|
| - ::wsprintf(format_buffer,
|
| - _T("Service Pack 6a (Build %d)"),
|
| - osvi.dwBuildNumber & 0xFFFF);
|
| - SafeStrCat(buffer, format_buffer, buf_len);
|
| - } else {
|
| - // Windows NT 4.0 prior to SP6a.
|
| - ::wsprintf(format_buffer, _T("%s (Build %d)"),
|
| - osvi.szCSDVersion,
|
| - osvi.dwBuildNumber & 0xFFFF);
|
| - SafeStrCat(buffer, format_buffer, buf_len);
|
| - }
|
| - ::RegCloseKey(hKey);
|
| - } else {
|
| - // Windows NT 3.51 and earlier or Windows 2000 and later.
|
| - ::wsprintf(format_buffer,
|
| - _T("%s (Build %d)"),
|
| - osvi.szCSDVersion,
|
| - osvi.dwBuildNumber & 0xFFFF);
|
| - SafeStrCat(buffer, format_buffer, buf_len);
|
| - }
|
| -
|
| - break;
|
| -
|
| - // Test for the Windows 95 product family.
|
| - case VER_PLATFORM_WIN32_WINDOWS:
|
| -
|
| - if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) {
|
| - SafeStrCat(buffer, _T("Microsoft Windows 95 "), buf_len);
|
| - if (osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B') {
|
| - SafeStrCat(buffer, _T("OSR2 "), buf_len);
|
| - }
|
| - }
|
| -
|
| - if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) {
|
| - SafeStrCat(buffer, _T("Microsoft Windows 98 "), buf_len);
|
| - if (osvi.szCSDVersion[1] == 'A') {
|
| - SafeStrCat(buffer, _T("SE "), buf_len);
|
| - }
|
| - }
|
| -
|
| - if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) {
|
| - SafeStrCat(buffer,
|
| - _T("Microsoft Windows Millennium Edition"),
|
| - buf_len);
|
| - }
|
| - break;
|
| -
|
| - case VER_PLATFORM_WIN32s:
|
| -
|
| - SafeStrCat(buffer, _T("Microsoft Win32s"), buf_len);
|
| - break;
|
| -
|
| - default:
|
| - SafeStrCat(buffer, _T("Unknown operating system"), buf_len);
|
| - break;
|
| - }
|
| - // SKIP_LOC_END
|
| -
|
| - // Remove trailing space, if any.
|
| - DWORD buffer_len = ::lstrlen(buffer);
|
| - if (buffer[buffer_len-1] == kNullChar) {
|
| - buffer[buffer_len-1] = kNullChar;
|
| - }
|
| -
|
| - // Copy to destination argument.
|
| - String_StrNCpy(name_buf, buffer, name_buf_len);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -DWORD SystemInfo::GetProcessorArchitecture() {
|
| - static DWORD processor_architecture_cached(PROCESSOR_ARCHITECTURE_UNKNOWN);
|
| -
|
| - if (processor_architecture_cached == PROCESSOR_ARCHITECTURE_UNKNOWN) {
|
| - typedef void (WINAPI * GetSystemInfoFunc)(LPSYSTEM_INFO);
|
| -
|
| - HMODULE handle = ::GetModuleHandle(_T("kernel32"));
|
| - ASSERT1(handle);
|
| - GetSystemInfoFunc get_native_system_info =
|
| - reinterpret_cast<GetSystemInfoFunc>(::GetProcAddress(
|
| - handle,
|
| - "GetNativeSystemInfo"));
|
| -
|
| - if (get_native_system_info != NULL) {
|
| - SYSTEM_INFO sys_info = {0};
|
| -
|
| - get_native_system_info(&sys_info);
|
| -
|
| - processor_architecture_cached = sys_info.wProcessorArchitecture;
|
| - } else {
|
| - // If we couldn't get the _native_ system info, then we must be on OS
|
| - // earlier than XP, so can't be 64-bit anyway. Assume Intel.
|
| - processor_architecture_cached = PROCESSOR_ARCHITECTURE_INTEL;
|
| - }
|
| - }
|
| -
|
| - return processor_architecture_cached;
|
| -}
|
| -
|
| -bool SystemInfo::Is64BitWindows() {
|
| -#if defined(_WIN64)
|
| - return true;
|
| -#else
|
| - return Process::IsWow64(::GetCurrentProcessId());
|
| -#endif
|
| -}
|
| -
|
| -} // namespace omaha
|
|
|