more seh fixed

svn path=/trunk/; revision=27034
This commit is contained in:
Magnus Olsen 2007-06-07 01:53:44 +00:00
parent 32740d717d
commit 201a7b042d

View file

@ -107,32 +107,39 @@ Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeig
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DX_WINDBG_trace(); DX_WINDBG_trace();
HRESULT ret = DD_OK;
_SEH_TRY
{
// FIXME: Check primary if surface is locked / busy etc. // FIXME: Check primary if surface is locked / busy etc.
// Check Parameters // Check Parameters
if(dwFlags != 0) if(dwFlags != 0)
{ {
return DDERR_INVALIDPARAMS; ret = DDERR_INVALIDPARAMS;
} }
else
{
if ((!dwHeight || This->lpLcl->lpGbl->vmiData.dwDisplayHeight == dwHeight) && if ((!dwHeight || This->lpLcl->lpGbl->vmiData.dwDisplayHeight == dwHeight) &&
(!dwWidth || This->lpLcl->lpGbl->vmiData.dwDisplayWidth == dwWidth) && (!dwWidth || This->lpLcl->lpGbl->vmiData.dwDisplayWidth == dwWidth) &&
(!dwBPP || This->lpLcl->lpGbl->vmiData.ddpfDisplay.dwRGBBitCount == dwBPP) && (!dwBPP || This->lpLcl->lpGbl->vmiData.ddpfDisplay.dwRGBBitCount == dwBPP) &&
(!dwRefreshRate || This->lpLcl->lpGbl->dwMonitorFrequency == dwRefreshRate)) (!dwRefreshRate || This->lpLcl->lpGbl->dwMonitorFrequency == dwRefreshRate))
{ {
return DD_OK; // nothing to do here for us ret = DD_OK; // nothing to do here for us
} }
else
{
// Here we go // Here we go
DEVMODE DevMode; DEVMODE DevMode;
DevMode.dmFields = 0; DevMode.dmFields = 0;
if(dwHeight)
if (dwHeight)
DevMode.dmFields |= DM_PELSHEIGHT; DevMode.dmFields |= DM_PELSHEIGHT;
if(dwWidth) if (dwWidth)
DevMode.dmFields |= DM_PELSWIDTH; DevMode.dmFields |= DM_PELSWIDTH;
if(dwBPP) if (dwBPP)
DevMode.dmFields |= DM_BITSPERPEL; DevMode.dmFields |= DM_BITSPERPEL;
if(dwRefreshRate) if (dwRefreshRate)
DevMode.dmFields |= DM_DISPLAYFREQUENCY; DevMode.dmFields |= DM_DISPLAYFREQUENCY;
DevMode.dmPelsHeight = dwHeight; DevMode.dmPelsHeight = dwHeight;
@ -144,19 +151,28 @@ Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeig
if(retval == DISP_CHANGE_BADMODE) if(retval == DISP_CHANGE_BADMODE)
{ {
return DDERR_UNSUPPORTED; ret = DDERR_UNSUPPORTED;
} }
else if(retval != DISP_CHANGE_SUCCESSFUL) else if(retval != DISP_CHANGE_SUCCESSFUL)
{ {
return DDERR_GENERIC; ret = DDERR_GENERIC;
} }
else
{
// Update Interals // Update Interals
BOOL ModeChanged; BOOL ModeChanged;
DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged); DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged);
StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE); StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE);
}
}
}
}
_SEH_HANDLE
{
}
_SEH_END;
return DD_OK; return ret;
} }
HRESULT WINAPI HRESULT WINAPI
@ -165,12 +181,20 @@ Main_DirectDraw_RestoreDisplayMode (LPDIRECTDRAW7 iface)
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DX_WINDBG_trace(); DX_WINDBG_trace();
_SEH_TRY
{
ChangeDisplaySettings(NULL, 0); ChangeDisplaySettings(NULL, 0);
// Update Interals // Update Interals
BOOL ModeChanged; BOOL ModeChanged;
DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged); DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged);
StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE); StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE);
}
_SEH_HANDLE
{
}
_SEH_END;
return DD_OK; return DD_OK;
} }
@ -178,29 +202,48 @@ Main_DirectDraw_RestoreDisplayMode (LPDIRECTDRAW7 iface)
HRESULT WINAPI HRESULT WINAPI
Main_DirectDraw_GetMonitorFrequency (LPDIRECTDRAW7 iface, LPDWORD lpFreq) Main_DirectDraw_GetMonitorFrequency (LPDIRECTDRAW7 iface, LPDWORD lpFreq)
{ {
HRESULT retVal = DD_OK;
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DX_WINDBG_trace(); DX_WINDBG_trace();
if (lpFreq == NULL) _SEH_TRY
return DDERR_INVALIDPARAMS; {
if(IsBadWritePtr(lpFreq,sizeof(LPDWORD)))
{
retVal = DDERR_INVALIDPARAMS;
}
else
{
*lpFreq = This->lpLcl->lpGbl->dwMonitorFrequency; *lpFreq = This->lpLcl->lpGbl->dwMonitorFrequency;
}
}
_SEH_HANDLE
{
}
_SEH_END;
return DD_OK; return retVal;
} }
HRESULT WINAPI HRESULT WINAPI
Main_DirectDraw_GetDisplayMode (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD) Main_DirectDraw_GetDisplayMode (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD)
{ {
HRESULT retVal = DD_OK;
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DX_WINDBG_trace(); DX_WINDBG_trace();
if (pDDSD == NULL) _SEH_TRY
return DDERR_INVALIDPARAMS; {
if(IsBadWritePtr(pDDSD,sizeof(LPDWORD)))
if (pDDSD->dwSize != sizeof(DDSURFACEDESC2)) {
return DDERR_INVALIDPARAMS; retVal = DDERR_INVALIDPARAMS;
}
else if (pDDSD->dwSize != sizeof(DDSURFACEDESC2))
{
retVal = DDERR_INVALIDPARAMS;
}
else
{
// FIXME: More stucture members might need to be filled // FIXME: More stucture members might need to be filled
pDDSD->dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_REFRESHRATE; pDDSD->dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_REFRESHRATE;
@ -209,6 +252,12 @@ Main_DirectDraw_GetDisplayMode (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD)
pDDSD->ddpfPixelFormat = This->lpLcl->lpGbl->vmiData.ddpfDisplay; pDDSD->ddpfPixelFormat = This->lpLcl->lpGbl->vmiData.ddpfDisplay;
pDDSD->dwRefreshRate = This->lpLcl->lpGbl->dwMonitorFrequency; pDDSD->dwRefreshRate = This->lpLcl->lpGbl->dwMonitorFrequency;
pDDSD->lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch; pDDSD->lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch;
}
}
_SEH_HANDLE
{
}
_SEH_END;
return DD_OK; return retVal;
} }