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
13 GetRegValue(HKEY hBaseKey
, LPWSTR SubKey
, LPWSTR ValueName
, DWORD Type
, LPWSTR Result
, DWORD Size
)
21 if (RegOpenKeyExW(hBaseKey
, SubKey
, 0, KEY_QUERY_VALUE
, &hKey
) != ERROR_SUCCESS
)
25 res
= RegQueryValueExW(hKey
, ValueName
, NULL
, &dwType
, (LPBYTE
)Result
, &dwSize
);
31 if (res
!= ERROR_SUCCESS
)
34 if (Size
== sizeof(DWORD
))
37 Result
[(Size
/ sizeof(WCHAR
))-1] = L
'\0';
44 GetDirectXVersion(WCHAR
* szBuffer
)
48 if (!GetRegValue(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\DirectX", L
"Version", REG_SZ
, szVer
, sizeof(szVer
)))
51 if(!wcscmp(szVer
, L
"4.02.0095"))
52 wcscpy(szBuffer
, L
"1.0");
53 else if (!wcscmp(szVer
, L
"4.03.00.1096"))
54 wcscpy(szBuffer
, L
"2.0");
55 else if (!wcscmp(szVer
, L
"4.04.0068"))
56 wcscpy(szBuffer
, L
"3.0");
57 else if (!wcscmp(szVer
, L
"4.04.0069"))
58 wcscpy(szBuffer
, L
"3.0");
59 else if (!wcscmp(szVer
, L
"4.05.00.0155"))
60 wcscpy(szBuffer
, L
"5.0");
61 else if (!wcscmp(szVer
, L
"4.05.01.1721"))
62 wcscpy(szBuffer
, L
"5.0");
63 else if (!wcscmp(szVer
, L
"4.05.01.1998"))
64 wcscpy(szBuffer
, L
"5.0");
65 else if (!wcscmp(szVer
, L
"4.06.02.0436"))
66 wcscpy(szBuffer
, L
"6.0");
67 else if (!wcscmp(szVer
, L
"4.07.00.0700"))
68 wcscpy(szBuffer
, L
"7.0");
69 else if (!wcscmp(szVer
, L
"4.07.00.0716"))
70 wcscpy(szBuffer
, L
"7.0a");
71 else if (!wcscmp(szVer
, L
"4.08.00.0400"))
72 wcscpy(szBuffer
, L
"8.0");
73 else if (!wcscmp(szVer
, L
"4.08.01.0881"))
74 wcscpy(szBuffer
, L
"8.1");
75 else if (!wcscmp(szVer
, L
"4.08.01.0810"))
76 wcscpy(szBuffer
, L
"8.1");
77 else if (!wcscmp(szVer
, L
"4.09.0000.0900"))
78 wcscpy(szBuffer
, L
"9.0");
79 else if (!wcscmp(szVer
, L
"4.09.00.0900"))
80 wcscpy(szBuffer
, L
"9.0");
81 else if (!wcscmp(szVer
, L
"4.09.0000.0901"))
82 wcscpy(szBuffer
, L
"9.0a");
83 else if (!wcscmp(szVer
, L
"4.09.00.0901"))
84 wcscpy(szBuffer
, L
"9.0a");
85 else if (!wcscmp(szVer
, L
"4.09.0000.0902"))
86 wcscpy(szBuffer
, L
"9.0b");
87 else if (!wcscmp(szVer
, L
"4.09.00.0902"))
88 wcscpy(szBuffer
, L
"9.0b");
89 else if (!wcscmp(szVer
, L
"4.09.00.0904"))
90 wcscpy(szBuffer
, L
"9.0c");
91 else if (!wcscmp(szVer
, L
"4.09.0000.0904"))
92 wcscpy(szBuffer
, L
"9.0c");
102 GetVistaVersion(WCHAR
* szBuffer
)
106 if (GetProductInfo(6, 0, 0, 0, &Length
))
110 case PRODUCT_ULTIMATE
:
111 wsprintfW(szBuffer
, L
"Windows Vista Ultimate (6.0, Build %04u)", info
.dwBuildNumber
);
113 case PRODUCT_HOME_BASIC
:
114 wsprintfW(szBuffer
, L
"Windows Vista Home Basic (6.0, Build %04u)", info
.dwBuildNumber
);
116 case PRODUCT_HOME_PREMIUM
:
117 wsprintfW(szBuffer
, L
"Windows Vista Home Premimum (6.0, Build %04u)", info
.dwBuildNumber
);
119 case PRODUCT_ENTERPRISE
:
120 wsprintfW(szBuffer
, L
"Windows Vista Enterprise (6.0, Build %04u)", info
.dwBuildNumber
);
122 case PRODUCT_HOME_BASIC_N
:
123 wsprintfW(szBuffer
, L
"Windows Vista Home Basic N(6.0, Build %04u)", info
.dwBuildNumber
);
125 case PRODUCT_BUSINESS
:
126 wsprintfW(szBuffer
, L
"Windows Vista Business(6.0, Build %04u)", info
.dwBuildNumber
);
128 case PRODUCT_STARTER
:
129 wsprintfW(szBuffer
, L
"Windows Vista Starter(6.0, Build %04u)", info
.dwBuildNumber
);
131 case PRODUCT_BUSINESS_N
:
132 wsprintfW(szBuffer
, L
"Windows Vista Business N(6.0, Build %04u)", info
.dwBuildNumber
);
145 GetOSVersion(WCHAR
* szBuffer
)
147 OSVERSIONINFOEXW info
;
149 ZeroMemory(&info
, sizeof(info
));
150 info
.dwOSVersionInfoSize
= sizeof(info
);
151 if (GetVersionExW((LPOSVERSIONINFO
)&info
))
153 /* FIXME retrieve ReactOS version*/
154 if (info
.dwMajorVersion
== 4)
156 wcscpy(szBuffer
, L
"Windows NT 4.0");
157 if (info
.szCSDVersion
[0])
159 wcscat(szBuffer
, L
" ");
160 wcscat(szBuffer
, info
.szCSDVersion
);
165 if (info
.dwMajorVersion
== 5 && info
.dwMinorVersion
== 0)
167 wcscpy(szBuffer
, L
"Windows 2000");
168 if (info
.szCSDVersion
[0])
170 wcscat(szBuffer
, L
" ");
171 wcscat(szBuffer
, info
.szCSDVersion
);
176 if (info
.dwMajorVersion
== 5 && info
.dwMinorVersion
== 1)
178 wcscpy(szBuffer
, L
"Windows XP");
179 if (info
.szCSDVersion
[0])
181 wcscat(szBuffer
, L
" ");
182 wcscat(szBuffer
, info
.szCSDVersion
);
187 if (info
.dwMajorVersion
== 6 && info
.dwMinorVersion
== 0)
189 // if (GetVistaVersion(szBuffer))
192 wsprintfW(szBuffer
, L
"Windows Vista (6.0, Build %04u)", info
.dwBuildNumber
);
202 InitializeSystemPage(HWND hwndDlg
)
206 DWORDLONG AvailableBytes
, UsedBytes
;
214 Length
= GetDateFormat(LOCALE_SYSTEM_DEFAULT
, DATE_LONGDATE
, NULL
, NULL
, szTime
, sizeof(szTime
) / sizeof(WCHAR
));
217 szTime
[Length
-1] = L
',';
218 szTime
[Length
++] = L
' ';
220 Length
= GetTimeFormatW(LOCALE_SYSTEM_DEFAULT
, TIME_FORCE24HOURFORMAT
|LOCALE_NOUSEROVERRIDE
, NULL
, NULL
, &szTime
[Length
], (sizeof(szTime
) / sizeof(WCHAR
)));
222 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_TIME
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
224 /* set computer name */
226 Length
= sizeof(szTime
) / sizeof(WCHAR
);
227 if (GetComputerNameW(szTime
, &Length
))
228 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_COMPUTER
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
230 /* set product name */
231 if (GetOSVersion(szTime
))
233 SendDlgItemMessage(hwndDlg
, IDC_STATIC_OS
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
237 if (LoadStringW(hInst
, IDS_VERSION_UNKNOWN
, szTime
, sizeof(szTime
) / sizeof(WCHAR
)))
239 szTime
[(sizeof(szTime
) / sizeof(WCHAR
))-1] = L
'\0';
240 SendDlgItemMessage(hwndDlg
, IDC_STATIC_VERSION
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
244 /* FIXME set product language/local language */
245 if (GetLocaleInfo(LOCALE_SYSTEM_DEFAULT
,LOCALE_SLANGUAGE
, szTime
, sizeof(szTime
) / sizeof(WCHAR
)))
246 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_LANG
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
248 /* set system manufacturer */
250 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"SystemManufacturer", REG_SZ
, szTime
, sizeof(szTime
)))
253 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_MANU
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
256 /* set motherboard model */
258 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"SystemProductName", REG_SZ
, szTime
, sizeof(szTime
)))
260 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_MODEL
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
265 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"BIOSVendor", REG_SZ
, szTime
, sizeof(szTime
)))
268 DWORD StrLength
= (sizeof(szTime
) / sizeof(WCHAR
));
270 Index
= wcslen(szTime
);
273 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"BIOSReleaseDate", REG_SZ
, &szTime
[Index
], StrLength
))
275 if (Index
+ StrLength
> (sizeof(szTime
)/sizeof(WCHAR
))- 15)
277 //FIXME retrieve BiosMajorRelease, BiosMinorRelease
278 //StrLength = wcslen(&szTime[Index]);
279 //szTime[Index+StrLength] = L' ';
280 //wcscpy(&szTime[Index+StrLength], L"Ver: "); //FIXME NON-NLS
281 //szTime[(sizeof(szTime)/sizeof(WCHAR))-1] = L'\0';
283 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_BIOS
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
286 /* set processor string */
287 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\CentralProcessor\\0", L
"ProcessorNameString", REG_SZ
, szDesc
, sizeof(szDesc
)))
289 /* FIXME retrieve current speed */
291 GetSystemInfo(&SysInfo
);
292 if (SysInfo
.dwNumberOfProcessors
> 1)
293 LoadStringW(hInst
, IDS_FORMAT_MPPROC
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
));
295 LoadStringW(hInst
, IDS_FORMAT_UNIPROC
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
));
297 szFormat
[(sizeof(szFormat
)/sizeof(WCHAR
))-1] = L
'\0';
298 wsprintfW(szTime
, szFormat
, szDesc
, SysInfo
.dwNumberOfProcessors
);
299 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_PROC
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
302 /* retrieve available memory */
303 ZeroMemory(&mem
, sizeof(mem
));
304 mem
.dwLength
= sizeof(mem
);
305 if (GlobalMemoryStatusEx(&mem
))
307 if (LoadStringW(hInst
, IDS_FORMAT_MB
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
)))
309 /* set total mem string */
310 szFormat
[(sizeof(szFormat
) / sizeof(WCHAR
))-1] = L
'\0';
311 wsprintfW(szTime
, szFormat
, (mem
.ullTotalPhys
/1048576));
312 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_MEM
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
315 if (LoadStringW(hInst
, IDS_FORMAT_SWAP
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
)))
317 /* set swap string */
318 AvailableBytes
= (mem
.ullTotalPageFile
-mem
.ullTotalPhys
)/1048576;
319 UsedBytes
= (mem
.ullTotalPageFile
-mem
.ullAvailPageFile
)/1048576;
321 szFormat
[(sizeof(szFormat
) / sizeof(WCHAR
))-1] = L
'\0';
322 wsprintfW(szTime
, szFormat
, (UsedBytes
), (AvailableBytes
));
323 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_SWAP
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
326 /* set directx version string */
327 wcscpy(szTime
, L
"ReactX ");
328 if (GetDirectXVersion(&szTime
[7]))
330 SendDlgItemMessage(hwndDlg
, IDC_STATIC_VERSION
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
334 if (LoadStringW(hInst
, IDS_VERSION_UNKNOWN
, szTime
, sizeof(szTime
) / sizeof(WCHAR
)))
336 szTime
[(sizeof(szTime
) / sizeof(WCHAR
))-1] = L
'\0';
337 SendDlgItemMessage(hwndDlg
, IDC_STATIC_VERSION
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
344 SystemPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
346 UNREFERENCED_PARAMETER(lParam
);
347 UNREFERENCED_PARAMETER(wParam
);
352 SetWindowPos(hDlg
, NULL
, 10, 32, 0, 0, SWP_NOACTIVATE
| SWP_NOOWNERZORDER
| SWP_NOSIZE
| SWP_NOZORDER
);
353 InitializeSystemPage(hDlg
);