OS Version UWP, Win32

This commit is contained in:
Bashar Astifan
2024-09-03 20:07:57 +04:00
parent b235d4b218
commit f1771b9474
6 changed files with 40 additions and 98 deletions
+3 -55
View File
@@ -93,46 +93,8 @@ bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, u
#endif
}
bool DoesVersionMatchWindows(WindowsReleaseInfo release, uint64_t version, uint32_t& outMajor, uint32_t& outMinor, uint32_t& outBuild) {
if (release.spMajor == 0 && release.spMinor == 0) {
// Compare Info
uint32_t major = release.major;
uint32_t minor = release.minor;
uint32_t build = release.build;
bool greater = release.greater;
// System Info
uint32_t osMajor = 0, osMinor = 0, osBuild = 0, osRevision = 0;
if (version > 0) {
// Extract the major, minor, build, and revision numbers
// UWP take this path
osMajor = static_cast<uint32_t>((version & 0xFFFF000000000000L) >> 48);
osMinor = static_cast<uint32_t>((version & 0x0000FFFF00000000L) >> 32);
osBuild = static_cast<uint32_t>((version & 0x00000000FFFF0000L) >> 16);
osRevision = static_cast<uint32_t>((version & 0x000000000000FFFFL));
}
else {
// "Applications not manifested for Windows 10 will return the Windows 8 OS version value (6.2)."
// Try to use kernel32.dll instead, for Windows 10+.
GetVersionFromKernel32(osMajor, osMinor, osBuild);
}
if (major == osMajor) {
// To detect Windows 11 we must check build number
if (osMinor >= minor && osBuild >= build) {
outMajor = osMajor;
outMinor = osMinor;
outBuild = osBuild;
return true;
}
}
}
else {
return DoesVersionMatchWindows(release.major, release.minor, release.spMajor, release.spMinor, release.greater);
}
return false;
bool DoesVersionMatchWindows(WindowsReleaseInfo release) {
return DoesVersionMatchWindows(release.major, release.minor, release.spMajor, release.spMinor, release.greater);
}
bool IsVistaOrHigher() {
@@ -146,20 +108,6 @@ bool IsWin7OrHigher() {
}
std::string GetWindowsVersion() {
uint32_t outMajor = 0, outMinor = 0, outBuild = 0; // Dummy
return GetWindowsVersion(0, outMajor, outMinor, outBuild);
}
std::string GetWindowsVersion(uint64_t versionInfo) {
uint32_t outMajor = 0, outMinor = 0, outBuild = 0; // Dummy
return GetWindowsVersion(versionInfo, outMajor, outMinor, outBuild);
}
std::string GetWindowsVersion(uint32_t& outMajor, uint32_t& outMinor, uint32_t& outBuild) {
return GetWindowsVersion(0, outMajor, outMinor, outBuild);
}
std::string GetWindowsVersion(uint64_t versionInfo, uint32_t& outMajor, uint32_t& outMinor, uint32_t& outBuild) {
std::vector<std::pair<std::string, WindowsReleaseInfo>> windowsReleases = {
/* { "Preview text", { major, minor, spMajor, spMinor, build, greater } }, */
{ "Microsoft Windows XP, Service Pack 2", { 5, 1, 2, 0 } },
@@ -178,7 +126,7 @@ std::string GetWindowsVersion(uint64_t versionInfo, uint32_t& outMajor, uint32_t
// Start from higher to lower
for (auto release = rbegin(windowsReleases); release != rend(windowsReleases); ++release) {
WindowsReleaseInfo releaseInfo = release->second;
bool buildMatch = DoesVersionMatchWindows(releaseInfo, versionInfo, outMajor, outMinor, outBuild);
bool buildMatch = DoesVersionMatchWindows(releaseInfo);
if (buildMatch) {
std::string previewText = release->first;
return previewText;
+1 -8
View File
@@ -7,16 +7,9 @@
bool IsVistaOrHigher();
bool IsWin7OrHigher();
bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, uint32_t spMinor, bool acceptGreater);
bool GetVersionFromKernel32(uint32_t& major, uint32_t& minor, uint32_t& build);
std::string GetWindowsVersion();
// Platforms like UWP has their own API,
// so we use versionInfo to pass version info from outside
// on Win32 it will use kernel (normal behavior) when versionInfo is 0
std::string GetWindowsVersion(uint64_t versionInfo);
std::string GetWindowsVersion(uint32_t& outMajor, uint32_t& outMinor, uint32_t& outBuild);
std::string GetWindowsVersion(uint64_t versionInfo, uint32_t& outMajor, uint32_t& outMinor, uint32_t& outBuild);
std::string GetWindowsSystemArchitecture();
#endif
+2 -15
View File
@@ -24,7 +24,6 @@
#include "Common/System/Display.h"
#include "Common/System/NativeApp.h"
#include "Common/System/Request.h"
#include "Common/OSVersion.h"
#include "Core/System.h"
#include "Core/Loaders.h"
@@ -314,21 +313,9 @@ std::string System_GetProperty(SystemProperty prop) {
static bool hasCheckedGPUDriverVersion = false;
switch (prop) {
case SYSPROP_NAME:
{
uint64_t versionInfo = GetWindowsVersionInfo();
std::string osName;
if (IsXBox()) {
osName = "Xbox OS";
}
else {
osName = GetWindowsVersion(versionInfo);
}
osName += " " + GetWindowsSystemArchitecture();
return osName;
}
return GetSystemName();
case SYSPROP_SYSTEMVERSION:
return GetWindowsVersionInfoPreview();
return GetWindowsBuild();
case SYSPROP_LANGREGION:
return GetLangRegion();
case SYSPROP_CLIPBOARD_TEXT:
+23 -8
View File
@@ -21,6 +21,7 @@
#include "UWPUtil.h"
#include "NKCodeFromWindowsSystem.h"
#include "Common/Log.h"
#include "Common/OSVersion.h"
#include <ppl.h>
#include <ppltasks.h>
@@ -239,25 +240,39 @@ bool IsMobile() {
return deviceInfo->DeviceFamily == "Windows.Mobile";
}
uint64_t GetWindowsVersionInfo() {
void GetVersionInfo(uint32_t& major, uint32_t& minor, uint32_t& build, uint32_t& revision) {
Platform::String^ deviceFamilyVersion = Windows::System::Profile::AnalyticsInfo::VersionInfo->DeviceFamilyVersion;
return std::stoull(deviceFamilyVersion->Data());
}
uint64_t version = std::stoull(deviceFamilyVersion->Data());
void ParseVersionInfo(uint64_t version, uint32_t& major, uint32_t& minor, uint32_t& build, uint32_t& revision) {
major = static_cast<uint32_t>((version & 0xFFFF000000000000L) >> 48);
minor = static_cast<uint32_t>((version & 0x0000FFFF00000000L) >> 32);
build = static_cast<uint32_t>((version & 0x00000000FFFF0000L) >> 16);
revision = static_cast<uint32_t>(version & 0x000000000000FFFFL);
}
std::string GetWindowsVersionInfoPreview() {
uint64_t version = GetWindowsVersionInfo();
std::string GetSystemName() {
std::string osName = "Microsoft Windows 10";
if (IsXBox()) {
osName = "Xbox OS";
}
else {
uint32_t major = 0, minor = 0, build = 0, revision = 0;
GetVersionInfo(major, minor, build, revision);
if (build >= 22000) {
osName = "Microsoft Windows 11";
}
}
return osName + " " + GetWindowsSystemArchitecture();
}
std::string GetWindowsBuild() {
uint32_t major = 0, minor = 0, build = 0, revision = 0;
ParseVersionInfo(version, major, minor, build, revision);
GetVersionInfo(major, minor, build, revision);
char buffer[50];
sprintf_s(buffer, sizeof(buffer), "%u.%u.%u", major, minor, build);
sprintf_s(buffer, sizeof(buffer), "%u.%u.%u (rev. %u)", major, minor, build, revision);
return std::string(buffer);
}
#pragma endregion
+6 -6
View File
@@ -48,9 +48,9 @@ std::string GetLangRegion();
bool IsXBox();
bool IsMobile();
// Get windows version info
uint64_t GetWindowsVersionInfo();
// Parse data from GetWindowsVersionInfo to major, minor, build, revision
void ParseVersionInfo(uint64_t version, uint32_t& major, uint32_t& minor, uint32_t& build, uint32_t& revision);
// Get formatted windows version as string (for preview)
std::string GetWindowsVersionInfoPreview();
// Get major, minor, build, revision
void GetVersionInfo(uint32_t& major, uint32_t& minor, uint32_t& build, uint32_t& revision);
// Get formatted windows info as string (for preview)
std::string GetSystemName();
std::string GetWindowsBuild();
+5 -6
View File
@@ -906,14 +906,13 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin
g_VFS.Register("", new DirectoryReader(exePath));
langRegion = GetDefaultLangRegion();
osName = GetWindowsVersion() + " " + GetWindowsSystemArchitecture();
// OS Build
uint32_t outMajor = 0, outMinor = 0, outBuild = 0;
osName = GetWindowsVersion(outMajor, outMinor, outBuild) + " " + GetWindowsSystemArchitecture();
if (outMajor > 0) {
// Builds with (service pack) don't show OS Version for now
char buffer[50];
sprintf_s(buffer, sizeof(buffer), "%u.%u.%u", outMajor, outMinor, outBuild);
osVersion = std::string(buffer);
if (GetVersionFromKernel32(outMajor, outMinor, outBuild)) {
// Builds with (service pack) don't show OS Build for now
osVersion = std::to_string(outMajor) + "." + std::to_string(outMinor) + "." + std::to_string(outBuild);
}
std::string configFilename = "";