1 //=============================================================================
2 //
3 //   File : KviRuntimeInfo.cpp
4 //   Creation date : Thu Jan 19 2006 13:50:11 GMT by Alexey Uzhva
5 //
6 //   This file is part of the KVIrc IRC client distribution
7 //   Copyright (C) 2006-2008 Alexey Uzhva (wizard at opendoor dot ru)
8 //
9 //   This program is FREE software. You can redistribute it and/or
10 //   modify it under the terms of the GNU General Public License
11 //   as published by the Free Software Foundation; either version 2
12 //   of the License, or (at your option) any later version.
13 //
14 //   This program is distributed in the HOPE that it will be USEFUL,
15 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
16 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 //   See the GNU General Public License for more details.
18 //
19 //   You should have received a copy of the GNU General Public License
20 //   along with this program. If not, write to the Free Software Foundation,
21 //   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 //
23 //=============================================================================
24 
25 #include "KviRuntimeInfo.h"
26 #include "KviLocale.h"
27 #include "KviQString.h"
28 
29 #include <QApplication>
30 #include <QString>
31 #include <QStyle>
32 
33 #if !defined(COMPILE_ON_WINDOWS) && !defined(COMPILE_ON_MINGW)
34 #include <sys/utsname.h>
35 #include <cstdlib>
36 #include <unistd.h>
37 #endif
38 
39 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
40 #include <winsock2.h>
41 
42 typedef enum _QueryInfo {
43 	Os_Release,
44 	Os_Version,
45 	Os_Type
46 } QueryInfo;
47 
48 typedef void(WINAPI * PGNSI)(LPSYSTEM_INFO);
49 typedef BOOL(WINAPI * PGETPRODUCTINFO)(DWORD, DWORD, DWORD, DWORD, PDWORD);
50 
51 #define BUFSIZE 1024
52 
53 // stolen from WinNT.h (last updated from 10.0.17763.0 SDK)
54 //
55 // Product types
56 // This list grows with each OS release.
57 //
58 // There is no ordering of values to ensure callers
59 // do an equality test i.e. greater-than and less-than
60 // comparisons are not useful.
61 //
62 // NOTE: Values in this list should never be deleted.
63 //       When a product-type 'X' gets dropped from a
64 //       OS release onwards, the value of 'X' continues
65 //       to be used in the mapping table of GetProductInfo.
66 //
67 // clang-format off
68 #define PRODUCT_UNDEFINED                           0x00000000
69 
70 #define PRODUCT_ULTIMATE                            0x00000001
71 #define PRODUCT_HOME_BASIC                          0x00000002
72 #define PRODUCT_HOME_PREMIUM                        0x00000003
73 #define PRODUCT_ENTERPRISE                          0x00000004
74 #define PRODUCT_HOME_BASIC_N                        0x00000005
75 #define PRODUCT_BUSINESS                            0x00000006
76 #define PRODUCT_STANDARD_SERVER                     0x00000007
77 #define PRODUCT_DATACENTER_SERVER                   0x00000008
78 #define PRODUCT_SMALLBUSINESS_SERVER                0x00000009
79 #define PRODUCT_ENTERPRISE_SERVER                   0x0000000A
80 #define PRODUCT_STARTER                             0x0000000B
81 #define PRODUCT_DATACENTER_SERVER_CORE              0x0000000C
82 #define PRODUCT_STANDARD_SERVER_CORE                0x0000000D
83 #define PRODUCT_ENTERPRISE_SERVER_CORE              0x0000000E
84 #define PRODUCT_ENTERPRISE_SERVER_IA64              0x0000000F
85 #define PRODUCT_BUSINESS_N                          0x00000010
86 #define PRODUCT_WEB_SERVER                          0x00000011
87 #define PRODUCT_CLUSTER_SERVER                      0x00000012
88 #define PRODUCT_HOME_SERVER                         0x00000013
89 #define PRODUCT_STORAGE_EXPRESS_SERVER              0x00000014
90 #define PRODUCT_STORAGE_STANDARD_SERVER             0x00000015
91 #define PRODUCT_STORAGE_WORKGROUP_SERVER            0x00000016
92 #define PRODUCT_STORAGE_ENTERPRISE_SERVER           0x00000017
93 #define PRODUCT_SERVER_FOR_SMALLBUSINESS            0x00000018
94 #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM        0x00000019
95 #define PRODUCT_HOME_PREMIUM_N                      0x0000001A
96 #define PRODUCT_ENTERPRISE_N                        0x0000001B
97 #define PRODUCT_ULTIMATE_N                          0x0000001C
98 #define PRODUCT_WEB_SERVER_CORE                     0x0000001D
99 #define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT    0x0000001E
100 #define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY      0x0000001F
101 #define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING     0x00000020
102 #define PRODUCT_SERVER_FOUNDATION                   0x00000021
103 #define PRODUCT_HOME_PREMIUM_SERVER                 0x00000022
104 #define PRODUCT_SERVER_FOR_SMALLBUSINESS_V          0x00000023
105 #define PRODUCT_STANDARD_SERVER_V                   0x00000024
106 #define PRODUCT_DATACENTER_SERVER_V                 0x00000025
107 #define PRODUCT_ENTERPRISE_SERVER_V                 0x00000026
108 #define PRODUCT_DATACENTER_SERVER_CORE_V            0x00000027
109 #define PRODUCT_STANDARD_SERVER_CORE_V              0x00000028
110 #define PRODUCT_ENTERPRISE_SERVER_CORE_V            0x00000029
111 #define PRODUCT_HYPERV                              0x0000002A
112 #define PRODUCT_STORAGE_EXPRESS_SERVER_CORE         0x0000002B
113 #define PRODUCT_STORAGE_STANDARD_SERVER_CORE        0x0000002C
114 #define PRODUCT_STORAGE_WORKGROUP_SERVER_CORE       0x0000002D
115 #define PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE      0x0000002E
116 #define PRODUCT_STARTER_N                           0x0000002F
117 #define PRODUCT_PROFESSIONAL                        0x00000030
118 #define PRODUCT_PROFESSIONAL_N                      0x00000031
119 #define PRODUCT_SB_SOLUTION_SERVER                  0x00000032
120 #define PRODUCT_SERVER_FOR_SB_SOLUTIONS             0x00000033
121 #define PRODUCT_STANDARD_SERVER_SOLUTIONS           0x00000034
122 #define PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE      0x00000035
123 #define PRODUCT_SB_SOLUTION_SERVER_EM               0x00000036
124 #define PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM          0x00000037
125 #define PRODUCT_SOLUTION_EMBEDDEDSERVER             0x00000038
126 #define PRODUCT_SOLUTION_EMBEDDEDSERVER_CORE        0x00000039
127 #define PRODUCT_PROFESSIONAL_EMBEDDED               0x0000003A
128 #define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT       0x0000003B
129 #define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL       0x0000003C
130 #define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC    0x0000003D
131 #define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC    0x0000003E
132 #define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE   0x0000003F
133 #define PRODUCT_CLUSTER_SERVER_V                    0x00000040
134 #define PRODUCT_EMBEDDED                            0x00000041
135 #define PRODUCT_STARTER_E                           0x00000042
136 #define PRODUCT_HOME_BASIC_E                        0x00000043
137 #define PRODUCT_HOME_PREMIUM_E                      0x00000044
138 #define PRODUCT_PROFESSIONAL_E                      0x00000045
139 #define PRODUCT_ENTERPRISE_E                        0x00000046
140 #define PRODUCT_ULTIMATE_E                          0x00000047
141 #define PRODUCT_ENTERPRISE_EVALUATION               0x00000048
142 #define PRODUCT_MULTIPOINT_STANDARD_SERVER          0x0000004C
143 #define PRODUCT_MULTIPOINT_PREMIUM_SERVER           0x0000004D
144 #define PRODUCT_STANDARD_EVALUATION_SERVER          0x0000004F
145 #define PRODUCT_DATACENTER_EVALUATION_SERVER        0x00000050
146 #define PRODUCT_ENTERPRISE_N_EVALUATION             0x00000054
147 #define PRODUCT_EMBEDDED_AUTOMOTIVE                 0x00000055
148 #define PRODUCT_EMBEDDED_INDUSTRY_A                 0x00000056
149 #define PRODUCT_THINPC                              0x00000057
150 #define PRODUCT_EMBEDDED_A                          0x00000058
151 #define PRODUCT_EMBEDDED_INDUSTRY                   0x00000059
152 #define PRODUCT_EMBEDDED_E                          0x0000005A
153 #define PRODUCT_EMBEDDED_INDUSTRY_E                 0x0000005B
154 #define PRODUCT_EMBEDDED_INDUSTRY_A_E               0x0000005C
155 #define PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER 0x0000005F
156 #define PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER  0x00000060
157 #define PRODUCT_CORE_ARM                            0x00000061
158 #define PRODUCT_CORE_N                              0x00000062
159 #define PRODUCT_CORE_COUNTRYSPECIFIC                0x00000063
160 #define PRODUCT_CORE_SINGLELANGUAGE                 0x00000064
161 #define PRODUCT_CORE                                0x00000065
162 #define PRODUCT_PROFESSIONAL_WMC                    0x00000067
163 #define PRODUCT_EMBEDDED_INDUSTRY_EVAL              0x00000069
164 #define PRODUCT_EMBEDDED_INDUSTRY_E_EVAL            0x0000006A
165 #define PRODUCT_EMBEDDED_EVAL                       0x0000006B
166 #define PRODUCT_EMBEDDED_E_EVAL                     0x0000006C
167 #define PRODUCT_NANO_SERVER                         0x0000006D
168 #define PRODUCT_CLOUD_STORAGE_SERVER                0x0000006E
169 #define PRODUCT_CORE_CONNECTED                      0x0000006F
170 #define PRODUCT_PROFESSIONAL_STUDENT                0x00000070
171 #define PRODUCT_CORE_CONNECTED_N                    0x00000071
172 #define PRODUCT_PROFESSIONAL_STUDENT_N              0x00000072
173 #define PRODUCT_CORE_CONNECTED_SINGLELANGUAGE       0x00000073
174 #define PRODUCT_CORE_CONNECTED_COUNTRYSPECIFIC      0x00000074
175 #define PRODUCT_CONNECTED_CAR                       0x00000075
176 #define PRODUCT_INDUSTRY_HANDHELD                   0x00000076
177 #define PRODUCT_PPI_PRO                             0x00000077
178 #define PRODUCT_ARM64_SERVER                        0x00000078
179 #define PRODUCT_EDUCATION                           0x00000079
180 #define PRODUCT_EDUCATION_N                         0x0000007A
181 #define PRODUCT_IOTUAP                              0x0000007B
182 #define PRODUCT_CLOUD_HOST_INFRASTRUCTURE_SERVER    0x0000007C
183 #define PRODUCT_ENTERPRISE_S                        0x0000007D
184 #define PRODUCT_ENTERPRISE_S_N                      0x0000007E
185 #define PRODUCT_PROFESSIONAL_S                      0x0000007F
186 #define PRODUCT_PROFESSIONAL_S_N                    0x00000080
187 #define PRODUCT_ENTERPRISE_S_EVALUATION             0x00000081
188 #define PRODUCT_ENTERPRISE_S_N_EVALUATION           0x00000082
189 #define PRODUCT_HOLOGRAPHIC                         0x00000087
190 #define PRODUCT_PRO_SINGLE_LANGUAGE                 0x0000008A
191 #define PRODUCT_PRO_CHINA                           0x0000008B
192 #define PRODUCT_ENTERPRISE_SUBSCRIPTION             0x0000008C
193 #define PRODUCT_ENTERPRISE_SUBSCRIPTION_N           0x0000008D
194 #define PRODUCT_DATACENTER_NANO_SERVER              0x0000008F
195 #define PRODUCT_STANDARD_NANO_SERVER                0x00000090
196 #define PRODUCT_DATACENTER_A_SERVER_CORE            0x00000091
197 #define PRODUCT_STANDARD_A_SERVER_CORE              0x00000092
198 #define PRODUCT_DATACENTER_WS_SERVER_CORE           0x00000093
199 #define PRODUCT_STANDARD_WS_SERVER_CORE             0x00000094
200 #define PRODUCT_UTILITY_VM                          0x00000095
201 #define PRODUCT_DATACENTER_EVALUATION_SERVER_CORE   0x0000009F
202 #define PRODUCT_STANDARD_EVALUATION_SERVER_CORE     0x000000A0
203 #define PRODUCT_PRO_WORKSTATION                     0x000000A1
204 #define PRODUCT_PRO_WORKSTATION_N                   0x000000A2
205 #define PRODUCT_PRO_FOR_EDUCATION                   0x000000A4
206 #define PRODUCT_PRO_FOR_EDUCATION_N                 0x000000A5
207 #define PRODUCT_AZURE_SERVER_CORE                   0x000000A8
208 #define PRODUCT_AZURE_NANO_SERVER                   0x000000A9
209 #define PRODUCT_ENTERPRISEG                         0x000000AB
210 #define PRODUCT_ENTERPRISEGN                        0x000000AC
211 #define PRODUCT_SERVERRDSH                          0x000000AF
212 #define PRODUCT_CLOUD                               0x000000B2
213 #define PRODUCT_CLOUDN                              0x000000B3
214 #define PRODUCT_HUBOS                               0x000000B4
215 #define PRODUCT_ONECOREUPDATEOS                     0x000000B6
216 #define PRODUCT_CLOUDE                              0x000000B7
217 #define PRODUCT_ANDROMEDA                           0x000000B8
218 #define PRODUCT_IOTOS                               0x000000B9
219 #define PRODUCT_CLOUDEN                             0x000000BA
220 
221 #define PRODUCT_UNLICENSED                          0xABCDABCD
222 // clang-format on
223 
queryWinInfo(QueryInfo info)224 static QString queryWinInfo(QueryInfo info)
225 {
226 	QString szVersion;
227 	OSVERSIONINFOEX osvi;
228 	SYSTEM_INFO si;
229 	PGNSI pGNSI;
230 	BOOL bOsVersionInfoEx;
231 
232 	ZeroMemory(&si, sizeof(SYSTEM_INFO));
233 	ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
234 
235 	// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
236 	// If that fails, try using the OSVERSIONINFO structure.
237 
238 	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
239 
240 	if(!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi)))
241 	{
242 		osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
243 		if(!GetVersionEx((OSVERSIONINFO *)&osvi))
244 			return KviQString::Empty;
245 	}
246 
247 	// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
248 
249 	pGNSI = (PGNSI)GetProcAddress(
250 	    GetModuleHandle(TEXT("kernel32.dll")),
251 	    "GetNativeSystemInfo");
252 	if(nullptr != pGNSI)
253 		pGNSI(&si);
254 	else
255 		GetSystemInfo(&si);
256 
257 	switch(osvi.dwPlatformId)
258 	{
259 		// Test for the Windows NT product family.
260 
261 		case VER_PLATFORM_WIN32_NT:
262 
263 			// Test for the specific product.
264 			if(osvi.dwMajorVersion == 10 && osvi.dwMinorVersion == 0)
265 			{
266 				if(osvi.wProductType == VER_NT_WORKSTATION)
267 					szVersion += "Windows 10 ";
268 				else if(osvi.wProductType == VER_NT_SERVER || osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
269 					szVersion += "Windows Server ";
270 						if(osvi.dwBuildNumber <= 14393)
271 							szVersion += "2016 ";
272 						else if(osvi.dwBuildNumber <= 17763)
273 							szVersion += "2019 ";
274 						else
275 							szVersion += "vNext ";
276 			}
277 
278 			if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 3)
279 			{
280 				if(osvi.wProductType == VER_NT_WORKSTATION)
281 					szVersion += "Windows 8.1 ";
282 				else
283 					szVersion += "Windows Server 2012 R2 ";
284 			}
285 
286 			if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2)
287 			{
288 				if(osvi.wProductType == VER_NT_WORKSTATION)
289 					szVersion += "Windows 8 ";
290 				else
291 					szVersion += "Windows Server 2012 ";
292 			}
293 
294 			if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1)
295 			{
296 				if(osvi.wProductType == VER_NT_WORKSTATION)
297 					szVersion += "Windows 7 ";
298 				else
299 					szVersion += "Windows Server 2008 R2 ";
300 			}
301 
302 			PGETPRODUCTINFO pGetProductInfo;
303 			pGetProductInfo = (PGETPRODUCTINFO)GetProcAddress(
304 			    GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo");
305 			// from MSDN, Document Date 12/05/2018
306 			// https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getproductinfo
307 			// the entire PRODUCT_CORE group has the base Windows version in the
308 			// returned value. rip out "Windows" of all PRODUCT values as well
309 			if(bOsVersionInfoEx)
310 			{
311 				DWORD dwPlatformInfo;
312 				if(nullptr != pGetProductInfo)
313 					if(pGetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion,
314 					       osvi.wServicePackMajor, osvi.wServicePackMinor, &dwPlatformInfo))
315 					{
316 						switch(dwPlatformInfo)
317 						{
318 							case PRODUCT_BUSINESS:
319 								szVersion += "Business";
320 								break;
321 							case PRODUCT_BUSINESS_N:
322 								szVersion += "Business N";
323 								break;
324 							case PRODUCT_CLUSTER_SERVER:
325 								szVersion += "HPC Edition";
326 								break;
327 							case PRODUCT_CLUSTER_SERVER_V:
328 								szVersion += "Server Hyper Core V";
329 								break;
330 							case PRODUCT_CORE:
331 								//szVersion+="10 Home";
332 								break;
333 							case PRODUCT_CORE_COUNTRYSPECIFIC:
334 								szVersion += "China";
335 								break;
336 							case PRODUCT_CORE_N:
337 								szVersion += "N";
338 								break;
339 							case PRODUCT_CORE_SINGLELANGUAGE:
340 								szVersion += "Single Language";
341 								break;
342 							case PRODUCT_DATACENTER_EVALUATION_SERVER:
343 								szVersion += "Server Datacenter (evaluation installation)";
344 								break;
345 							case PRODUCT_DATACENTER_A_SERVER_CORE:
346 								szVersion += "Server Datacenter, Semi-Annual Channel (core installation)";
347 								break;
348 							case PRODUCT_STANDARD_A_SERVER_CORE:
349 								szVersion += "Server Standard, Semi-Annual Channel (core installation)";
350 								break;
351 							case PRODUCT_DATACENTER_SERVER:
352 								szVersion += "Server Datacenter (full installation)";
353 								break;
354 							case PRODUCT_DATACENTER_SERVER_CORE:
355 								szVersion += "Server Datacenter (core installation)";
356 								break;
357 							case PRODUCT_DATACENTER_SERVER_CORE_V:
358 								szVersion += "Server Datacenter without Hyper-V (core installation)";
359 								break;
360 							case PRODUCT_DATACENTER_SERVER_V:
361 								szVersion += "Server Datacenter without Hyper-V (full installation)";
362 								break;
363 							case PRODUCT_EDUCATION:
364 								szVersion += "Education";
365 								break;
366 							case PRODUCT_EDUCATION_N:
367 								szVersion += "Education N";
368 								break;
369 							case PRODUCT_ENTERPRISE:
370 								szVersion += "Enterprise";
371 								break;
372 							case PRODUCT_ENTERPRISE_E:
373 								szVersion+= "Enterprise E";
374 								break;
375 							case PRODUCT_ENTERPRISE_EVALUATION:
376 								szVersion += "Enterprise Evaluation";
377 								break;
378 							case PRODUCT_ENTERPRISE_N:
379 								szVersion += "Enterprise N";
380 								break;
381 							case PRODUCT_ENTERPRISE_N_EVALUATION:
382 								szVersion += "Enterprise N (evaluation installation)";
383 								break;
384 							case PRODUCT_ENTERPRISE_S:
385 								szVersion+= "Enterprise 2015 LTSB";
386 								break;
387 							case PRODUCT_ENTERPRISE_S_EVALUATION:
388 								szVersion += "Enterprise 2015 LTSB Evaluation";
389 								break;
390 							case PRODUCT_ENTERPRISE_S_N:
391 								szVersion += "Windows 10 Enterprise 2015 LTSB N";
392 								break;
393 							case PRODUCT_ENTERPRISE_S_N_EVALUATION:
394 								szVersion += "Windows 10 Enterprise 2015 LTSB N Evaluation";
395 								break;
396 							case PRODUCT_ENTERPRISE_SERVER:
397 								szVersion += "Server Enterprise (full installation)";
398 								break;
399 							case PRODUCT_ENTERPRISE_SERVER_CORE:
400 								szVersion += "Server Enterprise (core installation)";
401 								break;
402 							case PRODUCT_ENTERPRISE_SERVER_CORE_V:
403 								szVersion += "Server Enterprise without Hyper-V (core installation)";
404 								break;
405 							case PRODUCT_ENTERPRISE_SERVER_IA64:
406 								szVersion += "Server Enterprise for Itanium-based Systems";
407 								break;
408 							case PRODUCT_ENTERPRISE_SERVER_V:
409 								szVersion += "Server Enterprise without Hyper-V (full installation)";
410 								break;
411 							case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL:
412 								szVersion += "Essential Server Solution Additional";
413 								break;
414 							case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC:
415 								szVersion += "Essential Server Solution Additional SVC";
416 								break;
417 							case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT:
418 								szVersion += "Essential Server Solution Management";
419 								break;
420 							case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC:
421 								szVersion += "Essential Server Solution Management SVC";
422 								break;
423 							case PRODUCT_HOME_BASIC:
424 								szVersion += "Home Basic";
425 								break;
426 							case PRODUCT_HOME_BASIC_E:
427 								//szVersion+="Not supported";
428 								break;
429 							case PRODUCT_HOME_BASIC_N:
430 								szVersion += "Home Basic N";
431 								break;
432 							case PRODUCT_HOME_PREMIUM:
433 								szVersion += "Home Premium";
434 								break;
435 							case PRODUCT_HOME_PREMIUM_E:
436 								//szVersion+="Not supported";
437 								break;
438 							case PRODUCT_HOME_PREMIUM_N:
439 								szVersion += "Home Premium N";
440 								break;
441 							case PRODUCT_HOME_PREMIUM_SERVER:
442 								szVersion += "Home Server 2011";
443 								break;
444 							case PRODUCT_HOME_SERVER:
445 								szVersion += "Storage Server 2008 R2 Essentials";
446 								break;
447 							case PRODUCT_HYPERV:
448 								szVersion += "Hyper-V Server";
449 								break;
450 							case PRODUCT_IOTUAP:
451 								szVersion += "IoT Core";
452 								break;
453 							//case PRODUCT_IOTUAPCOMMERCIAL:
454 								//szVersion += "IoT Core Commercial";
455 								//break;
456 							case PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT:
457 								szVersion += "Essential Business Server Management Server";
458 								break;
459 							case PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING:
460 								szVersion += "Essential Business Server Messaging Server";
461 								break;
462 							case PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY:
463 								szVersion += "Essential Business Server Security Server";
464 								break;
465 							//case PRODUCT_MOBILE_CORE:
466 								//szVersion += "Mobile";
467 								//break;
468 							//case PRODUCT_MOBILE_ENTERPRISE:
469 								//szVersion += "Mobile Enterprise";
470 								//break;
471 							case PRODUCT_MULTIPOINT_PREMIUM_SERVER:
472 								szVersion += "MultiPoint Server Premium (full installation)";
473 								break;
474 							case PRODUCT_MULTIPOINT_STANDARD_SERVER:
475 								szVersion += "MultiPoint Server Standard (full installation)";
476 								break;
477 							case PRODUCT_PRO_WORKSTATION:
478 								szVersion += "Pro for Workstations";
479 								break;
480 							case PRODUCT_PRO_WORKSTATION_N:
481 								szVersion += "Pro for Workstations N";
482 								break;
483 							case PRODUCT_PROFESSIONAL:
484 								szVersion += "Pro";
485 								break;
486 							case PRODUCT_PROFESSIONAL_E:
487 								//szVersion+="Not supported";
488 								break;
489 							case PRODUCT_PROFESSIONAL_N:
490 								szVersion += "Pro N";
491 								break;
492 							case PRODUCT_PROFESSIONAL_WMC:
493 								szVersion += "Professional with Media Center";
494 								break;
495 							case PRODUCT_SB_SOLUTION_SERVER:
496 								szVersion += "Small Business Server 2011 Essentials";
497 								break;
498 							case PRODUCT_SB_SOLUTION_SERVER_EM:
499 								szVersion += "Server For SB Solutions EM";
500 								break;
501 							case PRODUCT_SERVER_FOR_SB_SOLUTIONS:
502 								szVersion += "Server For SB Solutions";
503 								break;
504 							case PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM:
505 								szVersion += "Server For SB Solutions EM";
506 								break;
507 							case PRODUCT_SERVER_FOR_SMALLBUSINESS:
508 								szVersion += "Server 2008 for Windows Essential Server Solutions";
509 								break;
510 							case PRODUCT_SERVER_FOR_SMALLBUSINESS_V:
511 								szVersion += "Server 2008 without Hyper-V for Windows Essential Server Solutions";
512 								break;
513 							case PRODUCT_SERVER_FOUNDATION:
514 								szVersion += "Server Foundation";
515 								break;
516 							case PRODUCT_SMALLBUSINESS_SERVER:
517 								szVersion += "Small Business Server";
518 								break;
519 							case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
520 								szVersion += "Small Business Server Premium";
521 								break;
522 							case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE:
523 								szVersion += "Small Business Server Premium (core installation)";
524 								break;
525 							case PRODUCT_SOLUTION_EMBEDDEDSERVER:
526 								szVersion += "MultiPoint Server";
527 								break;
528 							case PRODUCT_STANDARD_EVALUATION_SERVER:
529 								szVersion += "Server Standard (evaluation installation)";
530 								break;
531 							case PRODUCT_STANDARD_SERVER:
532 								szVersion += "Server Standard";
533 								break;
534 							case PRODUCT_STANDARD_SERVER_CORE:
535 								szVersion += "Server Standard (core installation)";
536 								break;
537 							case PRODUCT_STANDARD_SERVER_V:
538 								szVersion += "Server Standard without Hyper-V";
539 								break;
540 							case PRODUCT_STANDARD_SERVER_CORE_V:
541 								szVersion += "Server Standard without Hyper-V (core installation)";
542 								break;
543 							case PRODUCT_STANDARD_SERVER_SOLUTIONS:
544 								szVersion += "Server Solutions Premium";
545 								break;
546 							case PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE:
547 								szVersion += "Server Solutions Premium (core installation)";
548 								break;
549 							case PRODUCT_STARTER:
550 								szVersion += "Starter";
551 								break;
552 							case PRODUCT_STARTER_E:
553 								//szVersion+="Not supported";
554 								break;
555 							case PRODUCT_STARTER_N:
556 								szVersion += "Starter N";
557 								break;
558 							case PRODUCT_STORAGE_ENTERPRISE_SERVER:
559 								szVersion += "Storage Server Enterprise";
560 								break;
561 							case PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE:
562 								szVersion += "Storage Server Enterprise (core installation)";
563 								break;
564 							case PRODUCT_STORAGE_EXPRESS_SERVER:
565 								szVersion += "Storage Server Express";
566 								break;
567 							case PRODUCT_STORAGE_EXPRESS_SERVER_CORE:
568 								szVersion += "Storage Server Express (core installation)";
569 								break;
570 							case PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER:
571 								szVersion += "Storage Server Standard (evaluation installation)";
572 								break;
573 							case PRODUCT_STORAGE_STANDARD_SERVER:
574 								szVersion += "Storage Server Standard";
575 								break;
576 							case PRODUCT_STORAGE_STANDARD_SERVER_CORE:
577 								szVersion += "Storage Server Standard (core installation)";
578 								break;
579 							case PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER:
580 								szVersion += "Storage Server Workgroup (evaluation installation)";
581 								break;
582 							case PRODUCT_STORAGE_WORKGROUP_SERVER:
583 								szVersion += "Storage Server Workgroup";
584 								break;
585 							case PRODUCT_STORAGE_WORKGROUP_SERVER_CORE:
586 								szVersion += "Storage Server Workgroup (core installation)";
587 								break;
588 							case PRODUCT_ULTIMATE:
589 								szVersion += "Ultimate";
590 								break;
591 							case PRODUCT_ULTIMATE_E:
592 								//szVersion+="Not supported";
593 								break;
594 							case PRODUCT_ULTIMATE_N:
595 								szVersion += "Ultimate N";
596 								break;
597 							case PRODUCT_UNDEFINED:
598 								szVersion += "An unknown product";
599 								break;
600 							// just use unknown here since we do not care.
601 							case PRODUCT_UNLICENSED:
602 								szVersion += "An unknown product";
603 								break;
604 							case PRODUCT_WEB_SERVER:
605 								szVersion += "Web Server (full installation)";
606 								break;
607 							case PRODUCT_WEB_SERVER_CORE:
608 								szVersion += "Web Server (core installation)";
609 								break;
610 						}
611 						szVersion += " ";
612 						if(si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
613 						{
614 							szVersion += "(x64) ";
615 						}
616 					}
617 			}
618 			// Display service pack (if any) and build number.
619 			szVersion += QString("%1 (Build %2)").arg(QString::fromWCharArray(osvi.szCSDVersion)).arg(osvi.dwBuildNumber & 0xFFFF);
620 	}
621 	if(info == Os_Release)
622 	{
623 		unsigned long major = osvi.dwMajorVersion;
624 		unsigned long minor = osvi.dwMinorVersion;
625 		unsigned long release = osvi.dwBuildNumber;
626 		QString szMajor, szMinor, szRelease, szVersion;
627 		szMajor.setNum(major);
628 		szMinor.setNum(minor);
629 		szRelease.setNum(release);
630 		szVersion = "Release : " + szMajor + "." + szMinor + "." + szRelease;
631 		return szVersion;
632 	}
633 	if(info == Os_Type)
634 	{
635 		if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
636 			return " NT ";
637 		return __tr2qs("Unknown ");
638 	}
639 	if(info == Os_Version)
640 	{
641 		return szVersion;
642 	}
643 
644 	return KviQString::Empty;
645 }
646 #endif
647 
648 namespace KviRuntimeInfo
649 {
type()650 	QString type()
651 	{
652 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
653 		return queryWinInfo(Os_Type);
654 #else
655 		return "UNIX";
656 #endif
657 	}
658 
name()659 	QString name()
660 	{
661 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
662 		return "Windows";
663 #elif defined(COMPILE_ON_MAC)
664 		return "macOS";
665 #else
666 		struct utsname uts;
667 		if(uname(&uts) == 0)
668 			return QString::fromLocal8Bit(uts.sysname);
669 		return KviQString::Empty;
670 #endif
671 	}
672 
version()673 	QString version()
674 	{
675 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
676 		return queryWinInfo(Os_Version);
677 #else
678 		struct utsname uts;
679 		if(uname(&uts) == 0)
680 			return QString::fromLocal8Bit(uts.version);
681 		return KviQString::Empty;
682 #endif
683 	}
684 
release()685 	QString release()
686 	{
687 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
688 		return queryWinInfo(Os_Release);
689 #else
690 		struct utsname uts;
691 		if(uname(&uts) == 0)
692 			return QString::fromLocal8Bit(uts.release);
693 		return KviQString::Empty;
694 #endif
695 	}
696 
machine()697 	QString machine()
698 	{
699 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
700 		QString mach = getenv("PROCESSOR_IDENTIFIER");
701 		return mach.section(",", 0, 0);
702 #else
703 		struct utsname uts;
704 		if(uname(&uts) == 0)
705 			return QString::fromLocal8Bit(uts.machine);
706 		return KviQString::Empty;
707 #endif
708 	}
709 
nodename()710 	QString nodename()
711 	{
712 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
713 		return "windows";
714 #else
715 		struct utsname uts;
716 		if(uname(&uts) == 0)
717 			return QString::fromLocal8Bit(uts.nodename);
718 		return KviQString::Empty;
719 #endif
720 	}
721 
hostname()722 	QString hostname()
723 	{
724 		char hbuffer[1024];
725 		if(gethostname(hbuffer, 1024) == 0)
726 			return QString::fromLocal8Bit(hbuffer);
727 		else
728 			return KviQString::Empty;
729 	}
730 
qtVersion()731 	QString qtVersion()
732 	{
733 		return QString(qVersion());
734 	}
735 
qtTheme()736 	QString qtTheme()
737 	{
738 		static QString theme{qApp->style()->objectName().isEmpty() ?
739 		                         __tr2qs("Overridden with a stylesheet") :
740 		                         qApp->style()->objectName()};
741 		return theme;
742 	}
743 }
744