Added stubs for new DirectDraw4 and DirectDrawSurface4 methods.

diff --git a/graphics/d3d_private.h b/graphics/d3d_private.h
index f642f10..c170e7b 100644
--- a/graphics/d3d_private.h
+++ b/graphics/d3d_private.h
@@ -105,8 +105,8 @@
 #endif /* HAVE_MESAGL */
 
 /* All non-static functions 'exported' by various sub-objects */
-extern LPDIRECT3DTEXTURE2 d3dtexture2_create(LPDIRECTDRAWSURFACE3 surf) ;
-extern LPDIRECT3DTEXTURE d3dtexture_create(LPDIRECTDRAWSURFACE3 surf) ;
+extern LPDIRECT3DTEXTURE2 d3dtexture2_create(LPDIRECTDRAWSURFACE4 surf) ;
+extern LPDIRECT3DTEXTURE d3dtexture_create(LPDIRECTDRAWSURFACE4 surf) ;
 
 extern LPDIRECT3DLIGHT d3dlight_create_dx3(LPDIRECT3D d3d) ;
 extern LPDIRECT3DLIGHT d3dlight_create(LPDIRECT3D2 d3d) ;
diff --git a/graphics/d3dtexture.c b/graphics/d3dtexture.c
index 76ed9ed..beba37e 100644
--- a/graphics/d3dtexture.c
+++ b/graphics/d3dtexture.c
@@ -29,7 +29,7 @@
 /*******************************************************************************
  *				Texture2 Creation functions
  */
