114#if defined(__APPLE__)
116 size_t size =
sizeof(result);
117 if (sysctlbyname(
"kern.osrelease", result, &size,
nullptr, 0) == 0)
121#elif defined(__CYGWIN__)
123 if (uname(&name) == 0)
125 std::string result(name.sysname);
127 result.append(name.release);
129 result.append(name.version);
134#elif defined(linux) || defined(__linux) || defined(__linux__)
135 static std::regex pattern(
"DISTRIB_DESCRIPTION=\"(.*)\"");
138 std::ifstream stream(
"/etc/lsb-release");
139 while (getline(stream, line))
142 if (std::regex_match(line, matches, pattern))
147#elif defined(_WIN32) || defined(_WIN64)
148 static NTSTATUS(__stdcall *RtlGetVersion)(OUT PRTL_OSVERSIONINFOEXW lpVersionInformation) = (NTSTATUS(__stdcall*)(PRTL_OSVERSIONINFOEXW))GetProcAddress(GetModuleHandle(
"ntdll.dll"),
"RtlGetVersion");
149 static void(__stdcall *GetNativeSystemInfo)(OUT LPSYSTEM_INFO lpSystemInfo) = (
void(__stdcall*)(LPSYSTEM_INFO))GetProcAddress(GetModuleHandle(
"kernel32.dll"),
"GetNativeSystemInfo");
150 static BOOL(__stdcall *GetProductInfo)(IN DWORD dwOSMajorVersion, IN DWORD dwOSMinorVersion, IN DWORD dwSpMajorVersion, IN DWORD dwSpMinorVersion, OUT PDWORD pdwReturnedProductType) = (BOOL(__stdcall*)(DWORD, DWORD, DWORD, DWORD, PDWORD))GetProcAddress(GetModuleHandle(
"kernel32.dll"),
"GetProductInfo");
152 OSVERSIONINFOEXW osvi;
153 ZeroMemory(&osvi,
sizeof(OSVERSIONINFOEXW));
154 osvi.dwOSVersionInfoSize =
sizeof(OSVERSIONINFOEXW);
156 if (RtlGetVersion !=
nullptr)
158 NTSTATUS ntRtlGetVersionStatus = RtlGetVersion(&osvi);
159 if (ntRtlGetVersionStatus != STATUS_SUCCESS)
166#pragma warning(disable: 4996)
168 BOOL bOsVersionInfoEx = GetVersionExW((OSVERSIONINFOW*)&osvi);
169 if (bOsVersionInfoEx == 0)
177 ZeroMemory(&si,
sizeof(SYSTEM_INFO));
179 if (GetNativeSystemInfo !=
nullptr)
180 GetNativeSystemInfo(&si);
184 if ((osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) || (osvi.dwMajorVersion <= 4))
189 std::stringstream os;
193 if (osvi.dwMajorVersion >= 6)
195 if (osvi.dwMajorVersion == 10)
197 if (osvi.dwMinorVersion == 0)
199 if (osvi.wProductType == VER_NT_WORKSTATION)
201 if (osvi.dwBuildNumber >= 22000)
208 if (osvi.dwBuildNumber >= 20348)
209 os <<
"Windows Server 2022 ";
210 else if (osvi.dwBuildNumber >= 17763)
211 os <<
"Windows Server 2019 ";
213 os <<
"Windows Server 2016 ";
217 else if (osvi.dwMajorVersion == 6)
219 if (osvi.dwMinorVersion == 3)
221 if (osvi.wProductType == VER_NT_WORKSTATION)
222 os <<
"Windows 8.1 ";
224 os <<
"Windows Server 2012 R2 ";
226 else if (osvi.dwMinorVersion == 2)
228 if (osvi.wProductType == VER_NT_WORKSTATION)
231 os <<
"Windows Server 2012 ";
233 else if (osvi.dwMinorVersion == 1)
235 if (osvi.wProductType == VER_NT_WORKSTATION)
238 os <<
"Windows Server 2008 R2 ";
240 else if (osvi.dwMinorVersion == 0)
242 if (osvi.wProductType == VER_NT_WORKSTATION)
243 os <<
"Windows Vista ";
245 os <<
"Windows Server 2008 ";
250 if ((GetProductInfo !=
nullptr) && GetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType))
254 case PRODUCT_ULTIMATE:
255 os <<
"Ultimate Edition";
257 case PRODUCT_PROFESSIONAL:
258 os <<
"Professional";
260 case PRODUCT_HOME_PREMIUM:
261 os <<
"Home Premium Edition";
263 case PRODUCT_HOME_BASIC:
264 os <<
"Home Basic Edition";
266 case PRODUCT_ENTERPRISE:
267 os <<
"Enterprise Edition";
269 case PRODUCT_BUSINESS:
270 os <<
"Business Edition";
272 case PRODUCT_STARTER:
273 os <<
"Starter Edition";
275 case PRODUCT_CLUSTER_SERVER:
276 os <<
"Cluster Server Edition";
278 case PRODUCT_DATACENTER_SERVER:
279 os <<
"Datacenter Edition";
281 case PRODUCT_DATACENTER_SERVER_CORE:
282 os <<
"Datacenter Edition (core installation)";
284 case PRODUCT_ENTERPRISE_SERVER:
285 os <<
"Enterprise Edition";
287 case PRODUCT_ENTERPRISE_SERVER_CORE:
288 os <<
"Enterprise Edition (core installation)";
290 case PRODUCT_ENTERPRISE_SERVER_IA64:
291 os <<
"Enterprise Edition for Itanium-based Systems";
293 case PRODUCT_SMALLBUSINESS_SERVER:
294 os <<
"Small Business Server";
296 case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
297 os <<
"Small Business Server Premium Edition";
299 case PRODUCT_STANDARD_SERVER:
300 os <<
"Standard Edition";
302 case PRODUCT_STANDARD_SERVER_CORE:
303 os <<
"Standard Edition (core installation)";
305 case PRODUCT_WEB_SERVER:
306 os <<
"Web Server Edition";
311 else if ((osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion == 2))
313 if (GetSystemMetrics(SM_SERVERR2))
314 os <<
"Windows Server 2003 R2, ";
315 else if (osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER)
316 os <<
"Windows Storage Server 2003";
317 else if (osvi.wSuiteMask & VER_SUITE_WH_SERVER)
318 os <<
"Windows Home Server";
319 else if ((osvi.wProductType == VER_NT_WORKSTATION) && (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64))
320 os <<
"Windows XP Professional x64 Edition";
322 os <<
"Windows Server 2003, ";
323 if (osvi.wProductType != VER_NT_WORKSTATION)
325 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
327 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
328 os <<
"Datacenter Edition for Itanium-based Systems";
329 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
330 os <<
"Enterprise Edition for Itanium-based Systems";
332 else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
334 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
335 os <<
"Datacenter x64 Edition";
336 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
337 os <<
"Enterprise x64 Edition";
339 os <<
"Standard x64 Edition";
343 if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER)
344 os <<
"Compute Cluster Edition";
345 else if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
346 os <<
"Datacenter Edition";
347 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
348 os <<
"Enterprise Edition";
349 else if (osvi.wSuiteMask & VER_SUITE_BLADE)
352 os <<
"Standard Edition";
356 else if ((osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion == 1))
359 if (osvi.wSuiteMask & VER_SUITE_PERSONAL)
360 os <<
"Home Edition";
362 os <<
"Professional";
364 else if ((osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion == 0))
366 os <<
"Windows 2000 ";
367 if (osvi.wProductType == VER_NT_WORKSTATION)
368 os <<
"Professional";
371 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
372 os <<
"Datacenter Server";
373 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
374 os <<
"Advanced Server";
381 std::wstring sp_version(osvi.szCSDVersion);
382 std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
383 if (std::wcslen(osvi.szCSDVersion) > 0)
384 os <<
" " << convert.to_bytes(sp_version.data(), sp_version.data() + sp_version.size());
387 os <<
" (build " << osvi.dwBuildNumber <<
")";
390 if (osvi.dwMajorVersion >= 6)
392 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
394 else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
396 else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
397 os <<
", Intel Itanium";
398 else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM)
400#if !defined(__MINGW32__) && !defined(__MINGW64__)
401 else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64)
408 #error Unsupported platform