diff --git a/cmake/windows/windows.cmake b/cmake/windows/windows.cmake index 2aff156..fb34cdf 100644 --- a/cmake/windows/windows.cmake +++ b/cmake/windows/windows.cmake @@ -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( diff --git a/include/sys/windows/WinVersion.h b/include/sys/windows/WinVersion.h new file mode 100644 index 0000000..c260e23 --- /dev/null +++ b/include/sys/windows/WinVersion.h @@ -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); +}; + diff --git a/src/sys/windows/WinVersion.cpp b/src/sys/windows/WinVersion.cpp new file mode 100644 index 0000000..1760476 --- /dev/null +++ b/src/sys/windows/WinVersion.cpp @@ -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 + +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; +} diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 6e5da02..05bf832 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -22,10 +22,7 @@ #ifdef Q_OS_WIN #include "3rdparty/WinCommander.hpp" -#include -#include -#include -#include +#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";