fix: improve windows version detection

This commit is contained in:
parhelia512 2025-07-20 11:30:45 +08:00
parent f8acb23ebb
commit b3cb901479
4 changed files with 99 additions and 7 deletions

View File

@ -1,5 +1,5 @@
set(PLATFORM_SOURCES 3rdparty/WinCommander.cpp src/sys/windows/guihelper.cpp src/sys/windows/MiniDump.cpp src/sys/windows/eventHandler.cpp)
set(PLATFORM_LIBRARIES wininet wsock32 ws2_32 user32 rasapi32 iphlpapi)
set(PLATFORM_SOURCES 3rdparty/WinCommander.cpp src/sys/windows/guihelper.cpp src/sys/windows/MiniDump.cpp src/sys/windows/eventHandler.cpp src/sys/windows/WinVersion.cpp)
set(PLATFORM_LIBRARIES wininet wsock32 ws2_32 user32 rasapi32 iphlpapi ntdll)
include(cmake/windows/generate_product_version.cmake)
generate_product_version(

View File

@ -0,0 +1,55 @@
// The MIT License (MIT)
// Windows Version Detection 1.2.0
// Copyright (C) 2022 - 2023 by Shao Voon Wong (shaovoon@yahoo.com)
//
// http://opensource.org/licenses/MIT
// History
// 1.0.0: First Releease
// 1.1.0: Added IsBuildNumGreaterOrEqual()
// 1.2.0: Removed the Windows 11 build number check to set major version to 11.
#pragma once
struct VersionInfo
{
VersionInfo() : Major(0), Minor(0), BuildNum(0) {}
unsigned int Major;
unsigned int Minor;
unsigned int BuildNum;
};
struct BuildNumber
{
enum BN : unsigned int
{
Windows_Vista = 6002,
Windows_7 = 7601,
Windows_8 = 9200,
Windows_8_1 = 9600,
Windows_10_1507 = 10240,
Windows_10_1511 = 10586,
Windows_10_1607 = 14393,
Windows_10_1703 = 15063,
Windows_10_1709 = 16299,
Windows_10_1803 = 17134,
Windows_10_1809 = 17763,
Windows_10_1903 = 18362,
Windows_10_1909 = 18363,
Windows_10_2004 = 19041,
Windows_10_20H2 = 19042,
Windows_10_21H1 = 19043,
Windows_10_21H2 = 19044,
Windows_10_22H2 = 19045,
Windows_11_21H2 = 22000,
Windows_11_22H2 = 22621,
};
};
class WinVersion
{
public:
static bool GetVersion(VersionInfo& info);
static bool IsBuildNumGreaterOrEqual(unsigned int buildNumber);
};

View File

@ -0,0 +1,40 @@
// The MIT License (MIT)
// Windows Version Detection 1.2.0
// Copyright (C) 2022 - 2023 by Shao Voon Wong (shaovoon@yahoo.com)
//
// http://opensource.org/licenses/MIT
// History
// 1.0.0: First Releease
// 1.1.0: Added IsBuildNumGreaterOrEqual()
// 1.2.0: Removed the Windows 11 build number check to set major version to 11.
#include "include/sys/windows/WinVersion.h"
#include <Windows.h>
extern "C" NTSTATUS __stdcall RtlGetVersion(OSVERSIONINFOEXW * lpVersionInformation);
bool WinVersion::GetVersion(VersionInfo& info)
{
OSVERSIONINFOEXW osv;
osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
if (RtlGetVersion(&osv) == 0)
{
info.Major = osv.dwMajorVersion;
info.Minor = osv.dwMinorVersion;
info.BuildNum = osv.dwBuildNumber;
return true;
}
return false;
}
bool WinVersion::IsBuildNumGreaterOrEqual(unsigned int buildNumber)
{
VersionInfo info;
if (GetVersion(info))
{
return (info.BuildNum >= buildNumber);
}
return false;
}

View File

@ -22,10 +22,7 @@
#ifdef Q_OS_WIN
#include "3rdparty/WinCommander.hpp"
#include <sdkddkver.h>
#include <minwindef.h>
#include <winbase.h>
#include <VersionHelpers.h>
#include "include/sys/windows/WinVersion.h"
#else
#ifdef Q_OS_LINUX
#include "include/sys/linux/LinuxCap.h"
@ -2286,7 +2283,7 @@ void MainWindow::CheckUpdate() {
QString search;
#ifdef Q_OS_WIN32
# ifdef Q_OS_WIN64
if (IsWindows10OrGreater())
if (WinVersion::IsBuildNumGreaterOrEqual(BuildNumber::Windows_10_1809))
search = "windows64";
else
search = "windowslegacy64";