Check if CanCreateSurface is implemented by the driver before calling it. Modified: trunk/reactos/lib/ddraw/main/surface.c _____
Modified: trunk/reactos/lib/ddraw/main/surface.c --- trunk/reactos/lib/ddraw/main/surface.c 2005-10-30 08:41:19 UTC (rev 18871) +++ trunk/reactos/lib/ddraw/main/surface.c 2005-10-30 08:46:46 UTC (rev 18872) @@ -26,17 +26,20 @@
This->owner = (IDirectDrawImpl*)pDD;
- /* can the driver create the surface */ - DDHAL_CANCREATESURFACEDATA CanCreateData; - memset(&CanCreateData, 0, sizeof(DDHAL_CANCREATESURFACEDATA)); - CanCreateData.lpDD = &This->owner->DirectDrawGlobal; - CanCreateData.lpDDSurfaceDesc = (DDSURFACEDESC*)pDDSD; + if (This->owner->DirectDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) + { + /* can the driver create the surface */ + DDHAL_CANCREATESURFACEDATA CanCreateData; + memset(&CanCreateData, 0, sizeof(DDHAL_CANCREATESURFACEDATA)); + CanCreateData.lpDD = &This->owner->DirectDrawGlobal; + CanCreateData.lpDDSurfaceDesc = (DDSURFACEDESC*)pDDSD; + + if (This->owner->DirectDrawGlobal.lpDDCBtmp->HALDD.CanCreateSurface(&CanCre ateData) == DDHAL_DRIVER_NOTHANDLED) + return DDERR_INVALIDPARAMS; - if (This->owner->DirectDrawGlobal.lpDDCBtmp->HALDD.CanCreateSurface(&CanCre ateData) == DDHAL_DRIVER_NOTHANDLED) - return DDERR_INVALIDPARAMS; - - if(CanCreateData.ddRVal != DD_OK) - return CanCreateData.ddRVal; + if(CanCreateData.ddRVal != DD_OK) + return CanCreateData.ddRVal; + }
/* down here we got a crach */
@@ -81,6 +84,7 @@ CreateData.lplpSList = pLocal; /* this is the call we were waiting for */ + MessageBox(0,0,0,0);
if(This->owner->DirectDrawGlobal.lpDDCBtmp->HALDD.CreateSurface(&CreateD ata) == DDHAL_DRIVER_NOTHANDLED) return DDERR_INVALIDPARAMS;