b6686a515d64b8549b4596b855c24bea9dc9b1d2
[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 typedef BOOL (WINAPI *ISWOW64PROC) (HANDLE, PBOOL);
13
14 BOOL
15 GetRegValue(HKEY hBaseKey, LPWSTR SubKey, LPWSTR ValueName, DWORD Type, LPWSTR Result, DWORD Size)
16 {
17 HKEY hKey;
18 LONG res;
19 DWORD dwType;
20 DWORD dwSize;
21
22 if (RegOpenKeyExW(hBaseKey, SubKey, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
23 return FALSE;
24
25 dwSize = Size;
26 res = RegQueryValueExW(hKey, ValueName, NULL, &dwType, (LPBYTE)Result, &dwSize);
27 RegCloseKey(hKey);
28
29 if (res != ERROR_SUCCESS)
30 return FALSE;
31
32 if (dwType != Type)
33 return FALSE;
34
35 if (Size == sizeof(DWORD))
36 return TRUE;
37
38 Result[(Size / sizeof(WCHAR))-1] = L'\0';
39 return TRUE;
40 }
41
42
43 static
44 BOOL
45 GetDirectXVersion(WCHAR * szBuffer)
46 {
47 WCHAR szVer[20];
48
49 if (!GetRegValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\DirectX", L"Version", REG_SZ, szVer, sizeof(szVer)))
50 return FALSE;
51
52 if(!wcscmp(szVer, L"4.02.0095"))
53 wcscpy(szBuffer, L"1.0");
54 else if (!wcscmp(szVer, L"4.03.00.1096"))
55 wcscpy(szBuffer, L"2.0");
56 else if (!wcscmp(szVer, L"4.04.0068"))
57 wcscpy(szBuffer, L"3.0");
58 else if (!wcscmp(szVer, L"4.04.0069"))
59 wcscpy(szBuffer, L"3.0");
60 else if (!wcscmp(szVer, L"4.05.00.0155"))
61 wcscpy(szBuffer, L"5.0");
62 else if (!wcscmp(szVer, L"4.05.01.1721"))
63 wcscpy(szBuffer, L"5.0");
64 else if (!wcscmp(szVer, L"4.05.01.1998"))
65 wcscpy(szBuffer, L"5.0");
66 else if (!wcscmp(szVer, L"4.06.02.0436"))
67 wcscpy(szBuffer, L"6.0");
68 else if (!wcscmp(szVer, L"4.07.00.0700"))
69 wcscpy(szBuffer, L"7.0");
70 else if (!wcscmp(szVer, L"4.07.00.0716"))
71 wcscpy(szBuffer, L"7.0a");
72 else if (!wcscmp(szVer, L"4.08.00.0400"))
73 wcscpy(szBuffer, L"8.0");
74 else if (!wcscmp(szVer, L"4.08.01.0881"))
75 wcscpy(szBuffer, L"8.1");
76 else if (!wcscmp(szVer, L"4.08.01.0810"))
77 wcscpy(szBuffer, L"8.1");
78 else if (!wcscmp(szVer, L"4.09.0000.0900"))
79 wcscpy(szBuffer, L"9.0");
80 else if (!wcscmp(szVer, L"4.09.00.0900"))
81 wcscpy(szBuffer, L"9.0");
82 else if (!wcscmp(szVer, L"4.09.0000.0901"))
83 wcscpy(szBuffer, L"9.0a");
84 else if (!wcscmp(szVer, L"4.09.00.0901"))
85 wcscpy(szBuffer, L"9.0a");
86 else if (!wcscmp(szVer, L"4.09.0000.0902"))
87 wcscpy(szBuffer, L"9.0b");
88 else if (!wcscmp(szVer, L"4.09.00.0902"))
89 wcscpy(szBuffer, L"9.0b");
90 else if (!wcscmp(szVer, L"4.09.00.0904"))
91 wcscpy(szBuffer, L"9.0c");
92 else if (!wcscmp(szVer, L"4.09.0000.0904"))
93 wcscpy(szBuffer, L"9.0c");
94 else
95 return FALSE;
96
97 return TRUE;
98 }
99
100 VOID GetSystemCPU(WCHAR *szBuffer)
101 {
102 SYSTEM_INFO archInfo;
103 ISWOW64PROC fnIsWow64Process;
104 BOOL isWow64 = FALSE;
105
106 /* Find out if the program is running through WOW64 or not. Apparently,
107 IsWow64Process() is not available on all versions of Windows, so the function
108 has to be imported at runtime. If the function cannot be found, then assume
109 the program is not running in WOW64. */
110 fnIsWow64Process = (ISWOW64PROC)GetProcAddress(
111 GetModuleHandleW(L"kernel32"), "IsWow64Process");
112
113 if (fnIsWow64Process != NULL)
114 fnIsWow64Process(GetCurrentProcess(), &isWow64);
115
116 /* If the program is compiled as 32-bit, but is running in WOW64, it will
117 automatically report as 32-bit regardless of the actual system architecture.
118 It detects whether or not the program is using WOW64 or not, and then
119 uses GetNativeSystemInfo(). If it is, it will properly report the actual
120 system architecture to the user. */
121 if (isWow64)
122 GetNativeSystemInfo(&archInfo);
123 else
124 GetSystemInfo(&archInfo);
125
126 /* Now check to see what the system architecture is */
127 if(archInfo.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_UNKNOWN)
128 {
129 switch(archInfo.wProcessorArchitecture)
130 {
131 case PROCESSOR_ARCHITECTURE_INTEL:
132 {
133 wsprintfW(szBuffer, L"32-bit");
134 break;
135 }
136 case PROCESSOR_ARCHITECTURE_AMD64:
137 {
138 wsprintfW(szBuffer, L"64-bit");
139 break;
140 }
141 case PROCESSOR_ARCHITECTURE_IA64:
142 {
143 wsprintfW(szBuffer, L"Itanium");
144 break;
145 }
146 case PROCESSOR_ARCHITECTURE_ARM:
147 {
148 wsprintfW(szBuffer, L"ARM");
149 break;
150 }
151 default:break;
152 }
153 }
154 }
155
156 static
157 VOID
158 InitializeSystemPage(HWND hwndDlg)
159 {
160 WCHAR szTime[200];
161 WCHAR szOSName[50];
162 DWORD Length;
163 DWORDLONG AvailableBytes, UsedBytes;
164 MEMORYSTATUSEX mem;
165 WCHAR szFormat[40];
166 WCHAR szDesc[50];
167 SYSTEM_INFO SysInfo;
168 OSVERSIONINFO VersionInfo;
169
170 /* set date/time */
171 szTime[0] = L'\0';
172 Length = GetDateFormat(LOCALE_SYSTEM_DEFAULT, DATE_LONGDATE, NULL, NULL, szTime, sizeof(szTime) / sizeof(WCHAR));
173 if (Length)
174 {
175 szTime[Length-1] = L',';
176 szTime[Length++] = L' ';
177 }
178 Length = GetTimeFormatW(LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT|LOCALE_NOUSEROVERRIDE, NULL, NULL, &szTime[Length], (sizeof(szTime) / sizeof(WCHAR)));
179 szTime[199] = L'\0';
180 SendDlgItemMessageW(hwndDlg, IDC_STATIC_TIME, WM_SETTEXT, 0, (LPARAM)szTime);
181
182 /* set computer name */
183 szTime[0] = L'\0';
184 Length = sizeof(szTime) / sizeof(WCHAR);
185 if (GetComputerNameW(szTime, &Length))
186 SendDlgItemMessageW(hwndDlg, IDC_STATIC_COMPUTER, WM_SETTEXT, 0, (LPARAM)szTime);
187
188 /* set product name */
189 if (GetRegValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", L"ProductName", REG_SZ, szOSName, sizeof(szOSName)))
190 {
191 if (LoadStringW(hInst, IDS_OS_VERSION, szFormat, sizeof(szFormat) / sizeof(WCHAR)))
192 {
193 WCHAR szCpuName[50];
194
195 ZeroMemory(&VersionInfo, sizeof(OSVERSIONINFO));
196 VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
197
198 GetSystemCPU(szCpuName);
199
200 if (GetVersionEx(&VersionInfo))
201 {
202 szTime[(sizeof(szTime) / sizeof(WCHAR))-1] = L'\0';
203 wsprintfW(szTime, szFormat, szOSName, szCpuName, VersionInfo.dwMajorVersion, VersionInfo.dwMinorVersion, VersionInfo.dwBuildNumber);
204 SendDlgItemMessageW(hwndDlg, IDC_STATIC_OS, WM_SETTEXT, 0, (LPARAM)szTime);
205 }
206 else
207 {
208 /* If the version of the OS cannot be retrieved for some reason, then just give the OS Name and Architecture */
209 szTime[(sizeof(szTime) / sizeof(WCHAR))-1] = L'\0';
210 wsprintfW(szTime, L"%s %s", szOSName, szCpuName);
211 SendDlgItemMessageW(hwndDlg, IDC_STATIC_OS, WM_SETTEXT, 0, (LPARAM)szTime);
212 }
213 }
214 }
215 else
216 {
217 if (LoadStringW(hInst, IDS_VERSION_UNKNOWN, szTime, sizeof(szTime) / sizeof(WCHAR)))
218 {
219 szTime[(sizeof(szTime) / sizeof(WCHAR))-1] = L'\0';
220 SendDlgItemMessage(hwndDlg, IDC_STATIC_VERSION, WM_SETTEXT, 0, (LPARAM)szTime);
221 }
222 }
223
224 /* FIXME set product language/local language */
225 if (GetLocaleInfo(LOCALE_SYSTEM_DEFAULT,LOCALE_SLANGUAGE , szTime, sizeof(szTime) / sizeof(WCHAR)))
226 SendDlgItemMessageW(hwndDlg, IDC_STATIC_LANG, WM_SETTEXT, 0, (LPARAM)szTime);
227
228 /* set system manufacturer */
229 szTime[0] = L'\0';
230 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\BIOS", L"SystemManufacturer", REG_SZ, szTime, sizeof(szTime)))
231 {
232 szTime[199] = L'\0';
233 SendDlgItemMessageW(hwndDlg, IDC_STATIC_MANU, WM_SETTEXT, 0, (LPARAM)szTime);
234 }
235
236 /* set motherboard model */
237 szTime[0] = L'\0';
238 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\BIOS", L"SystemProductName", REG_SZ, szTime, sizeof(szTime)))
239 {
240 SendDlgItemMessageW(hwndDlg, IDC_STATIC_MODEL, WM_SETTEXT, 0, (LPARAM)szTime);
241 }
242
243 /* set bios model */
244 szTime[0] = L'\0';
245 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\BIOS", L"BIOSVendor", REG_SZ, szTime, sizeof(szTime)))
246 {
247 DWORD Index;
248 DWORD StrLength = (sizeof(szTime) / sizeof(WCHAR));
249
250 Index = wcslen(szTime);
251 StrLength -= Index;
252
253 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\BIOS", L"BIOSReleaseDate", REG_SZ, &szTime[Index], StrLength))
254 {
255 if (Index + StrLength > (sizeof(szTime)/sizeof(WCHAR))- 15)
256 {
257 //FIXME retrieve BiosMajorRelease, BiosMinorRelease
258 //StrLength = wcslen(&szTime[Index]);
259 //szTime[Index+StrLength] = L' ';
260 //wcscpy(&szTime[Index+StrLength], L"Ver: "); //FIXME NON-NLS
261 //szTime[(sizeof(szTime)/sizeof(WCHAR))-1] = L'\0';
262 }
263 SendDlgItemMessageW(hwndDlg, IDC_STATIC_BIOS, WM_SETTEXT, 0, (LPARAM)szTime);
264 }
265 }
266 /* set processor string */
267 if (GetRegValue(HKEY_LOCAL_MACHINE, L"Hardware\\Description\\System\\CentralProcessor\\0", L"ProcessorNameString", REG_SZ, szDesc, sizeof(szDesc)))
268 {
269 /* FIXME retrieve current speed */
270 szFormat[0] = L'\0';
271 GetSystemInfo(&SysInfo);
272 if (SysInfo.dwNumberOfProcessors > 1)
273 LoadStringW(hInst, IDS_FORMAT_MPPROC, szFormat, sizeof(szFormat) / sizeof(WCHAR));
274 else
275 LoadStringW(hInst, IDS_FORMAT_UNIPROC, szFormat, sizeof(szFormat) / sizeof(WCHAR));
276
277 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0';
278 wsprintfW(szTime, szFormat, szDesc, SysInfo.dwNumberOfProcessors);
279 SendDlgItemMessageW(hwndDlg, IDC_STATIC_PROC, WM_SETTEXT, 0, (LPARAM)szTime);
280 }
281
282 /* retrieve available memory */
283 ZeroMemory(&mem, sizeof(mem));
284 mem.dwLength = sizeof(mem);
285 if (GlobalMemoryStatusEx(&mem))
286 {
287 if (LoadStringW(hInst, IDS_FORMAT_MB, szFormat, sizeof(szFormat) / sizeof(WCHAR)))
288 {
289 /* set total mem string */
290 szFormat[(sizeof(szFormat) / sizeof(WCHAR))-1] = L'\0';
291 wsprintfW(szTime, szFormat, (mem.ullTotalPhys/1048576));
292 SendDlgItemMessageW(hwndDlg, IDC_STATIC_MEM, WM_SETTEXT, 0, (LPARAM)szTime);
293 }
294
295 if (LoadStringW(hInst, IDS_FORMAT_SWAP, szFormat, sizeof(szFormat) / sizeof(WCHAR)))
296 {
297 /* set swap string */
298 AvailableBytes = (mem.ullTotalPageFile-mem.ullTotalPhys)/1048576;
299 UsedBytes = (mem.ullTotalPageFile-mem.ullAvailPageFile)/1048576;
300
301 szFormat[(sizeof(szFormat) / sizeof(WCHAR))-1] = L'\0';
302 wsprintfW(szTime, szFormat, (UsedBytes), (AvailableBytes));
303 SendDlgItemMessageW(hwndDlg, IDC_STATIC_SWAP, WM_SETTEXT, 0, (LPARAM)szTime);
304 }
305 }
306 /* set directx version string */
307 wcscpy(szTime, L"ReactX ");
308 if (GetDirectXVersion(&szTime[7]))
309 {
310 SendDlgItemMessage(hwndDlg, IDC_STATIC_VERSION, WM_SETTEXT, 0, (LPARAM)szTime);
311 }
312 else
313 {
314 if (LoadStringW(hInst, IDS_VERSION_UNKNOWN, szTime, sizeof(szTime) / sizeof(WCHAR)))
315 {
316 szTime[(sizeof(szTime) / sizeof(WCHAR))-1] = L'\0';
317 SendDlgItemMessage(hwndDlg, IDC_STATIC_VERSION, WM_SETTEXT, 0, (LPARAM)szTime);
318 }
319 }
320 }
321
322
323 INT_PTR CALLBACK
324 SystemPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
325 {
326 UNREFERENCED_PARAMETER(lParam);
327 UNREFERENCED_PARAMETER(wParam);
328 switch (message)
329 {
330 case WM_INITDIALOG:
331 {
332 SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
333 InitializeSystemPage(hDlg);
334 return TRUE;
335 }
336 }
337
338 return FALSE;
339 }