Sync with trunk rev.61910 to get latest improvements and bugfixes.
[reactos.git] / base / applications / dxdiag / system.c
1 /*
2 * PROJECT: ReactX Diagnosis Application
3 * LICENSE: LGPL - See COPYING in the top level directory
4 * FILE: base/applications/dxdiag/system.c
5 * PURPOSE: ReactX diagnosis system page
6 * COPYRIGHT: Copyright 2008 Johannes Anderwald
7 *
8 */
9
10 #include "precomp.h"
11
12 BOOL
13 GetRegValue(HKEY hBaseKey, LPWSTR SubKey, LPWSTR ValueName, DWORD Type, LPWSTR Result, DWORD Size)
14 {
15 HKEY hKey;
16 LONG res;
17 DWORD dwType;
18 DWORD dwSize;
19
20 if (RegOpenKeyExW(hBaseKey, SubKey, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
21 return FALSE;
22
23 dwSize = Size;
24 res = RegQueryValueExW(hKey, ValueName, NULL, &dwType, (LPBYTE)Result, &dwSize);
25 RegCloseKey(hKey);
26
27 if (res != ERROR_SUCCESS)
28 return FALSE;
29
30 if (dwType != Type)
31 return FALSE;
32
33 if (Size == sizeof(DWORD))
34 return TRUE;
35
36 Result[(Size / sizeof(WCHAR))-1] = L'\0';
37 return TRUE;
38 }
39
40
41 static
42 BOOL
43 GetDirectXVersion(WCHAR * szBuffer)
44 {
45 WCHAR szVer[20];
46
47 if (!GetRegValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\DirectX", L"Version", REG_SZ, szVer, sizeof(szVer)))
48 return FALSE;
49
50 if(!wcscmp(szVer, L"4.02.0095"))
51 wcscpy(szBuffer, L"1.0");
52 else if (!wcscmp(szVer, L"4.03.00.1096"))
53 wcscpy(szBuffer, L"2.0");
54 else if (!wcscmp(szVer, L"4.04.0068"))
55 wcscpy(szBuffer, L"3.0");
56 else if (!wcscmp(szVer, L"4.04.0069"))
57 wcscpy(szBuffer, L"3.0");
58 else if (!wcscmp(szVer, L"4.05.00.0155"))
59 wcscpy(szBuffer, L"5.0");
60 else if (!wcscmp(szVer, L"4.05.01.1721"))
61 wcscpy(szBuffer, L"5.0");
62 else if (!wcscmp(szVer, L"4.05.01.1998"))
63 wcscpy(szBuffer, L"5.0");
64 else if (!wcscmp(szVer, L"4.06.02.0436"))
65 wcscpy(szBuffer, L"6.0");
66 else if (!wcscmp(szVer, L"4.07.00.0700"))
67 wcscpy(szBuffer, L"7.0");
68 else if (!wcscmp(szVer, L"4.07.00.0716"))
69 wcscpy(szBuffer, L"7.0a");
70 else if (!wcscmp(szVer, L"4.08.00.0400"))
71 wcscpy(szBuffer, L"8.0");
72 else if (!wcscmp(szVer, L"4.08.01.0881"))
73 wcscpy(szBuffer, L"8.1");
74 else if (!wcscmp(szVer, L"4.08.01.0810"))
75 wcscpy(szBuffer, L"8.1");
76 else if (!wcscmp(szVer, L"4.09.0000.0900"))
77 wcscpy(szBuffer, L"9.0");
78 else if (!wcscmp(szVer, L"4.09.00.0900"))
79 wcscpy(szBuffer, L"9.0");
80 else if (!wcscmp(szVer, L"4.09.0000.0901"))
81 wcscpy(szBuffer, L"9.0a");
82 else if (!wcscmp(szVer, L"4.09.00.0901"))
83 wcscpy(szBuffer, L"9.0a");
84 else if (!wcscmp(szVer, L"4.09.0000.0902"))
85 wcscpy(szBuffer, L"9.0b");
86 else if (!wcscmp(szVer, L"4.09.00.0902"))
87 wcscpy(szBuffer, L"9.0b");
88 else if (!wcscmp(szVer, L"4.09.00.0904"))
89 wcscpy(szBuffer, L"9.0c");
90 else if (!wcscmp(szVer, L"4.09.0000.0904"))
91 wcscpy(szBuffer, L"9.0c");
92 else
93 return FALSE;
94
95 return TRUE;
96 }
97
98 #if 0
99 static
100 BOOL
101 GetVistaVersion(WCHAR * szBuffer)
102 {
103 DWORD Length;
104
105 if (GetProductInfo(6, 0, 0, 0, &Length))
106 {
107 switch(Length)
108 {
109 case PRODUCT_ULTIMATE:
110 wsprintfW(szBuffer, L"Windows Vista Ultimate (6.0, Build %04u)", info.dwBuildNumber);
111 return TRUE;
112 case PRODUCT_HOME_BASIC:
113 wsprintfW(szBuffer, L"Windows Vista Home Basic (6.0, Build %04u)", info.dwBuildNumber);
114 return TRUE;
115 case PRODUCT_HOME_PREMIUM:
116 wsprintfW(szBuffer, L"Windows Vista Home Premimum (6.0, Build %04u)", info.dwBuildNumber);
117 return TRUE;
118 case PRODUCT_ENTERPRISE:
119 wsprintfW(szBuffer, L"Windows Vista Enterprise (6.0, Build %04u)", info.dwBuildNumber);
120 return TRUE;
121 case PRODUCT_HOME_BASIC_N:
122 wsprintfW(szBuffer, L"Windows Vista Home Basic N(6.0, Build %04u)", info.dwBuildNumber);
123 return TRUE;
124 case PRODUCT_BUSINESS:
125 wsprintfW(szBuffer, L"Windows Vista Business(6.0, Build %04u)", info.dwBuildNumber);
126 return TRUE;
127 case PRODUCT_STARTER:
128 wsprintfW(szBuffer, L"Windows Vista Starter(6.0, Build %04u)", info.dwBuildNumber);
129 return TRUE;
130 case PRODUCT_BUSINESS_N:
131 wsprintfW(szBuffer, L"Windows Vista Business N(6.0, Build %04u)", info.dwBuildNumber);
132 return TRUE;
133 default:
134 return FALSE;
135 }
136 }
137 }
138
139 #endif
140
141
142 static
143 BOOL
144 GetOSVersion(WCHAR * szBuffer)
145 {
146 OSVERSIONINFOEXW info;
147
148 ZeroMemory(&info, sizeof(info));
149 info.dwOSVersionInfoSize = sizeof(info);
150 if (GetVersionExW((LPOSVERSIONINFO)&info))
151 {
152 /* FIXME retrieve ReactOS version*/
153 if (info.dwMajorVersion == 4)
154 {
155 wcscpy(szBuffer, L"Windows NT 4.0");
156 if (info.szCSDVersion[0])
157 {
158 wcscat(szBuffer, L" ");
159 wcscat(szBuffer, info.szCSDVersion);
160 }
161 return TRUE;
162 }
163
164 if (info.dwMajorVersion == 5 && info.dwMinorVersion == 0)
165 {
166 wcscpy(szBuffer, L"Windows 2000");
167 if (info.szCSDVersion[0])
168 {
169 wcscat(szBuffer, L" ");
170 wcscat(szBuffer, info.szCSDVersion);
171 }
172 return TRUE;
173 }
174
175 if (info.dwMajorVersion == 5 && info.dwMinorVersion == 1)
176 {
177 wcscpy(szBuffer, L"Windows XP");
178 if (info.szCSDVersion[0])
179 {
180 wcscat(szBuffer, L" ");
181 wcscat(szBuffer, info.szCSDVersion);
182 }
183 return TRUE;
184 }
185
186 if (info.dwMajorVersion == 6 && info.dwMinorVersion == 0)
187 {
188 // if (GetVistaVersion(szBuffer))
189 // return TRUE;
190
191 wsprintfW(szBuffer, L"Windows Vista (6.0, Build %04u)", info.dwBuildNumber);
192 return TRUE;
193 }
194 }
195
196 return FALSE;
197 }
198
199 static
200 VOID
201 InitializeSystemPage(HWND hwndDlg)
202 {
203 WCHAR szTime[200];
204 DWORD Length;
205 DWORDLONG AvailableBytes, UsedBytes;
206 MEMORYSTATUSEX mem;
207 WCHAR szFormat[40];
208 WCHAR szDesc[50];
209 SYSTEM_INFO SysInfo;
210
211 /* set date/time */
212 szTime[0] = L'\0';
213 Length = GetDateFormat(LOCALE_SYSTEM_DEFAULT, DATE_LONGDATE, NULL, NULL, szTime, sizeof(szTime) / sizeof(WCHAR));
214 if (Length)
215 {
216 szTime[Length-1] = L',';
217 szTime[Length++] = L' ';
218 }
219 Length = GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT|LOCALE_NOUSEROVERRIDE, NULL, NULL, &szTime[Length], (sizeof(szTime) / sizeof(WCHAR)));
220 szTime[199] = L'\0';
221 SendDlgItemMessageW(hwndDlg, IDC_STATIC_TIME, WM_SETTEXT, 0, (LPARAM)szTime);
222
223 /* set computer name */
224 szTime[0] = L'\0';
225 Length = sizeof(szTime) / sizeof(WCHAR);
226 if (GetComputerNameW(szTime, &Length))
227 SendDlgItemMessageW(hwndDlg, IDC_STATIC_COMPUTER, WM_SETTEXT, 0, (LPARAM)szTime);
228
229 /* set product name */
230 if (GetOSVersion(szTime))
231 {
232 SendDlgItemMessage(hwndDlg, IDC_STATIC_OS, WM_SETTEXT, 0, (LPARAM)szTime);
233 }
234 else
235 {
236 if (LoadStringW(hInst, IDS_VERSION_UNKNOWN, szTime, sizeof(szTime) / sizeof(WCHAR)))
237 {
238 szTime[(sizeof(szTime) / sizeof(WCHAR))-1] = L'\0';
239 SendDlgItemMessage(hwndDlg, IDC_STATIC_VERSION, WM_SETTEXT, 0, (LPARAM)szTime);
240 }
241 }
242
243 /* FIXME set product language/local language */
244 if (GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SLANGUAGE , szTime, sizeof(szTime) / sizeof(WCHAR)))
245 SendDlgItemMessageW(hwndDlg, IDC_STATIC_LANG, WM_SETTEXT, 0, (LPARAM)szTime);
246
247 /* set system manufacturer */
248 szTime[0] = L'\0';
249 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\BIOS", L"SystemManufacturer", REG_SZ, szTime, sizeof(szTime)))
250 {
251 szTime[199] = L'\0';
252 SendDlgItemMessageW(hwndDlg, IDC_STATIC_MANU, WM_SETTEXT, 0, (LPARAM)szTime);
253 }
254
255 /* set motherboard model */
256 szTime[0] = L'\0';
257 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\BIOS", L"SystemProductName", REG_SZ, szTime, sizeof(szTime)))
258 {
259 SendDlgItemMessageW(hwndDlg, IDC_STATIC_MODEL, WM_SETTEXT, 0, (LPARAM)szTime);
260 }
261
262 /* set bios model */
263 szTime[0] = L'\0';
264 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\BIOS", L"BIOSVendor", REG_SZ, szTime, sizeof(szTime)))
265 {
266 DWORD Index;
267 DWORD StrLength = (sizeof(szTime) / sizeof(WCHAR));
268
269 Index = wcslen(szTime);
270 StrLength -= Index;
271
272 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\BIOS", L"BIOSReleaseDate", REG_SZ, &szTime[Index], StrLength))
273 {
274 if (Index + StrLength > (sizeof(szTime)/sizeof(WCHAR))- 15)
275 {
276 //FIXME retrieve BiosMajorRelease, BiosMinorRelease
277 //StrLength = wcslen(&szTime[Index]);
278 //szTime[Index+StrLength] = L' ';
279 //wcscpy(&szTime[Index+StrLength], L"Ver: "); //FIXME NON-NLS
280 //szTime[(sizeof(szTime)/sizeof(WCHAR))-1] = L'\0';
281 }
282 SendDlgItemMessageW(hwndDlg, IDC_STATIC_BIOS, WM_SETTEXT, 0, (LPARAM)szTime);
283 }
284 }
285 /* set processor string */
286 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\CentralProcessor\\0", L"ProcessorNameString", REG_SZ, szDesc, sizeof(szDesc)))
287 {
288 /* FIXME retrieve current speed */
289 szFormat[0] = L'\0';
290 GetSystemInfo(&SysInfo);
291 if (SysInfo.dwNumberOfProcessors > 1)
292 LoadStringW(hInst, IDS_FORMAT_MPPROC, szFormat, sizeof(szFormat) / sizeof(WCHAR));
293 else
294 LoadStringW(hInst, IDS_FORMAT_UNIPROC, szFormat, sizeof(szFormat) / sizeof(WCHAR));
295
296 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0';
297 wsprintfW(szTime, szFormat, szDesc, SysInfo.dwNumberOfProcessors);
298 SendDlgItemMessageW(hwndDlg, IDC_STATIC_PROC, WM_SETTEXT, 0, (LPARAM)szTime);
299 }
300
301 /* retrieve available memory */
302 ZeroMemory(&mem, sizeof(mem));
303 mem.dwLength = sizeof(mem);
304 if (GlobalMemoryStatusEx(&mem))
305 {
306 if (LoadStringW(hInst, IDS_FORMAT_MB, szFormat, sizeof(szFormat) / sizeof(WCHAR)))
307 {
308 /* set total mem string */
309 szFormat[(sizeof(szFormat) / sizeof(WCHAR))-1] = L'\0';
310 wsprintfW(szTime, szFormat, (mem.ullTotalPhys/1048576));
311 SendDlgItemMessageW(hwndDlg, IDC_STATIC_MEM, WM_SETTEXT, 0, (LPARAM)szTime);
312 }
313
314 if (LoadStringW(hInst, IDS_FORMAT_SWAP, szFormat, sizeof(szFormat) / sizeof(WCHAR)))
315 {
316 /* set swap string */
317 AvailableBytes = (mem.ullTotalPageFile-mem.ullTotalPhys)/1048576;
318 UsedBytes = (mem.ullTotalPageFile-mem.ullAvailPageFile)/1048576;
319
320 szFormat[(sizeof(szFormat) / sizeof(WCHAR))-1] = L'\0';
321 wsprintfW(szTime, szFormat, (UsedBytes), (AvailableBytes));
322 SendDlgItemMessageW(hwndDlg, IDC_STATIC_SWAP, WM_SETTEXT, 0, (LPARAM)szTime);
323 }
324 }
325 /* set directx version string */
326 wcscpy(szTime, L"ReactX ");
327 if (GetDirectXVersion(&szTime[7]))
328 {
329 SendDlgItemMessage(hwndDlg, IDC_STATIC_VERSION, WM_SETTEXT, 0, (LPARAM)szTime);
330 }
331 else
332 {
333 if (LoadStringW(hInst, IDS_VERSION_UNKNOWN, szTime, sizeof(szTime) / sizeof(WCHAR)))
334 {
335 szTime[(sizeof(szTime) / sizeof(WCHAR))-1] = L'\0';
336 SendDlgItemMessage(hwndDlg, IDC_STATIC_VERSION, WM_SETTEXT, 0, (LPARAM)szTime);
337 }
338 }
339 }
340
341
342 INT_PTR CALLBACK
343 SystemPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
344 {
345 UNREFERENCED_PARAMETER(lParam);
346 UNREFERENCED_PARAMETER(wParam);
347 switch (message)
348 {
349 case WM_INITDIALOG:
350 {
351 SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
352 InitializeSystemPage(hDlg);
353 return TRUE;
354 }
355 }
356
357 return FALSE;
358 }