diff --git a/reactos/subsys/win32k/ntddraw/ddraw.c b/reactos/subsys/win32k/ntddraw/ddraw.c index 52a0e96e16e..caacefcdbea 100644 --- a/reactos/subsys/win32k/ntddraw/ddraw.c +++ b/reactos/subsys/win32k/ntddraw/ddraw.c @@ -442,16 +442,27 @@ DWORD STDCALL NtGdiDdUnlock( ) { 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 = puUnlockData->lpDD; + + /* use our cache version instead */ + puUnlockData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_UNLOCK)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->Surf.Unlock(puUnlockData); + /* But back the orignal PDev */ + puUnlockData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -463,16 +474,27 @@ DWORD STDCALL NtGdiDdBlt( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceDest, GDI_OBJECT_TYPE_DIRECTDRAW); 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(pDirectDraw); return ddRVal; } @@ -483,16 +505,27 @@ DWORD STDCALL NtGdiDdSetColorKey( ) { 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 = puSetColorKeyData->lpDD; + + /* use our cache version instead */ + puSetColorKeyData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_SETCOLORKEY)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->Surf.SetColorKey(puSetColorKeyData); + /* But back the orignal PDev */ + puSetColorKeyData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -505,16 +538,27 @@ DWORD STDCALL NtGdiDdAddAttachedSurface( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceAttached, GDI_OBJECT_TYPE_DIRECTDRAW); if (pDirectDraw == NULL) return DDHAL_DRIVER_NOTHANDLED; + /* backup the orignal PDev and info */ + lgpl = puAddAttachedSurfaceData->lpDD; + + /* use our cache version instead */ + puAddAttachedSurfaceData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->Surf.AddAttachedSurface(puAddAttachedSurfaceData); + /* But back the orignal PDev */ + puAddAttachedSurfaceData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -525,16 +569,27 @@ DWORD STDCALL NtGdiDdGetBltStatus( ) { 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 = puGetBltStatusData->lpDD; + + /* use our cache version instead */ + puGetBltStatusData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->Surf.GetBltStatus(puGetBltStatusData); + /* But back the orignal PDev */ + puGetBltStatusData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -545,16 +600,27 @@ DWORD STDCALL NtGdiDdGetFlipStatus( ) { 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 = puGetFlipStatusData->lpDD; + + /* use our cache version instead */ + puGetFlipStatusData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->Surf.GetFlipStatus(puGetFlipStatusData); + /* But back the orignal PDev */ + puGetFlipStatusData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -566,16 +632,27 @@ DWORD STDCALL NtGdiDdUpdateOverlay( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceDestination, GDI_OBJECT_TYPE_DIRECTDRAW); if (pDirectDraw == NULL) return DDHAL_DRIVER_NOTHANDLED; + /* backup the orignal PDev and info */ + lgpl = puUpdateOverlayData->lpDD; + + /* use our cache version instead */ + puUpdateOverlayData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->Surf.UpdateOverlay(puUpdateOverlayData); + /* But back the orignal PDev */ + puUpdateOverlayData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -587,16 +664,27 @@ DWORD STDCALL NtGdiDdSetOverlayPosition( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceDestination, GDI_OBJECT_TYPE_DIRECTDRAW); if (pDirectDraw == NULL) return DDHAL_DRIVER_NOTHANDLED; + /* backup the orignal PDev and info */ + lgpl = puSetOverlayPositionData->lpDD; + + /* use our cache version instead */ + puSetOverlayPositionData->lpDD = &pDirectDraw->Global; + + /* make the call */ if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION)) ddRVal = DDHAL_DRIVER_NOTHANDLED; else ddRVal = pDirectDraw->Surf.SetOverlayPosition(puSetOverlayPositionData); + /* But back the orignal PDev */ + puSetOverlayPositionData->lpDD = lgpl; + GDIOBJ_UnlockObjByPtr(pDirectDraw); return ddRVal; } @@ -698,13 +786,25 @@ DWORD STDCALL NtGdiDdGetAvailDriverMemory( ) { DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW); + /* backup the orignal PDev and info */ + lgpl = puGetAvailDriverMemoryData->lpDD; + + /* use our cache version instead */ + puGetAvailDriverMemoryData->lpDD = &pDirectDraw->Global; + + /* make the call */ // ddRVal = pDirectDraw->DdGetAvailDriverMemory(puGetAvailDriverMemoryData); GDIOBJ_UnlockObjByPtr(pDirectDraw); + + /* But back the orignal PDev */ + puGetAvailDriverMemoryData->lpDD = lgpl; + return ddRVal; } @@ -717,12 +817,23 @@ DWORD STDCALL NtGdiDdSetExclusiveMode( ) { DWORD ddRVal; + PDD_DIRECTDRAW_GLOBAL lgpl; PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDraw, GDI_OBJECT_TYPE_DIRECTDRAW); + /* backup the orignal PDev and info */ + lgpl = puSetExclusiveModeData->lpDD; + + /* use our cache version instead */ + puSetExclusiveModeData->lpDD = &pDirectDraw->Global; + + /* make the call */ ddRVal = pDirectDraw->DdSetExclusiveMode(puSetExclusiveModeData); GDIOBJ_UnlockObjByPtr(pDirectDraw); + + /* But back the orignal PDev */ + puSetExclusiveModeData->lpDD = lgpl; return ddRVal; }