1#include "OSNameLogger.h"
10#define STATUS_SUCCESS (0x00000000)
13#pragma comment(lib, "User32.lib")
15typedef LONG(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
16typedef void (WINAPI* PGNSI)(LPSYSTEM_INFO);
17typedef BOOL(WINAPI* PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
20#if defined(__APPLE__) || defined(__MACH__)
21#include "TargetConditionals.h"
24#if defined(__linux__) || defined(__unix) || defined(__unix__)
25#include <sys/utsname.h>
28#if defined(__ANDROID__)
36RTL_OSVERSIONINFOW getRealOSVersion()
38 HMODULE hMod = ::GetModuleHandleW(L
"ntdll.dll");
41 RtlGetVersionPtr fxPtr = (RtlGetVersionPtr)::GetProcAddress(hMod,
"RtlGetVersion");
44 RTL_OSVERSIONINFOW rovi = { 0 };
45 rovi.dwOSVersionInfoSize =
sizeof(rovi);
46 if (STATUS_SUCCESS == fxPtr(&rovi))
52 RTL_OSVERSIONINFOW rovi = { 0 };
56BOOL GetOSDisplayString(LPTSTR pszOS)
64 RTL_OSVERSIONINFOW version = getRealOSVersion();
66 ZeroMemory(&si,
sizeof(SYSTEM_INFO));
67 ZeroMemory(&osvi,
sizeof(OSVERSIONINFOEX));
69 osvi.dwOSVersionInfoSize =
sizeof(OSVERSIONINFOEX);
73 pGNSI = (PGNSI)GetProcAddress(
74 GetModuleHandle(TEXT(
"kernel32.dll")),
75 "GetNativeSystemInfo");
78 else GetSystemInfo(&si);
83#pragma warning(disable : 4996)
84 GetVersionEx((OSVERSIONINFO*)&osvi);
87 if (VER_PLATFORM_WIN32_NT == version.dwPlatformId && version.dwMajorVersion > 4)
89 StringCchCopy(pszOS, BUFSIZE, TEXT(
"Microsoft "));
93 if (version.dwMajorVersion == 10)
95 if (osvi.wProductType == VER_NT_WORKSTATION)
97 if (version.dwMinorVersion == 0)
99 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows 10 "));
102 else StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows Server 2016"));
108 if (version.dwMajorVersion == 6)
110 if (version.dwMinorVersion == 0)
112 if (osvi.wProductType == VER_NT_WORKSTATION)
113 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows Vista "));
114 else StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows Server 2008 "));
117 if (version.dwMinorVersion == 1 || version.dwMinorVersion == 2)
119 if (osvi.wProductType == VER_NT_WORKSTATION && version.dwMinorVersion == 1)
120 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows 7 "));
122 if (osvi.wProductType == VER_NT_WORKSTATION && version.dwMinorVersion == 2)
123 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows 8 "));
125 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows Server 2008 R2 "));
128 if (version.dwMinorVersion == 3)
130 if (osvi.wProductType == VER_NT_WORKSTATION)
131 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows 8.1 "));
132 else StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows Server 2012 R2"));
135 pGPI = (PGPI)GetProcAddress(
136 GetModuleHandle(TEXT(
"kernel32.dll")),
139 pGPI(version.dwMajorVersion, version.dwMinorVersion, 0, 0, &dwType);
143 case PRODUCT_ULTIMATE:
144 StringCchCat(pszOS, BUFSIZE, TEXT(
"Ultimate Edition"));
146 case PRODUCT_PROFESSIONAL:
147 StringCchCat(pszOS, BUFSIZE, TEXT(
"Professional"));
149 case PRODUCT_HOME_PREMIUM:
150 StringCchCat(pszOS, BUFSIZE, TEXT(
"Home Premium Edition"));
152 case PRODUCT_HOME_BASIC:
153 StringCchCat(pszOS, BUFSIZE, TEXT(
"Home Basic Edition"));
155 case PRODUCT_ENTERPRISE:
156 StringCchCat(pszOS, BUFSIZE, TEXT(
"Enterprise Edition"));
158 case PRODUCT_BUSINESS:
159 StringCchCat(pszOS, BUFSIZE, TEXT(
"Business Edition"));
161 case PRODUCT_STARTER:
162 StringCchCat(pszOS, BUFSIZE, TEXT(
"Starter Edition"));
164 case PRODUCT_CLUSTER_SERVER:
165 StringCchCat(pszOS, BUFSIZE, TEXT(
"Cluster Server Edition"));
167 case PRODUCT_DATACENTER_SERVER:
168 StringCchCat(pszOS, BUFSIZE, TEXT(
"Datacenter Edition"));
170 case PRODUCT_DATACENTER_SERVER_CORE:
171 StringCchCat(pszOS, BUFSIZE, TEXT(
"Datacenter Edition (core installation)"));
173 case PRODUCT_ENTERPRISE_SERVER:
174 StringCchCat(pszOS, BUFSIZE, TEXT(
"Enterprise Edition"));
176 case PRODUCT_ENTERPRISE_SERVER_CORE:
177 StringCchCat(pszOS, BUFSIZE, TEXT(
"Enterprise Edition (core installation)"));
179 case PRODUCT_ENTERPRISE_SERVER_IA64:
180 StringCchCat(pszOS, BUFSIZE, TEXT(
"Enterprise Edition for Itanium-based Systems"));
182 case PRODUCT_SMALLBUSINESS_SERVER:
183 StringCchCat(pszOS, BUFSIZE, TEXT(
"Small Business Server"));
185 case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
186 StringCchCat(pszOS, BUFSIZE, TEXT(
"Small Business Server Premium Edition"));
188 case PRODUCT_STANDARD_SERVER:
189 StringCchCat(pszOS, BUFSIZE, TEXT(
"Standard Edition"));
191 case PRODUCT_STANDARD_SERVER_CORE:
192 StringCchCat(pszOS, BUFSIZE, TEXT(
"Standard Edition (core installation)"));
194 case PRODUCT_WEB_SERVER:
195 StringCchCat(pszOS, BUFSIZE, TEXT(
"Web Server Edition"));
200 if (version.dwMajorVersion == 5 && version.dwMinorVersion == 2)
202 if (GetSystemMetrics(SM_SERVERR2))
203 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows Server 2003 R2, "));
204 else if (osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER)
205 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows Storage Server 2003"));
206 else if (osvi.wSuiteMask & VER_SUITE_WH_SERVER)
207 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows Home Server"));
208 else if (osvi.wProductType == VER_NT_WORKSTATION &&
209 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
211 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows XP Professional x64 Edition"));
213 else StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows Server 2003, "));
216 if (osvi.wProductType != VER_NT_WORKSTATION)
218 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
220 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
221 StringCchCat(pszOS, BUFSIZE, TEXT(
"Datacenter Edition for Itanium-based Systems"));
222 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
223 StringCchCat(pszOS, BUFSIZE, TEXT(
"Enterprise Edition for Itanium-based Systems"));
226 else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
228 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
229 StringCchCat(pszOS, BUFSIZE, TEXT(
"Datacenter x64 Edition"));
230 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
231 StringCchCat(pszOS, BUFSIZE, TEXT(
"Enterprise x64 Edition"));
232 else StringCchCat(pszOS, BUFSIZE, TEXT(
"Standard x64 Edition"));
237 if (osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER)
238 StringCchCat(pszOS, BUFSIZE, TEXT(
"Compute Cluster Edition"));
239 else if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
240 StringCchCat(pszOS, BUFSIZE, TEXT(
"Datacenter Edition"));
241 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
242 StringCchCat(pszOS, BUFSIZE, TEXT(
"Enterprise Edition"));
243 else if (osvi.wSuiteMask & VER_SUITE_BLADE)
244 StringCchCat(pszOS, BUFSIZE, TEXT(
"Web Edition"));
245 else StringCchCat(pszOS, BUFSIZE, TEXT(
"Standard Edition"));
250 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
252 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows XP "));
253 if (osvi.wSuiteMask & VER_SUITE_PERSONAL)
254 StringCchCat(pszOS, BUFSIZE, TEXT(
"Home Edition"));
255 else StringCchCat(pszOS, BUFSIZE, TEXT(
"Professional"));
258 if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
260 StringCchCat(pszOS, BUFSIZE, TEXT(
"Windows 2000 "));
262 if (osvi.wProductType == VER_NT_WORKSTATION)
264 StringCchCat(pszOS, BUFSIZE, TEXT(
"Professional"));
268 if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
269 StringCchCat(pszOS, BUFSIZE, TEXT(
"Datacenter Server"));
270 else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
271 StringCchCat(pszOS, BUFSIZE, TEXT(
"Advanced Server"));
272 else StringCchCat(pszOS, BUFSIZE, TEXT(
"Server"));
278 if (_tcslen(osvi.szCSDVersion) > 0)
280 StringCchCat(pszOS, BUFSIZE, TEXT(
" "));
281 StringCchCat(pszOS, BUFSIZE, osvi.szCSDVersion);
286 StringCchPrintf(buf, 80, TEXT(
" (build %d)"), osvi.dwBuildNumber);
287 StringCchCat(pszOS, BUFSIZE, buf);
289 if (osvi.dwMajorVersion >= 6)
291 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
292 StringCchCat(pszOS, BUFSIZE, TEXT(
", 64-bit"));
293 else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
294 StringCchCat(pszOS, BUFSIZE, TEXT(
", 32-bit"));
302 printf(
"This sample does not support this version of Windows.\n");
308std::string Cogs::Logging::getOsNameAndVersion()
310 std::string header{
"Logging OS Version: " };
315 BOOL displaystring = GetOSDisplayString(szOS);
319 std::string windowsVersion(narrow(szOS));
321 std::string windowsVersion(szOS);
323 return header +
"[OS Name]: Windows [OS Version]: " + windowsVersion;
326 return header +
"[OS Name]: Windows [OS Version]: -";
328#elif defined(__CYGWIN__) && !defined(_WIN32)
329 return header +
"[OS Name]: Windows (Cygwin POSIX under Microsoft Window) [OS Version]: -"
334 int getAndroidVersion()
347 return header +
"[OS Name]: Android [OS Version]: " + (getAndridVersion() == 0) ?
"-" : getAndroidVersion();
349#elif defined(__APPLE__) || defined(__MACH__)
350#if TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR
353 return header +
"[OS Name]: iPhone Simulator [OS Version]: - ";
354#elif TARGET_OS_IPHONE
355 return header +
"[OS Name]: iPhone [OS Version]: - ";
357 return header +
"[OS Name]: Mac OS X [OS Version]: - ";
359 return header +
"[OS Name]: Unknown Apple OS [OS Version]: -";
364 return header +
"[OS Name]: FreeBSD [OS Version]: - ";
366#elif __linux__ || __unix || __unix__
371 if (uname(&name))
return header +
"[OS Name]: Unknown Linux/Unix based platform [OS Version]: -";
372 return header +
"[OS Name]: " + name.sysname +
" [OS Version]: " + name.release +
" " + name.version;
375 return header +
"[OS Name]: Other/Non standard OS [OS Version]: -";