NtGdiDdCanCreateSurface

1. fixed the input of DDSURFACEDESC2 so it been convert to DDSURFACEDESC.
2. fixed varius bsod in ros 0.3.1 
3. fixed some return code. 

svn path=/trunk/; revision=26293
This commit is contained in:
Magnus Olsen 2007-04-09 11:45:25 +00:00
parent 2c7409ef06
commit aa7e29c22e

View file

@ -449,19 +449,36 @@ DWORD STDCALL NtGdiDdCanCreateSurface(
)
{
DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED;
DD_CANCREATESURFACEDATA CanCreateSurfaceData;
if ((puCanCreateSurfaceData) &&
(hDirectDrawLocal))
{
DDSURFACEDESC desc;
DWORD descSize = 0;
NTSTATUS Status = FALSE;
PDD_DIRECTDRAW pDirectDraw = NULL;
DD_CANCREATESURFACEDATA CanCreateSurfaceData;
LPDDHAL_CANCREATESURFACEDATA pCanCreateSurfaceData = (LPDDHAL_CANCREATESURFACEDATA)puCanCreateSurfaceData;
DPRINT1("NtGdiDdCanCreateSurface\n");
RtlZeroMemory(&CanCreateSurfaceData,sizeof(DDSURFACEDESC));
RtlZeroMemory(&desc,sizeof(DDSURFACEDESC));
_SEH_TRY
{
ProbeForRead(puCanCreateSurfaceData, sizeof(DD_CANCREATESURFACEDATA), 1);
RtlCopyMemory(&CanCreateSurfaceData,puCanCreateSurfaceData, sizeof(DD_CANCREATESURFACEDATA));
ProbeForRead(puCanCreateSurfaceData->lpDDSurfaceDesc, sizeof(DDSURFACEDESC), 1);
RtlCopyMemory(&desc,puCanCreateSurfaceData->lpDDSurfaceDesc, sizeof(DDSURFACEDESC));
ProbeForRead(pCanCreateSurfaceData, sizeof(DDHAL_CANCREATESURFACEDATA), 1);
CanCreateSurfaceData.bIsDifferentPixelFormat = pCanCreateSurfaceData->bIsDifferentPixelFormat;
if (pCanCreateSurfaceData->lpDDSurfaceDesc)
{
ProbeForRead(pCanCreateSurfaceData->lpDDSurfaceDesc, sizeof(DDSURFACEDESC), 1);
RtlCopyMemory(&desc,pCanCreateSurfaceData->lpDDSurfaceDesc, sizeof(DDSURFACEDESC));
/*if it was DDSURFACEDESC2 been pass down */
descSize = desc.dwSize;
desc.dwSize = sizeof(DDSURFACEDESC);
}
}
_SEH_HANDLE
{
@ -469,21 +486,23 @@ DWORD STDCALL NtGdiDdCanCreateSurface(
}
_SEH_END;
if(NT_SUCCESS(Status))
if ((NT_SUCCESS(Status)) &&
(desc.dwSize != 0))
{
pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
if (pDirectDraw != NULL)
{
if (pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE)
if ((pDirectDraw) &&
(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE))
{
CanCreateSurfaceData.ddRVal = DDERR_GENERIC;
CanCreateSurfaceData.lpDD = &pDirectDraw->Global;
CanCreateSurfaceData.lpDDSurfaceDesc = &desc;
ddRVal = pDirectDraw->DD.CanCreateSurface(&CanCreateSurfaceData);
/*if it was DDSURFACEDESC2 been pass down */
desc.dwSize = descSize;
_SEH_TRY
{
ProbeForWrite(puCanCreateSurfaceData, sizeof(DD_CANCREATESURFACEDATA), 1);
ProbeForWrite(puCanCreateSurfaceData, sizeof(DDHAL_CANCREATESURFACEDATA), 1);
puCanCreateSurfaceData->ddRVal = CanCreateSurfaceData.ddRVal;
ProbeForWrite(puCanCreateSurfaceData->lpDDSurfaceDesc, sizeof(DDSURFACEDESC), 1);
@ -499,7 +518,6 @@ DWORD STDCALL NtGdiDdCanCreateSurface(
GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw);
}
}
return ddRVal;
}