50% are implmene in DD->GetCaps now

svn path=/trunk/; revision=27213
This commit is contained in:
Magnus Olsen 2007-06-17 14:14:42 +00:00
parent b51c13f0a3
commit d68da75a83

View file

@ -455,35 +455,46 @@ HRESULT WINAPI
Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps, Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
LPDDCAPS pHELCaps) LPDDCAPS pHELCaps)
{ {
HRESULT retVal = DD_OK; HRESULT retVal = DDERR_INVALIDPARAMS;
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
DX_WINDBG_trace(); DX_WINDBG_trace();
if (!(IsBadWritePtr(pDriverCaps,sizeof(LPDDCAPS))))
_SEH_TRY
{ {
if (!(IsBadWritePtr(pHELCaps,sizeof(LPDDCAPS)))) if ((!pDriverCaps) && (!pHELCaps))
{ {
return DDERR_INVALIDPARAMS; retVal = DDERR_INVALIDPARAMS;
} _SEH_LEAVE;
} }
if ((IsBadWritePtr(pDriverCaps,sizeof(LPDDCAPS)))) if (pDriverCaps)
{ {
/* Setup hardware caps */
DDSCAPS2 ddscaps = { 0 }; DDSCAPS2 ddscaps = { 0 };
LPDDCORECAPS CoreCaps = (LPDDCORECAPS)&This->lpLcl->lpGbl->ddCaps;
DWORD dwTotal = 0; DWORD dwTotal = 0;
DWORD dwFree = 0; DWORD dwFree = 0;
/* Setup hardware caps */
Main_DirectDraw_GetAvailableVidMem4(iface, &ddscaps, &dwTotal, &dwFree); Main_DirectDraw_GetAvailableVidMem4(iface, &ddscaps, &dwTotal, &dwFree);
switch (pDriverCaps->dwSize) switch (pDriverCaps->dwSize)
{ {
case sizeof(DDCAPS_DX1): case sizeof(DDCAPS_DX1):
{ {
LPDDCAPS_DX1 myCaps = (LPDDCAPS_DX1) pDriverCaps; LPDDCAPS_DX1 myCaps = (LPDDCAPS_DX1) pDriverCaps;
if (CoreCaps->dwSize == sizeof(DDCORECAPS))
{
memcpy(myCaps, CoreCaps, sizeof(DDCAPS_DX1));
}
myCaps->dwVidMemFree = dwFree; myCaps->dwVidMemFree = dwFree;
myCaps->dwVidMemTotal = dwTotal; myCaps->dwVidMemTotal = dwTotal;
myCaps->dwSize = sizeof(DDCAPS_DX1);
retVal = DD_OK;
} }
break; break;
@ -491,8 +502,16 @@ Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
{ {
LPDDCAPS_DX3 myCaps = (LPDDCAPS_DX3) pDriverCaps; LPDDCAPS_DX3 myCaps = (LPDDCAPS_DX3) pDriverCaps;
if (CoreCaps->dwSize == sizeof(DDCORECAPS))
{
memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCAPS_DX3));
}
myCaps->dwVidMemFree = dwFree; myCaps->dwVidMemFree = dwFree;
myCaps->dwVidMemTotal = dwTotal; myCaps->dwVidMemTotal = dwTotal;
myCaps->dwSize = sizeof(DDCAPS_DX3);
retVal = DD_OK;
} }
break; break;
@ -500,8 +519,24 @@ Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
{ {
LPDDCAPS_DX5 myCaps = (LPDDCAPS_DX5) pDriverCaps; LPDDCAPS_DX5 myCaps = (LPDDCAPS_DX5) pDriverCaps;
if (CoreCaps->dwSize == sizeof(DDCORECAPS))
{
memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS));
}
/* FIXME
DWORD dwNLVBCaps;
DWORD dwNLVBCaps2;
DWORD dwNLVBCKeyCaps;
DWORD dwNLVBFXCaps;
DWORD dwNLVBRops[DD_ROP_SPACE];
*/
myCaps->dwVidMemFree = dwFree; myCaps->dwVidMemFree = dwFree;
myCaps->dwVidMemTotal = dwTotal; myCaps->dwVidMemTotal = dwTotal;
myCaps->dwSize = sizeof(DDCAPS_DX5);
retVal = DD_OK;
} }
break; break;
@ -510,8 +545,28 @@ Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
{ {
LPDDCAPS_DX7 myCaps = (LPDDCAPS_DX7) pDriverCaps; LPDDCAPS_DX7 myCaps = (LPDDCAPS_DX7) pDriverCaps;
if (CoreCaps->dwSize == sizeof(DDCORECAPS))
{
memcpy(&myCaps->dwCaps, &CoreCaps->dwCaps, sizeof(DDCORECAPS));
}
myCaps->dwVidMemFree = dwFree; myCaps->dwVidMemFree = dwFree;
myCaps->dwVidMemTotal = dwTotal; myCaps->dwVidMemTotal = dwTotal;
/* FIXME
DWORD dwNLVBCaps;
DWORD dwNLVBCaps2;
DWORD dwNLVBCKeyCaps;
DWORD dwNLVBFXCaps;
DWORD dwNLVBRops[DD_ROP_SPACE];
*/
myCaps->ddsCaps.dwCaps = ddscaps.dwCaps;
myCaps->ddsCaps.dwCaps2 = ddscaps.dwCaps2;
myCaps->ddsCaps.dwCaps3 = ddscaps.dwCaps3;
myCaps->ddsCaps.dwCaps4 = ddscaps.dwCaps4;
myCaps->dwSize = sizeof(DDCAPS_DX7);
} }
break; break;
@ -521,9 +576,9 @@ Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
} }
} }
if ((IsBadWritePtr(pHELCaps,sizeof(LPDDCAPS)))) if (pHELCaps)
{ {
/* Setup hardware caps */ /* Setup software caps */
switch (pHELCaps->dwSize) switch (pHELCaps->dwSize)
{ {
case sizeof(DDCAPS_DX1): case sizeof(DDCAPS_DX1):
@ -545,6 +600,12 @@ Main_DirectDraw_GetCaps( LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
break; break;
} }
} }
}
_SEH_HANDLE
{
retVal = DD_FALSE;
}
_SEH_END;
return retVal; return retVal;
} }