diff --git a/include/Cubed/tools/system_version.hpp b/include/Cubed/tools/system_version.hpp index 849e874..d7072ab 100644 --- a/include/Cubed/tools/system_version.hpp +++ b/include/Cubed/tools/system_version.hpp @@ -1,13 +1,37 @@ #pragma once #include -#include - #include #ifdef _WIN32 +#include +typedef LONG (WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW); +inline bool get_os_version(std::string& str) { + HMODULE hntdll = GetModuleHandleW(L"ntdll.dll"); + if (!hntdll) return false; + + auto prtl_get_version = reinterpret_cast( + GetProcAddress(hntdll, "RtlGetVersion")); + if (!prtl_get_version) return false; + + RTL_OSVERSIONINFOW osvi = { 0 }; + osvi.dwOSVersionInfoSize = sizeof(osvi); + if (prtl_get_version(&osvi) != 0) return false; + if (osvi.dwMajorVersion == 10) { + if (osvi.dwBuildNumber >= 22000) { + str = "Windows 11 Build " + std::to_string(osvi.dwBuildNumber); + } else { + str = "Windows 10 Build " + std::to_string(osvi.dwBuildNumber); + } + } else { + str = "Windows Build " + std::to_string(osvi.dwBuildNumber); + } + return true; +} #elif defined(__linux__) +#include + inline bool get_os_version(std::string& str) { std::ifstream file("/etc/os-release"); if (!file.is_open()) { @@ -33,6 +57,11 @@ inline bool get_os_version(std::string& str) { } return false; } +#else +inline bool get_os_version(std::string& str) { + str = "Unknown OS"; + return false; +} #endif