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
12 typedef BOOL (WINAPI
*ISWOW64PROC
) (HANDLE
, PBOOL
);
15 GetRegValue(HKEY hBaseKey
, LPWSTR SubKey
, LPWSTR ValueName
, DWORD Type
, LPWSTR Result
, DWORD Size
)
22 if (RegOpenKeyExW(hBaseKey
, SubKey
, 0, KEY_QUERY_VALUE
, &hKey
) != ERROR_SUCCESS
)
26 res
= RegQueryValueExW(hKey
, ValueName
, NULL
, &dwType
, (LPBYTE
)Result
, &dwSize
);
29 if (res
!= ERROR_SUCCESS
)
35 if (Size
== sizeof(DWORD
))
38 Result
[(Size
/ sizeof(WCHAR
))-1] = L
'\0';
45 GetDirectXVersion(WCHAR
* szBuffer
)
49 if (!GetRegValue(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\DirectX", L
"Version", REG_SZ
, szVer
, sizeof(szVer
)))
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");
100 VOID
GetSystemCPU(WCHAR
*szBuffer
)
102 SYSTEM_INFO archInfo
;
103 ISWOW64PROC fnIsWow64Process
;
104 BOOL isWow64
= FALSE
;
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");
113 if (fnIsWow64Process
!= NULL
)
114 fnIsWow64Process(GetCurrentProcess(), &isWow64
);
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. */
122 GetNativeSystemInfo(&archInfo
);
124 GetSystemInfo(&archInfo
);
126 /* Now check to see what the system architecture is */
127 if(archInfo
.wProcessorArchitecture
!= PROCESSOR_ARCHITECTURE_UNKNOWN
)
129 switch(archInfo
.wProcessorArchitecture
)
131 case PROCESSOR_ARCHITECTURE_INTEL
:
133 wsprintfW(szBuffer
, L
"32-bit");
136 case PROCESSOR_ARCHITECTURE_AMD64
:
138 wsprintfW(szBuffer
, L
"64-bit");
141 case PROCESSOR_ARCHITECTURE_IA64
:
143 wsprintfW(szBuffer
, L
"Itanium");
146 case PROCESSOR_ARCHITECTURE_ARM
:
148 wsprintfW(szBuffer
, L
"ARM");
158 InitializeSystemPage(HWND hwndDlg
)
163 DWORDLONG AvailableBytes
, UsedBytes
;
168 OSVERSIONINFO VersionInfo
;
172 Length
= GetDateFormat(LOCALE_SYSTEM_DEFAULT
, DATE_LONGDATE
, NULL
, NULL
, szTime
, sizeof(szTime
) / sizeof(WCHAR
));
175 szTime
[Length
-1] = L
',';
176 szTime
[Length
++] = L
' ';
178 Length
= GetTimeFormatW(LOCALE_SYSTEM_DEFAULT
, TIME_FORCE24HOURFORMAT
|LOCALE_NOUSEROVERRIDE
, NULL
, NULL
, &szTime
[Length
], (sizeof(szTime
) / sizeof(WCHAR
)));
180 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_TIME
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
182 /* set computer name */
184 Length
= sizeof(szTime
) / sizeof(WCHAR
);
185 if (GetComputerNameW(szTime
, &Length
))
186 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_COMPUTER
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
188 /* set product name */
189 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", L
"ProductName", REG_SZ
, szOSName
, sizeof(szOSName
)))
191 if (LoadStringW(hInst
, IDS_OS_VERSION
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
)))
195 ZeroMemory(&VersionInfo
, sizeof(OSVERSIONINFO
));
196 VersionInfo
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFO
);
198 GetSystemCPU(szCpuName
);
200 if (GetVersionEx(&VersionInfo
))
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
);
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
);
217 if (LoadStringW(hInst
, IDS_VERSION_UNKNOWN
, szTime
, sizeof(szTime
) / sizeof(WCHAR
)))
219 szTime
[(sizeof(szTime
) / sizeof(WCHAR
))-1] = L
'\0';
220 SendDlgItemMessage(hwndDlg
, IDC_STATIC_VERSION
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
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
);
228 /* set system manufacturer */
230 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"SystemManufacturer", REG_SZ
, szTime
, sizeof(szTime
)))
233 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_MANU
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
236 /* set motherboard model */
238 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"SystemProductName", REG_SZ
, szTime
, sizeof(szTime
)))
240 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_MODEL
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
245 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"BIOSVendor", REG_SZ
, szTime
, sizeof(szTime
)))
248 DWORD StrLength
= (sizeof(szTime
) / sizeof(WCHAR
));
250 Index
= wcslen(szTime
);
253 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\BIOS", L
"BIOSReleaseDate", REG_SZ
, &szTime
[Index
], StrLength
))
255 if (Index
+ StrLength
> (sizeof(szTime
)/sizeof(WCHAR
))- 15)
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';
263 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_BIOS
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
266 /* set processor string */
267 if (GetRegValue(HKEY_LOCAL_MACHINE
, L
"Hardware\\Description\\System\\CentralProcessor\\0", L
"ProcessorNameString", REG_SZ
, szDesc
, sizeof(szDesc
)))
269 /* FIXME retrieve current speed */
271 GetSystemInfo(&SysInfo
);
272 if (SysInfo
.dwNumberOfProcessors
> 1)
273 LoadStringW(hInst
, IDS_FORMAT_MPPROC
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
));
275 LoadStringW(hInst
, IDS_FORMAT_UNIPROC
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
));
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
);
282 /* retrieve available memory */
283 ZeroMemory(&mem
, sizeof(mem
));
284 mem
.dwLength
= sizeof(mem
);
285 if (GlobalMemoryStatusEx(&mem
))
287 if (LoadStringW(hInst
, IDS_FORMAT_MB
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
)))
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
);
295 if (LoadStringW(hInst
, IDS_FORMAT_SWAP
, szFormat
, sizeof(szFormat
) / sizeof(WCHAR
)))
297 /* set swap string */
298 AvailableBytes
= (mem
.ullTotalPageFile
-mem
.ullTotalPhys
)/1048576;
299 UsedBytes
= (mem
.ullTotalPageFile
-mem
.ullAvailPageFile
)/1048576;
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
);
306 /* set directx version string */
307 wcscpy(szTime
, L
"ReactX ");
308 if (GetDirectXVersion(&szTime
[7]))
310 SendDlgItemMessage(hwndDlg
, IDC_STATIC_VERSION
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
314 if (LoadStringW(hInst
, IDS_VERSION_UNKNOWN
, szTime
, sizeof(szTime
) / sizeof(WCHAR
)))
316 szTime
[(sizeof(szTime
) / sizeof(WCHAR
))-1] = L
'\0';
317 SendDlgItemMessage(hwndDlg
, IDC_STATIC_VERSION
, WM_SETTEXT
, 0, (LPARAM
)szTime
);
324 SystemPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
326 UNREFERENCED_PARAMETER(lParam
);
327 UNREFERENCED_PARAMETER(wParam
);
332 SetWindowPos(hDlg
, NULL
, 10, 32, 0, 0, SWP_NOACTIVATE
| SWP_NOOWNERZORDER
| SWP_NOSIZE
| SWP_NOZORDER
);
333 InitializeSystemPage(hDlg
);