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