diff --git a/reactos/subsys/win32k/ntddraw/ddraw.c b/reactos/subsys/win32k/ntddraw/ddraw.c index 702f182f5ec..52a0e96e16e 100644 --- a/reactos/subsys/win32k/ntddraw/ddraw.c +++ b/reactos/subsys/win32k/ntddraw/ddraw.c @@ -208,12 +208,19 @@ DWORD STDCALL NtGdiDdCreateSurface( ) { DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED; - + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW); if (pDirectDraw == NULL) return DDHAL_DRIVER_NOTHANDLED; + /* backup the orignal PDev and info */ + lgpl = puCreateSurfaceData->lpDD; + + /* use our cache version instead */ + puCreateSurfaceData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else @@ -221,6 +228,9 @@ DWORD STDCALL NtGdiDdCreateSurface( ddRVal = pDirectDraw->DD.CreateSurface(puCreateSurfaceData); } + /* But back the orignal PDev */ + puCreateSurfaceData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -231,15 +241,27 @@ DWORD STDCALL NtGdiDdWaitForVerticalBlank( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; + PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW); if (pDirectDraw == NULL) return DDHAL_DRIVER_NOTHANDLED; + /* backup the orignal PDev and info */ + lgpl = puWaitForVerticalBlankData->lpDD; + + /* use our cache version instead */ + puWaitForVerticalBlankData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->DD.WaitForVerticalBlank(puWaitForVerticalBlankData); + /* But back the orignal PDev */ + puWaitForVerticalBlankData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -250,16 +272,27 @@ DWORD STDCALL NtGdiDdCanCreateSurface( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW); if (pDirectDraw == NULL) return DDHAL_DRIVER_NOTHANDLED; + /* backup the orignal PDev and info */ + lgpl = puCanCreateSurfaceData->lpDD; + + /* use our cache version instead */ + puCanCreateSurfaceData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->DD.CanCreateSurface(puCanCreateSurfaceData); + /* But back the orignal PDev */ + puCanCreateSurfaceData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -270,16 +303,27 @@ DWORD STDCALL NtGdiDdGetScanLine( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW); if (pDirectDraw == NULL) return DDHAL_DRIVER_NOTHANDLED; + /* backup the orignal PDev and info */ + lgpl = puGetScanLineData->lpDD; + + /* use our cache version instead */ + puGetScanLineData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_GETSCANLINE)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->DD.GetScanLine(puGetScanLineData); + /* But back the orignal PDev */ + puGetScanLineData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -321,6 +365,7 @@ DWORD STDCALL NtGdiDdDestroySurface( ddRVal = pDirectDraw->Surf.DestroySurface(&DestroySurf); } + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -334,16 +379,27 @@ DWORD STDCALL NtGdiDdFlip( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceTarget, GDI_OBJECT_TYPE_DIRECTDRAW); if (pDirectDraw == NULL) return DDHAL_DRIVER_NOTHANDLED; + /* backup the orignal PDev and info */ + lgpl = puFlipData->lpDD; + + /* use our cache version instead */ + puFlipData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_FLIP)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->Surf.Flip(puFlipData); + /* But back the orignal PDev */ + puFlipData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -355,16 +411,27 @@ DWORD STDCALL NtGdiDdLock( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface, GDI_OBJECT_TYPE_DIRECTDRAW); if (pDirectDraw == NULL) return DDHAL_DRIVER_NOTHANDLED; + /* backup the orignal PDev and info */ + lgpl = puLockData->lpDD; + + /* use our cache version instead */ + puLockData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_LOCK)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->Surf.Lock(puLockData); + /* But back the orignal PDev */ + puLockData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; }