diff --git a/reactos/subsystems/win32/win32k/ntddraw/dd.c b/reactos/subsystems/win32/win32k/ntddraw/dd.c index 62b22e594cb..d02c19ce541 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dd.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dd.c @@ -44,28 +44,29 @@ DWORD STDCALL NtGdiDdCreateSurface( DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED; NTSTATUS Status = FALSE; PDD_DIRECTDRAW pDirectDraw; - HANDLE hsurface; PDD_SURFACE phsurface; PDD_SURFACE_LOCAL pLocal; PDD_SURFACE_MORE pMore; PDD_SURFACE_GLOBAL pGlobal; + DD_CREATESURFACEDATA CreateSurfaceData; + /* FIXME alloc so mayne we need */ - PHANDLE *myhSurface[1]; + PHANDLE *myhSurface; /* GCC4 warnns on value are unisitaed, but they are initated in seh */ - myhSurface[0] = 0; DPRINT1("NtGdiDdCreateSurface\n"); + DPRINT1("Copy puCreateSurfaceData to kmode CreateSurfaceData\n"); _SEH_TRY { - ProbeForRead(hSurface, sizeof(HANDLE), 1); - ProbeForRead(hSurface[0], sizeof(HANDLE), 1); - myhSurface[0] = hSurface[0]; + ProbeForRead(puCreateSurfaceData, sizeof(DD_CREATESURFACEDATA), 1); + RtlCopyMemory( &CreateSurfaceData, puCreateSurfaceData, + sizeof( DD_CREATESURFACEDATA ) ); } _SEH_HANDLE { @@ -78,15 +79,63 @@ DWORD STDCALL NtGdiDdCreateSurface( return ddRVal; } - - /* Create a surface */ - hsurface = GDIOBJ_AllocObj(DdHandleTable, GDI_OBJECT_TYPE_DD_SURFACE); - if (!hsurface) + /* FIXME we only support one surface at moment + this is a hack to prevent more that one surface being create + */ + if (CreateSurfaceData.dwSCnt > 1) { + CreateSurfaceData.dwSCnt = 1; + } + + + DPRINT1("Setup surface in put handler\n"); + myhSurface = ExAllocatePoolWithTag( PagedPool, CreateSurfaceData.dwSCnt * sizeof(HANDLE), 0); + + _SEH_TRY + { + ProbeForRead(hSurface, CreateSurfaceData.dwSCnt * sizeof(HANDLE), 1); + for (i=0;iCreateSurfaceData, puCreateSurfaceData, + RtlCopyMemory( &CreateSurfaceData, puCreateSurfaceData, sizeof( DD_CREATESURFACEDATA ) ); } _SEH_HANDLE @@ -206,12 +255,8 @@ DWORD STDCALL NtGdiDdCreateSurface( pLocal = &phsurface->Local; pMore = &phsurface->More; pGlobal = &phsurface->Global; - - /* FIXME we only support one surface for now */ - phsurface->CreateSurfaceData.dwSCnt = 1; - - for (i = 0; i < phsurface->CreateSurfaceData.dwSCnt; i++) + for (i = 0; i < CreateSurfaceData.dwSCnt; i++) { phsurface->lcllist[i] = (PDD_SURFACE_LOCAL)pLocal; pLocal->lpGbl = pGlobal; @@ -226,34 +271,104 @@ DWORD STDCALL NtGdiDdCreateSurface( } - - /* FIXME support for more that one surface */ - /* setup DD_CREATESURFACEDATA CreateSurfaceData for the driver */ - phsurface->CreateSurfaceData.lplpSList = (PDD_SURFACE_LOCAL *) &phsurface->lcllist; - phsurface->CreateSurfaceData.lpDDSurfaceDesc = &phsurface->desc; - phsurface->CreateSurfaceData.CreateSurface = NULL; - phsurface->CreateSurfaceData.ddRVal = DDERR_GENERIC; - phsurface->CreateSurfaceData.lpDD = &pDirectDraw->Global; + CreateSurfaceData.lplpSList = (PDD_SURFACE_LOCAL *) &phsurface->lcllist; + CreateSurfaceData.lpDDSurfaceDesc = &phsurface->desc; + CreateSurfaceData.CreateSurface = NULL; + CreateSurfaceData.ddRVal = DDERR_GENERIC; + CreateSurfaceData.lpDD = &pDirectDraw->Global; /* the CreateSurface crash with lcl convering */ if ((pDirectDraw->DD.dwFlags & DDHAL_CB32_CREATESURFACE)) { DPRINT1("0x%04x",pDirectDraw->DD.CreateSurface); - ddRVal = pDirectDraw->DD.CreateSurface(&phsurface->CreateSurfaceData); + ddRVal = pDirectDraw->DD.CreateSurface(&CreateSurfaceData); + } + + DPRINT1("Retun value is %04x and driver return code is %04x\n",ddRVal,CreateSurfaceData.ddRVal); + + /* FIXME support for more that one surface */ + _SEH_TRY + { + ProbeForWrite(puSurfaceDescription, sizeof(DDSURFACEDESC), 1); + RtlCopyMemory( puSurfaceDescription, &phsurface->desc, sizeof( DDSURFACEDESC ) ); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + _SEH_TRY + { + ProbeForWrite(puCreateSurfaceData, sizeof(DD_CREATESURFACEDATA), 1); + puCreateSurfaceData->ddRVal = CreateSurfaceData.ddRVal; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + for (i = 0; i < CreateSurfaceData.dwSCnt; i++) + { + _SEH_TRY + { + ProbeForWrite(puSurfaceGlobalData, sizeof(DD_SURFACE_GLOBAL), 1); + RtlCopyMemory( puSurfaceGlobalData, &phsurface->Global, sizeof( DD_SURFACE_GLOBAL ) ); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + _SEH_TRY + { + ProbeForWrite(puSurfaceLocalData, sizeof(DD_SURFACE_LOCAL), 1); + RtlCopyMemory( puSurfaceLocalData, &phsurface->Local, sizeof( DD_SURFACE_LOCAL ) ); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + _SEH_TRY + { + ProbeForWrite(puSurfaceMoreData, sizeof(DD_SURFACE_MORE), 1); + RtlCopyMemory( puSurfaceMoreData, &phsurface->More, sizeof( DD_SURFACE_MORE ) ); + + puSurfaceLocalData->lpGbl = puSurfaceGlobalData; + puSurfaceLocalData->lpSurfMore = puSurfaceMoreData; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + DPRINT1("GDIOBJ_UnlockObjByPtr\n"); + GDIOBJ_UnlockObjByPtr(DdHandleTable, phsurface); + _SEH_TRY + { + ProbeForWrite(puhSurface, sizeof(HANDLE), 1); + puhSurface[i] = myhSurface[i]; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; } - /* FIXME copy data from DDRAWI_ sturct to DD_ struct */ /* FIXME fillin the return handler */ DPRINT1("GDIOBJ_UnlockObjByPtr\n"); - GDIOBJ_UnlockObjByPtr(DdHandleTable, phsurface); - DPRINT1("GDIOBJ_UnlockObjByPtr\n"); GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); - - DPRINT1("Retun value is %04x and driver return code is %04x\n",ddRVal,phsurface->CreateSurfaceData.ddRVal); + DPRINT1("Retun value is %04x and driver return code is %04x\n",ddRVal,CreateSurfaceData.ddRVal); return ddRVal; } diff --git a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c index cc7d56cefc9..dd5bf1b3498 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c +++ b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c @@ -667,40 +667,7 @@ DWORD STDCALL NtGdiDdUnlock( return ddRVal; } -DWORD STDCALL NtGdiDdBlt( - HANDLE hSurfaceDest, - HANDLE hSurfaceSrc, - PDD_BLTDATA puBltData -) -{ - DWORD ddRVal; - PDD_DIRECTDRAW_GLOBAL lgpl; - PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(DdHandleTable, hSurfaceDest, GDI_OBJECT_TYPE_DIRECTDRAW); -#ifdef DX_DEBUG - DPRINT1("NtGdiDdBlt\n"); -#endif - if (pDirectDraw == NULL) - return DDHAL_DRIVER_NOTHANDLED; - - /* backup the orignal PDev and info */ - lgpl = puBltData->lpDD; - - /* use our cache version instead */ - puBltData->lpDD = &pDirectDraw->Global; - - /* make the call */ - if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_BLT)) - ddRVal = DDHAL_DRIVER_NOTHANDLED; - else - ddRVal = pDirectDraw->Surf.Blt(puBltData); - - /* But back the orignal PDev */ - puBltData->lpDD = lgpl; - - GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); - return ddRVal; - } DWORD STDCALL NtGdiDdSetColorKey( HANDLE hSurface, diff --git a/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c b/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c index 4142a38db53..f845379f7da 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c +++ b/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c @@ -16,6 +16,107 @@ #define DdHandleTable GdiHandleTable + +DWORD STDCALL NtGdiDdBlt( + HANDLE hSurfaceDest, + HANDLE hSurfaceSrc, + PDD_BLTDATA puBltData +) +{ + NTSTATUS Status = FALSE; + DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED; + DD_BLTDATA Blt; + PDD_SURFACE pDstSurface = NULL; + PDD_SURFACE pSrcSurface = NULL; + PDD_DIRECTDRAW pDirectDraw; + + DPRINT1("NtGdiDdBlt\n"); + + _SEH_TRY + { + ProbeForRead(puBltData, sizeof(DD_BLTDATA), 1); + RtlCopyMemory( &Blt, puBltData, sizeof( DD_BLTDATA ) ); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + return ddRVal; + } + + pDstSurface = GDIOBJ_LockObj(DdHandleTable, hSurfaceDest, GDI_OBJECT_TYPE_DD_SURFACE); + if (!pDstSurface) + { + DPRINT1("Fail\n"); + return ddRVal; + } + + pDirectDraw = GDIOBJ_LockObj(DdHandleTable, pDstSurface->hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW); + if (!pDirectDraw) + { + DPRINT1("Fail\n"); + GDIOBJ_UnlockObjByPtr(DdHandleTable, pSrcSurface); + return ddRVal; + } + + if (pSrcSurface) + { + pSrcSurface = GDIOBJ_LockObj(DdHandleTable, pSrcSurface, GDI_OBJECT_TYPE_DD_SURFACE); + if (!pSrcSurface) + { + DPRINT1("Fail\n"); + GDIOBJ_UnlockObjByPtr(DdHandleTable, pDstSurface); + GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); + return ddRVal; + } + } + + Blt.lpDDDestSurface = &pDstSurface->Local; + if (pDstSurface) + { + Blt.lpDDSrcSurface = &pDstSurface->Local; + } + + Blt.ddRVal = DDERR_GENERIC; + + if (pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_BLT) + { + Blt.lpDD = &pDirectDraw->Global; + Blt.Blt = NULL; + ddRVal = pDirectDraw->Surf.Blt(&Blt); + } + + DPRINT1("Retun value is %04x and driver return code is %04x\n",ddRVal,Blt.ddRVal); + + GDIOBJ_UnlockObjByPtr(DdHandleTable, pDirectDraw); + GDIOBJ_UnlockObjByPtr(DdHandleTable, pDstSurface); + + if(pSrcSurface) + { + GDIOBJ_UnlockObjByPtr(DdHandleTable, pSrcSurface); + } + + _SEH_TRY + { + ProbeForWrite(puBltData, sizeof(DD_BLTDATA), 1); + puBltData->ddRVal = Blt.ddRVal; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + DPRINT1("Retun value is %04x and driver return code is %04x\n",ddRVal,Blt.ddRVal); + return ddRVal; + } + + + /************************************************************************/ /* NtGdiDdCreateSurface */ /* status : untested */