Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendisplay.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactX Diagnosis Application 00003 * LICENSE: LGPL - See COPYING in the top level directory 00004 * FILE: base/applications/dxdiag/display.c 00005 * PURPOSE: ReactX diagnosis display page 00006 * COPYRIGHT: Copyright 2008 Johannes Anderwald 00007 * 00008 */ 00009 00010 #include "precomp.h" 00011 #include <d3d9.h> 00012 00013 BOOL 00014 GetFileModifyTime(LPCWSTR pFullPath, WCHAR * szTime, int szTimeSize) 00015 { 00016 HANDLE hFile; 00017 FILETIME AccessTime; 00018 SYSTEMTIME SysTime, LocalTime; 00019 UINT Length; 00020 TIME_ZONE_INFORMATION TimeInfo; 00021 00022 hFile = CreateFileW(pFullPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); 00023 if (!hFile) 00024 return FALSE; 00025 00026 if (!GetFileTime(hFile, NULL, NULL, &AccessTime)) 00027 { 00028 CloseHandle(hFile); 00029 return FALSE; 00030 } 00031 CloseHandle(hFile); 00032 00033 if(!GetTimeZoneInformation(&TimeInfo)) 00034 return FALSE; 00035 00036 if (!FileTimeToSystemTime(&AccessTime, &SysTime)) 00037 return FALSE; 00038 00039 if (!SystemTimeToTzSpecificLocalTime(&TimeInfo, &SysTime, &LocalTime)) 00040 return FALSE; 00041 00042 Length = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &LocalTime, NULL, szTime, szTimeSize); 00043 szTime[Length-1] = L' '; 00044 return GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_FORCE24HOURFORMAT, &LocalTime, NULL, &szTime[Length], szTimeSize-Length); 00045 } 00046 00047 00048 00049 static UINT WINAPI 00050 DriverFilesCallback(IN PVOID Context, 00051 IN UINT Notification, 00052 IN UINT_PTR Param1, 00053 IN UINT_PTR Param2) 00054 { 00055 LPCWSTR pFile; 00056 LPWSTR pBuffer; 00057 LPCWSTR pFullPath = (LPCWSTR)Param1; 00058 WCHAR szVer[60]; 00059 LRESULT Length, fLength; 00060 HWND * hDlgCtrls = (HWND *)Context; 00061 00062 if (wcsstr(pFullPath, L"\\DRIVERS\\")) 00063 { 00064 /* exclude files from drivers dir to have failsafe file version/date information */ 00065 return NO_ERROR; 00066 } 00067 00068 pFile = wcsrchr(pFullPath, L'\\'); 00069 if (!pFile) 00070 return NO_ERROR; 00071 00072 pFile++; 00073 fLength = wcslen(pFile) + 1; 00074 00075 Length = SendMessageW(hDlgCtrls[0], WM_GETTEXTLENGTH, 0, 0) + 1; 00076 pBuffer = HeapAlloc(GetProcessHeap(), 0, (Length + fLength) * sizeof(WCHAR)); 00077 if (!pBuffer) 00078 return ERROR_OUTOFMEMORY; 00079 00080 Length = SendMessageW(hDlgCtrls[0], WM_GETTEXT, Length, (LPARAM)pBuffer); 00081 if (Length) 00082 { 00083 pBuffer[Length++] = L','; 00084 } 00085 else 00086 { 00087 /* set file version */ 00088 if (GetFileVersion(pFullPath, szVer, sizeof(szVer)/sizeof(WCHAR))) 00089 SendMessageW(hDlgCtrls[1], WM_SETTEXT, 0, (LPARAM)szVer); 00090 /* set file time */ 00091 if (GetFileModifyTime(pFullPath, szVer, sizeof(szVer)/sizeof(WCHAR))) 00092 SendMessageW(hDlgCtrls[2], WM_SETTEXT, 0, (LPARAM)szVer); 00093 } 00094 00095 wcscpy(&pBuffer[Length], pFile); 00096 SendMessageW(hDlgCtrls[0], WM_SETTEXT, 0, (LPARAM)pBuffer); 00097 HeapFree(GetProcessHeap(), 0, pBuffer); 00098 return NO_ERROR; 00099 } 00100 00101 VOID 00102 EnumerateDrivers(PVOID Context, HDEVINFO hList, PSP_DEVINFO_DATA pInfoData) 00103 { 00104 HSPFILEQ hQueue; 00105 SP_DEVINSTALL_PARAMS DeviceInstallParams = {0}; 00106 SP_DRVINFO_DATA DriverInfoData; 00107 DWORD Result; 00108 00109 DeviceInstallParams.cbSize = sizeof(DeviceInstallParams); 00110 if (!SetupDiGetDeviceInstallParamsW(hList, pInfoData, &DeviceInstallParams)) 00111 return; 00112 00113 DeviceInstallParams.FlagsEx |= (DI_FLAGSEX_INSTALLEDDRIVER | DI_FLAGSEX_ALLOWEXCLUDEDDRVS); 00114 if (!SetupDiSetDeviceInstallParams(hList, pInfoData, &DeviceInstallParams)) 00115 return; 00116 00117 if (!SetupDiBuildDriverInfoList(hList, pInfoData, SPDIT_CLASSDRIVER)) 00118 return; 00119 00120 DriverInfoData.cbSize = sizeof(DriverInfoData); 00121 if (!SetupDiEnumDriverInfoW(hList, pInfoData, SPDIT_CLASSDRIVER, 0, &DriverInfoData)) 00122 return; 00123 00124 DriverInfoData.cbSize = sizeof(DriverInfoData); 00125 if (!SetupDiSetSelectedDriverW(hList, pInfoData, &DriverInfoData)) 00126 return; 00127 00128 hQueue = SetupOpenFileQueue(); 00129 if (hQueue == (HSPFILEQ)INVALID_HANDLE_VALUE) 00130 return; 00131 00132 DeviceInstallParams.cbSize = sizeof(DeviceInstallParams); 00133 if (!SetupDiGetDeviceInstallParamsW(hList, pInfoData, &DeviceInstallParams)) 00134 { 00135 SetupCloseFileQueue(hQueue); 00136 return; 00137 } 00138 00139 DeviceInstallParams.FileQueue = hQueue; 00140 DeviceInstallParams.Flags |= DI_NOVCP; 00141 00142 if (!SetupDiSetDeviceInstallParamsW(hList, pInfoData, &DeviceInstallParams)) 00143 { 00144 SetupCloseFileQueue(hQueue); 00145 return; 00146 } 00147 00148 if(!SetupDiCallClassInstaller(DIF_INSTALLDEVICEFILES, hList, pInfoData)) 00149 { 00150 SetupCloseFileQueue(hQueue); 00151 return; 00152 } 00153 00154 00155 /* enumerate the driver files */ 00156 SetupScanFileQueueW(hQueue, SPQ_SCAN_USE_CALLBACK, NULL, DriverFilesCallback, Context, &Result); 00157 SetupCloseFileQueue(hQueue); 00158 } 00159 00160 static 00161 void 00162 SetDeviceDetails(HWND * hDlgCtrls, LPCGUID classGUID, LPGUID * deviceGUID) 00163 { 00164 HDEVINFO hInfo; 00165 DWORD dwIndex = 0; 00166 SP_DEVINFO_DATA InfoData; 00167 WCHAR szText[100]; 00168 00169 /* create the setup list */ 00170 hInfo = SetupDiGetClassDevsW(classGUID, NULL, NULL, DIGCF_PRESENT|DIGCF_PROFILE); 00171 if (hInfo == INVALID_HANDLE_VALUE) 00172 return; 00173 00174 do 00175 { 00176 ZeroMemory(&InfoData, sizeof(InfoData)); 00177 InfoData.cbSize = sizeof(InfoData); 00178 00179 if (SetupDiEnumDeviceInfo(hInfo, dwIndex, &InfoData)) 00180 { 00181 /* set device name */ 00182 if (SetupDiGetDeviceRegistryPropertyW(hInfo, &InfoData, SPDRP_DEVICEDESC, NULL, (PBYTE)szText, sizeof(szText), NULL)) 00183 SendMessageW(hDlgCtrls[0], WM_SETTEXT, 0, (LPARAM)szText); 00184 00185 /* set the manufacturer name */ 00186 if (SetupDiGetDeviceRegistryPropertyW(hInfo, &InfoData, SPDRP_MFG, NULL, (PBYTE)szText, sizeof(szText), NULL)) 00187 SendMessageW(hDlgCtrls[1], WM_SETTEXT, 0, (LPARAM)szText); 00188 00189 /* FIXME 00190 * we currently enumerate only the first adapter 00191 */ 00192 EnumerateDrivers(&hDlgCtrls[2], hInfo, &InfoData); 00193 break; 00194 } 00195 00196 if (GetLastError() == ERROR_NO_MORE_ITEMS) 00197 break; 00198 00199 dwIndex++; 00200 }while(TRUE); 00201 00202 /* destroy the setup list */ 00203 SetupDiDestroyDeviceInfoList(hInfo); 00204 } 00205 00206 00207 static 00208 BOOL 00209 InitializeDialog(HWND hwndDlg, PDISPLAY_DEVICEW pDispDevice) 00210 { 00211 WCHAR szText[100]; 00212 WCHAR szFormat[30]; 00213 HKEY hKey; 00214 HWND hDlgCtrls[5]; 00215 DWORD dwMemory; 00216 DEVMODE DevMode; 00217 IDirect3D9 * ppObj; 00218 D3DADAPTER_IDENTIFIER9 Identifier; 00219 HRESULT hResult; 00220 00221 szText[0] = L'\0'; 00222 ppObj = Direct3DCreate9(D3D_SDK_VERSION); 00223 if (ppObj) 00224 { 00225 hResult = IDirect3D9_GetAdapterIdentifier(ppObj, D3DADAPTER_DEFAULT , 2/*D3DENUM_WHQL_LEVEL*/, &Identifier); 00226 if (hResult == D3D_OK) 00227 { 00228 00229 if (Identifier.WHQLLevel) 00230 { 00231 /* adapter is WHQL certified */ 00232 LoadStringW(hInst, IDS_OPTION_YES, szText, sizeof(szText)/sizeof(WCHAR)); 00233 } 00234 else 00235 { 00236 LoadStringW(hInst, IDS_OPTION_NO, szText, sizeof(szText)/sizeof(WCHAR)); 00237 } 00238 } 00239 IDirect3D9_Release(ppObj); 00240 } 00241 else 00242 { 00243 LoadStringW(hInst, IDS_DEVICE_STATUS_UNKNOWN, szText, sizeof(szText)/sizeof(WCHAR)); 00244 } 00245 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; 00246 SendDlgItemMessageW(hwndDlg, IDC_STATIC_ADAPTER_LOGO, WM_SETTEXT, 0, (LPARAM)szText); 00247 00248 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, &pDispDevice->DeviceKey[18], 0, KEY_READ, &hKey) != ERROR_SUCCESS) 00249 return FALSE; 00250 00251 if (GetRegValue(hKey, NULL, L"HardwareInformation.ChipType", REG_BINARY, szText, sizeof(szText))) 00252 { 00253 /* set chip type */ 00254 SendDlgItemMessageW(hwndDlg, IDC_STATIC_ADAPTER_CHIP, WM_SETTEXT, 0, (LPARAM)szText); 00255 } 00256 00257 if (GetRegValue(hKey, NULL, L"HardwareInformation.DacType", REG_BINARY, szText, sizeof(szText))) 00258 { 00259 /* set DAC type */ 00260 SendDlgItemMessageW(hwndDlg, IDC_STATIC_ADAPTER_DAC, WM_SETTEXT, 0, (LPARAM)szText); 00261 } 00262 00263 if (GetRegValue(hKey, NULL, L"HardwareInformation.MemorySize", REG_BINARY, (LPWSTR)&dwMemory, sizeof(dwMemory))) 00264 { 00265 /* set chip memory size */ 00266 if (dwMemory > (1048576)) 00267 { 00268 /* buggy ATI driver requires that */ 00269 dwMemory /= 1048576; 00270 } 00271 szFormat[0] = L'\0'; 00272 if (LoadStringW(hInst, IDS_FORMAT_ADAPTER_MEM, szFormat, sizeof(szFormat)/sizeof(WCHAR))) 00273 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0'; 00274 wsprintfW(szText, szFormat, dwMemory); 00275 SendDlgItemMessageW(hwndDlg, IDC_STATIC_ADAPTER_MEM, WM_SETTEXT, 0, (LPARAM)szText); 00276 } 00277 00278 /* retrieve current display mode */ 00279 DevMode.dmSize = sizeof(DEVMODE); 00280 if (EnumDisplaySettingsW(pDispDevice->DeviceName, ENUM_CURRENT_SETTINGS, &DevMode)) 00281 { 00282 szFormat[0] = L'\0'; 00283 if (LoadStringW(hInst, IDS_FORMAT_ADAPTER_MODE, szFormat, sizeof(szFormat)/sizeof(WCHAR))) 00284 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0'; 00285 wsprintfW(szText, szFormat, DevMode.dmPelsWidth, DevMode.dmPelsHeight, DevMode.dmBitsPerPel, DevMode.dmDisplayFrequency); 00286 SendDlgItemMessageW(hwndDlg, IDC_STATIC_ADAPTER_MODE, WM_SETTEXT, 0, (LPARAM)szText); 00287 } 00288 00289 /* query attached monitor */ 00290 wcscpy(szText, pDispDevice->DeviceName); 00291 ZeroMemory(pDispDevice, sizeof(DISPLAY_DEVICEW)); 00292 pDispDevice->cb = sizeof(DISPLAY_DEVICEW); 00293 if (EnumDisplayDevicesW(szText, 0, pDispDevice, 0)) 00294 { 00295 /* set monitor name */ 00296 SendDlgItemMessageW(hwndDlg, IDC_STATIC_ADAPTER_MONITOR, WM_SETTEXT, 0, (LPARAM)pDispDevice->DeviceString); 00297 } 00298 00299 hDlgCtrls[0] = GetDlgItem(hwndDlg, IDC_STATIC_ADAPTER_ID); 00300 hDlgCtrls[1] = GetDlgItem(hwndDlg, IDC_STATIC_ADAPTER_VENDOR); 00301 hDlgCtrls[2] = GetDlgItem(hwndDlg, IDC_STATIC_ADAPTER_DRIVER); 00302 hDlgCtrls[3] = GetDlgItem(hwndDlg, IDC_STATIC_ADAPTER_VERSION); 00303 hDlgCtrls[4] = GetDlgItem(hwndDlg, IDC_STATIC_ADAPTER_DATE); 00304 00305 SetDeviceDetails(hDlgCtrls, &GUID_DEVCLASS_DISPLAY, NULL); 00306 return TRUE; 00307 } 00308 00309 void InitializeDisplayAdapters(PDXDIAG_CONTEXT pContext) 00310 { 00311 DISPLAY_DEVICEW DispDevice; 00312 HWND * hDlgs; 00313 HWND hwndDlg; 00314 WCHAR szDisplay[20]; 00315 WCHAR szText[30]; 00316 DWORD dwOffset = 0; 00317 00318 while(TRUE) 00319 { 00320 ZeroMemory(&DispDevice, sizeof(DISPLAY_DEVICEW)); 00321 DispDevice.cb = sizeof(DISPLAY_DEVICEW); 00322 if (!EnumDisplayDevicesW(NULL, pContext->NumDisplayAdapter + dwOffset, &DispDevice, 0)) 00323 return; 00324 00325 /* skip devices not attached to the desktop and mirror drivers */ 00326 if (!(DispDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) || (DispDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER)) 00327 { 00328 dwOffset++; 00329 continue; 00330 } 00331 if (pContext->NumDisplayAdapter) 00332 hDlgs = HeapReAlloc(GetProcessHeap(), 0, pContext->hDisplayWnd, (pContext->NumDisplayAdapter + 1) * sizeof(HWND)); 00333 else 00334 hDlgs = HeapAlloc(GetProcessHeap(), 0, (pContext->NumDisplayAdapter + 1) * sizeof(HWND)); 00335 00336 if (!hDlgs) 00337 break; 00338 00339 pContext->hDisplayWnd = hDlgs; 00340 hwndDlg = CreateDialogParamW(hInst, MAKEINTRESOURCEW(IDD_DISPLAY_DIALOG), pContext->hMainDialog, DisplayPageWndProc, (LPARAM)pContext); 00341 if (!hwndDlg) 00342 break; 00343 00344 /* initialize the dialog */ 00345 InitializeDialog(hwndDlg, &DispDevice); 00346 00347 szDisplay[0] = L'\0'; 00348 LoadStringW(hInst, IDS_DISPLAY_DIALOG, szDisplay, sizeof(szDisplay)/sizeof(WCHAR)); 00349 szDisplay[(sizeof(szDisplay)/sizeof(WCHAR))-1] = L'\0'; 00350 00351 wsprintfW (szText, L"%s %u", szDisplay, pContext->NumDisplayAdapter + 1); 00352 InsertTabCtrlItem(GetDlgItem(pContext->hMainDialog, IDC_TAB_CONTROL), pContext->NumDisplayAdapter + 1, szText); 00353 00354 hDlgs[pContext->NumDisplayAdapter] = hwndDlg; 00355 pContext->NumDisplayAdapter++; 00356 } 00357 00358 00359 } 00360 00361 00362 INT_PTR CALLBACK 00363 DisplayPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 00364 { 00365 RECT rect; 00366 PDXDIAG_CONTEXT pContext = (PDXDIAG_CONTEXT)GetWindowLongPtr(hDlg, DWLP_USER); 00367 switch (message) 00368 { 00369 case WM_INITDIALOG: 00370 { 00371 pContext = (PDXDIAG_CONTEXT) lParam; 00372 SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pContext); 00373 SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER); 00374 return TRUE; 00375 } 00376 case WM_COMMAND: 00377 { 00378 switch(LOWORD(wParam)) 00379 { 00380 case IDC_BUTTON_TESTDD: 00381 case IDC_BUTTON_TEST3D: 00382 GetWindowRect(pContext->hMainDialog, &rect); 00383 /* FIXME log result errors */ 00384 if (IDC_BUTTON_TESTDD == LOWORD(wParam)) 00385 DDTests(); 00386 else if (IDC_BUTTON_TEST3D == LOWORD(wParam)) 00387 D3DTests(); 00388 SetWindowPos(pContext->hMainDialog, NULL, rect.left, rect.top, rect.right, rect.bottom, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER); 00389 break; 00390 } 00391 break; 00392 } 00393 } 00394 00395 return FALSE; 00396 } Generated on Sat May 26 2012 04:15:35 for ReactOS by
1.7.6.1
|