From 8b779bdae2f7758fb25e83775854d3d5cf7fa106 Mon Sep 17 00:00:00 2001 From: SIrHrVedel <38987957+SirHrVedel@users.noreply.github.com> Date: Sun, 7 Jun 2026 22:41:37 +0200 Subject: [PATCH] Fix Windows system version detection --- src/Cafe/CafeSystem.cpp | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/Cafe/CafeSystem.cpp b/src/Cafe/CafeSystem.cpp index 096d90f4..d466b66c 100644 --- a/src/Cafe/CafeSystem.cpp +++ b/src/Cafe/CafeSystem.cpp @@ -499,21 +499,43 @@ namespace CafeSystem std::string GetWindowsNamedVersion(uint32& buildNumber) { char productName[256]; + char buildNumberStr[32]; + char featureVersion[32]; HKEY hKey; DWORD dwType = REG_SZ; DWORD dwSize = sizeof(productName); + buildNumber = 0; + featureVersion[0] = '\0'; if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { if (RegQueryValueExA(hKey, "ProductName", NULL, &dwType, (LPBYTE)productName, &dwSize) != ERROR_SUCCESS) strcpy(productName, "Windows"); + dwType = REG_SZ; + dwSize = sizeof(buildNumberStr); + if (RegQueryValueExA(hKey, "CurrentBuildNumber", NULL, &dwType, (LPBYTE)buildNumberStr, &dwSize) == ERROR_SUCCESS) + buildNumber = (uint32)atoi(buildNumberStr); + dwType = REG_SZ; + dwSize = sizeof(featureVersion); + if (RegQueryValueExA(hKey, "DisplayVersion", NULL, &dwType, (LPBYTE)featureVersion, &dwSize) != ERROR_SUCCESS) + { + dwType = REG_SZ; + dwSize = sizeof(featureVersion); + if (RegQueryValueExA(hKey, "ReleaseId", NULL, &dwType, (LPBYTE)featureVersion, &dwSize) != ERROR_SUCCESS) + featureVersion[0] = '\0'; + } RegCloseKey(hKey); } - OSVERSIONINFO osvi; - ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&osvi); - buildNumber = osvi.dwBuildNumber; - return std::string(productName); + std::string result(productName); + // ProductName can still read "Windows 10" on Windows 11 after an in-place upgrade + if (buildNumber >= 22000) + { + size_t pos = result.find("Windows 10"); + if (pos != std::string::npos) + result.replace(pos, 10, "Windows 11"); + } + if (featureVersion[0] != '\0') + result += fmt::format(" {}", featureVersion); + return result; } #endif