ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

display.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.