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
)
20 if (RegOpenKeyExW(hBaseKey
, SubKey
, 0, KEY_QUERY_VALUE
, &hKey
) != ERROR_SUCCESS
)
24 res
= RegQueryValueExW(hKey
, ValueName
, NULL
, &dwType
, (LPBYTE
)Result
, &dwSize
);
27 if (res
!= ERROR_SUCCESS
)
33 if (Size
== sizeof(DWORD
))
36 Result
[(Size
/ sizeof(WCHAR
))-1] = L
'\0';
43 GetDirectXVersion(WCHAR
* szBuffer
)
47 if (!GetRegValue(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\DirectX", L
"Version", REG_SZ
, szVer
, sizeof(szVer
)))
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");
101 GetVistaVersion(WCHAR
* szBuffer
)
105 if (GetProductInfo(6, 0, 0, 0, &Length
))
109 case PRODUCT_ULTIMATE
:
110 wsprintfW(szBuffer
, L
"Windows Vista Ultimate (6.0, Build %04u)", info
.dwBuildNumber
);
112 case PRODUCT_HOME_BASIC
:
113 wsprintfW(szBuffer
, L
"Windows Vista Home Basic (6.0, Build %04u)", info
.dwBuildNumber
);
115 case PRODUCT_HOME_PREMIUM
:
116 wsprintfW(szBuffer
, L
"Windows Vista Home Premimum (6.0, Build %04u)", info
.dwBuildNumber
);
118 case PRODUCT_ENTERPRISE
:
119 wsprintfW(szBuffer
, L
"Windows Vista Enterprise (6.0, Build %04u)", info
.dwBuildNumber
);
121 case PRODUCT_HOME_BASIC_N
:
122 wsprintfW(szBuffer
, L
"Windows Vista Home Basic N(6.0, Build %04u)", info
.dwBuildNumber
);
124 case PRODUCT_BUSINESS
:
125 wsprintfW(szBuffer
, L
"Windows Vista Business(6.0, Build %04u)", info
.dwBuildNumber
);
127 case PRODUCT_STARTER
:
128 wsprintfW(szBuffer
, L
"Windows Vista Starter(6.0, Build %04u)", info
.dwBuildNumber
);
130 case PRODUCT_BUSINESS_N
:
131 wsprintfW(szBuffer
, L
"Windows Vista Business N(6.0, Build %04u)", info
.dwBuildNumber
);
144 GetOSVersion(WCHAR
* szBuffer
)
146 OSVERSIONINFOEXW info
;
148 ZeroMemory(&info
, sizeof(info
));
149 info
.dwOSVersionInfoSize
= sizeof(info
);
150 if (GetVersionExW((LPOSVERSIONINFO
)&info
))
152 /* FIXME retrieve ReactOS version*/
153 if (info
.dwMajorVersion
== 4)
155 wcscpy(szBuffer
, L
"Windows NT 4.0");
156 if (info
.szCSDVersion
[0])
158 wcscat(szBuffer
, L
" ");
159 wcscat(szBuffer
, info
.szCSDVersion
);
164 if (info
.dwMajorVersion
== 5 && info
.dwMinorVersion
== 0)
166 wcscpy(szBuffer
, L
"Windows 2000");
167 if (info
.szCSDVersion
[0])
169 wcscat(szBuffer
, L
" ");
170 wcscat(szBuffer
, info
.szCSDVersion
);
175 if (info
.dwMajorVersion
== 5 && info
.dwMinorVersion
== 1)
177 wcscpy(szBuffer
, L
"Windows XP");
178 if (info
.szCSDVersion
[0])
180 wcscat(szBuffer
, L
" ");
181 wcscat(szBuffer
, info
.szCSDVersion
);
186 if (info
.dwMajorVersion
== 6 && info
.dwMinorVersion
== 0)
188 // if (GetVistaVersion(szBuffer))
191 wsprintfW(szBuffer
, L
"Windows Vista (6.0, Build %04u)", info
.dwBuildNumber
);
201 InitializeSystemPage(HWND hwndDlg
)
205 DWORDLONG AvailableBytes
, UsedBytes
;
213 Length
= GetDateFormat(LOCALE_SYSTEM_DEFAULT
, DATE_LONGDATE
, NULL
, NULL
, szTime
, sizeof(szTime
) / sizeof(WCHAR
));
216 szTime
[Length
-1] = L
',';
217 szTime
[Length
++] = L
' ';
219 Length
= GetTimeFormatW(LOCALE_SYSTEM_DEFAULT
, TIME_FORCE24HOURFORMAT
|LOCALE_NOUSEROVERRIDE
, NULL
, NULL
, &szTime
[Length
], (sizeof(szTime
) / sizeof(WCHAR
)));
221 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_TIME
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
223 /* set computer name */
225 Length
= sizeof(szTime
) / sizeof(WCHAR
);
226 if (GetComputerNameW(szTime
, &Length
))
227 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_COMPUTER
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
229 /* set product name */
230 if (GetOSVersion(szTime
))
232 SendDlgItemMessage(hwndDlg
, IDC_STATIC_OS
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
236 if (LoadStringW(hInst
, IDS_VERSION_UNKNOWN
, szTime
, sizeof(szTime
) / sizeof(WCHAR
)))
238 szTime
[(sizeof(szTime
) / sizeof(WCHAR
))-1] = L
'\0';
239 SendDlgItemMessage(hwndDlg
, IDC_STATIC_VERSION
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
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
);
247 /* set system manufacturer */
249 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"SystemManufacturer", REG_SZ
, szTime
, sizeof(szTime
)))
252 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_MANU
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
255 /* set motherboard model */
257 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"SystemProductName", REG_SZ
, szTime
, sizeof(szTime
)))
259 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_MODEL
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
264 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"BIOSVendor", REG_SZ
, szTime
, sizeof(szTime
)))
267 DWORD StrLength
= (sizeof(szTime
) / sizeof(WCHAR
));
269 Index
= wcslen(szTime
);
272 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"BIOSReleaseDate", REG_SZ
, &szTime
[Index
], StrLength
))
274 if (Index
+ StrLength
> (sizeof(szTime
)/sizeof(WCHAR
))- 15)
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';
282 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_BIOS
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
285 /* set processor string */
286 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\CentralProcessor\\0", L
"ProcessorNameString", REG_SZ
, szDesc
, sizeof(szDesc
)))
288 /* FIXME retrieve current speed */
290 GetSystemInfo(&SysInfo
);
291 if (SysInfo
.dwNumberOfProcessors
> 1)
292 LoadStringW(hInst
, IDS_FORMAT_MPPROC
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
));
294 LoadStringW(hInst
, IDS_FORMAT_UNIPROC
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
));
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
);
301 /* retrieve available memory */
302 ZeroMemory(&mem
, sizeof(mem
));
303 mem
.dwLength
= sizeof(mem
);
304 if (GlobalMemoryStatusEx(&mem
))
306 if (LoadStringW(hInst
, IDS_FORMAT_MB
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
)))
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
);
314 if (LoadStringW(hInst
, IDS_FORMAT_SWAP
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
)))
316 /* set swap string */
317 AvailableBytes
= (mem
.ullTotalPageFile
-mem
.ullTotalPhys
)/1048576;
318 UsedBytes
= (mem
.ullTotalPageFile
-mem
.ullAvailPageFile
)/1048576;
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
);
325 /* set directx version string */
326 wcscpy(szTime
, L
"ReactX ");
327 if (GetDirectXVersion(&szTime
[7]))
329 SendDlgItemMessage(hwndDlg
, IDC_STATIC_VERSION
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
333 if (LoadStringW(hInst
, IDS_VERSION_UNKNOWN
, szTime
, sizeof(szTime
) / sizeof(WCHAR
)))
335 szTime
[(sizeof(szTime
) / sizeof(WCHAR
))-1] = L
'\0';
336 SendDlgItemMessage(hwndDlg
, IDC_STATIC_VERSION
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
343 SystemPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
345 UNREFERENCED_PARAMETER(lParam
);
346 UNREFERENCED_PARAMETER(wParam
);
351 SetWindowPos(hDlg
, NULL
, 10, 32, 0, 0, SWP_NOACTIVATE
| SWP_NOOWNERZORDER
| SWP_NOSIZE
| SWP_NOZORDER
);
352 InitializeSystemPage(hDlg
);