// Copyright (c) 2012 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.
#if !defined(__clang__) && _MSC_FULL_VER < 191125507 #error VS 2017 Update 3.2 or higher is required #endif
#if !defined(NTDDI_WIN10_RS4) #error Windows 10.0.17134.0 SDK or higher required. #endif
namespace base { namespace win {
namespace {
// The values under the CurrentVersion registry hive are mirrored under // the corresponding Wow6432 hive.
constexpr wchar_t kRegKeyWindowsNTCurrentVersion[] =
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
// Returns the "UBR" (Windows 10 patch number) and "ReleaseId" (Windows 10 // release number) from the registry. "UBR" is an undocumented value and will be // 0 if the value was not found. "ReleaseId" will be an empty string if the // value is not found.
std::pair<int, std::string> GetVersionData() {
DWORD ubr = 0;
std::wstring release_id;
RegKey key;
// static
OSInfo** OSInfo::GetInstanceStorage() { // Note: we don't use the Singleton class because it depends on AtExitManager, // and it's convenient for other modules to use this class without it. static OSInfo* info = []() {
_OSVERSIONINFOEXW version_info = {sizeof(version_info)};
::GetVersionEx(reinterpret_cast<_OSVERSIONINFOW*>(&version_info));
if (version_info.dwMajorVersion == 6 || version_info.dwMajorVersion == 10) { // Only present on Vista+. switch (os_type) { case PRODUCT_CLUSTER_SERVER: case PRODUCT_DATACENTER_SERVER: case PRODUCT_DATACENTER_SERVER_CORE: case PRODUCT_ENTERPRISE_SERVER: case PRODUCT_ENTERPRISE_SERVER_CORE: case PRODUCT_ENTERPRISE_SERVER_IA64: case PRODUCT_SMALLBUSINESS_SERVER: case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: case PRODUCT_STANDARD_SERVER: case PRODUCT_STANDARD_SERVER_CORE: case PRODUCT_WEB_SERVER:
version_type_ = SUITE_SERVER; break; case PRODUCT_PROFESSIONAL: case PRODUCT_ULTIMATE:
version_type_ = SUITE_PROFESSIONAL; break; case PRODUCT_ENTERPRISE: case PRODUCT_ENTERPRISE_E: case PRODUCT_ENTERPRISE_EVALUATION: case PRODUCT_ENTERPRISE_N: case PRODUCT_ENTERPRISE_N_EVALUATION: case PRODUCT_ENTERPRISE_S: case PRODUCT_ENTERPRISE_S_EVALUATION: case PRODUCT_ENTERPRISE_S_N: case PRODUCT_ENTERPRISE_S_N_EVALUATION: case PRODUCT_BUSINESS: case PRODUCT_BUSINESS_N:
version_type_ = SUITE_ENTERPRISE; break; case PRODUCT_EDUCATION: case PRODUCT_EDUCATION_N:
version_type_ = SUITE_EDUCATION; break; case PRODUCT_HOME_BASIC: case PRODUCT_HOME_PREMIUM: case PRODUCT_STARTER: default:
version_type_ = SUITE_HOME; break;
}
} elseif (version_info.dwMajorVersion == 5 &&
version_info.dwMinorVersion == 2) { if (version_info.wProductType == VER_NT_WORKSTATION &&
system_info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
version_type_ = SUITE_PROFESSIONAL;
} elseif (version_info.wSuiteMask & VER_SUITE_WH_SERVER) {
version_type_ = SUITE_HOME;
} else {
version_type_ = SUITE_SERVER;
}
} elseif (version_info.dwMajorVersion == 5 &&
version_info.dwMinorVersion == 1) { if (version_info.wSuiteMask & VER_SUITE_PERSONAL)
version_type_ = SUITE_HOME; else
version_type_ = SUITE_PROFESSIONAL;
} else { // Windows is pre XP so we don't care but pick a safe default.
version_type_ = SUITE_HOME;
}
}
OSInfo::~OSInfo() = default;
Version OSInfo::Kernel32Version() const { staticconst Version kernel32_version =
MajorMinorBuildToVersion(Kernel32BaseVersion().components()[0],
Kernel32BaseVersion().components()[1],
Kernel32BaseVersion().components()[2]); return kernel32_version;
}
Version OSInfo::UcrtVersion() const { auto ucrt_version_info = FileVersionInfoWin::CreateFileVersionInfoWin(
FilePath(FILE_PATH_LITERAL("ucrtbase.dll"))); if (ucrt_version_info) { auto ucrt_components = ucrt_version_info->GetFileVersion().components(); if (ucrt_components.size() == 4) { return MajorMinorBuildToVersion(ucrt_components[0], ucrt_components[1],
ucrt_components[2]);
}
} return Version();
}
// Retrieve a version from kernel32. This is useful because when running in // compatibility mode for a down-level version of the OS, the file version of // kernel32 will still be the "real" version.
base::Version OSInfo::Kernel32BaseVersion() const { staticconst NoDestructor<base::Version> version([] {
std::unique_ptr<FileVersionInfoWin> file_version_info =
FileVersionInfoWin::CreateFileVersionInfoWin(
FilePath(FILE_PATH_LITERAL("kernel32.dll"))); if (!file_version_info) { // crbug.com/912061: on some systems it seems kernel32.dll might be // corrupted or not in a state to get version info. In this case try // kernelbase.dll as a fallback.
file_version_info = FileVersionInfoWin::CreateFileVersionInfoWin(
FilePath(FILE_PATH_LITERAL("kernelbase.dll")));
}
CHECK(file_version_info); return file_version_info->GetFileVersion();
}()); return *version;
}
// With the exception of Server 2003, server variants are treated the same as // the corresponding workstation release. // static
Version OSInfo::MajorMinorBuildToVersion(int major, int minor, int build) { if (major == 10) { if (build >= 19041) return Version::WIN10_20H1; if (build >= 18362) return Version::WIN10_19H1; if (build >= 17763) return Version::WIN10_RS5; if (build >= 17134) return Version::WIN10_RS4; if (build >= 16299) return Version::WIN10_RS3; if (build >= 15063) return Version::WIN10_RS2; if (build >= 14393) return Version::WIN10_RS1; if (build >= 10586) return Version::WIN10_TH2; return Version::WIN10;
}
if (major > 6) { // Hitting this likely means that it's time for a >10 block above.
NOTREACHED() << major << "." << minor << "." << build; return Version::WIN_LAST;
}
if (major == 6) { switch (minor) { case 0: return Version::VISTA; case 1: return Version::WIN7; case 2: return Version::WIN8; default:
DCHECK_EQ(minor, 3); return Version::WIN8_1;
}
}
if (major == 5 && minor != 0) { // Treat XP Pro x64, Home Server, and Server 2003 R2 as Server 2003. return minor == 1 ? Version::XP : Version::SERVER_2003;
}
// Win 2000 or older. return Version::PRE_XP;
}
Version GetVersion() { return OSInfo::GetInstance()->version();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.