diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c b/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c index 4514826e46c..cd73d6e38c6 100644 --- a/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c +++ b/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c @@ -107,56 +107,72 @@ Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeig LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; DX_WINDBG_trace(); - // FIXME: Check primary if surface is locked / busy etc. + HRESULT ret = DD_OK; - // Check Parameters - if(dwFlags != 0) + _SEH_TRY { - return DDERR_INVALIDPARAMS; - } + // FIXME: Check primary if surface is locked / busy etc. - if ((!dwHeight || This->lpLcl->lpGbl->vmiData.dwDisplayHeight == dwHeight) && - (!dwWidth || This->lpLcl->lpGbl->vmiData.dwDisplayWidth == dwWidth) && - (!dwBPP || This->lpLcl->lpGbl->vmiData.ddpfDisplay.dwRGBBitCount == dwBPP) && - (!dwRefreshRate || This->lpLcl->lpGbl->dwMonitorFrequency == dwRefreshRate)) + // Check Parameters + if(dwFlags != 0) + { + ret = DDERR_INVALIDPARAMS; + } + else + { + if ((!dwHeight || This->lpLcl->lpGbl->vmiData.dwDisplayHeight == dwHeight) && + (!dwWidth || This->lpLcl->lpGbl->vmiData.dwDisplayWidth == dwWidth) && + (!dwBPP || This->lpLcl->lpGbl->vmiData.ddpfDisplay.dwRGBBitCount == dwBPP) && + (!dwRefreshRate || This->lpLcl->lpGbl->dwMonitorFrequency == dwRefreshRate)) + { + ret = DD_OK; // nothing to do here for us + } + else + { + // Here we go + DEVMODE DevMode; + DevMode.dmFields = 0; + + if (dwHeight) + DevMode.dmFields |= DM_PELSHEIGHT; + if (dwWidth) + DevMode.dmFields |= DM_PELSWIDTH; + if (dwBPP) + DevMode.dmFields |= DM_BITSPERPEL; + if (dwRefreshRate) + DevMode.dmFields |= DM_DISPLAYFREQUENCY; + + DevMode.dmPelsHeight = dwHeight; + DevMode.dmPelsWidth = dwWidth; + DevMode.dmBitsPerPel = dwBPP; + DevMode.dmDisplayFrequency = dwRefreshRate; + + LONG retval = ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN); /* FIXME: Are we supposed to set CDS_SET_PRIMARY as well ? */ + + if(retval == DISP_CHANGE_BADMODE) + { + ret = DDERR_UNSUPPORTED; + } + else if(retval != DISP_CHANGE_SUCCESSFUL) + { + ret = DDERR_GENERIC; + } + else + { + // Update Interals + BOOL ModeChanged; + DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged); + StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE); + } + } + } + } + _SEH_HANDLE { - return DD_OK; // nothing to do here for us } + _SEH_END; - // Here we go - DEVMODE DevMode; - DevMode.dmFields = 0; - if(dwHeight) - DevMode.dmFields |= DM_PELSHEIGHT; - if(dwWidth) - DevMode.dmFields |= DM_PELSWIDTH; - if(dwBPP) - DevMode.dmFields |= DM_BITSPERPEL; - if(dwRefreshRate) - DevMode.dmFields |= DM_DISPLAYFREQUENCY; - - DevMode.dmPelsHeight = dwHeight; - DevMode.dmPelsWidth = dwWidth; - DevMode.dmBitsPerPel = dwBPP; - DevMode.dmDisplayFrequency = dwRefreshRate; - - LONG retval = ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN); /* FIXME: Are we supposed to set CDS_SET_PRIMARY as well ? */ - - if(retval == DISP_CHANGE_BADMODE) - { - return DDERR_UNSUPPORTED; - } - else if(retval != DISP_CHANGE_SUCCESSFUL) - { - return DDERR_GENERIC; - } - - // Update Interals - BOOL ModeChanged; - DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged); - StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE); - - return DD_OK; + return ret; } HRESULT WINAPI @@ -165,12 +181,20 @@ Main_DirectDraw_RestoreDisplayMode (LPDIRECTDRAW7 iface) LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; DX_WINDBG_trace(); - ChangeDisplaySettings(NULL, 0); + _SEH_TRY + { + ChangeDisplaySettings(NULL, 0); + + // Update Interals + BOOL ModeChanged; + DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged); + StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE); + } + _SEH_HANDLE + { + } + _SEH_END; - // Update Interals - BOOL ModeChanged; - DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged); - StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE); return DD_OK; } @@ -178,37 +202,62 @@ Main_DirectDraw_RestoreDisplayMode (LPDIRECTDRAW7 iface) HRESULT WINAPI Main_DirectDraw_GetMonitorFrequency (LPDIRECTDRAW7 iface, LPDWORD lpFreq) { + HRESULT retVal = DD_OK; LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; DX_WINDBG_trace(); - if (lpFreq == NULL) - return DDERR_INVALIDPARAMS; + _SEH_TRY + { + if(IsBadWritePtr(lpFreq,sizeof(LPDWORD))) + { + retVal = DDERR_INVALIDPARAMS; + } + else + { + *lpFreq = This->lpLcl->lpGbl->dwMonitorFrequency; + } + } + _SEH_HANDLE + { + } + _SEH_END; - *lpFreq = This->lpLcl->lpGbl->dwMonitorFrequency; - - return DD_OK; + return retVal; } HRESULT WINAPI Main_DirectDraw_GetDisplayMode (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD) { + HRESULT retVal = DD_OK; LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; DX_WINDBG_trace(); - if (pDDSD == NULL) - return DDERR_INVALIDPARAMS; + _SEH_TRY + { + if(IsBadWritePtr(pDDSD,sizeof(LPDWORD))) + { + retVal = DDERR_INVALIDPARAMS; + } + else if (pDDSD->dwSize != sizeof(DDSURFACEDESC2)) + { + retVal = DDERR_INVALIDPARAMS; + } + else + { + // FIXME: More stucture members might need to be filled - if (pDDSD->dwSize != sizeof(DDSURFACEDESC2)) - return DDERR_INVALIDPARAMS; + pDDSD->dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_REFRESHRATE; + pDDSD->dwHeight = This->lpLcl->lpGbl->vmiData.dwDisplayHeight; + pDDSD->dwWidth = This->lpLcl->lpGbl->vmiData.dwDisplayWidth; + pDDSD->ddpfPixelFormat = This->lpLcl->lpGbl->vmiData.ddpfDisplay; + pDDSD->dwRefreshRate = This->lpLcl->lpGbl->dwMonitorFrequency; + pDDSD->lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch; + } + } + _SEH_HANDLE + { + } + _SEH_END; - // FIXME: More stucture members might need to be filled - - pDDSD->dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_REFRESHRATE; - pDDSD->dwHeight = This->lpLcl->lpGbl->vmiData.dwDisplayHeight; - pDDSD->dwWidth = This->lpLcl->lpGbl->vmiData.dwDisplayWidth; - pDDSD->ddpfPixelFormat = This->lpLcl->lpGbl->vmiData.ddpfDisplay; - pDDSD->dwRefreshRate = This->lpLcl->lpGbl->dwMonitorFrequency; - pDDSD->lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch; - - return DD_OK; + return retVal; }