diff --git a/inc/dd.h b/inc/dd.h index ec198ea..bfddd0a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -175,6 +175,7 @@ typedef struct CNCDDRAW RECT bnet_win_rect; POINT bnet_pos; void* last_freed_palette; /* Dungeon Keeper hack */ + void* last_freed_surface; /* Nox hack */ BOOL child_window_exists; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 973b5ba..ebe71b7 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -111,8 +111,10 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) if (This->mapping) CloseHandle(This->mapping); - if (This->backbuffer) + if (This->backbuffer && (!g_ddraw || (void*)This->backbuffer != g_ddraw->last_freed_surface)) + { IDirectDrawSurface_Release(This->backbuffer); + } if (This->clipper) IDirectDrawClipper_Release(This->clipper); @@ -124,6 +126,9 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) DeleteCriticalSection(&This->cs); + if (g_ddraw) + g_ddraw->last_freed_surface = This; + HeapFree(GetProcessHeap(), 0, This); }