From b235d4b218db522ad665ab1afdbdf75954a82548 Mon Sep 17 00:00:00 2001 From: Bashar Astifan Date: Tue, 3 Sep 2024 15:58:35 +0400 Subject: [PATCH 1/4] OS Version preview --- Common/OSVersion.cpp | 50 ++++++++++++++++++++++----------- Common/OSVersion.h | 9 ++++++ UI/DevScreens.cpp | 5 ++++ UWP/PPSSPP_UWPMain.cpp | 16 ++++++++++- UWP/UWPHelpers/InputHelpers.cpp | 22 +++++++++++++++ UWP/UWPHelpers/InputHelpers.h | 7 +++++ Windows/main.cpp | 13 ++++++++- 7 files changed, 104 insertions(+), 18 deletions(-) diff --git a/Common/OSVersion.cpp b/Common/OSVersion.cpp index ee35ef7c4e..973dc4ce5d 100644 --- a/Common/OSVersion.cpp +++ b/Common/OSVersion.cpp @@ -93,7 +93,7 @@ bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, u #endif } -bool DoesVersionMatchWindows(WindowsReleaseInfo release) { +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; @@ -101,25 +101,29 @@ bool DoesVersionMatchWindows(WindowsReleaseInfo release) { uint32_t build = release.build; bool greater = release.greater; - OSVERSIONINFOEX osvi; - ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - GetVersionEx((LPOSVERSIONINFO)&osvi); + // System Info + uint32_t osMajor = 0, osMinor = 0, osBuild = 0, osRevision = 0; - // OS Info - uint32_t osMajor = osvi.dwMajorVersion; - uint32_t osMinor = osvi.dwMinorVersion; - uint32_t osBuild = osvi.dwBuildNumber; - -#if !PPSSPP_PLATFORM(UWP) - // "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); -#endif + if (version > 0) { + // Extract the major, minor, build, and revision numbers + // UWP take this path + osMajor = static_cast((version & 0xFFFF000000000000L) >> 48); + osMinor = static_cast((version & 0x0000FFFF00000000L) >> 32); + osBuild = static_cast((version & 0x00000000FFFF0000L) >> 16); + osRevision = static_cast((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; } } @@ -142,6 +146,20 @@ 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> windowsReleases = { /* { "Preview text", { major, minor, spMajor, spMinor, build, greater } }, */ { "Microsoft Windows XP, Service Pack 2", { 5, 1, 2, 0 } }, @@ -160,7 +178,7 @@ std::string GetWindowsVersion() { // Start from higher to lower for (auto release = rbegin(windowsReleases); release != rend(windowsReleases); ++release) { WindowsReleaseInfo releaseInfo = release->second; - bool buildMatch = DoesVersionMatchWindows(releaseInfo); + bool buildMatch = DoesVersionMatchWindows(releaseInfo, versionInfo, outMajor, outMinor, outBuild); if (buildMatch) { std::string previewText = release->first; return previewText; diff --git a/Common/OSVersion.h b/Common/OSVersion.h index 262cba05ac..9701d23295 100644 --- a/Common/OSVersion.h +++ b/Common/OSVersion.h @@ -7,7 +7,16 @@ bool IsVistaOrHigher(); bool IsWin7OrHigher(); bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, uint32_t spMinor, bool acceptGreater); + 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 diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index 56cda92067..afd1850fa8 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -489,6 +489,11 @@ void SystemInfoScreen::CreateTabs() { systemInfo->Add(new InfoItem(si->T("System Name", "Name"), System_GetProperty(SYSPROP_NAME))); #if PPSSPP_PLATFORM(ANDROID) systemInfo->Add(new InfoItem(si->T("System Version"), StringFromInt(System_GetPropertyInt(SYSPROP_SYSTEMVERSION)))); +#elif PPSSPP_PLATFORM(WINDOWS) + std::string sysVersion = System_GetProperty(SYSPROP_SYSTEMVERSION); + if (!sysVersion.empty()) { + systemInfo->Add(new InfoItem(si->T("OS Build"), sysVersion)); + } #endif systemInfo->Add(new InfoItem(si->T("Lang/Region"), System_GetProperty(SYSPROP_LANGREGION))); std::string board = System_GetProperty(SYSPROP_BOARDNAME); diff --git a/UWP/PPSSPP_UWPMain.cpp b/UWP/PPSSPP_UWPMain.cpp index 719d342821..648044d724 100644 --- a/UWP/PPSSPP_UWPMain.cpp +++ b/UWP/PPSSPP_UWPMain.cpp @@ -314,7 +314,21 @@ std::string System_GetProperty(SystemProperty prop) { static bool hasCheckedGPUDriverVersion = false; switch (prop) { case SYSPROP_NAME: - return GetWindowsVersion(); + { + uint64_t versionInfo = GetWindowsVersionInfo(); + std::string osName; + if (IsXBox()) { + osName = "Xbox OS"; + } + else { + osName = GetWindowsVersion(versionInfo); + } + + osName += " " + GetWindowsSystemArchitecture(); + return osName; + } + case SYSPROP_SYSTEMVERSION: + return GetWindowsVersionInfoPreview(); case SYSPROP_LANGREGION: return GetLangRegion(); case SYSPROP_CLIPBOARD_TEXT: diff --git a/UWP/UWPHelpers/InputHelpers.cpp b/UWP/UWPHelpers/InputHelpers.cpp index 485998a044..2b9858b2c9 100644 --- a/UWP/UWPHelpers/InputHelpers.cpp +++ b/UWP/UWPHelpers/InputHelpers.cpp @@ -238,4 +238,26 @@ bool IsMobile() { auto deviceInfo = Windows::System::Profile::AnalyticsInfo::VersionInfo; return deviceInfo->DeviceFamily == "Windows.Mobile"; } + +uint64_t GetWindowsVersionInfo() { + Platform::String^ deviceFamilyVersion = Windows::System::Profile::AnalyticsInfo::VersionInfo->DeviceFamilyVersion; + return std::stoull(deviceFamilyVersion->Data()); +} + +void ParseVersionInfo(uint64_t version, uint32_t& major, uint32_t& minor, uint32_t& build, uint32_t& revision) { + major = static_cast((version & 0xFFFF000000000000L) >> 48); + minor = static_cast((version & 0x0000FFFF00000000L) >> 32); + build = static_cast((version & 0x00000000FFFF0000L) >> 16); + revision = static_cast(version & 0x000000000000FFFFL); +} + +std::string GetWindowsVersionInfoPreview() { + uint64_t version = GetWindowsVersionInfo(); + uint32_t major = 0, minor = 0, build = 0, revision = 0; + ParseVersionInfo(version, major, minor, build, revision); + + char buffer[50]; + sprintf_s(buffer, sizeof(buffer), "%u.%u.%u", major, minor, build); + return std::string(buffer); +} #pragma endregion diff --git a/UWP/UWPHelpers/InputHelpers.h b/UWP/UWPHelpers/InputHelpers.h index d5656e81fc..76f362dd79 100644 --- a/UWP/UWPHelpers/InputHelpers.h +++ b/UWP/UWPHelpers/InputHelpers.h @@ -47,3 +47,10 @@ bool IsCtrlOnHold(); 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(); diff --git a/Windows/main.cpp b/Windows/main.cpp index bd763a0908..6d78b18114 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -106,6 +106,7 @@ CVFPUDlg *vfpudlg = nullptr; static std::string langRegion; static std::string osName; +static std::string osVersion; static std::string gpuDriverVersion; static std::string restartArgs; @@ -203,6 +204,8 @@ std::string System_GetProperty(SystemProperty prop) { switch (prop) { case SYSPROP_NAME: return osName; + case SYSPROP_SYSTEMVERSION: + return osVersion; case SYSPROP_LANGREGION: return langRegion; case SYSPROP_CLIPBOARD_TEXT: @@ -903,7 +906,15 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin g_VFS.Register("", new DirectoryReader(exePath)); langRegion = GetDefaultLangRegion(); - osName = GetWindowsVersion() + " " + GetWindowsSystemArchitecture(); + + 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); + } std::string configFilename = ""; const std::wstring configOption = L"--config="; From f1771b9474f425e742fc12d7a429c7a5ec6587b7 Mon Sep 17 00:00:00 2001 From: Bashar Astifan Date: Tue, 3 Sep 2024 20:07:57 +0400 Subject: [PATCH 2/4] OS Version UWP, Win32 --- Common/OSVersion.cpp | 58 ++------------------------------- Common/OSVersion.h | 9 +---- UWP/PPSSPP_UWPMain.cpp | 17 ++-------- UWP/UWPHelpers/InputHelpers.cpp | 31 +++++++++++++----- UWP/UWPHelpers/InputHelpers.h | 12 +++---- Windows/main.cpp | 11 +++---- 6 files changed, 40 insertions(+), 98 deletions(-) diff --git a/Common/OSVersion.cpp b/Common/OSVersion.cpp index 973dc4ce5d..75ea112838 100644 --- a/Common/OSVersion.cpp +++ b/Common/OSVersion.cpp @@ -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((version & 0xFFFF000000000000L) >> 48); - osMinor = static_cast((version & 0x0000FFFF00000000L) >> 32); - osBuild = static_cast((version & 0x00000000FFFF0000L) >> 16); - osRevision = static_cast((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> 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; diff --git a/Common/OSVersion.h b/Common/OSVersion.h index 9701d23295..0e44a4f205 100644 --- a/Common/OSVersion.h +++ b/Common/OSVersion.h @@ -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 diff --git a/UWP/PPSSPP_UWPMain.cpp b/UWP/PPSSPP_UWPMain.cpp index 648044d724..084e350920 100644 --- a/UWP/PPSSPP_UWPMain.cpp +++ b/UWP/PPSSPP_UWPMain.cpp @@ -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: diff --git a/UWP/UWPHelpers/InputHelpers.cpp b/UWP/UWPHelpers/InputHelpers.cpp index 2b9858b2c9..441b731094 100644 --- a/UWP/UWPHelpers/InputHelpers.cpp +++ b/UWP/UWPHelpers/InputHelpers.cpp @@ -21,6 +21,7 @@ #include "UWPUtil.h" #include "NKCodeFromWindowsSystem.h" #include "Common/Log.h" +#include "Common/OSVersion.h" #include #include @@ -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((version & 0xFFFF000000000000L) >> 48); minor = static_cast((version & 0x0000FFFF00000000L) >> 32); build = static_cast((version & 0x00000000FFFF0000L) >> 16); revision = static_cast(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 diff --git a/UWP/UWPHelpers/InputHelpers.h b/UWP/UWPHelpers/InputHelpers.h index 76f362dd79..7bcfb4931c 100644 --- a/UWP/UWPHelpers/InputHelpers.h +++ b/UWP/UWPHelpers/InputHelpers.h @@ -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(); diff --git a/Windows/main.cpp b/Windows/main.cpp index 6d78b18114..34536daeb4 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -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 = ""; From b015225bf6e50c03df85f765a521c3d2b0b2cb64 Mon Sep 17 00:00:00 2001 From: Bashar Astifan Date: Tue, 3 Sep 2024 20:42:34 +0400 Subject: [PATCH 3/4] Adding SYSPROP_SYSTEMBUILD Using `SYSPROP_SYSTEMVERSION` is bad idea since it's set under `Available as Int`, instead I just added `SYSPROP_SYSTEMBUILD` --- Common/System/System.h | 1 + UI/DevScreens.cpp | 2 +- UWP/PPSSPP_UWPMain.cpp | 2 +- Windows/main.cpp | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Common/System/System.h b/Common/System/System.h index b0f83d70bd..fdd7a81874 100644 --- a/Common/System/System.h +++ b/Common/System/System.h @@ -124,6 +124,7 @@ enum SystemKeyboardLayout { enum SystemProperty { SYSPROP_NAME, + SYSPROP_SYSTEMBUILD, SYSPROP_LANGREGION, SYSPROP_CPUINFO, SYSPROP_BOARDNAME, diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index afd1850fa8..53300d3d74 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -490,7 +490,7 @@ void SystemInfoScreen::CreateTabs() { #if PPSSPP_PLATFORM(ANDROID) systemInfo->Add(new InfoItem(si->T("System Version"), StringFromInt(System_GetPropertyInt(SYSPROP_SYSTEMVERSION)))); #elif PPSSPP_PLATFORM(WINDOWS) - std::string sysVersion = System_GetProperty(SYSPROP_SYSTEMVERSION); + std::string sysVersion = System_GetProperty(SYSPROP_SYSTEMBUILD); if (!sysVersion.empty()) { systemInfo->Add(new InfoItem(si->T("OS Build"), sysVersion)); } diff --git a/UWP/PPSSPP_UWPMain.cpp b/UWP/PPSSPP_UWPMain.cpp index 084e350920..140d0948fd 100644 --- a/UWP/PPSSPP_UWPMain.cpp +++ b/UWP/PPSSPP_UWPMain.cpp @@ -314,7 +314,7 @@ std::string System_GetProperty(SystemProperty prop) { switch (prop) { case SYSPROP_NAME: return GetSystemName(); - case SYSPROP_SYSTEMVERSION: + case SYSPROP_SYSTEMBUILD: return GetWindowsBuild(); case SYSPROP_LANGREGION: return GetLangRegion(); diff --git a/Windows/main.cpp b/Windows/main.cpp index 34536daeb4..cfd7d987e9 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -204,7 +204,7 @@ std::string System_GetProperty(SystemProperty prop) { switch (prop) { case SYSPROP_NAME: return osName; - case SYSPROP_SYSTEMVERSION: + case SYSPROP_SYSTEMBUILD: return osVersion; case SYSPROP_LANGREGION: return langRegion; From e7d7d89066861ddc2774b1fd70fca8ae0511199b Mon Sep 17 00:00:00 2001 From: Bashar Astifan Date: Wed, 4 Sep 2024 22:56:37 +0400 Subject: [PATCH 4/4] Simplify & win11-build check fix Without build check on Windows 10 it will appear as Windows 11, I forgot to keep build check, also the process can be simplified more to avoid extra functions. --- Common/OSVersion.cpp | 25 +++++++++++++------------ Common/OSVersion.h | 3 ++- Core/Config.cpp | 6 +++--- Windows/MainWindow.cpp | 2 +- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Common/OSVersion.cpp b/Common/OSVersion.cpp index 75ea112838..a69b8217c7 100644 --- a/Common/OSVersion.cpp +++ b/Common/OSVersion.cpp @@ -46,7 +46,7 @@ bool GetVersionFromKernel32(uint32_t &major, uint32_t &minor, uint32_t &build) { #endif } -bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, uint32_t spMinor, bool greater) { +bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, uint32_t spMinor, uint32_t build, bool greater) { #if !PPSSPP_PLATFORM(UWP) if (spMajor == 0 && spMinor == 0) { // "Applications not manifested for Windows 10 will return the Windows 8 OS version value (6.2)." @@ -55,7 +55,9 @@ bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, u if (GetVersionFromKernel32(actualMajor, actualMinor, actualBuild)) { if (greater) return actualMajor > major || (major == actualMajor && actualMinor >= minor); - return major == actualMajor && minor == actualMinor; + + // To detect Windows 11 we must check build number + return major == actualMajor && minor == actualMinor && actualBuild >= build; } } @@ -86,25 +88,25 @@ bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, u return VerifyVersionInfo(&osvi, typeMask, conditionMask) != FALSE; #else - if (greater) { + if (greater) return true; - } return false; #endif } -bool DoesVersionMatchWindows(WindowsReleaseInfo release) { - return DoesVersionMatchWindows(release.major, release.minor, release.spMajor, release.spMinor, release.greater); -} - bool IsVistaOrHigher() { // Vista is 6.0 - return DoesVersionMatchWindows(6, 0, 0, 0, true); + return DoesVersionMatchWindows(6, 0, 0, 0, 0, true); } bool IsWin7OrHigher() { // Win7 is 6.1 - return DoesVersionMatchWindows(6, 1, 0, 0, true); + return DoesVersionMatchWindows(6, 1, 0, 0, 0, true); +} + +bool IsWin8OrHigher() { + // Win8 is 6.2 + return DoesVersionMatchWindows(6, 2, 0, 0, 0, true); } std::string GetWindowsVersion() { @@ -126,8 +128,7 @@ std::string GetWindowsVersion() { // Start from higher to lower for (auto release = rbegin(windowsReleases); release != rend(windowsReleases); ++release) { WindowsReleaseInfo releaseInfo = release->second; - bool buildMatch = DoesVersionMatchWindows(releaseInfo); - if (buildMatch) { + if (DoesVersionMatchWindows(releaseInfo.major, releaseInfo.minor, releaseInfo.spMajor, releaseInfo.spMinor, releaseInfo.build, releaseInfo.greater)) { std::string previewText = release->first; return previewText; } diff --git a/Common/OSVersion.h b/Common/OSVersion.h index 0e44a4f205..c1704b85df 100644 --- a/Common/OSVersion.h +++ b/Common/OSVersion.h @@ -6,7 +6,8 @@ bool IsVistaOrHigher(); bool IsWin7OrHigher(); -bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, uint32_t spMinor, bool acceptGreater); +bool IsWin8OrHigher(); +bool DoesVersionMatchWindows(uint32_t major, uint32_t minor, uint32_t spMajor, uint32_t spMinor, uint32_t build, bool acceptGreater); bool GetVersionFromKernel32(uint32_t& major, uint32_t& minor, uint32_t& build); std::string GetWindowsVersion(); diff --git a/Core/Config.cpp b/Core/Config.cpp index 5d2348d735..9e24732136 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -423,7 +423,7 @@ static int DefaultGPUBackend() { #if PPSSPP_PLATFORM(WINDOWS) // If no Vulkan, use Direct3D 11 on Windows 8+ (most importantly 10.) - if (DoesVersionMatchWindows(6, 2, 0, 0, true)) { + if (IsWin8OrHigher()) { return (int)GPUBackend::DIRECT3D11; } #elif PPSSPP_PLATFORM(ANDROID) @@ -489,7 +489,7 @@ int Config::NextValidBackend() { } #endif #if PPSSPP_PLATFORM(WINDOWS) - if (!failed.count(GPUBackend::DIRECT3D11) && DoesVersionMatchWindows(6, 1, 0, 0, true)) { + if (!failed.count(GPUBackend::DIRECT3D11) && IsWin7OrHigher()) { return (int)GPUBackend::DIRECT3D11; } #endif @@ -536,7 +536,7 @@ bool Config::IsBackendEnabled(GPUBackend backend) { if (backend != GPUBackend::OPENGL) return false; #elif PPSSPP_PLATFORM(WINDOWS) - if (backend == GPUBackend::DIRECT3D11 && !DoesVersionMatchWindows(6, 0, 0, 0, true)) + if (backend == GPUBackend::DIRECT3D11 && !IsVistaOrHigher()) return false; #else if (backend == GPUBackend::DIRECT3D11 || backend == GPUBackend::DIRECT3D9) diff --git a/Windows/MainWindow.cpp b/Windows/MainWindow.cpp index 8921e9c985..09857e31d2 100644 --- a/Windows/MainWindow.cpp +++ b/Windows/MainWindow.cpp @@ -765,7 +765,7 @@ namespace MainWindow switch (message) { case WM_CREATE: - if (!DoesVersionMatchWindows(6, 0, 0, 0, true)) { + if (!IsVistaOrHigher()) { // Remove the D3D11 choice on versions below XP RemoveMenu(GetMenu(hWnd), ID_OPTIONS_DIRECT3D11, MF_BYCOMMAND); }