-LPDIRECT3DTEXTURE2 d3dtexture2_create(LPDIRECTDRAWSURFACE3 surf)
+LPDIRECT3DTEXTURE2 d3dtexture2_create(LPDIRECTDRAWSURFACE4 surf)
 {
   LPDIRECT3DTEXTURE2 mat;
   
@@ -44,7 +44,7 @@
 /*******************************************************************************
  *				Texture Creation functions
  */
-LPDIRECT3DTEXTURE d3dtexture_create(LPDIRECTDRAWSURFACE3 surf)
+LPDIRECT3DTEXTURE d3dtexture_create(LPDIRECTDRAWSURFACE4 surf)
 {
   LPDIRECT3DTEXTURE mat;
   
@@ -425,12 +425,12 @@
 #else /* HAVE_MESAGL */
 
 /* These function should never be called if MesaGL is not present */
-LPDIRECT3DTEXTURE2 d3dtexture2_create(LPDIRECTDRAWSURFACE3 surf) {
+LPDIRECT3DTEXTURE2 d3dtexture2_create(LPDIRECTDRAWSURFACE4 surf) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
 
-LPDIRECT3DTEXTURE d3dtexture_create(LPDIRECTDRAWSURFACE3 surf) {
+LPDIRECT3DTEXTURE d3dtexture_create(LPDIRECTDRAWSURFACE4 surf) {
   ERR(ddraw, "Should not be called...\n");
   return NULL;
 }
diff --git a/graphics/ddraw.c b/graphics/ddraw.c
index c31e64a..0a814e8 100644
--- a/graphics/ddraw.c
+++ b/graphics/ddraw.c
@@ -89,9 +89,10 @@
     {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79}
 };
 
-static struct IDirectDrawSurface3_VTable	dga_dds3vt, xlib_dds3vt;
+static struct IDirectDrawSurface4_VTable	dga_dds4vt, xlib_dds4vt;
 static struct IDirectDraw_VTable		dga_ddvt, xlib_ddvt;
 static struct IDirectDraw2_VTable		dga_dd2vt, xlib_dd2vt;
+static struct IDirectDraw4_VTable		dga_dd4vt, xlib_dd4vt;
 static struct IDirectDrawClipper_VTable	ddclipvt;
 static struct IDirectDrawPalette_VTable dga_ddpalvt, xlib_ddpalvt;
 static struct IDirect3D_VTable			d3dvt;
@@ -373,14 +374,14 @@
 }
 
 /******************************************************************************
- *		IDirectDrawSurface,IDirectDrawSurface2,IDirectDrawSurface3
+ *		IDirectDrawSurface methods
  *
  * Since DDS3 and DDS2 are supersets of DDS, we implement DDS3 and let
  * DDS and DDS2 use those functions. (Function calls did not change (except
  * using different DirectDrawSurfaceX version), just added flags and functions)
  */
-static HRESULT WINAPI IDirectDrawSurface3_Lock(
-    LPDIRECTDRAWSURFACE3 this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
+static HRESULT WINAPI IDirectDrawSurface4_Lock(
+    LPDIRECTDRAWSURFACE4 this,LPRECT32 lprect,LPDDSURFACEDESC lpddsd,DWORD flags, HANDLE32 hnd
 ) {
         TRACE(ddraw, "(%p)->Lock(%p,%p,%08lx,%08lx)\n",
 		this,lprect,lpddsd,flags,(DWORD)hnd);
@@ -407,14 +408,14 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface3_Unlock(
-	LPDIRECTDRAWSURFACE3 this,LPVOID surface
+static HRESULT WINAPI DGA_IDirectDrawSurface4_Unlock(
+	LPDIRECTDRAWSURFACE4 this,LPVOID surface
 ) {
 	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
 	return DD_OK;
 }
 
-static void Xlib_copy_surface_on_screen(LPDIRECTDRAWSURFACE3 this) {
+static void Xlib_copy_surface_on_screen(LPDIRECTDRAWSURFACE4 this) {
   if (this->s.ddraw->d.depth != this->s.ddraw->d.screen_depth) {
     /* Pixel convertion ! */
     if ((this->s.ddraw->d.depth == 8) && (this->s.ddraw->d.screen_depth == 16)) {
@@ -460,8 +461,8 @@
 		  this->t.xlib.image->height);
 }
 
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_Unlock(
-	LPDIRECTDRAWSURFACE3 this,LPVOID surface)
+static HRESULT WINAPI Xlib_IDirectDrawSurface4_Unlock(
+	LPDIRECTDRAWSURFACE4 this,LPVOID surface)
 {
 	TRACE(ddraw,"(%p)->Unlock(%p)\n",this,surface);
   
@@ -480,8 +481,8 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface3_Flip(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
+static HRESULT WINAPI DGA_IDirectDrawSurface4_Flip(
+	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
 ) {
 #ifdef HAVE_LIBXXF86DGA
 	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
@@ -516,8 +517,8 @@
 #endif /* defined(HAVE_LIBXXF86DGA) */
 }
 
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_Flip(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 flipto,DWORD dwFlags
+static HRESULT WINAPI Xlib_IDirectDrawSurface4_Flip(
+	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWSURFACE4 flipto,DWORD dwFlags
 ) {
 	TRACE(ddraw,"(%p)->Flip(%p,%08lx)\n",this,flipto,dwFlags);
 	if (!this->s.ddraw->d.paintable)
@@ -549,12 +550,12 @@
 }
 
 
-/* The IDirectDrawSurface3::SetPalette method attaches the specified
+/* The IDirectDrawSurface4::SetPalette method attaches the specified
  * DirectDrawPalette object to a surface. The surface uses this palette for all
  * subsequent operations. The palette change takes place immediately.
  */
-static HRESULT WINAPI Xlib_IDirectDrawSurface3_SetPalette(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWPALETTE pal
+static HRESULT WINAPI Xlib_IDirectDrawSurface4_SetPalette(
+	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWPALETTE pal
 ) {
 	int i;
 	TRACE(ddraw,"(%p)->(%p)\n",this,pal);
@@ -613,8 +614,8 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI DGA_IDirectDrawSurface3_SetPalette(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWPALETTE pal
+static HRESULT WINAPI DGA_IDirectDrawSurface4_SetPalette(
+	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWPALETTE pal
 ) {
 	TRACE(ddraw,"(%p)->(%p)\n",this,pal);
 #ifdef HAVE_LIBXXF86DGA
@@ -646,8 +647,8 @@
 
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_Blt(
-	LPDIRECTDRAWSURFACE3 this,LPRECT32 rdst,LPDIRECTDRAWSURFACE3 src,LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
+static HRESULT WINAPI IDirectDrawSurface4_Blt(
+	LPDIRECTDRAWSURFACE4 this,LPRECT32 rdst,LPDIRECTDRAWSURFACE4 src,LPRECT32 rsrc,DWORD dwFlags,LPDDBLTFX lpbltfx
 ) {
 	RECT32	xdst,xsrc;
 	DDSURFACEDESC	ddesc,sdesc;
@@ -873,8 +874,8 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_BltFast(
-	LPDIRECTDRAWSURFACE3 this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE3 src,LPRECT32 rsrc,DWORD trans
+static HRESULT WINAPI IDirectDrawSurface4_BltFast(
+	LPDIRECTDRAWSURFACE4 this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE4 src,LPRECT32 rsrc,DWORD trans
 ) {
 	int		i,bpp,w,h;
 	DDSURFACEDESC	ddesc,sdesc;
@@ -910,8 +911,8 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_BltBatch(
-	LPDIRECTDRAWSURFACE3 this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
+static HRESULT WINAPI IDirectDrawSurface4_BltBatch(
+	LPDIRECTDRAWSURFACE4 this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
 ) {
 	FIXME(ddraw,"(%p)->BltBatch(%p,%08lx,%08lx),stub!\n",
 		this,ddbltbatch,x,y
@@ -919,16 +920,16 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetCaps(
-	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS caps
+static HRESULT WINAPI IDirectDrawSurface4_GetCaps(
+	LPDIRECTDRAWSURFACE4 this,LPDDSCAPS caps
 ) {
 	TRACE(ddraw,"(%p)->GetCaps(%p)\n",this,caps);
 	caps->dwCaps = DDSCAPS_PALETTE; /* probably more */
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetSurfaceDesc(
-	LPDIRECTDRAWSURFACE3 this,LPDDSURFACEDESC ddsd
+static HRESULT WINAPI IDirectDrawSurface4_GetSurfaceDesc(
+	LPDIRECTDRAWSURFACE4 this,LPDDSURFACEDESC ddsd
 ) { 
 		TRACE(ddraw, "(%p)->GetSurfaceDesc(%p)\n",
 			     this,ddsd);
@@ -949,13 +950,13 @@
 	return DD_OK;
 }
 
-static ULONG WINAPI IDirectDrawSurface3_AddRef(LPDIRECTDRAWSURFACE3 this) {
+static ULONG WINAPI IDirectDrawSurface4_AddRef(LPDIRECTDRAWSURFACE4 this) {
         TRACE( ddraw, "(%p)->() incrementing from %lu.\n", this, this->ref );
 
 	return ++(this->ref);
 }
 
-static ULONG WINAPI DGA_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
+static ULONG WINAPI DGA_IDirectDrawSurface4_Release(LPDIRECTDRAWSURFACE4 this) {
         TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
 
 #ifdef HAVE_LIBXXF86DGA
@@ -979,7 +980,7 @@
 	return this->ref;
 }
 
-static ULONG WINAPI Xlib_IDirectDrawSurface3_Release(LPDIRECTDRAWSURFACE3 this) {
+static ULONG WINAPI Xlib_IDirectDrawSurface4_Release(LPDIRECTDRAWSURFACE4 this) {
         TRACE( ddraw, "(%p)->() decrementing from %lu.\n", this, this->ref );
 
 	if (!--(this->ref)) {
@@ -1039,8 +1040,8 @@
 	return this->ref;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetAttachedSurface(
-	LPDIRECTDRAWSURFACE3 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE3 *lpdsf
+static HRESULT WINAPI IDirectDrawSurface4_GetAttachedSurface(
+	LPDIRECTDRAWSURFACE4 this,LPDDSCAPS lpddsd,LPDIRECTDRAWSURFACE4 *lpdsf
 ) {
         TRACE(ddraw, "(%p)->GetAttachedSurface(%p,%p)\n",
 		     this, lpddsd, lpdsf);
@@ -1064,16 +1065,16 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_Initialize(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd
+static HRESULT WINAPI IDirectDrawSurface4_Initialize(
+	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAW ddraw,LPDDSURFACEDESC lpdsfd
 ) {
 	TRACE(ddraw,"(%p)->(%p, %p)\n",this,ddraw,lpdsfd);
 
 	return DDERR_ALREADYINITIALIZED;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetPixelFormat(
-	LPDIRECTDRAWSURFACE3 this,LPDDPIXELFORMAT pf
+static HRESULT WINAPI IDirectDrawSurface4_GetPixelFormat(
+	LPDIRECTDRAWSURFACE4 this,LPDDPIXELFORMAT pf
 ) {
 	TRACE(ddraw,"(%p)->(%p)\n",this,pf);
 
@@ -1082,27 +1083,27 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetBltStatus(LPDIRECTDRAWSURFACE3 this,DWORD dwFlags) {
+static HRESULT WINAPI IDirectDrawSurface4_GetBltStatus(LPDIRECTDRAWSURFACE4 this,DWORD dwFlags) {
 	FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",this,dwFlags);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetOverlayPosition(
-	LPDIRECTDRAWSURFACE3 this,LPLONG x1,LPLONG x2
+static HRESULT WINAPI IDirectDrawSurface4_GetOverlayPosition(
+	LPDIRECTDRAWSURFACE4 this,LPLONG x1,LPLONG x2
 ) {
 	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,x1,x2);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_SetClipper(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWCLIPPER clipper
+static HRESULT WINAPI IDirectDrawSurface4_SetClipper(
+	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWCLIPPER clipper
 ) {
 	FIXME(ddraw,"(%p)->(%p),stub!\n",this,clipper);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_AddAttachedSurface(
-	LPDIRECTDRAWSURFACE3 this,LPDIRECTDRAWSURFACE3 surf
+static HRESULT WINAPI IDirectDrawSurface4_AddAttachedSurface(
+	LPDIRECTDRAWSURFACE4 this,LPDIRECTDRAWSURFACE4 surf
 ) {
 	FIXME(ddraw,"(%p)->(%p),stub!\n",this,surf);
 
@@ -1114,13 +1115,13 @@
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetDC(LPDIRECTDRAWSURFACE3 this,HDC32* lphdc) {
+static HRESULT WINAPI IDirectDrawSurface4_GetDC(LPDIRECTDRAWSURFACE4 this,HDC32* lphdc) {
 	FIXME(ddraw,"(%p)->GetDC(%p)\n",this,lphdc);
 	*lphdc = BeginPaint32(this->s.ddraw->d.window,&this->s.ddraw->d.ps);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_ReleaseDC(LPDIRECTDRAWSURFACE3 this,HDC32 hdc) {
+static HRESULT WINAPI IDirectDrawSurface4_ReleaseDC(LPDIRECTDRAWSURFACE4 this,HDC32 hdc) {
   	DDSURFACEDESC	desc;
 	DWORD x, y;
 	
@@ -1141,16 +1142,17 @@
 }
 
 
-static HRESULT WINAPI IDirectDrawSurface3_QueryInterface(LPDIRECTDRAWSURFACE3 this,REFIID refiid,LPVOID *obj) {
+static HRESULT WINAPI IDirectDrawSurface4_QueryInterface(LPDIRECTDRAWSURFACE4 this,REFIID refiid,LPVOID *obj) {
         char    xrefiid[50];
 
         WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
         TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
 	
-	/* DirectDrawSurface,DirectDrawSurface2 and DirectDrawSurface3 use
+	/* All DirectDrawSurface versions (1, 2, 3 and 4) use
 	 * the same interface. And IUnknown does that too of course.
 	 */
-	if (	!memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID))	||
+	if (    !memcmp(&IID_IDirectDrawSurface4,refiid,sizeof(IID))	||
+	        !memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID))	||
 		!memcmp(&IID_IDirectDrawSurface2,refiid,sizeof(IID))	||
 		!memcmp(&IID_IDirectDrawSurface,refiid,sizeof(IID))	||
 		!memcmp(&IID_IUnknown,refiid,sizeof(IID))
@@ -1196,23 +1198,23 @@
 	return OLE_E_ENUM_NOMORE;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_IsLost(LPDIRECTDRAWSURFACE3 this) {
+static HRESULT WINAPI IDirectDrawSurface4_IsLost(LPDIRECTDRAWSURFACE4 this) {
 	TRACE(ddraw,"(%p)->(), stub!\n",this);
 	return DD_OK; /* hmm */
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
+static HRESULT WINAPI IDirectDrawSurface4_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE4 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
 	FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,context,esfcb);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_Restore(LPDIRECTDRAWSURFACE3 this) {
+static HRESULT WINAPI IDirectDrawSurface4_Restore(LPDIRECTDRAWSURFACE4 this) {
 	FIXME(ddraw,"(%p)->(),stub!\n",this);
 	return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_SetColorKey(
-	LPDIRECTDRAWSURFACE3 this, DWORD dwFlags, LPDDCOLORKEY ckey ) 
+static HRESULT WINAPI IDirectDrawSurface4_SetColorKey(
+	LPDIRECTDRAWSURFACE4 this, DWORD dwFlags, LPDDCOLORKEY ckey ) 
 {
         TRACE(ddraw,"(%p)->(0x%08lx,%p)\n",this,dwFlags,ckey);
 
@@ -1253,8 +1255,8 @@
 
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_AddOverlayDirtyRect(
-        LPDIRECTDRAWSURFACE3 this, 
+static HRESULT WINAPI IDirectDrawSurface4_AddOverlayDirtyRect(
+        LPDIRECTDRAWSURFACE4 this, 
         LPRECT32 lpRect )
 {
   FIXME(ddraw,"(%p)->(%p),stub!\n",this,lpRect); 
@@ -1262,18 +1264,18 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_DeleteAttachedSurface(
-        LPDIRECTDRAWSURFACE3 this, 
+static HRESULT WINAPI IDirectDrawSurface4_DeleteAttachedSurface(
+        LPDIRECTDRAWSURFACE4 this, 
         DWORD dwFlags,
-        LPDIRECTDRAWSURFACE3 lpDDSAttachedSurface )
+        LPDIRECTDRAWSURFACE4 lpDDSAttachedSurface )
 {
   FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n",this,dwFlags,lpDDSAttachedSurface);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_EnumOverlayZOrders(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_EnumOverlayZOrders(
+        LPDIRECTDRAWSURFACE4 this,
         DWORD dwFlags,
         LPVOID lpContext,
         LPDDENUMSURFACESCALLBACK lpfnCallback )
@@ -1284,8 +1286,8 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetClipper(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_GetClipper(
+        LPDIRECTDRAWSURFACE4 this,
         LPDIRECTDRAWCLIPPER* lplpDDClipper )
 {
   FIXME(ddraw,"(%p)->(%p),stub!\n", this, lplpDDClipper);
@@ -1293,8 +1295,8 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetColorKey(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_GetColorKey(
+        LPDIRECTDRAWSURFACE4 this,
         DWORD dwFlags,
         LPDDCOLORKEY lpDDColorKey )
 {
@@ -1331,8 +1333,8 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetFlipStatus(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_GetFlipStatus(
+        LPDIRECTDRAWSURFACE4 this,
         DWORD dwFlags ) 
 {
   FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", this, dwFlags);
@@ -1340,8 +1342,8 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetPalette(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_GetPalette(
+        LPDIRECTDRAWSURFACE4 this,
         LPDIRECTDRAWPALETTE* lplpDDPalette )
 {
   FIXME(ddraw,"(%p)->(%p),stub!\n", this, lplpDDPalette);
@@ -1349,8 +1351,8 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_SetOverlayPosition(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_SetOverlayPosition(
+        LPDIRECTDRAWSURFACE4 this,
         LONG lX,
         LONG lY)
 {
@@ -1359,10 +1361,10 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_UpdateOverlay(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_UpdateOverlay(
+        LPDIRECTDRAWSURFACE4 this,
         LPRECT32 lpSrcRect,
-        LPDIRECTDRAWSURFACE3 lpDDDestSurface,
+        LPDIRECTDRAWSURFACE4 lpDDDestSurface,
         LPRECT32 lpDestRect,
         DWORD dwFlags,
         LPDDOVERLAYFX lpDDOverlayFx )
@@ -1373,8 +1375,8 @@
   return DD_OK;
 }
  
-static HRESULT WINAPI IDirectDrawSurface3_UpdateOverlayDisplay(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_UpdateOverlayDisplay(
+        LPDIRECTDRAWSURFACE4 this,
         DWORD dwFlags )
 {
   FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", this, dwFlags); 
@@ -1382,18 +1384,18 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_UpdateOverlayZOrder(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_UpdateOverlayZOrder(
+        LPDIRECTDRAWSURFACE4 this,
         DWORD dwFlags,
-        LPDIRECTDRAWSURFACE3 lpDDSReference )
+        LPDIRECTDRAWSURFACE4 lpDDSReference )
 {
   FIXME(ddraw,"(%p)->(0x%08lx,%p),stub!\n", this, dwFlags, lpDDSReference);
 
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_GetDDInterface(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_GetDDInterface(
+        LPDIRECTDRAWSURFACE4 this,
         LPVOID* lplpDD )
 {
   FIXME(ddraw,"(%p)->(%p),stub!\n", this, lplpDD);
@@ -1404,8 +1406,8 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_PageLock(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_PageLock(
+        LPDIRECTDRAWSURFACE4 this,
         DWORD dwFlags )
 {
   FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", this, dwFlags);
@@ -1413,8 +1415,8 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_PageUnlock(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_PageUnlock(
+        LPDIRECTDRAWSURFACE4 this,
         DWORD dwFlags )
 {
   FIXME(ddraw,"(%p)->(0x%08lx),stub!\n", this, dwFlags);
@@ -1422,8 +1424,8 @@
   return DD_OK;
 }
 
-static HRESULT WINAPI IDirectDrawSurface3_SetSurfaceDesc(
-        LPDIRECTDRAWSURFACE3 this,
+static HRESULT WINAPI IDirectDrawSurface4_SetSurfaceDesc(
+        LPDIRECTDRAWSURFACE4 this,
         LPDDSURFACEDESC lpDDSD,
         DWORD dwFlags )
 {
@@ -1432,90 +1434,139 @@
   return DD_OK;
 }
 
-static struct IDirectDrawSurface3_VTable dga_dds3vt = {
-	IDirectDrawSurface3_QueryInterface,
-	IDirectDrawSurface3_AddRef,
-	DGA_IDirectDrawSurface3_Release,
-	IDirectDrawSurface3_AddAttachedSurface,
-	IDirectDrawSurface3_AddOverlayDirtyRect,
-	IDirectDrawSurface3_Blt,
-	IDirectDrawSurface3_BltBatch,
-	IDirectDrawSurface3_BltFast,
-	IDirectDrawSurface3_DeleteAttachedSurface,
-	IDirectDrawSurface3_EnumAttachedSurfaces,
-	IDirectDrawSurface3_EnumOverlayZOrders,
-	DGA_IDirectDrawSurface3_Flip,
-	IDirectDrawSurface3_GetAttachedSurface,
-	IDirectDrawSurface3_GetBltStatus,
-	IDirectDrawSurface3_GetCaps,
-	IDirectDrawSurface3_GetClipper,
-	IDirectDrawSurface3_GetColorKey,
-	IDirectDrawSurface3_GetDC,
-	IDirectDrawSurface3_GetFlipStatus,
-	IDirectDrawSurface3_GetOverlayPosition,
-	IDirectDrawSurface3_GetPalette,
-	IDirectDrawSurface3_GetPixelFormat,
-	IDirectDrawSurface3_GetSurfaceDesc,
-	IDirectDrawSurface3_Initialize,
-	IDirectDrawSurface3_IsLost,
-	IDirectDrawSurface3_Lock,
-	IDirectDrawSurface3_ReleaseDC,
-	IDirectDrawSurface3_Restore,
-	IDirectDrawSurface3_SetClipper,
-	IDirectDrawSurface3_SetColorKey,
-	IDirectDrawSurface3_SetOverlayPosition,
-	DGA_IDirectDrawSurface3_SetPalette,
-	DGA_IDirectDrawSurface3_Unlock,
-	IDirectDrawSurface3_UpdateOverlay,
-	IDirectDrawSurface3_UpdateOverlayDisplay,
-	IDirectDrawSurface3_UpdateOverlayZOrder,
-	IDirectDrawSurface3_GetDDInterface,
-	IDirectDrawSurface3_PageLock,
-	IDirectDrawSurface3_PageUnlock,
-	IDirectDrawSurface3_SetSurfaceDesc,
+static HRESULT WINAPI IDirectDrawSurface4_SetPrivateData(LPDIRECTDRAWSURFACE4 this,
+							 REFGUID guidTag,
+							 LPVOID lpData,
+							 DWORD cbSize,
+							 DWORD dwFlags) {
+  FIXME(ddraw, "(%p)->(%p,%p,%ld,%08lx\n", this, guidTag, lpData, cbSize, dwFlags);
+  
+  return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDrawSurface4_GetPrivateData(LPDIRECTDRAWSURFACE4 this,
+							 REFGUID guidTag,
+							 LPVOID lpBuffer,
+							 LPDWORD lpcbBufferSize) {
+  FIXME(ddraw, "(%p)->(%p,%p,%p)\n", this, guidTag, lpBuffer, lpcbBufferSize);
+  
+  return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDrawSurface4_FreePrivateData(LPDIRECTDRAWSURFACE4 this,
+							  REFGUID guidTag)  {
+  FIXME(ddraw, "(%p)->(%p)\n", this, guidTag);
+  
+  return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDrawSurface4_GetUniquenessValue(LPDIRECTDRAWSURFACE4 this,
+							     LPDWORD lpValue)  {
+  FIXME(ddraw, "(%p)->(%p)\n", this, lpValue);
+  
+  return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDrawSurface4_ChangeUniquenessValue(LPDIRECTDRAWSURFACE4 this) {
+  FIXME(ddraw, "(%p)\n", this);
+  
+  return DD_OK;
+}
+
+static struct IDirectDrawSurface4_VTable dga_dds4vt = {
+	IDirectDrawSurface4_QueryInterface,
+	IDirectDrawSurface4_AddRef,
+	DGA_IDirectDrawSurface4_Release,
+	IDirectDrawSurface4_AddAttachedSurface,
+	IDirectDrawSurface4_AddOverlayDirtyRect,
+	IDirectDrawSurface4_Blt,
+	IDirectDrawSurface4_BltBatch,
+	IDirectDrawSurface4_BltFast,
+	IDirectDrawSurface4_DeleteAttachedSurface,
+	IDirectDrawSurface4_EnumAttachedSurfaces,
+	IDirectDrawSurface4_EnumOverlayZOrders,
+	DGA_IDirectDrawSurface4_Flip,
+	IDirectDrawSurface4_GetAttachedSurface,
+	IDirectDrawSurface4_GetBltStatus,
+	IDirectDrawSurface4_GetCaps,
+	IDirectDrawSurface4_GetClipper,
+	IDirectDrawSurface4_GetColorKey,
+	IDirectDrawSurface4_GetDC,
+	IDirectDrawSurface4_GetFlipStatus,
+	IDirectDrawSurface4_GetOverlayPosition,
+	IDirectDrawSurface4_GetPalette,
+	IDirectDrawSurface4_GetPixelFormat,
+	IDirectDrawSurface4_GetSurfaceDesc,
+	IDirectDrawSurface4_Initialize,
+	IDirectDrawSurface4_IsLost,
+	IDirectDrawSurface4_Lock,
+	IDirectDrawSurface4_ReleaseDC,
+	IDirectDrawSurface4_Restore,
+	IDirectDrawSurface4_SetClipper,
+	IDirectDrawSurface4_SetColorKey,
+	IDirectDrawSurface4_SetOverlayPosition,
+	DGA_IDirectDrawSurface4_SetPalette,
+	DGA_IDirectDrawSurface4_Unlock,
+	IDirectDrawSurface4_UpdateOverlay,
+	IDirectDrawSurface4_UpdateOverlayDisplay,
+	IDirectDrawSurface4_UpdateOverlayZOrder,
+	IDirectDrawSurface4_GetDDInterface,
+	IDirectDrawSurface4_PageLock,
+	IDirectDrawSurface4_PageUnlock,
+	IDirectDrawSurface4_SetSurfaceDesc,
+	IDirectDrawSurface4_SetPrivateData,
+	IDirectDrawSurface4_GetPrivateData,
+	IDirectDrawSurface4_FreePrivateData,
+	IDirectDrawSurface4_GetUniquenessValue,
+	IDirectDrawSurface4_ChangeUniquenessValue
 };
 
-static struct IDirectDrawSurface3_VTable xlib_dds3vt = {
-	IDirectDrawSurface3_QueryInterface,
-	IDirectDrawSurface3_AddRef,
-	Xlib_IDirectDrawSurface3_Release,
-	IDirectDrawSurface3_AddAttachedSurface,
-	IDirectDrawSurface3_AddOverlayDirtyRect,
-	IDirectDrawSurface3_Blt,
-	IDirectDrawSurface3_BltBatch,
-	IDirectDrawSurface3_BltFast,
-	IDirectDrawSurface3_DeleteAttachedSurface,
-	IDirectDrawSurface3_EnumAttachedSurfaces,
-	IDirectDrawSurface3_EnumOverlayZOrders,
-	Xlib_IDirectDrawSurface3_Flip,
-	IDirectDrawSurface3_GetAttachedSurface,
-	IDirectDrawSurface3_GetBltStatus,
-	IDirectDrawSurface3_GetCaps,
-	IDirectDrawSurface3_GetClipper,
-	IDirectDrawSurface3_GetColorKey,
-	IDirectDrawSurface3_GetDC,
-	IDirectDrawSurface3_GetFlipStatus,
-	IDirectDrawSurface3_GetOverlayPosition,
-	IDirectDrawSurface3_GetPalette,
-	IDirectDrawSurface3_GetPixelFormat,
-	IDirectDrawSurface3_GetSurfaceDesc,
-	IDirectDrawSurface3_Initialize,
-	IDirectDrawSurface3_IsLost,
-	IDirectDrawSurface3_Lock,
-	IDirectDrawSurface3_ReleaseDC,
-	IDirectDrawSurface3_Restore,
-	IDirectDrawSurface3_SetClipper,
-	IDirectDrawSurface3_SetColorKey,
-	IDirectDrawSurface3_SetOverlayPosition,
-	Xlib_IDirectDrawSurface3_SetPalette,
-	Xlib_IDirectDrawSurface3_Unlock,
-	IDirectDrawSurface3_UpdateOverlay,
-	IDirectDrawSurface3_UpdateOverlayDisplay,
-	IDirectDrawSurface3_UpdateOverlayZOrder,
-	IDirectDrawSurface3_GetDDInterface,
-	IDirectDrawSurface3_PageLock,
-	IDirectDrawSurface3_PageUnlock,
-	IDirectDrawSurface3_SetSurfaceDesc,
+static struct IDirectDrawSurface4_VTable xlib_dds4vt = {
+	IDirectDrawSurface4_QueryInterface,
+	IDirectDrawSurface4_AddRef,
+	Xlib_IDirectDrawSurface4_Release,
+	IDirectDrawSurface4_AddAttachedSurface,
+	IDirectDrawSurface4_AddOverlayDirtyRect,
+	IDirectDrawSurface4_Blt,
+	IDirectDrawSurface4_BltBatch,
+	IDirectDrawSurface4_BltFast,
+	IDirectDrawSurface4_DeleteAttachedSurface,
+	IDirectDrawSurface4_EnumAttachedSurfaces,
+	IDirectDrawSurface4_EnumOverlayZOrders,
+	Xlib_IDirectDrawSurface4_Flip,
+	IDirectDrawSurface4_GetAttachedSurface,
+	IDirectDrawSurface4_GetBltStatus,
+	IDirectDrawSurface4_GetCaps,
+	IDirectDrawSurface4_GetClipper,
+	IDirectDrawSurface4_GetColorKey,
+	IDirectDrawSurface4_GetDC,
+	IDirectDrawSurface4_GetFlipStatus,
+	IDirectDrawSurface4_GetOverlayPosition,
+	IDirectDrawSurface4_GetPalette,
+	IDirectDrawSurface4_GetPixelFormat,
+	IDirectDrawSurface4_GetSurfaceDesc,
+	IDirectDrawSurface4_Initialize,
+	IDirectDrawSurface4_IsLost,
+	IDirectDrawSurface4_Lock,
+	IDirectDrawSurface4_ReleaseDC,
+	IDirectDrawSurface4_Restore,
+	IDirectDrawSurface4_SetClipper,
+	IDirectDrawSurface4_SetColorKey,
+	IDirectDrawSurface4_SetOverlayPosition,
+	Xlib_IDirectDrawSurface4_SetPalette,
+	Xlib_IDirectDrawSurface4_Unlock,
+	IDirectDrawSurface4_UpdateOverlay,
+	IDirectDrawSurface4_UpdateOverlayDisplay,
+	IDirectDrawSurface4_UpdateOverlayZOrder,
+	IDirectDrawSurface4_GetDDInterface,
+	IDirectDrawSurface4_PageLock,
+	IDirectDrawSurface4_PageUnlock,
+	IDirectDrawSurface4_SetSurfaceDesc,
+	IDirectDrawSurface4_SetPrivateData,
+	IDirectDrawSurface4_GetPrivateData,
+	IDirectDrawSurface4_FreePrivateData,
+	IDirectDrawSurface4_GetUniquenessValue,
+	IDirectDrawSurface4_ChangeUniquenessValue
 };
 
 /******************************************************************************
@@ -2140,7 +2191,7 @@
 	this->lpvtbl->fnAddRef(this);
         
 	(*lpdsf)->ref = 1;
-	(*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds3vt;
+	(*lpdsf)->lpvtbl = (LPDIRECTDRAWSURFACE_VTABLE)&dga_dds4vt;
 	(*lpdsf)->s.ddraw = this;
 	(*lpdsf)->s.palette = NULL;
 	(*lpdsf)->t.dga.fb_height = -1; /* This is to have non-on screen surfaces freed */
@@ -2182,16 +2233,16 @@
 	(*lpdsf)->s.backbuffer = NULL;
 	  
 	if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
-		LPDIRECTDRAWSURFACE3	back;
+		LPDIRECTDRAWSURFACE4	back;
 
 		if (lpddsd->dwBackBufferCount>1)
 			FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
 
 	    (*lpdsf)->s.backbuffer = back =
-	      (LPDIRECTDRAWSURFACE3)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface3));
+	      (LPDIRECTDRAWSURFACE4)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface4));
 		this->lpvtbl->fnAddRef(this);
 		back->ref = 1;
-		back->lpvtbl = (LPDIRECTDRAWSURFACE3_VTABLE)&dga_dds3vt;
+		back->lpvtbl = (LPDIRECTDRAWSURFACE4_VTABLE)&dga_dds4vt;
 		for (i=0;i<32;i++)
 			if (!(this->e.dga.vpmask & (1<<i)))
 				break;
@@ -2228,7 +2279,7 @@
 #endif /* defined(HAVE_LIBXXF86DGA) */
 }
 
-static XImage *create_ximage(LPDIRECTDRAW2 this, LPDIRECTDRAWSURFACE3 lpdsf) {
+static XImage *create_ximage(LPDIRECTDRAW2 this, LPDIRECTDRAWSURFACE4 lpdsf) {
   XImage *img;
   void *img_data;
 
@@ -2336,7 +2387,7 @@
 	this->lpvtbl->fnAddRef(this);
 	(*lpdsf)->s.ddraw             = this;
 	(*lpdsf)->ref                 = 1;
-	(*lpdsf)->lpvtbl              = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds3vt;
+	(*lpdsf)->lpvtbl              = (LPDIRECTDRAWSURFACE_VTABLE)&xlib_dds4vt;
 	(*lpdsf)->s.palette = NULL;
 	(*lpdsf)->t.xlib.image = NULL; /* This is for off-screen buffers */
 
@@ -2356,7 +2407,7 @@
 	  (*lpdsf)->s.surface_desc = *lpddsd;
 	  
     /* Create the XImage */
-    img = create_ximage(this, (LPDIRECTDRAWSURFACE3) *lpdsf);
+    img = create_ximage(this, (LPDIRECTDRAWSURFACE4) *lpdsf);
     if (img == NULL)
       return DDERR_OUTOFMEMORY;
     (*lpdsf)->t.xlib.image = img;
@@ -2371,14 +2422,14 @@
     
     /* Check for backbuffers */
 	if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) {
-		LPDIRECTDRAWSURFACE3	back;
+		LPDIRECTDRAWSURFACE4	back;
       XImage *img;
 
 		if (lpddsd->dwBackBufferCount>1)
 			FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
 
       (*lpdsf)->s.backbuffer = back =
-	(LPDIRECTDRAWSURFACE3)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface3));
+	(LPDIRECTDRAWSURFACE4)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface4));
 
       TRACE(ddraw,"allocated back-buffer (%p)\n", back);
       
@@ -2386,7 +2437,7 @@
 		back->s.ddraw = this;
 
 		back->ref = 1;
-		back->lpvtbl = (LPDIRECTDRAWSURFACE3_VTABLE)&xlib_dds3vt;
+		back->lpvtbl = (LPDIRECTDRAWSURFACE4_VTABLE)&xlib_dds4vt;
 	    /* Copy the surface description from the front buffer */
 	    back->s.surface_desc = (*lpdsf)->s.surface_desc;
 
@@ -2948,6 +2999,15 @@
 
 		return S_OK;
 	}
+	if (!memcmp(&IID_IDirectDraw4,refiid,sizeof(IID_IDirectDraw4))) {
+		this->lpvtbl = (LPDIRECTDRAW2_VTABLE)&dga_dd4vt;
+		this->lpvtbl->fnAddRef(this);
+		*obj = this;
+
+		TRACE(ddraw, "  Creating IDirectDraw4 interface (%p)\n", *obj);
+
+		return S_OK;
+	}
 	if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
 		LPDIRECT3D	d3d;
 
@@ -3013,6 +3073,15 @@
 		
 		return S_OK;
 	}
+	if (!memcmp(&IID_IDirectDraw4,refiid,sizeof(IID_IDirectDraw4))) {
+		this->lpvtbl = (LPDIRECTDRAW2_VTABLE)&xlib_dd4vt;
+		this->lpvtbl->fnAddRef(this);
+		*obj = this;
+
+		TRACE(ddraw, "  Creating IDirectDraw4 interface (%p)\n", *obj);
+
+		return S_OK;
+	}
 	if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
 		LPDIRECT3D	d3d;
 
@@ -3209,6 +3278,26 @@
   return DD_OK;
 }
 
+static HRESULT WINAPI IDirectDraw2_GetGDISurface(LPDIRECTDRAW2 this,
+						 LPDIRECTDRAWSURFACE *lplpGDIDDSSurface) {
+  FIXME(ddraw,"(%p)->(%p)\n", this, lplpGDIDDSSurface);
+
+  return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDraw2_GetScanLine(LPDIRECTDRAW2 this,
+					       LPDWORD lpdwScanLine) {
+  FIXME(ddraw,"(%p)->(%p)\n", this, lpdwScanLine);
+
+  return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDraw2_Initialize(LPDIRECTDRAW2 this,
+					      GUID *lpGUID) {
+  FIXME(ddraw,"(%p)->(%p)\n", this, lpGUID);
+  
+  return DD_OK;
+}
 
 /* Note: Hack so we can reuse the old functions without compiler warnings */
 #ifdef __GNUC__
@@ -3232,11 +3321,11 @@
 	XCAST(GetCaps)DGA_IDirectDraw2_GetCaps,
 	XCAST(GetDisplayMode)DGA_IDirectDraw2_GetDisplayMode,
 	XCAST(GetFourCCCodes)IDirectDraw2_GetFourCCCodes,
-	XCAST(GetGDISurface)15,
+	XCAST(GetGDISurface)IDirectDraw2_GetGDISurface,
 	XCAST(GetMonitorFrequency)IDirectDraw2_GetMonitorFrequency,
-	XCAST(GetScanLine)17,
+	XCAST(GetScanLine)IDirectDraw2_GetScanLine,
 	XCAST(GetVerticalBlankStatus)IDirectDraw2_GetVerticalBlankStatus,
-	XCAST(Initialize)19,
+	XCAST(Initialize)IDirectDraw2_Initialize,
 	XCAST(RestoreDisplayMode)DGA_IDirectDraw2_RestoreDisplayMode,
 	XCAST(SetCooperativeLevel)IDirectDraw2_SetCooperativeLevel,
 	DGA_IDirectDraw_SetDisplayMode,
@@ -3258,17 +3347,19 @@
 	XCAST(GetCaps)Xlib_IDirectDraw2_GetCaps,
 	XCAST(GetDisplayMode)Xlib_IDirectDraw2_GetDisplayMode,
 	XCAST(GetFourCCCodes)IDirectDraw2_GetFourCCCodes,
-	XCAST(GetGDISurface)15,
+	XCAST(GetGDISurface)IDirectDraw2_GetGDISurface,
 	XCAST(GetMonitorFrequency)IDirectDraw2_GetMonitorFrequency,
-	XCAST(GetScanLine)17,
+	XCAST(GetScanLine)IDirectDraw2_GetScanLine,
 	XCAST(GetVerticalBlankStatus)IDirectDraw2_GetVerticalBlankStatus,
-	XCAST(Initialize)19,
+	XCAST(Initialize)IDirectDraw2_Initialize,
 	XCAST(RestoreDisplayMode)Xlib_IDirectDraw2_RestoreDisplayMode,
 	XCAST(SetCooperativeLevel)IDirectDraw2_SetCooperativeLevel,
 	Xlib_IDirectDraw_SetDisplayMode,
 	XCAST(WaitForVerticalBlank)IDirectDraw2_WaitForVerticalBlank,
 };
 
+#undef XCAST
+
 /*****************************************************************************
  * 	IDirectDraw2
  *
@@ -3317,18 +3408,18 @@
 	IDirectDraw2_CreateClipper,
 	DGA_IDirectDraw2_CreatePalette,
 	DGA_IDirectDraw2_CreateSurface,
-	(void*)8,
+	IDirectDraw2_DuplicateSurface,
 	IDirectDraw2_EnumDisplayModes,
 	IDirectDraw2_EnumSurfaces,
 	IDirectDraw2_FlipToGDISurface,
 	DGA_IDirectDraw2_GetCaps,
 	DGA_IDirectDraw2_GetDisplayMode,
 	IDirectDraw2_GetFourCCCodes,
-	(void*)15,
+	IDirectDraw2_GetGDISurface,
 	IDirectDraw2_GetMonitorFrequency,
-	(void*)17,
+	IDirectDraw2_GetScanLine,
 	IDirectDraw2_GetVerticalBlankStatus,
-	(void*)19,
+	IDirectDraw2_Initialize,
 	DGA_IDirectDraw2_RestoreDisplayMode,
 	IDirectDraw2_SetCooperativeLevel,
 	DGA_IDirectDraw2_SetDisplayMode,
@@ -3344,18 +3435,18 @@
 	IDirectDraw2_CreateClipper,
 	Xlib_IDirectDraw2_CreatePalette,
 	Xlib_IDirectDraw2_CreateSurface,
-	(void*)8,
+	IDirectDraw2_DuplicateSurface,
 	IDirectDraw2_EnumDisplayModes,
 	IDirectDraw2_EnumSurfaces,
 	IDirectDraw2_FlipToGDISurface,
 	Xlib_IDirectDraw2_GetCaps,
 	Xlib_IDirectDraw2_GetDisplayMode,
 	IDirectDraw2_GetFourCCCodes,
-	(void*)15,
+	IDirectDraw2_GetGDISurface,
 	IDirectDraw2_GetMonitorFrequency,
-	(void*)17,
+	IDirectDraw2_GetScanLine,
 	IDirectDraw2_GetVerticalBlankStatus,
-	(void*)19,
+	IDirectDraw2_Initialize,
 	Xlib_IDirectDraw2_RestoreDisplayMode,
 	IDirectDraw2_SetCooperativeLevel,
 	Xlib_IDirectDraw2_SetDisplayMode,
@@ -3363,6 +3454,110 @@
 	Xlib_IDirectDraw2_GetAvailableVidMem	
 };
 
+/*****************************************************************************
+ * 	IDirectDraw4
+ *
+ */
+
+static HRESULT WINAPI IDirectDraw4_GetSurfaceFromDC(LPDIRECTDRAW4 this,
+						    HDC32 hdc,
+						    LPDIRECTDRAWSURFACE *lpDDS) {
+  FIXME(ddraw, "(%p)->(%08ld,%p)\n", this, (DWORD) hdc, lpDDS);
+
+  return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDraw4_RestoreAllSurfaces(LPDIRECTDRAW4 this) {
+  FIXME(ddraw, "(%p)->()\n", this);
+
+  return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDraw4_TestCooperativeLevel(LPDIRECTDRAW4 this) {
+  FIXME(ddraw, "(%p)->()\n", this);
+
+  return DD_OK;
+}
+
+static HRESULT WINAPI IDirectDraw4_GetDeviceIdentifier(LPDIRECTDRAW4 this,
+						       LPDDDEVICEIDENTIFIER lpdddi,
+						       DWORD dwFlags) {
+  FIXME(ddraw, "(%p)->(%p,%08lx)\n", this, lpdddi, dwFlags);
+  
+  return DD_OK;
+}
+
+#ifdef __GNUC__
+# define XCAST(fun)	(typeof(dga_dd4vt.fn##fun))
+#else
+# define XCAST(fun)	(void*)
+#endif
+
+
+static struct IDirectDraw4_VTable dga_dd4vt = {
+	XCAST(QueryInterface)DGA_IDirectDraw2_QueryInterface,
+	XCAST(AddRef)IDirectDraw2_AddRef,
+	XCAST(Release)DGA_IDirectDraw2_Release,
+	XCAST(Compact)IDirectDraw2_Compact,
+	XCAST(CreateClipper)IDirectDraw2_CreateClipper,
+	XCAST(CreatePalette)DGA_IDirectDraw2_CreatePalette,
+	XCAST(CreateSurface)DGA_IDirectDraw2_CreateSurface,
+	XCAST(DuplicateSurface)IDirectDraw2_DuplicateSurface,
+	XCAST(EnumDisplayModes)IDirectDraw2_EnumDisplayModes,
+	XCAST(EnumSurfaces)IDirectDraw2_EnumSurfaces,
+	XCAST(FlipToGDISurface)IDirectDraw2_FlipToGDISurface,
+	XCAST(GetCaps)DGA_IDirectDraw2_GetCaps,
+	XCAST(GetDisplayMode)DGA_IDirectDraw2_GetDisplayMode,
+	XCAST(GetFourCCCodes)IDirectDraw2_GetFourCCCodes,
+	XCAST(GetGDISurface)IDirectDraw2_GetGDISurface,
+	XCAST(GetMonitorFrequency)IDirectDraw2_GetMonitorFrequency,
+	XCAST(GetScanLine)IDirectDraw2_GetScanLine,
+	XCAST(GetVerticalBlankStatus)IDirectDraw2_GetVerticalBlankStatus,
+	XCAST(Initialize)IDirectDraw2_Initialize,
+	XCAST(RestoreDisplayMode)DGA_IDirectDraw2_RestoreDisplayMode,
+	XCAST(SetCooperativeLevel)IDirectDraw2_SetCooperativeLevel,
+	XCAST(SetDisplayMode)DGA_IDirectDraw_SetDisplayMode,
+	XCAST(WaitForVerticalBlank)IDirectDraw2_WaitForVerticalBlank,
+	XCAST(GetAvailableVidMem)DGA_IDirectDraw2_GetAvailableVidMem,
+	IDirectDraw4_GetSurfaceFromDC,
+	IDirectDraw4_RestoreAllSurfaces,
+	IDirectDraw4_TestCooperativeLevel,
+	IDirectDraw4_GetDeviceIdentifier
+};
+
+static struct IDirectDraw4_VTable xlib_dd4vt = {
+	XCAST(QueryInterface)Xlib_IDirectDraw2_QueryInterface,
+	XCAST(AddRef)IDirectDraw2_AddRef,
+	XCAST(Release)Xlib_IDirectDraw2_Release,
+	XCAST(Compact)IDirectDraw2_Compact,
+	XCAST(CreateClipper)IDirectDraw2_CreateClipper,
+	XCAST(CreatePalette)Xlib_IDirectDraw2_CreatePalette,
+	XCAST(CreateSurface)Xlib_IDirectDraw2_CreateSurface,
+	XCAST(DuplicateSurface)IDirectDraw2_DuplicateSurface,
+	XCAST(EnumDisplayModes)IDirectDraw2_EnumDisplayModes,
+	XCAST(EnumSurfaces)IDirectDraw2_EnumSurfaces,
+	XCAST(FlipToGDISurface)IDirectDraw2_FlipToGDISurface,
+	XCAST(GetCaps)Xlib_IDirectDraw2_GetCaps,
+	XCAST(GetDisplayMode)Xlib_IDirectDraw2_GetDisplayMode,
+	XCAST(GetFourCCCodes)IDirectDraw2_GetFourCCCodes,
+	XCAST(GetGDISurface)IDirectDraw2_GetGDISurface,
+	XCAST(GetMonitorFrequency)IDirectDraw2_GetMonitorFrequency,
+	XCAST(GetScanLine)IDirectDraw2_GetScanLine,
+	XCAST(GetVerticalBlankStatus)IDirectDraw2_GetVerticalBlankStatus,
+	XCAST(Initialize)IDirectDraw2_Initialize,
+	XCAST(RestoreDisplayMode)Xlib_IDirectDraw2_RestoreDisplayMode,
+	XCAST(SetCooperativeLevel)IDirectDraw2_SetCooperativeLevel,
+	XCAST(SetDisplayMode)Xlib_IDirectDraw_SetDisplayMode,
+	XCAST(WaitForVerticalBlank)IDirectDraw2_WaitForVerticalBlank,
+	XCAST(GetAvailableVidMem)Xlib_IDirectDraw2_GetAvailableVidMem,
+	IDirectDraw4_GetSurfaceFromDC,
+	IDirectDraw4_RestoreAllSurfaces,
+	IDirectDraw4_TestCooperativeLevel,
+	IDirectDraw4_GetDeviceIdentifier
+};
+
+#undef XCAST
+
 /******************************************************************************
  * 				DirectDrawCreate
  */
@@ -3519,10 +3714,9 @@
 	(*lplpDD)->d.width = screenWidth;
 
 #ifdef HAVE_LIBXXSHM
-	/* Test if XShm is available.
-	   As XShm is not ready yet for 'prime-time', it is disabled for now */
+	/* Test if XShm is available. */
 	if (((*lplpDD)->e.xlib.xshm_active = DDRAW_XSHM_Available()))
-	  TRACE(ddraw, "Using XShm extesion.\n");
+	  TRACE(ddraw, "Using XShm extension.\n");
 #endif
 	
 	return DD_OK;
diff --git a/include/d3d.h b/include/d3d.h
index d88dcac..2fd6498 100644
--- a/include/d3d.h
+++ b/include/d3d.h
@@ -1325,7 +1325,7 @@
 #ifdef HAVE_MESAGL
   GLuint tex_name;
 #endif  
-  LPDIRECTDRAWSURFACE3       surface;
+  LPDIRECTDRAWSURFACE4       surface;
 };
 
 #undef THIS
diff --git a/include/ddraw.h b/include/ddraw.h
index 0567549..61d2b9e 100644
--- a/include/ddraw.h
+++ b/include/ddraw.h
@@ -20,20 +20,24 @@
 DEFINE_GUID( CLSID_DirectDrawClipper,	0x593817A0,0x7DB3,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xb9,0x33,0x56 );
 DEFINE_GUID( IID_IDirectDraw,		0x6C14DB80,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 );
 DEFINE_GUID( IID_IDirectDraw2,		0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56 );
+DEFINE_GUID( IID_IDirectDraw4,          0x9c59509a,0x39bd,0x11d1,0x8c,0x4a,0x00,0xc0,0x4f,0xd9,0x30,0xc5 );
 DEFINE_GUID( IID_IDirectDrawSurface,	0x6C14DB81,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 );
 DEFINE_GUID( IID_IDirectDrawSurface2,	0x57805885,0x6eec,0x11cf,0x94,0x41,0xa8,0x23,0x03,0xc1,0x0e,0x27 );
 DEFINE_GUID( IID_IDirectDrawSurface3,	0xDA044E00,0x69B2,0x11D0,0xA1,0xD5,0x00,0xAA,0x00,0xB8,0xDF,0xBB );
+DEFINE_GUID( IID_IDirectDrawSurface4,   0x0B2B8630,0xAD35,0x11D0,0x8E,0xA6,0x00,0x60,0x97,0x97,0xEA,0x5B );
 DEFINE_GUID( IID_IDirectDrawPalette,	0x6C14DB84,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 );
 DEFINE_GUID( IID_IDirectDrawClipper,	0x6C14DB85,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 );
 DEFINE_GUID( IID_IDirectDrawColorControl,0x4B9F0EE0,0x0D7E,0x11D0,0x9B,0x06,0x00,0xA0,0xC9,0x03,0xA3,0xB8 );
 
 typedef struct IDirectDraw IDirectDraw,*LPDIRECTDRAW;
 typedef struct IDirectDraw2 IDirectDraw2,*LPDIRECTDRAW2;
+typedef struct IDirectDraw4 IDirectDraw4,*LPDIRECTDRAW4;
 typedef struct IDirectDrawClipper IDirectDrawClipper,*LPDIRECTDRAWCLIPPER;
 typedef struct IDirectDrawPalette IDirectDrawPalette,*LPDIRECTDRAWPALETTE;
 typedef struct IDirectDrawSurface IDirectDrawSurface,*LPDIRECTDRAWSURFACE;
 typedef struct IDirectDrawSurface2 IDirectDrawSurface2,*LPDIRECTDRAWSURFACE2;
 typedef struct IDirectDrawSurface3 IDirectDrawSurface3,*LPDIRECTDRAWSURFACE3;
+typedef struct IDirectDrawSurface4 IDirectDrawSurface4,*LPDIRECTDRAWSURFACE4;
 typedef struct IDirectDrawColorControl IDirectDrawColorControl,*LPDIRECTDRAWCOLORCONTROL;
 
 #define DDENUMRET_CANCEL	0
@@ -810,6 +814,19 @@
     LPDDBLTFX		lpDDBltFx;
 } DDBLTBATCH,*LPDDBLTBATCH;
 
+#define MAX_DDDEVICEID_STRING          512
+
+typedef struct tagDDDEVICEIDENTIFIER {
+  char    szDriver[MAX_DDDEVICEID_STRING];
+  char    szDescription[MAX_DDDEVICEID_STRING];
+  LARGE_INTEGER  liDriverVersion;
+  DWORD   dwVendorId;
+  DWORD   dwDeviceId;
+  DWORD   dwSubSysId;
+  DWORD   dwRevision;
+  GUID    guidDeviceIdentifier;
+} DDDEVICEIDENTIFIER, * LPDDDEVICEIDENTIFIER;
+
 #define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
 #define STDMETHOD_(ret,xfn) ret (CALLBACK *fn##xfn)
 #define PURE
@@ -995,11 +1012,65 @@
 };
 #undef THIS
 
+#define THIS LPDIRECTDRAW4 this
+typedef struct IDirectDraw4_VTable
+{
+    /*** IUnknown methods ***/
+/*00*/	STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE;
+/*04*/	STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+/*08*/	STDMETHOD_(ULONG,Release) (THIS) PURE;
+    /*** IDirectDraw methods ***/
+/*0C*/	STDMETHOD(Compact)(THIS) PURE;
+/*10*/	STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE;
+/*14*/	STDMETHOD(CreatePalette)(THIS_ DWORD,LPPALETTEENTRY,
+				 LPDIRECTDRAWPALETTE FAR*, IUnknown FAR *) PURE;
+/*18*/	STDMETHOD(CreateSurface)(THIS_ LPDDSURFACEDESC,LPDIRECTDRAWSURFACE
+				 FAR *, IUnknown FAR *) PURE;
+/*1C*/	STDMETHOD(DuplicateSurface)(THIS_ LPDIRECTDRAWSURFACE, 
+				    LPDIRECTDRAWSURFACE FAR * ) PURE;
+/*20*/	STDMETHOD(EnumDisplayModes)(THIS_ DWORD, LPDDSURFACEDESC, LPVOID,
+				    LPDDENUMMODESCALLBACK ) PURE;
+/*24*/	STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC, LPVOID,
+				LPDDENUMSURFACESCALLBACK ) PURE;
+/*28*/	STDMETHOD(FlipToGDISurface)(THIS) PURE;
+/*2C*/	STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE;
+/*30*/	STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC) PURE;
+/*34*/	STDMETHOD(GetFourCCCodes)(THIS_  LPDWORD, LPDWORD ) PURE;
+/*38*/	STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE FAR *) PURE;
+/*3C*/	STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE;
+/*40*/	STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE;
+/*44*/	STDMETHOD(GetVerticalBlankStatus)(THIS_ BOOL32* ) PURE;
+/*48*/	STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE;
+/*4C*/	STDMETHOD(RestoreDisplayMode)(THIS) PURE;
+/*50*/	STDMETHOD(SetCooperativeLevel)(THIS_ HWND32, DWORD) PURE;
+/*54*/	STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD, DWORD, DWORD, DWORD) PURE;
+/*58*/	STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE32 ) PURE;
+    /*** Added in the v2 interface ***/
+/*5C*/	STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS, LPDWORD, LPDWORD) PURE;
+    /*** Added in the V4 Interface ***/
+/*60*/   STDMETHOD(GetSurfaceFromDC) (THIS_ HDC32, LPDIRECTDRAWSURFACE *) PURE;
+/*64*/   STDMETHOD(RestoreAllSurfaces)(THIS) PURE;
+/*68*/   STDMETHOD(TestCooperativeLevel)(THIS) PURE;
+/*6C*/   STDMETHOD(GetDeviceIdentifier)(THIS_ LPDDDEVICEIDENTIFIER, DWORD ) PURE;
+} IDirectDraw4_VTable,*LPDIRECTDRAW4_VTABLE;
+/* MUST HAVE THE SAME LAYOUT AS struct IDirectDraw */
+
+struct IDirectDraw4 {
+	LPDIRECTDRAW4_VTABLE	lpvtbl;
+	DWORD			ref;
+	struct _common_directdrawdata	d;
+	union {
+		struct _xlib_directdrawdata xlib;
+		struct _dga_directdrawdata dga;
+	} e;
+};
+#undef THIS
+
 #define THIS LPDIRECTDRAWSURFACE this
 struct _common_directdrawsurface {
     LPDIRECTDRAWPALETTE		palette;
     LPDIRECTDRAW2		ddraw;
-    LPDIRECTDRAWSURFACE3	backbuffer;
+    LPDIRECTDRAWSURFACE4	backbuffer;
 
     DDSURFACEDESC               surface_desc;
 };
@@ -1119,7 +1190,6 @@
     struct _common_directdrawsurface	s;
     union {
 	struct _dga_directdrawsurface	dga;
-	struct _xlib_directdrawsurface	xshm;
 	struct _xlib_directdrawsurface	xlib;
     } t;
 };
@@ -1179,12 +1249,78 @@
     struct _common_directdrawsurface	s;
     union {
 	struct _dga_directdrawsurface	dga;
-	struct _xlib_directdrawsurface	xshm;
 	struct _xlib_directdrawsurface	xlib;
     } t;
 };
 #undef THIS
 
+#define THIS LPDIRECTDRAWSURFACE4 this
+
+typedef struct IDirectDrawSurface4_VTable {
+    /*** IUnknown methods ***/
+/*00*/STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE;
+/*04*/STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+/*08*/STDMETHOD_(ULONG,Release) (THIS) PURE;
+    /*** IDirectDrawSurface methods ***/
+/*0c*/STDMETHOD(AddAttachedSurface)(THIS_ LPDIRECTDRAWSURFACE4) PURE;
+/*10*/STDMETHOD(AddOverlayDirtyRect)(THIS_ LPRECT32) PURE;
+/*14*/STDMETHOD(Blt)(THIS_ LPRECT32,LPDIRECTDRAWSURFACE4, LPRECT32,DWORD, LPDDBLTFX) PURE;
+/*18*/STDMETHOD(BltBatch)(THIS_ LPDDBLTBATCH, DWORD, DWORD ) PURE;
+/*1c*/STDMETHOD(BltFast)(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE4, LPRECT32,DWORD) PURE;
+/*20*/STDMETHOD(DeleteAttachedSurface)(THIS_ DWORD,LPDIRECTDRAWSURFACE4) PURE;
+/*24*/STDMETHOD(EnumAttachedSurfaces)(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK) PURE;    
+/*28*/STDMETHOD(EnumOverlayZOrders)(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK) PURE;
+/*2c*/STDMETHOD(Flip)(THIS_ LPDIRECTDRAWSURFACE4, DWORD) PURE;
+/*30*/STDMETHOD(GetAttachedSurface)(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE4 FAR *) PURE;
+/*34*/STDMETHOD(GetBltStatus)(THIS_ DWORD) PURE;
+/*38*/STDMETHOD(GetCaps)(THIS_ LPDDSCAPS) PURE;
+/*3c*/STDMETHOD(GetClipper)(THIS_ LPDIRECTDRAWCLIPPER FAR*) PURE;
+/*40*/STDMETHOD(GetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE;
+/*44*/STDMETHOD(GetDC)(THIS_ HDC32 FAR *) PURE;
+/*48*/STDMETHOD(GetFlipStatus)(THIS_ DWORD) PURE;
+/*4c*/STDMETHOD(GetOverlayPosition)(THIS_ LPLONG, LPLONG ) PURE;
+/*50*/STDMETHOD(GetPalette)(THIS_ LPDIRECTDRAWPALETTE FAR*) PURE;
+/*54*/STDMETHOD(GetPixelFormat)(THIS_ LPDDPIXELFORMAT) PURE;
+/*58*/STDMETHOD(GetSurfaceDesc)(THIS_ LPDDSURFACEDESC) PURE;
+/*5c*/STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC) PURE;
+/*60*/STDMETHOD(IsLost)(THIS) PURE;
+/*64*/STDMETHOD(Lock)(THIS_ LPRECT32,LPDDSURFACEDESC,DWORD,HANDLE32) PURE;
+/*68*/STDMETHOD(ReleaseDC)(THIS_ HDC32) PURE;
+/*6c*/STDMETHOD(Restore)(THIS) PURE;
+/*70*/STDMETHOD(SetClipper)(THIS_ LPDIRECTDRAWCLIPPER) PURE;
+/*74*/STDMETHOD(SetColorKey)(THIS_ DWORD, LPDDCOLORKEY) PURE;
+/*78*/STDMETHOD(SetOverlayPosition)(THIS_ LONG, LONG ) PURE;
+/*7c*/STDMETHOD(SetPalette)(THIS_ LPDIRECTDRAWPALETTE) PURE;
+/*80*/STDMETHOD(Unlock)(THIS_ LPVOID) PURE;
+/*84*/STDMETHOD(UpdateOverlay)(THIS_ LPRECT32, LPDIRECTDRAWSURFACE4,LPRECT32,DWORD, LPDDOVERLAYFX) PURE;
+/*88*/STDMETHOD(UpdateOverlayDisplay)(THIS_ DWORD) PURE;
+/*8c*/STDMETHOD(UpdateOverlayZOrder)(THIS_ DWORD, LPDIRECTDRAWSURFACE4) PURE;
+    /*** Added in the v2 interface ***/
+/*90*/STDMETHOD(GetDDInterface)(THIS_ LPVOID FAR *) PURE;
+/*94*/STDMETHOD(PageLock)(THIS_ DWORD) PURE;
+/*98*/STDMETHOD(PageUnlock)(THIS_ DWORD) PURE;
+    /*** Added in the V3 interface ***/
+/*9c*/STDMETHOD(SetSurfaceDesc)(THIS_ LPDDSURFACEDESC, DWORD) PURE;
+    /*** Added in the v4 interface ***/
+/*a0*/STDMETHOD(SetPrivateData)(THIS_ REFGUID, LPVOID, DWORD, DWORD) PURE;
+/*a4*/STDMETHOD(GetPrivateData)(THIS_ REFGUID, LPVOID, LPDWORD) PURE;
+/*a8*/STDMETHOD(FreePrivateData)(THIS_ REFGUID) PURE;
+/*ac*/STDMETHOD(GetUniquenessValue)(THIS_ LPDWORD) PURE;
+/*b0*/STDMETHOD(ChangeUniquenessValue)(THIS) PURE;
+} *LPDIRECTDRAWSURFACE4_VTABLE,IDirectDrawSurface4_VTable;
+
+struct IDirectDrawSurface4 {
+    LPDIRECTDRAWSURFACE4_VTABLE	lpvtbl;
+    DWORD			ref;
+    struct _common_directdrawsurface	s;
+    union {
+	struct _dga_directdrawsurface	dga;
+	struct _xlib_directdrawsurface	xlib;
+    } t;
+};
+#undef THIS
+
+
 #define THIS LPDIRECTDRAWCOLORCONTROL this
 typedef struct IDirectDrawColorControl_VTable {
 	/*** IUnknown methods ***/