diff --git a/dlls/ddraw/ddcomimpl.h b/dlls/ddraw/ddcomimpl.h
index 394823d6df7470f5f4ec237b243988903a507da3..93915160cce55476c27e17c92e519ebf18081074 100644
--- a/dlls/ddraw/ddcomimpl.h
+++ b/dlls/ddraw/ddcomimpl.h
@@ -27,9 +27,6 @@
 	(impltype*)((ifaceptr) == NULL ? NULL			\
 		  : (char*)(ifaceptr) - offsetof(impltype, ifacename##_vtbl))
 
-#define ICOM_THIS_FROM(impltype, ifacename, ifaceptr) \
-	impltype* This = ICOM_OBJECT(impltype, ifacename, ifaceptr)
-
 #define COM_INTERFACE_CAST(impltype, ifnamefrom, ifnameto, ifaceptr) \
     ((ifaceptr) ? (ifnameto *)&(((impltype *)((char *)(ifaceptr) \
     - offsetof(impltype, ifnamefrom##_vtbl)))->ifnameto##_vtbl) : NULL)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index b7d4173c1124d10d40064074accbefa375885e8b..cdd90c3213144461cc84dbc9acaa25dd351e7ce3 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -91,7 +91,7 @@ IDirectDrawImpl_QueryInterface(IDirectDraw7 *iface,
                                REFIID refiid,
                                void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
 
     TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(refiid), obj);
 
@@ -234,7 +234,7 @@ IDirectDrawImpl_QueryInterface(IDirectDraw7 *iface,
 static ULONG WINAPI
 IDirectDrawImpl_AddRef(IDirectDraw7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref7);
 
     TRACE("(%p) : incrementing IDirectDraw7 refcount from %u.\n", This, ref -1);
@@ -293,7 +293,7 @@ IDirectDrawImpl_Destroy(IDirectDrawImpl *This)
 static ULONG WINAPI
 IDirectDrawImpl_Release(IDirectDraw7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref7);
 
     TRACE("(%p)->() decrementing IDirectDraw7 refcount from %u.\n", This, ref +1);
@@ -360,7 +360,7 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface,
                                     HWND hwnd,
                                     DWORD cooplevel)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     HWND window;
 
     TRACE("(%p)->(%p,%08x)\n",This,hwnd,cooplevel);
@@ -546,7 +546,7 @@ IDirectDrawImpl_SetDisplayModeNoOverride(IDirectDraw7 *iface,
                                          DWORD RefreshRate,
                                          DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     WINED3DDISPLAYMODE Mode;
     HRESULT hr;
     TRACE("(%p)->(%d,%d,%d,%d,%x): Relay!\n", This, Width, Height, BPP, RefreshRate, Flags);
@@ -662,7 +662,7 @@ IDirectDrawImpl_SetDisplayMode(IDirectDraw7 *iface,
 static HRESULT WINAPI
 IDirectDrawImpl_RestoreDisplayMode(IDirectDraw7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     TRACE("(%p)\n", This);
 
     return IDirectDrawImpl_SetDisplayModeNoOverride(iface,
@@ -689,7 +689,7 @@ IDirectDrawImpl_GetCaps(IDirectDraw7 *iface,
                         DDCAPS *DriverCaps,
                         DDCAPS *HELCaps)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     DDCAPS caps;
     WINED3DCAPS winecaps;
     HRESULT hr;
@@ -784,7 +784,7 @@ IDirectDrawImpl_GetCaps(IDirectDraw7 *iface,
 static HRESULT WINAPI
 IDirectDrawImpl_Compact(IDirectDraw7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     TRACE("(%p)\n", This);
 
     return DD_OK;
@@ -808,7 +808,7 @@ static HRESULT WINAPI
 IDirectDrawImpl_GetDisplayMode(IDirectDraw7 *iface,
                                DDSURFACEDESC2 *DDSD)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     HRESULT hr;
     WINED3DDISPLAYMODE Mode;
     DWORD Size;
@@ -879,7 +879,7 @@ static HRESULT WINAPI
 IDirectDrawImpl_GetFourCCCodes(IDirectDraw7 *iface,
                                DWORD *NumCodes, DWORD *Codes)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     WINED3DFORMAT formats[] = {
         WINED3DFMT_YUY2, WINED3DFMT_UYVY, WINED3DFMT_YV12,
         WINED3DFMT_DXT1, WINED3DFMT_DXT2, WINED3DFMT_DXT3, WINED3DFMT_DXT4, WINED3DFMT_DXT5,
@@ -941,7 +941,7 @@ static HRESULT WINAPI
 IDirectDrawImpl_GetMonitorFrequency(IDirectDraw7 *iface,
                                     DWORD *Freq)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     TRACE("(%p)->(%p)\n", This, Freq);
 
     /* Ideally this should be in WineD3D, as it concerns the screen setup,
@@ -969,7 +969,7 @@ static HRESULT WINAPI
 IDirectDrawImpl_GetVerticalBlankStatus(IDirectDraw7 *iface,
                                        BOOL *status)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     TRACE("(%p)->(%p)\n", This, status);
 
     /* This looks sane, the MSDN suggests it too */
@@ -1004,7 +1004,7 @@ IDirectDrawImpl_GetVerticalBlankStatus(IDirectDraw7 *iface,
 static HRESULT WINAPI
 IDirectDrawImpl_GetAvailableVidMem(IDirectDraw7 *iface, DDSCAPS2 *Caps, DWORD *total, DWORD *free)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     TRACE("(%p)->(%p, %p, %p)\n", This, Caps, total, free);
 
     if(TRACE_ON(ddraw))
@@ -1050,7 +1050,7 @@ static HRESULT WINAPI
 IDirectDrawImpl_Initialize(IDirectDraw7 *iface,
                            GUID *Guid)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     TRACE("(%p)->(%s): No-op\n", This, debugstr_guid(Guid));
 
     if(This->initialized)
@@ -1079,7 +1079,7 @@ IDirectDrawImpl_Initialize(IDirectDraw7 *iface,
 static HRESULT WINAPI
 IDirectDrawImpl_FlipToGDISurface(IDirectDraw7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     TRACE("(%p)\n", This);
 
     return DD_OK;
@@ -1107,7 +1107,7 @@ IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw7 *iface,
                                      DWORD Flags,
                                      HANDLE h)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     static BOOL hide = FALSE;
 
     /* This function is called often, so print the fixme only once */
@@ -1138,7 +1138,7 @@ IDirectDrawImpl_WaitForVerticalBlank(IDirectDraw7 *iface,
  *****************************************************************************/ 
 static HRESULT WINAPI IDirectDrawImpl_GetScanLine(IDirectDraw7 *iface, DWORD *Scanline)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     static BOOL hide = FALSE;
     WINED3DDISPLAYMODE Mode;
 
@@ -1180,7 +1180,7 @@ static HRESULT WINAPI IDirectDrawImpl_GetScanLine(IDirectDraw7 *iface, DWORD *Sc
 static HRESULT WINAPI
 IDirectDrawImpl_TestCooperativeLevel(IDirectDraw7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     HRESULT hr;
     TRACE("(%p)\n", This);
 
@@ -1248,7 +1248,7 @@ static HRESULT WINAPI
 IDirectDrawImpl_GetGDISurface(IDirectDraw7 *iface,
                               IDirectDrawSurface7 **GDISurface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     IWineD3DSurface *Surf;
     IDirectDrawSurface7 *ddsurf;
     HRESULT hr;
@@ -1319,7 +1319,7 @@ IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface,
                                  void *Context,
                                  LPDDENUMMODESCALLBACK2 cb)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     unsigned int modenum, fmt;
     WINED3DFORMAT pixelformat = WINED3DFMT_UNKNOWN;
     WINED3DDISPLAYMODE mode;
@@ -1500,7 +1500,7 @@ IDirectDrawImpl_EvaluateMode(IDirectDraw7 *iface,
                              DWORD Flags,
                              DWORD *Timeout)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     FIXME("(%p)->(%d,%p): Stub!\n", This, Flags, Timeout);
 
     /* When implementing this, implement it in WineD3D */
@@ -1528,7 +1528,7 @@ IDirectDrawImpl_GetDeviceIdentifier(IDirectDraw7 *iface,
                                     DDDEVICEIDENTIFIER2 *DDDI,
                                     DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     TRACE("(%p)->(%p,%08x)\n", This, DDDI, Flags);
 
     if(!DDDI)
@@ -1562,7 +1562,7 @@ IDirectDrawImpl_GetSurfaceFromDC(IDirectDraw7 *iface,
                                  HDC hdc,
                                  IDirectDrawSurface7 **Surface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     FIXME("(%p)->(%p,%p): Stub!\n", This, hdc, Surface);
 
     /* Implementation idea if needed: Loop through all surfaces and compare
@@ -1584,7 +1584,7 @@ IDirectDrawImpl_GetSurfaceFromDC(IDirectDraw7 *iface,
 static HRESULT WINAPI
 IDirectDrawImpl_RestoreAllSurfaces(IDirectDraw7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     FIXME("(%p): Stub\n", This);
 
     /* This isn't hard to implement: Enumerate all WineD3D surfaces,
@@ -1623,7 +1623,7 @@ IDirectDrawImpl_StartModeTest(IDirectDraw7 *iface,
                               DWORD NumModes,
                               DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     WARN("(%p)->(%p, %d, %x): Semi-Stub, most likely harmless\n", This, Modes, NumModes, Flags);
 
     /* This looks sane */
@@ -2326,7 +2326,7 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface,
                               IDirectDrawSurface7 **Surf,
                               IUnknown *UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     IDirectDrawSurfaceImpl *object = NULL;
     HRESULT hr;
     LONG extra_surfaces = 0;
@@ -2890,7 +2890,7 @@ IDirectDrawImpl_EnumSurfaces(IDirectDraw7 *iface,
      * because WineDDraw doesn't handle ddraw-like surface
      * caps structures
      */
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     IDirectDrawSurfaceImpl *surf;
     BOOL all, nomatch;
     DDSURFACEDESC2 desc;
@@ -3157,7 +3157,7 @@ IDirectDrawImpl_CreateClipper(IDirectDraw7 *iface,
                               IDirectDrawClipper **Clipper,
                               IUnknown *UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     TRACE("(%p)->(%x,%p,%p)\n", This, Flags, Clipper, UnkOuter);
     return DirectDrawCreateClipper(Flags, Clipper, UnkOuter);
 }
@@ -3186,7 +3186,7 @@ IDirectDrawImpl_CreatePalette(IDirectDraw7 *iface,
                               IDirectDrawPalette **Palette,
                               IUnknown *pUnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     IDirectDrawPaletteImpl *object;
     HRESULT hr = DDERR_GENERIC;
     TRACE("(%p)->(%x,%p,%p,%p)\n", This, Flags, ColorTable, Palette, pUnkOuter);
@@ -3257,7 +3257,7 @@ IDirectDrawImpl_DuplicateSurface(IDirectDraw7 *iface,
                                  IDirectDrawSurface7 *Src,
                                  IDirectDrawSurface7 **Dest)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
+    IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
     IDirectDrawSurfaceImpl *Surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, Src);
 
     FIXME("(%p)->(%p,%p)\n", This, Surf, Dest);
diff --git a/dlls/ddraw/ddraw_thunks.c b/dlls/ddraw/ddraw_thunks.c
index 1ae1d192cfc886c21c880b8daf664ea561d76c3e..c59669bf2321f420d8dc3d77ec4825657e2ea193 100644
--- a/dlls/ddraw/ddraw_thunks.c
+++ b/dlls/ddraw/ddraw_thunks.c
@@ -42,6 +42,26 @@
 WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk);
 WINE_DECLARE_DEBUG_CHANNEL(ddraw);
 
+static inline IDirectDrawImpl *ddraw_from_ddraw1(IDirectDraw *iface)
+{
+    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw_vtbl));
+}
+
+static inline IDirectDrawImpl *ddraw_from_ddraw2(IDirectDraw2 *iface)
+{
+    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw2_vtbl));
+}
+
+static inline IDirectDrawImpl *ddraw_from_ddraw3(IDirectDraw3 *iface)
+{
+    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw3_vtbl));
+}
+
+static inline IDirectDrawImpl *ddraw_from_ddraw4(IDirectDraw4 *iface)
+{
+    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirectDraw4_vtbl));
+}
+
 static HRESULT WINAPI
 IDirectDrawImpl_QueryInterface(LPDIRECTDRAW This, REFIID iid, LPVOID *ppObj)
 {
@@ -81,7 +101,7 @@ IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This, REFIID iid, LPVOID *ppObj)
 static ULONG WINAPI
 IDirectDrawImpl_AddRef(LPDIRECTDRAW iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
     ULONG ref = InterlockedIncrement(&This->ref1);
 
     TRACE("(%p) : incrementing IDirectDraw refcount from %u.\n", This, ref -1);
@@ -94,7 +114,7 @@ IDirectDrawImpl_AddRef(LPDIRECTDRAW iface)
 static ULONG WINAPI
 IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw2, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
     ULONG ref = InterlockedIncrement(&This->ref2);
 
     TRACE("(%p) : incrementing IDirectDraw2 refcount from %u.\n", This, ref -1);
@@ -107,7 +127,7 @@ IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface)
 static ULONG WINAPI
 IDirectDraw3Impl_AddRef(LPDIRECTDRAW3 iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw3, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw3(iface);
     ULONG ref = InterlockedIncrement(&This->ref3);
 
     TRACE("(%p) : incrementing IDirectDraw3 refcount from %u.\n", This, ref -1);
@@ -120,7 +140,7 @@ IDirectDraw3Impl_AddRef(LPDIRECTDRAW3 iface)
 static ULONG WINAPI
 IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw4, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
     ULONG ref = InterlockedIncrement(&This->ref4);
 
     TRACE("(%p) : incrementing IDirectDraw4 refcount from %u.\n", This, ref -1);
@@ -133,7 +153,7 @@ IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 iface)
 static ULONG WINAPI
 IDirectDrawImpl_Release(LPDIRECTDRAW iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
     ULONG ref = InterlockedDecrement(&This->ref1);
 
     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw refcount from %u.\n", This, ref +1);
@@ -150,7 +170,7 @@ IDirectDrawImpl_Release(LPDIRECTDRAW iface)
 static ULONG WINAPI
 IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw2, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
     ULONG ref = InterlockedDecrement(&This->ref2);
 
     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw2 refcount from %u.\n", This, ref +1);
@@ -167,7 +187,7 @@ IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface)
 static ULONG WINAPI
 IDirectDraw3Impl_Release(LPDIRECTDRAW3 iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw3, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw3(iface);
     ULONG ref = InterlockedDecrement(&This->ref3);
 
     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw3 refcount from %u.\n", This, ref +1);
@@ -184,7 +204,7 @@ IDirectDraw3Impl_Release(LPDIRECTDRAW3 iface)
 static ULONG WINAPI
 IDirectDraw4Impl_Release(LPDIRECTDRAW4 iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw4, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
     ULONG ref = InterlockedDecrement(&This->ref4);
 
     TRACE_(ddraw)("(%p)->() decrementing IDirectDraw4 refcount from %u.\n", This, ref +1);
@@ -1123,7 +1143,7 @@ IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This, LPBOOL lpbIsInVB)
 static HRESULT WINAPI
 IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
     HRESULT ret_value;
 
     ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
@@ -1134,7 +1154,7 @@ IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID)
 static HRESULT WINAPI
 IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw2, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
     HRESULT ret_value;
 
     ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
@@ -1145,7 +1165,7 @@ IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID)
 static HRESULT WINAPI
 IDirectDraw3Impl_Initialize(LPDIRECTDRAW3 iface, LPGUID pGUID)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw3, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw3(iface);
     HRESULT ret_value;
 
     ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
@@ -1156,7 +1176,7 @@ IDirectDraw3Impl_Initialize(LPDIRECTDRAW3 iface, LPGUID pGUID)
 static HRESULT WINAPI
 IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw4, iface);
+    IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
     HRESULT ret_value;
 
     ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 9855e75e7c34562870e31ea313ecb5db3bbdbc23..dad204703ff7d0e2d7a4182079de32f829a1885a 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -93,6 +93,21 @@ static inline WORD d3d_fpu_setup(void)
     return oldcw;
 }
 
+static inline IDirect3DDeviceImpl *device_from_device1(IDirect3DDevice *iface)
+{
+    return (IDirect3DDeviceImpl *)((char*)iface - FIELD_OFFSET(IDirect3DDeviceImpl, IDirect3DDevice_vtbl));
+}
+
+static inline IDirect3DDeviceImpl *device_from_device2(IDirect3DDevice2 *iface)
+{
+    return (IDirect3DDeviceImpl *)((char*)iface - FIELD_OFFSET(IDirect3DDeviceImpl, IDirect3DDevice2_vtbl));
+}
+
+static inline IDirect3DDeviceImpl *device_from_device3(IDirect3DDevice3 *iface)
+{
+    return (IDirect3DDeviceImpl *)((char*)iface - FIELD_OFFSET(IDirect3DDeviceImpl, IDirect3DDevice3_vtbl));
+}
+
 /*****************************************************************************
  * IUnknown Methods. Common for Version 1, 2, 3 and 7 
  *****************************************************************************/
@@ -120,7 +135,7 @@ IDirect3DDeviceImpl_7_QueryInterface(IDirect3DDevice7 *iface,
                                      REFIID refiid,
                                      void **obj)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(refiid), obj);
 
     /* According to COM docs, if the QueryInterface fails, obj should be set to NULL */
@@ -214,7 +229,7 @@ Thunk_IDirect3DDeviceImpl_3_QueryInterface(IDirect3DDevice3 *iface,
                                            REFIID riid,
                                            void **obj)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", This, debugstr_guid(riid), obj);
     return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)This, riid, obj);
 }
@@ -224,7 +239,7 @@ Thunk_IDirect3DDeviceImpl_2_QueryInterface(IDirect3DDevice2 *iface,
                                            REFIID riid,
                                            void **obj)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", This, debugstr_guid(riid), obj);
     return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)This, riid, obj);
 }
@@ -234,7 +249,7 @@ Thunk_IDirect3DDeviceImpl_1_QueryInterface(IDirect3DDevice *iface,
                                            REFIID riid,
                                            void **obp)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", This, debugstr_guid(riid), obp);
     return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)This, riid, obp);
 }
@@ -254,7 +269,7 @@ Thunk_IDirect3DDeviceImpl_1_QueryInterface(IDirect3DDevice *iface,
 static ULONG WINAPI
 IDirect3DDeviceImpl_7_AddRef(IDirect3DDevice7 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p) : incrementing from %u.\n", This, ref -1);
@@ -265,7 +280,7 @@ IDirect3DDeviceImpl_7_AddRef(IDirect3DDevice7 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DDeviceImpl_3_AddRef(IDirect3DDevice3 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)This);
 }
@@ -273,7 +288,7 @@ Thunk_IDirect3DDeviceImpl_3_AddRef(IDirect3DDevice3 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DDeviceImpl_2_AddRef(IDirect3DDevice2 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)This);
 }
@@ -300,7 +315,7 @@ Thunk_IDirect3DDeviceImpl_1_AddRef(IDirect3DDevice *iface)
 static ULONG WINAPI
 IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->() decrementing from %u.\n", This, ref +1);
@@ -435,7 +450,7 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DDeviceImpl_3_Release(IDirect3DDevice3 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_Release((IDirect3DDevice7 *)This);
 }
@@ -443,7 +458,7 @@ Thunk_IDirect3DDeviceImpl_3_Release(IDirect3DDevice3 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DDeviceImpl_2_Release(IDirect3DDevice2 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_Release((IDirect3DDevice7 *)This);
 }
@@ -451,7 +466,7 @@ Thunk_IDirect3DDeviceImpl_2_Release(IDirect3DDevice2 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DDeviceImpl_1_Release(IDirect3DDevice *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_Release((IDirect3DDevice7 *)This);
 }
@@ -479,7 +494,7 @@ IDirect3DDeviceImpl_1_Initialize(IDirect3DDevice *iface,
                                  IDirect3D *Direct3D, GUID *guid,
                                  D3DDEVICEDESC *Desc)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
 
     /* It shouldn't be crucial, but print a FIXME, I'm interested if
      * any game calls it and when
@@ -509,7 +524,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_GetCaps(IDirect3DDevice7 *iface,
                               D3DDEVICEDESC7 *Desc)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     D3DDEVICEDESC OldDesc;
     TRACE("(%p)->(%p)\n", This, Desc);
 
@@ -559,7 +574,7 @@ IDirect3DDeviceImpl_3_GetCaps(IDirect3DDevice3 *iface,
                               D3DDEVICEDESC *HWDesc,
                               D3DDEVICEDESC *HelDesc)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     D3DDEVICEDESC7 newDesc;
     HRESULT hr;
     TRACE("(%p)->(%p,%p)\n", iface, HWDesc, HelDesc);
@@ -576,7 +591,7 @@ Thunk_IDirect3DDeviceImpl_2_GetCaps(IDirect3DDevice2 *iface,
                                     D3DDEVICEDESC *D3DHWDevDesc,
                                     D3DDEVICEDESC *D3DHELDevDesc)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", This, D3DHWDevDesc, D3DHELDevDesc);
     return IDirect3DDevice3_GetCaps((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, D3DHWDevDesc, D3DHELDevDesc);
 }
@@ -586,7 +601,7 @@ Thunk_IDirect3DDeviceImpl_1_GetCaps(IDirect3DDevice *iface,
                                     D3DDEVICEDESC *D3DHWDevDesc,
                                     D3DDEVICEDESC *D3DHELDevDesc)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", This, D3DHWDevDesc, D3DHELDevDesc);
     return IDirect3DDevice3_GetCaps((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, D3DHWDevDesc, D3DHELDevDesc);
 }
@@ -608,7 +623,7 @@ IDirect3DDeviceImpl_2_SwapTextureHandles(IDirect3DDevice2 *iface,
                                          IDirect3DTexture2 *Tex1,
                                          IDirect3DTexture2 *Tex2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     DWORD swap;
     IDirectDrawSurfaceImpl *surf1 = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture2, Tex1);
     IDirectDrawSurfaceImpl *surf2 = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture2, Tex2);
@@ -631,7 +646,7 @@ Thunk_IDirect3DDeviceImpl_1_SwapTextureHandles(IDirect3DDevice *iface,
                                                IDirect3DTexture *D3DTex1,
                                                IDirect3DTexture *D3DTex2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     IDirectDrawSurfaceImpl *surf1 = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture, D3DTex1);
     IDirectDrawSurfaceImpl *surf2 = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture, D3DTex2);
     IDirect3DTexture2 *t1 = surf1 ? (IDirect3DTexture2 *)&surf1->IDirect3DTexture2_vtbl : NULL;
@@ -662,7 +677,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_3_GetStats(IDirect3DDevice3 *iface,
                                D3DSTATS *Stats)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     FIXME("(%p)->(%p): Stub!\n", This, Stats);
 
     if(!Stats)
@@ -682,7 +697,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_GetStats(IDirect3DDevice2 *iface,
                                      D3DSTATS *Stats)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, Stats);
     return IDirect3DDevice3_GetStats((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, Stats);
 }
@@ -691,7 +706,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_1_GetStats(IDirect3DDevice *iface,
                                      D3DSTATS *Stats)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, Stats);
     return IDirect3DDevice3_GetStats((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, Stats);
 }
@@ -722,7 +737,7 @@ IDirect3DDeviceImpl_1_CreateExecuteBuffer(IDirect3DDevice *iface,
                                           IDirect3DExecuteBuffer **ExecuteBuffer,
                                           IUnknown *UnkOuter)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     IDirect3DExecuteBufferImpl* object;
     TRACE("(%p)->(%p,%p,%p)!\n", This, Desc, ExecuteBuffer, UnkOuter);
 
@@ -805,7 +820,7 @@ IDirect3DDeviceImpl_1_Execute(IDirect3DDevice *iface,
                               IDirect3DViewport *Viewport,
                               DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     IDirect3DExecuteBufferImpl *Direct3DExecuteBufferImpl = ICOM_OBJECT(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, ExecuteBuffer);
     IDirect3DViewportImpl *Direct3DViewportImpl = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Viewport);
 
@@ -843,7 +858,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_3_AddViewport(IDirect3DDevice3 *iface,
                                   IDirect3DViewport3 *Viewport)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Viewport);
 
     TRACE("(%p)->(%p)\n", This, vp);
@@ -866,7 +881,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_AddViewport(IDirect3DDevice2 *iface,
                                         IDirect3DViewport2 *Direct3DViewport2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Direct3DViewport2);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp);
     return IDirect3DDevice3_AddViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp);
@@ -876,7 +891,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_1_AddViewport(IDirect3DDevice *iface,
                                         IDirect3DViewport *Direct3DViewport)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Direct3DViewport);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp);
     return IDirect3DDevice3_AddViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp);
@@ -902,7 +917,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_3_DeleteViewport(IDirect3DDevice3 *iface,
                                      IDirect3DViewport3 *Viewport)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *) Viewport;
     IDirect3DViewportImpl *cur_viewport, *prev_viewport = NULL;
 
@@ -932,7 +947,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_DeleteViewport(IDirect3DDevice2 *iface,
                                            IDirect3DViewport2 *Direct3DViewport2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Direct3DViewport2);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp);
     return IDirect3DDevice3_DeleteViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp);
@@ -942,7 +957,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_1_DeleteViewport(IDirect3DDevice *iface,
                                            IDirect3DViewport *Direct3DViewport)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Direct3DViewport);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp);
     return IDirect3DDevice3_DeleteViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp);
@@ -972,7 +987,7 @@ IDirect3DDeviceImpl_3_NextViewport(IDirect3DDevice3 *iface,
                                    IDirect3DViewport3 **lplpDirect3DViewport3,
                                    DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Viewport3);
     IDirect3DViewportImpl *res = NULL;
 
@@ -1025,7 +1040,7 @@ Thunk_IDirect3DDeviceImpl_2_NextViewport(IDirect3DDevice2 *iface,
                                          IDirect3DViewport2 **lplpDirect3DViewport2,
                                          DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Viewport2);
     IDirect3DViewport3 *res;
     HRESULT hr;
@@ -1042,7 +1057,7 @@ Thunk_IDirect3DDeviceImpl_1_NextViewport(IDirect3DDevice *iface,
                                          IDirect3DViewport **lplpDirect3DViewport,
                                          DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Viewport);
     IDirect3DViewport3 *res;
     HRESULT hr;
@@ -1081,7 +1096,7 @@ IDirect3DDeviceImpl_1_Pick(IDirect3DDevice *iface,
                            DWORD Flags,
                            D3DRECT *Rect)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     IDirect3DExecuteBufferImpl *execbuf = ICOM_OBJECT(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, ExecuteBuffer);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Viewport);
     FIXME("(%p)->(%p,%p,%08x,%p): stub!\n", This, execbuf, vp, Flags, Rect);
@@ -1110,7 +1125,7 @@ IDirect3DDeviceImpl_1_GetPickRecords(IDirect3DDevice *iface,
                                      DWORD *Count,
                                      D3DPICKRECORD *D3DPickRec)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     FIXME("(%p)->(%p,%p): stub!\n", This, Count, D3DPickRec);
 
     return D3D_OK;
@@ -1140,7 +1155,7 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface,
                                          LPD3DENUMPIXELFORMATSCALLBACK Callback,
                                          void *Arg)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     WINED3DDISPLAYMODE mode;
     unsigned int i;
@@ -1282,7 +1297,7 @@ Thunk_IDirect3DDeviceImpl_3_EnumTextureFormats(IDirect3DDevice3 *iface,
                                                LPD3DENUMPIXELFORMATSCALLBACK Callback,
                                                void *Arg)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice7 interface.\n", This, Callback, Arg);
     return IDirect3DDevice7_EnumTextureFormats((IDirect3DDevice7 *)This, Callback, Arg);
 }
@@ -1302,7 +1317,7 @@ IDirect3DDeviceImpl_2_EnumTextureFormats(IDirect3DDevice2 *iface,
                                          LPD3DENUMTEXTUREFORMATSCALLBACK Callback,
                                          void *Arg)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     HRESULT hr;
     unsigned int i;
     WINED3DDISPLAYMODE mode;
@@ -1382,7 +1397,7 @@ Thunk_IDirect3DDeviceImpl_1_EnumTextureFormats(IDirect3DDevice *iface,
                                                LPD3DENUMTEXTUREFORMATSCALLBACK Callback,
                                                void *Arg)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice2 interface.\n", This, Callback, Arg);
     return IDirect3DDevice2_EnumTextureFormats((IDirect3DDevice2 *)&This->IDirect3DDevice2_vtbl, Callback, Arg);
 }
@@ -1406,7 +1421,7 @@ Thunk_IDirect3DDeviceImpl_1_EnumTextureFormats(IDirect3DDevice *iface,
 static HRESULT WINAPI
 IDirect3DDeviceImpl_1_CreateMatrix(IDirect3DDevice *iface, D3DMATRIXHANDLE *D3DMatHandle)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     D3DMATRIX *Matrix;
     TRACE("(%p)->(%p)\n", This, D3DMatHandle);
 
@@ -1460,7 +1475,7 @@ IDirect3DDeviceImpl_1_SetMatrix(IDirect3DDevice *iface,
                                 D3DMATRIXHANDLE D3DMatHandle,
                                 D3DMATRIX *D3DMatrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE("(%p)->(%08x,%p)\n", This, D3DMatHandle, D3DMatrix);
 
     if( (!D3DMatHandle) || (!D3DMatrix) )
@@ -1529,7 +1544,7 @@ IDirect3DDeviceImpl_1_GetMatrix(IDirect3DDevice *iface,
                                 D3DMATRIXHANDLE D3DMatHandle,
                                 D3DMATRIX *D3DMatrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE("(%p)->(%08x,%p)\n", This, D3DMatHandle, D3DMatrix);
 
     if(!D3DMatrix)
@@ -1577,7 +1592,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_1_DeleteMatrix(IDirect3DDevice *iface,
                                    D3DMATRIXHANDLE D3DMatHandle)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE("(%p)->(%08x)\n", This, D3DMatHandle);
 
     if(!D3DMatHandle)
@@ -1622,7 +1637,7 @@ IDirect3DDeviceImpl_1_DeleteMatrix(IDirect3DDevice *iface,
 static HRESULT
 IDirect3DDeviceImpl_7_BeginScene(IDirect3DDevice7 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p): Relay\n", This);
 
@@ -1655,7 +1670,7 @@ IDirect3DDeviceImpl_7_BeginScene_FPUPreserve(IDirect3DDevice7 *iface)
 static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_3_BeginScene(IDirect3DDevice3 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)This);
 }
@@ -1663,7 +1678,7 @@ Thunk_IDirect3DDeviceImpl_3_BeginScene(IDirect3DDevice3 *iface)
 static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_BeginScene(IDirect3DDevice2 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)This);
 }
@@ -1671,7 +1686,7 @@ Thunk_IDirect3DDeviceImpl_2_BeginScene(IDirect3DDevice2 *iface)
 static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_1_BeginScene(IDirect3DDevice *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)This);
 }
@@ -1693,7 +1708,7 @@ Thunk_IDirect3DDeviceImpl_1_BeginScene(IDirect3DDevice *iface)
 static HRESULT
 IDirect3DDeviceImpl_7_EndScene(IDirect3DDevice7 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p): Relay\n", This);
 
@@ -1726,7 +1741,7 @@ IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface)
 static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This);
 }
@@ -1734,7 +1749,7 @@ Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface)
 static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This);
 }
@@ -1742,7 +1757,7 @@ Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface)
 static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_1_EndScene(IDirect3DDevice *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This);
     return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This);
 }
@@ -1765,7 +1780,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_7_GetDirect3D(IDirect3DDevice7 *iface,
                                   IDirect3D7 **Direct3D7)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     TRACE("(%p)->(%p)\n", This, Direct3D7);
 
     if(!Direct3D7)
@@ -1782,7 +1797,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_3_GetDirect3D(IDirect3DDevice3 *iface,
                                         IDirect3D3 **Direct3D3)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     HRESULT ret;
     IDirect3D7 *ret_ptr;
 
@@ -1799,7 +1814,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_GetDirect3D(IDirect3DDevice2 *iface,
                                         IDirect3D2 **Direct3D2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     HRESULT ret;
     IDirect3D7 *ret_ptr;
 
@@ -1816,7 +1831,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_1_GetDirect3D(IDirect3DDevice *iface,
                                         IDirect3D **Direct3D)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice, iface);
+    IDirect3DDeviceImpl *This = device_from_device1(iface);
     HRESULT ret;
     IDirect3D7 *ret_ptr;
 
@@ -1849,7 +1864,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_3_SetCurrentViewport(IDirect3DDevice3 *iface,
                                          IDirect3DViewport3 *Direct3DViewport3)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Direct3DViewport3);
     TRACE("(%p)->(%p)\n", This, Direct3DViewport3);
 
@@ -1887,7 +1902,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_SetCurrentViewport(IDirect3DDevice2 *iface,
                                                IDirect3DViewport2 *Direct3DViewport2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, Direct3DViewport2);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp);
     return IDirect3DDevice3_SetCurrentViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl,
@@ -1913,7 +1928,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_3_GetCurrentViewport(IDirect3DDevice3 *iface,
                                          IDirect3DViewport3 **Direct3DViewport3)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE("(%p)->(%p)\n", This, Direct3DViewport3);
 
     if(!Direct3DViewport3)
@@ -1935,7 +1950,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_GetCurrentViewport(IDirect3DDevice2 *iface,
                                                IDirect3DViewport2 **Direct3DViewport2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     HRESULT hr;
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, Direct3DViewport2);
     hr = IDirect3DDevice3_GetCurrentViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl,
@@ -1968,7 +1983,7 @@ IDirect3DDeviceImpl_7_SetRenderTarget(IDirect3DDevice7 *iface,
                                       IDirectDrawSurface7 *NewTarget,
                                       DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     IDirectDrawSurfaceImpl *Target = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, NewTarget);
     HRESULT hr;
     TRACE("(%p)->(%p,%08x): Relay\n", This, NewTarget, Flags);
@@ -2027,7 +2042,7 @@ Thunk_IDirect3DDeviceImpl_3_SetRenderTarget(IDirect3DDevice3 *iface,
                                             IDirectDrawSurface4 *NewRenderTarget,
                                             DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     IDirectDrawSurfaceImpl *Target = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, NewRenderTarget);
     TRACE_(ddraw_thunk)("(%p)->(%p,%08x) thunking to IDirect3DDevice7 interface.\n", This, Target, Flags);
     return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 *)Target, Flags);
@@ -2038,7 +2053,7 @@ Thunk_IDirect3DDeviceImpl_2_SetRenderTarget(IDirect3DDevice2 *iface,
                                             IDirectDrawSurface *NewRenderTarget,
                                             DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     IDirectDrawSurfaceImpl *Target = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface3, NewRenderTarget);
     TRACE_(ddraw_thunk)("(%p)->(%p,%08x) thunking to IDirect3DDevice7 interface.\n", This, Target, Flags);
     return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 *)Target, Flags);
@@ -2065,7 +2080,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_7_GetRenderTarget(IDirect3DDevice7 *iface,
                                       IDirectDrawSurface7 **RenderTarget)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     TRACE("(%p)->(%p): Relay\n", This, RenderTarget);
 
     if(!RenderTarget)
@@ -2083,7 +2098,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_3_GetRenderTarget(IDirect3DDevice3 *iface,
                                             IDirectDrawSurface4 **RenderTarget)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     HRESULT hr;
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, RenderTarget);
     hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget);
@@ -2096,7 +2111,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_GetRenderTarget(IDirect3DDevice2 *iface,
                                             IDirectDrawSurface **RenderTarget)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     HRESULT hr;
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, RenderTarget);
     hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget);
@@ -2129,7 +2144,7 @@ IDirect3DDeviceImpl_3_Begin(IDirect3DDevice3 *iface,
                             DWORD VertexTypeDesc,
                             DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE("(%p)->(%d,%d,%08x)\n", This, PrimitiveType, VertexTypeDesc, Flags);
 
     EnterCriticalSection(&ddraw_cs);
@@ -2150,7 +2165,7 @@ Thunk_IDirect3DDeviceImpl_2_Begin(IDirect3DDevice2 *iface,
                                   DWORD dwFlags)
 {
     DWORD FVF;
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p/%p)->(%08x,%08x,%08x): Thunking to IDirect3DDevice3\n", This, iface, d3dpt, dwVertexTypeDesc, dwFlags);
 
     switch(dwVertexTypeDesc)
@@ -2193,7 +2208,7 @@ IDirect3DDeviceImpl_3_BeginIndexed(IDirect3DDevice3 *iface,
                                    DWORD NumVertices,
                                    DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     FIXME("(%p)->(%08x,%08x,%p,%08x,%08x): stub!\n", This, PrimitiveType, VertexType, Vertices, NumVertices, Flags);
     return D3D_OK;
 }
@@ -2208,7 +2223,7 @@ Thunk_IDirect3DDeviceImpl_2_BeginIndexed(IDirect3DDevice2 *iface,
                                          DWORD dwFlags)
 {
     DWORD FVF;
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p/%p)->(%08x,%08x,%p,%08x,%08x): Thunking to IDirect3DDevice3\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwNumVertices, dwFlags);
 
     switch(d3dvtVertexType)
@@ -2246,7 +2261,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_3_Vertex(IDirect3DDevice3 *iface,
                              void *Vertex)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE("(%p)->(%p)\n", This, Vertex);
 
     if(!Vertex)
@@ -2276,7 +2291,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_Vertex(IDirect3DDevice2 *iface,
                                    void *lpVertexType)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, lpVertexType);
     return IDirect3DDevice3_Vertex((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, lpVertexType);
 }
@@ -2298,7 +2313,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_3_Index(IDirect3DDevice3 *iface,
                             WORD VertexIndex)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     FIXME("(%p)->(%04x): stub!\n", This, VertexIndex);
     return D3D_OK;
 }
@@ -2307,7 +2322,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_Index(IDirect3DDevice2 *iface,
                                   WORD wVertexIndex)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%04x) thunking to IDirect3DDevice3 interface.\n", This, wVertexIndex);
     return IDirect3DDevice3_Index((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, wVertexIndex);
 }
@@ -2334,7 +2349,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_3_End(IDirect3DDevice3 *iface,
                           DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE("(%p)->(%08x)\n", This, Flags);
 
     return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)This, This->primitive_type,
@@ -2345,7 +2360,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_End(IDirect3DDevice2 *iface,
                                 DWORD dwFlags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x) thunking to IDirect3DDevice3 interface.\n", This, dwFlags);
     return IDirect3DDevice3_End((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, dwFlags);
 }
@@ -2372,7 +2387,7 @@ IDirect3DDeviceImpl_7_GetRenderState(IDirect3DDevice7 *iface,
                                      D3DRENDERSTATETYPE RenderStateType,
                                      DWORD *Value)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x,%p): Relay\n", This, RenderStateType, Value);
 
@@ -2478,7 +2493,7 @@ IDirect3DDeviceImpl_3_GetRenderState(IDirect3DDevice3 *iface,
                                      D3DRENDERSTATETYPE dwRenderStateType,
                                      DWORD *lpdwRenderState)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     HRESULT hr;
     TRACE("(%p)->(%08x,%p)\n", This, dwRenderStateType, lpdwRenderState);
 
@@ -2607,7 +2622,7 @@ Thunk_IDirect3DDeviceImpl_2_GetRenderState(IDirect3DDevice2 *iface,
                                            D3DRENDERSTATETYPE dwRenderStateType,
                                            DWORD *lpdwRenderState)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice3 interface.\n", This, dwRenderStateType, lpdwRenderState);
     return IDirect3DDevice3_GetRenderState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl,
             dwRenderStateType, lpdwRenderState);
@@ -2635,7 +2650,7 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
                                      D3DRENDERSTATETYPE RenderStateType,
                                      DWORD Value)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x,%d): Relay\n", This, RenderStateType, Value);
 
@@ -2787,7 +2802,7 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface,
     unless some broken game will be found that cares. */
 
     HRESULT hr;
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE("(%p)->(%08x,%d)\n", This, RenderStateType, Value);
 
     EnterCriticalSection(&ddraw_cs);
@@ -2931,7 +2946,7 @@ Thunk_IDirect3DDeviceImpl_2_SetRenderState(IDirect3DDevice2 *iface,
                                            D3DRENDERSTATETYPE RenderStateType,
                                            DWORD Value)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%d) thunking to IDirect3DDevice3 interface.\n", This, RenderStateType, Value);
     return IDirect3DDevice3_SetRenderState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, RenderStateType, Value);
 }
@@ -2959,7 +2974,7 @@ IDirect3DDeviceImpl_3_SetLightState(IDirect3DDevice3 *iface,
                                     D3DLIGHTSTATETYPE LightStateType,
                                     DWORD Value)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     HRESULT hr;
 
     TRACE("(%p)->(%08x,%08x)\n", This, LightStateType, Value);
@@ -3064,7 +3079,7 @@ Thunk_IDirect3DDeviceImpl_2_SetLightState(IDirect3DDevice2 *iface,
                                           D3DLIGHTSTATETYPE LightStateType,
                                           DWORD Value)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%08x) thunking to IDirect3DDevice3 interface.\n", This, LightStateType, Value);
     return IDirect3DDevice3_SetLightState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, LightStateType, Value);
 }
@@ -3092,7 +3107,7 @@ IDirect3DDeviceImpl_3_GetLightState(IDirect3DDevice3 *iface,
                                     D3DLIGHTSTATETYPE LightStateType,
                                     DWORD *Value)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     HRESULT hr;
 
     TRACE("(%p)->(%08x,%p)\n", This, LightStateType, Value);
@@ -3158,7 +3173,7 @@ Thunk_IDirect3DDeviceImpl_2_GetLightState(IDirect3DDevice2 *iface,
                                           D3DLIGHTSTATETYPE LightStateType,
                                           DWORD *Value)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice3 interface.\n", This, LightStateType, Value);
     return IDirect3DDevice3_GetLightState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, LightStateType, Value);
 }
@@ -3189,7 +3204,7 @@ IDirect3DDeviceImpl_7_SetTransform(IDirect3DDevice7 *iface,
                                    D3DTRANSFORMSTATETYPE TransformStateType,
                                    D3DMATRIX *Matrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     D3DTRANSFORMSTATETYPE type;
     HRESULT hr;
     TRACE("(%p)->(%08x,%p): Relay\n", This, TransformStateType, Matrix);
@@ -3243,7 +3258,7 @@ Thunk_IDirect3DDeviceImpl_3_SetTransform(IDirect3DDevice3 *iface,
                                          D3DTRANSFORMSTATETYPE TransformStateType,
                                          D3DMATRIX *D3DMatrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix);
     return IDirect3DDevice7_SetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix);
 }
@@ -3253,7 +3268,7 @@ Thunk_IDirect3DDeviceImpl_2_SetTransform(IDirect3DDevice2 *iface,
                                          D3DTRANSFORMSTATETYPE TransformStateType,
                                          D3DMATRIX *D3DMatrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix);
     return IDirect3DDevice7_SetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix);
 }
@@ -3280,7 +3295,7 @@ IDirect3DDeviceImpl_7_GetTransform(IDirect3DDevice7 *iface,
                                    D3DTRANSFORMSTATETYPE TransformStateType,
                                    D3DMATRIX *Matrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     D3DTRANSFORMSTATETYPE type;
     HRESULT hr;
     TRACE("(%p)->(%08x,%p): Relay\n", This, TransformStateType, Matrix);
@@ -3332,7 +3347,7 @@ Thunk_IDirect3DDeviceImpl_3_GetTransform(IDirect3DDevice3 *iface,
                                          D3DTRANSFORMSTATETYPE TransformStateType,
                                          D3DMATRIX *D3DMatrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix);
     return IDirect3DDevice7_GetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix);
 }
@@ -3342,7 +3357,7 @@ Thunk_IDirect3DDeviceImpl_2_GetTransform(IDirect3DDevice2 *iface,
                                          D3DTRANSFORMSTATETYPE TransformStateType,
                                          D3DMATRIX *D3DMatrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix);
     return IDirect3DDevice7_GetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix);
 }
@@ -3370,7 +3385,7 @@ IDirect3DDeviceImpl_7_MultiplyTransform(IDirect3DDevice7 *iface,
                                         D3DTRANSFORMSTATETYPE TransformStateType,
                                         D3DMATRIX *D3DMatrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     D3DTRANSFORMSTATETYPE type;
     TRACE("(%p)->(%08x,%p): Relay\n", This, TransformStateType, D3DMatrix);
@@ -3421,7 +3436,7 @@ Thunk_IDirect3DDeviceImpl_3_MultiplyTransform(IDirect3DDevice3 *iface,
                                               D3DTRANSFORMSTATETYPE TransformStateType,
                                               D3DMATRIX *D3DMatrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix);
     return IDirect3DDevice7_MultiplyTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix);
 }
@@ -3431,7 +3446,7 @@ Thunk_IDirect3DDeviceImpl_2_MultiplyTransform(IDirect3DDevice2 *iface,
                                               D3DTRANSFORMSTATETYPE TransformStateType,
                                               D3DMATRIX *D3DMatrix)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix);
     return IDirect3DDevice7_MultiplyTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix);
 }
@@ -3465,7 +3480,7 @@ IDirect3DDeviceImpl_7_DrawPrimitive(IDirect3DDevice7 *iface,
                                     DWORD VertexCount,
                                     DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     UINT PrimitiveCount, stride;
     HRESULT hr;
     TRACE("(%p)->(%08x,%08x,%p,%08x,%08x): Relay!\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Flags);
@@ -3564,7 +3579,7 @@ Thunk_IDirect3DDeviceImpl_3_DrawPrimitive(IDirect3DDevice3 *iface,
                                           DWORD VertexCount,
                                           DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Flags);
     return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)This,
             PrimitiveType, VertexType, Vertices, VertexCount, Flags);
@@ -3578,7 +3593,7 @@ Thunk_IDirect3DDeviceImpl_2_DrawPrimitive(IDirect3DDevice2 *iface,
                                           DWORD VertexCount,
                                           DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     DWORD FVF;
     TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Flags);
 
@@ -3629,7 +3644,7 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitive(IDirect3DDevice7 *iface,
                                            DWORD IndexCount,
                                            DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     UINT PrimitiveCount = 0;
     HRESULT hr;
     TRACE("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x): Relay!\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags);
@@ -3732,7 +3747,7 @@ Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitive(IDirect3DDevice3 *iface,
                                                  DWORD IndexCount,
                                                  DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags);
     return IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)This,
             PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags);
@@ -3749,7 +3764,7 @@ Thunk_IDirect3DDeviceImpl_2_DrawIndexedPrimitive(IDirect3DDevice2 *iface,
                                                  DWORD Flags)
 {
     DWORD FVF;
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags);
 
     switch(VertexType)
@@ -3786,7 +3801,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_7_SetClipStatus(IDirect3DDevice7 *iface,
                                     D3DCLIPSTATUS *ClipStatus)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     FIXME("(%p)->(%p): Stub!\n", This, ClipStatus);
 
     /* D3DCLIPSTATUS and WINED3DCLIPSTATUS are different. I don't know how to convert them
@@ -3800,7 +3815,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_3_SetClipStatus(IDirect3DDevice3 *iface,
                                           D3DCLIPSTATUS *ClipStatus)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus);
     return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)This, ClipStatus);
 }
@@ -3809,7 +3824,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_SetClipStatus(IDirect3DDevice2 *iface,
                                           D3DCLIPSTATUS *ClipStatus)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus);
     return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)This, ClipStatus);
 }
@@ -3830,7 +3845,7 @@ static HRESULT WINAPI
 IDirect3DDeviceImpl_7_GetClipStatus(IDirect3DDevice7 *iface,
                                     D3DCLIPSTATUS *ClipStatus)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     FIXME("(%p)->(%p): Stub!\n", This, ClipStatus);
 
     /* D3DCLIPSTATUS and WINED3DCLIPSTATUS are different. I don't know how to convert them */
@@ -3842,7 +3857,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_3_GetClipStatus(IDirect3DDevice3 *iface,
                                           D3DCLIPSTATUS *ClipStatus)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus);
     return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)This, ClipStatus);
 }
@@ -3851,7 +3866,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_2_GetClipStatus(IDirect3DDevice2 *iface,
                                           D3DCLIPSTATUS *ClipStatus)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface);
+    IDirect3DDeviceImpl *This = device_from_device2(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus);
     return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)This, ClipStatus);
 }
@@ -3885,7 +3900,7 @@ IDirect3DDeviceImpl_7_DrawPrimitiveStrided(IDirect3DDevice7 *iface,
                                            DWORD VertexCount,
                                            DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     WineDirect3DVertexStridedData WineD3DStrided;
     DWORD i;
     UINT PrimitiveCount;
@@ -4026,7 +4041,7 @@ Thunk_IDirect3DDeviceImpl_3_DrawPrimitiveStrided(IDirect3DDevice3 *iface,
                                                  DWORD VertexCount,
                                                  DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags);
     return IDirect3DDevice7_DrawPrimitiveStrided((IDirect3DDevice7 *)This,
             PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags);
@@ -4059,7 +4074,7 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveStrided(IDirect3DDevice7 *iface,
                                                   DWORD IndexCount,
                                                   DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     WineDirect3DVertexStridedData WineD3DStrided;
     DWORD i;
     UINT PrimitiveCount;
@@ -4209,7 +4224,7 @@ Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveStrided(IDirect3DDevice3 *iface,
                                                         DWORD IndexCount,
                                                         DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags);
     return IDirect3DDevice7_DrawIndexedPrimitiveStrided((IDirect3DDevice7 *)This, PrimitiveType,
             VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags);
@@ -4242,7 +4257,7 @@ IDirect3DDeviceImpl_7_DrawPrimitiveVB(IDirect3DDevice7 *iface,
                                       DWORD NumVertices,
                                       DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     IDirect3DVertexBufferImpl *vb = ICOM_OBJECT(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, D3DVertexBuf);
     UINT PrimitiveCount;
     HRESULT hr;
@@ -4369,7 +4384,7 @@ Thunk_IDirect3DDeviceImpl_3_DrawPrimitiveVB(IDirect3DDevice3 *iface,
                                             DWORD NumVertices,
                                             DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     IDirect3DVertexBufferImpl *vb = ICOM_OBJECT(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, D3DVertexBuf);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p,%08x,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This,  PrimitiveType, vb, StartVertex, NumVertices, Flags);
     return IDirect3DDevice7_DrawPrimitiveVB((IDirect3DDevice7 *)This, PrimitiveType,
@@ -4404,7 +4419,7 @@ IDirect3DDeviceImpl_7_DrawIndexedPrimitiveVB(IDirect3DDevice7 *iface,
                                              DWORD IndexCount,
                                              DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     IDirect3DVertexBufferImpl *vb = ICOM_OBJECT(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, D3DVertexBuf);
     DWORD stride;
     UINT PrimitiveCount;
@@ -4571,7 +4586,7 @@ Thunk_IDirect3DDeviceImpl_3_DrawIndexedPrimitiveVB(IDirect3DDevice3 *iface,
                                                    DWORD IndexCount,
                                                    DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     IDirect3DVertexBufferImpl *VB = ICOM_OBJECT(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, D3DVertexBuf);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VB, Indices, IndexCount, Flags);
 
@@ -4615,7 +4630,7 @@ IDirect3DDeviceImpl_7_ComputeSphereVisibility(IDirect3DDevice7 *iface,
                                               DWORD Flags,
                                               DWORD *ReturnValues)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     FIXME("(%p)->(%p,%p,%08x,%08x,%p): stub!\n", This, Centers, Radii, NumSpheres, Flags, ReturnValues);
 
     /* the DirectX 7 sdk says that the visibility is computed by
@@ -4651,7 +4666,7 @@ Thunk_IDirect3DDeviceImpl_3_ComputeSphereVisibility(IDirect3DDevice3 *iface,
                                                     DWORD Flags,
                                                     DWORD *ReturnValues)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p,%p,%08x,%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, Centers, Radii, NumSpheres, Flags, ReturnValues);
     return IDirect3DDevice7_ComputeSphereVisibility((IDirect3DDevice7 *)This,
             Centers, Radii, NumSpheres, Flags, ReturnValues);
@@ -4681,7 +4696,7 @@ IDirect3DDeviceImpl_7_GetTexture(IDirect3DDevice7 *iface,
                                  DWORD Stage,
                                  IDirectDrawSurface7 **Texture)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     IWineD3DBaseTexture *Surf;
     HRESULT hr;
     TRACE("(%p)->(%d,%p): Relay\n", This, Stage, Texture);
@@ -4738,7 +4753,7 @@ Thunk_IDirect3DDeviceImpl_3_GetTexture(IDirect3DDevice3 *iface,
                                        DWORD Stage,
                                        IDirect3DTexture2 **Texture2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     HRESULT ret;
     IDirectDrawSurface7 *ret_val;
 
@@ -4773,7 +4788,7 @@ IDirect3DDeviceImpl_7_SetTexture(IDirect3DDevice7 *iface,
                                  DWORD Stage,
                                  IDirectDrawSurface7 *Texture)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     IDirectDrawSurfaceImpl *surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, Texture);
     HRESULT hr;
     TRACE("(%p)->(%08x,%p): Relay!\n", This, Stage, surf);
@@ -4815,7 +4830,7 @@ IDirect3DDeviceImpl_3_SetTexture(IDirect3DDevice3 *iface,
                                  DWORD Stage,
                                  IDirect3DTexture2 *Texture2)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     IDirectDrawSurfaceImpl *tex = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture2, Texture2);
     DWORD texmapblend;
     HRESULT hr;
@@ -4932,7 +4947,7 @@ IDirect3DDeviceImpl_7_GetTextureStageState(IDirect3DDevice7 *iface,
                                            D3DTEXTURESTAGESTATETYPE TexStageStateType,
                                            DWORD *State)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     const struct tss_lookup *l = &tss_lookup[TexStageStateType];
     TRACE("(%p)->(%08x,%08x,%p): Relay!\n", This, Stage, TexStageStateType, State);
@@ -5026,7 +5041,7 @@ Thunk_IDirect3DDeviceImpl_3_GetTextureStageState(IDirect3DDevice3 *iface,
                                                  D3DTEXTURESTAGESTATETYPE TexStageStateType,
                                                  DWORD *State)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, Stage, TexStageStateType, State);
     return IDirect3DDevice7_GetTextureStageState((IDirect3DDevice7 *)This, Stage, TexStageStateType, State);
 }
@@ -5055,7 +5070,7 @@ IDirect3DDeviceImpl_7_SetTextureStageState(IDirect3DDevice7 *iface,
                                            D3DTEXTURESTAGESTATETYPE TexStageStateType,
                                            DWORD State)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     const struct tss_lookup *l = &tss_lookup[TexStageStateType];
     HRESULT hr;
     TRACE("(%p)->(%08x,%08x,%08x): Relay!\n", This, Stage, TexStageStateType, State);
@@ -5151,7 +5166,7 @@ Thunk_IDirect3DDeviceImpl_3_SetTextureStageState(IDirect3DDevice3 *iface,
                                                  D3DTEXTURESTAGESTATETYPE TexStageStateType,
                                                  DWORD State)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, Stage, TexStageStateType, State);
     return IDirect3DDevice7_SetTextureStageState((IDirect3DDevice7 *)This, Stage, TexStageStateType, State);
 }
@@ -5178,7 +5193,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_ValidateDevice(IDirect3DDevice7 *iface,
                                      DWORD *NumPasses)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p): Relay\n", This, NumPasses);
 
@@ -5213,7 +5228,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DDeviceImpl_3_ValidateDevice(IDirect3DDevice3 *iface,
                                            DWORD *Passes)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
+    IDirect3DDeviceImpl *This = device_from_device3(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, Passes);
     return IDirect3DDevice7_ValidateDevice((IDirect3DDevice7 *)This, Passes);
 }
@@ -5248,7 +5263,7 @@ IDirect3DDeviceImpl_7_Clear(IDirect3DDevice7 *iface,
                             D3DVALUE Z,
                             DWORD Stencil)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x,%p,%08x,%08x,%f,%08x): Relay\n", This, Count, Rects, Flags, Color, Z, Stencil);
 
@@ -5311,7 +5326,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_SetViewport(IDirect3DDevice7 *iface,
                                   D3DVIEWPORT7 *Data)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p) Relay!\n", This, Data);
 
@@ -5367,7 +5382,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_GetViewport(IDirect3DDevice7 *iface,
                                   D3DVIEWPORT7 *Data)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p) Relay!\n", This, Data);
 
@@ -5424,7 +5439,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_SetMaterial(IDirect3DDevice7 *iface,
                                   D3DMATERIAL7 *Mat)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p): Relay!\n", This, Mat);
 
@@ -5478,7 +5493,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_GetMaterial(IDirect3DDevice7 *iface,
                                   D3DMATERIAL7 *Mat)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p): Relay!\n", This, Mat);
 
@@ -5532,7 +5547,7 @@ IDirect3DDeviceImpl_7_SetLight(IDirect3DDevice7 *iface,
                                DWORD LightIndex,
                                D3DLIGHT7 *Light)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x,%p): Relay!\n", This, LightIndex, Light);
 
@@ -5587,7 +5602,7 @@ IDirect3DDeviceImpl_7_GetLight(IDirect3DDevice7 *iface,
                                DWORD LightIndex,
                                D3DLIGHT7 *Light)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT rc;
     TRACE("(%p)->(%08x,%p): Relay!\n", This, LightIndex, Light);
 
@@ -5640,7 +5655,7 @@ IDirect3DDeviceImpl_7_GetLight_FPUPreserve(IDirect3DDevice7 *iface,
 static HRESULT
 IDirect3DDeviceImpl_7_BeginStateBlock(IDirect3DDevice7 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(): Relay!\n", This);
 
@@ -5690,7 +5705,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_EndStateBlock(IDirect3DDevice7 *iface,
                                     DWORD *BlockHandle)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p): Relay!\n", This, BlockHandle);
 
@@ -5757,7 +5772,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_PreLoad(IDirect3DDevice7 *iface,
                               IDirectDrawSurface7 *Texture)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     IDirectDrawSurfaceImpl *surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, Texture);
 
     TRACE("(%p)->(%p): Relay!\n", This, surf);
@@ -5809,7 +5824,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_ApplyStateBlock(IDirect3DDevice7 *iface,
                                       DWORD BlockHandle)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x): Relay!\n", This, BlockHandle);
 
@@ -5873,7 +5888,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_CaptureStateBlock(IDirect3DDevice7 *iface,
                                         DWORD BlockHandle)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x): Relay!\n", This, BlockHandle);
 
@@ -5936,7 +5951,7 @@ static HRESULT
 IDirect3DDeviceImpl_7_DeleteStateBlock(IDirect3DDevice7 *iface,
                                        DWORD BlockHandle)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     ULONG ref;
     TRACE("(%p)->(%08x): Relay!\n", This, BlockHandle);
 
@@ -6008,7 +6023,7 @@ IDirect3DDeviceImpl_7_CreateStateBlock(IDirect3DDevice7 *iface,
                                        D3DSTATEBLOCKTYPE Type,
                                        DWORD *BlockHandle)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x,%p)!\n", This, Type, BlockHandle);
 
@@ -6253,7 +6268,7 @@ IDirect3DDeviceImpl_7_Load(IDirect3DDevice7 *iface,
                            RECT *SrcRect,
                            DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     IDirectDrawSurfaceImpl *dest = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, DestTex);
     IDirectDrawSurfaceImpl *src = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, SrcTex);
     POINT destpoint;
@@ -6466,7 +6481,7 @@ IDirect3DDeviceImpl_7_LightEnable(IDirect3DDevice7 *iface,
                                   DWORD LightIndex,
                                   BOOL Enable)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x,%d): Relay!\n", This, LightIndex, Enable);
 
@@ -6521,7 +6536,7 @@ IDirect3DDeviceImpl_7_GetLightEnable(IDirect3DDevice7 *iface,
                                      DWORD LightIndex,
                                      BOOL* Enable)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x,%p): Relay\n", This, LightIndex, Enable);
 
@@ -6579,7 +6594,7 @@ IDirect3DDeviceImpl_7_SetClipPlane(IDirect3DDevice7 *iface,
                                    DWORD Index,
                                    D3DVALUE* PlaneEquation)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%08x,%p): Relay!\n", This, Index, PlaneEquation);
 
@@ -6635,7 +6650,7 @@ IDirect3DDeviceImpl_7_GetClipPlane(IDirect3DDevice7 *iface,
                                    DWORD Index,
                                    D3DVALUE* PlaneEquation)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%d,%p): Relay!\n", This, Index, PlaneEquation);
 
@@ -6693,7 +6708,7 @@ IDirect3DDeviceImpl_7_GetInfo(IDirect3DDevice7 *iface,
                               void *DevInfoStruct,
                               DWORD Size)
 {
-    ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
+    IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
     TRACE("(%p)->(%08x,%p,%08x)\n", This, DevInfoID, DevInfoStruct, Size);
 
     if (TRACE_ON(d3d7))
diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c
index 2d984819a17f39e8bc7ab342ce42bcb381f0553a..feb5aa5d26108a6751403f612e31b29fa77f3822 100644
--- a/dlls/ddraw/direct3d.c
+++ b/dlls/ddraw/direct3d.c
@@ -40,6 +40,26 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d7);
 
+static inline IDirectDrawImpl *ddraw_from_d3d1(IDirect3D *iface)
+{
+    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirect3D_vtbl));
+}
+
+static inline IDirectDrawImpl *ddraw_from_d3d2(IDirect3D2 *iface)
+{
+    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirect3D2_vtbl));
+}
+
+static inline IDirectDrawImpl *ddraw_from_d3d3(IDirect3D3 *iface)
+{
+    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirect3D3_vtbl));
+}
+
+static inline IDirectDrawImpl *ddraw_from_d3d7(IDirect3D7 *iface)
+{
+    return (IDirectDrawImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawImpl, IDirect3D7_vtbl));
+}
+
 /*****************************************************************************
  * IDirect3D7::QueryInterface
  *
@@ -51,7 +71,7 @@ Thunk_IDirect3DImpl_7_QueryInterface(IDirect3D7 *iface,
                                     REFIID refiid,
                                     void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d7(iface);
     TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj);
 
     return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj);
@@ -62,7 +82,7 @@ Thunk_IDirect3DImpl_3_QueryInterface(IDirect3D3 *iface,
                                     REFIID refiid,
                                     void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj);
 
     return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj);
@@ -73,7 +93,7 @@ Thunk_IDirect3DImpl_2_QueryInterface(IDirect3D2 *iface,
                                     REFIID refiid,
                                     void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D2, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d2(iface);
     TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj);
 
     return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj);
@@ -84,7 +104,7 @@ Thunk_IDirect3DImpl_1_QueryInterface(IDirect3D *iface,
                                     REFIID refiid,
                                     void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d1(iface);
     TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj);
 
     return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj);
@@ -112,7 +132,7 @@ Thunk_IDirect3DImpl_1_QueryInterface(IDirect3D *iface,
 static ULONG WINAPI
 Thunk_IDirect3DImpl_7_AddRef(IDirect3D7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d7(iface);
     TRACE("(%p) : Thunking to IDirectDraw7.\n", This);
 
     return IDirectDraw7_AddRef((IDirectDraw7 *)This);
@@ -121,7 +141,7 @@ Thunk_IDirect3DImpl_7_AddRef(IDirect3D7 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DImpl_3_AddRef(IDirect3D3 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     TRACE("(%p) : Thunking to IDirectDraw.\n", This);
 
     return IDirectDraw_AddRef((IDirectDraw *)&This->IDirectDraw_vtbl);
@@ -130,7 +150,7 @@ Thunk_IDirect3DImpl_3_AddRef(IDirect3D3 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DImpl_2_AddRef(IDirect3D2 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D2, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d2(iface);
     TRACE("(%p) : Thunking to IDirectDraw.\n", This);
 
     return IDirectDraw_AddRef((IDirectDraw *)&This->IDirectDraw_vtbl);
@@ -139,7 +159,7 @@ Thunk_IDirect3DImpl_2_AddRef(IDirect3D2 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DImpl_1_AddRef(IDirect3D *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d1(iface);
     TRACE("(%p) : Thunking to IDirectDraw.\n", This);
 
     return IDirectDraw_AddRef((IDirectDraw *)&This->IDirectDraw_vtbl);
@@ -156,7 +176,7 @@ Thunk_IDirect3DImpl_1_AddRef(IDirect3D *iface)
 static ULONG WINAPI
 Thunk_IDirect3DImpl_7_Release(IDirect3D7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d7(iface);
     TRACE("(%p) : Thunking to IDirectDraw7.\n", This);
 
     return IDirectDraw7_Release((IDirectDraw7 *)This);
@@ -165,7 +185,7 @@ Thunk_IDirect3DImpl_7_Release(IDirect3D7 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DImpl_3_Release(IDirect3D3 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     TRACE("(%p) : Thunking to IDirectDraw.\n", This);
 
     return IDirectDraw_Release((IDirectDraw *)&This->IDirectDraw_vtbl);
@@ -174,7 +194,7 @@ Thunk_IDirect3DImpl_3_Release(IDirect3D3 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DImpl_2_Release(IDirect3D2 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D2, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d2(iface);
     TRACE("(%p) : Thunking to IDirectDraw.\n", This);
 
     return IDirectDraw_Release((IDirectDraw *)&This->IDirectDraw_vtbl);
@@ -183,7 +203,7 @@ Thunk_IDirect3DImpl_2_Release(IDirect3D2 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DImpl_1_Release(IDirect3D *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d1(iface);
     TRACE("(%p) : Thunking to IDirectDraw.\n", This);
 
     return IDirectDraw_Release((IDirectDraw *)&This->IDirectDraw_vtbl);
@@ -212,7 +232,7 @@ static HRESULT WINAPI
 IDirect3DImpl_1_Initialize(IDirect3D *iface,
                            REFIID refiid)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d1(iface);
 
     TRACE("(%p)->(%s) no-op...\n", This, debugstr_guid(refiid));
     return D3D_OK;
@@ -237,7 +257,7 @@ IDirect3DImpl_7_EnumDevices(IDirect3D7 *iface,
                           LPD3DENUMDEVICESCALLBACK7 Callback,
                           void *Context)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d7(iface);
     char interface_name_tnl[] = "WINE Direct3D7 Hardware Transform and Lighting acceleration using WineD3D";
     char device_name_tnl[] = "Wine D3D7 T&L HAL";
     char interface_name_hal[] = "WINE Direct3D7 Hardware acceleration using WineD3D";
@@ -293,7 +313,7 @@ IDirect3DImpl_3_EnumDevices(IDirect3D3 *iface,
                             LPD3DENUMDEVICESCALLBACK Callback,
                             void *Context)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     D3DDEVICEDESC dref, d1, d2;
     D3DDEVICEDESC7 newDesc;
     static CHAR wined3d_description[] = "Wine D3DDevice using WineD3D and OpenGL";
@@ -377,7 +397,7 @@ Thunk_IDirect3DImpl_2_EnumDevices(IDirect3D2 *iface,
                                   LPD3DENUMDEVICESCALLBACK Callback,
                                   void *Context)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D2, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d2(iface);
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Callback, Context);
     return IDirect3D3_EnumDevices((IDirect3D3 *)&This->IDirect3D3_vtbl, Callback, Context);
 }
@@ -387,7 +407,7 @@ Thunk_IDirect3DImpl_1_EnumDevices(IDirect3D *iface,
                                   LPD3DENUMDEVICESCALLBACK Callback,
                                   void *Context)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d1(iface);
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Callback, Context);
     return IDirect3D3_EnumDevices((IDirect3D3 *)&This->IDirect3D3_vtbl, Callback, Context);
 }
@@ -418,7 +438,7 @@ IDirect3DImpl_3_CreateLight(IDirect3D3 *iface,
                             IDirect3DLight **Light,
                             IUnknown *UnkOuter )
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     IDirect3DLightImpl *object;
 
     TRACE("(%p)->(%p,%p)\n", This, Light, UnkOuter);
@@ -454,7 +474,7 @@ Thunk_IDirect3DImpl_2_CreateLight(IDirect3D2 *iface,
                                   IDirect3DLight **Direct3DLight,
                                   IUnknown *UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D2, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d2(iface);
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DLight, UnkOuter);
     return IDirect3D3_CreateLight((IDirect3D3 *)&This->IDirect3D3_vtbl, Direct3DLight, UnkOuter);
 }
@@ -464,7 +484,7 @@ Thunk_IDirect3DImpl_1_CreateLight(IDirect3D *iface,
                                   IDirect3DLight **Direct3DLight,
                                   IUnknown *UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d1(iface);
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DLight, UnkOuter);
     return IDirect3D3_CreateLight((IDirect3D3 *)&This->IDirect3D3_vtbl, Direct3DLight, UnkOuter);
 }
@@ -494,7 +514,7 @@ IDirect3DImpl_3_CreateMaterial(IDirect3D3 *iface,
                                IDirect3DMaterial3 **Material,
                                IUnknown *UnkOuter )
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     IDirect3DMaterialImpl *object;
 
     TRACE("(%p)->(%p,%p)\n", This, Material, UnkOuter);
@@ -525,7 +545,7 @@ Thunk_IDirect3DImpl_2_CreateMaterial(IDirect3D2 *iface,
                                      IDirect3DMaterial2 **Direct3DMaterial,
                                      IUnknown* UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D2, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d2(iface);
     HRESULT ret;
     IDirect3DMaterial3 *ret_val;
 
@@ -544,7 +564,7 @@ Thunk_IDirect3DImpl_1_CreateMaterial(IDirect3D *iface,
                                      IDirect3DMaterial **Direct3DMaterial,
                                      IUnknown* UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d1(iface);
     HRESULT ret;
     LPDIRECT3DMATERIAL3 ret_val;
 
@@ -583,7 +603,7 @@ IDirect3DImpl_3_CreateViewport(IDirect3D3 *iface,
                               IDirect3DViewport3 **Viewport,
                               IUnknown *UnkOuter )
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     IDirect3DViewportImpl *object;
 
     if(UnkOuter)
@@ -615,7 +635,7 @@ Thunk_IDirect3DImpl_2_CreateViewport(IDirect3D2 *iface,
                                      IDirect3DViewport2 **D3DViewport2,
                                      IUnknown *UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D2, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d2(iface);
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, D3DViewport2, UnkOuter);
 
     return IDirect3D3_CreateViewport((IDirect3D3 *)&This->IDirect3D3_vtbl,
@@ -628,7 +648,7 @@ Thunk_IDirect3DImpl_1_CreateViewport(IDirect3D *iface,
                                      IDirect3DViewport **D3DViewport,
                                      IUnknown* UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d1(iface);
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, D3DViewport, UnkOuter);
 
     return IDirect3D3_CreateViewport((IDirect3D3 *)&This->IDirect3D3_vtbl,
@@ -657,7 +677,7 @@ IDirect3DImpl_3_FindDevice(IDirect3D3 *iface,
                            D3DFINDDEVICESEARCH *D3DDFS,
                            D3DFINDDEVICERESULT *D3DFDR)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     D3DDEVICEDESC desc;
     D3DDEVICEDESC7 newDesc;
     HRESULT hr;
@@ -701,7 +721,7 @@ Thunk_IDirect3DImpl_2_FindDevice(IDirect3D2 *iface,
                                  D3DFINDDEVICESEARCH *D3DDFS,
                                  D3DFINDDEVICERESULT *D3DFDR)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D2, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d2(iface);
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, D3DDFS, D3DFDR);
     return IDirect3D3_FindDevice((IDirect3D3 *)&This->IDirect3D3_vtbl, D3DDFS, D3DFDR);
 }
@@ -711,7 +731,7 @@ Thunk_IDirect3DImpl_1_FindDevice(IDirect3D *iface,
                                 D3DFINDDEVICESEARCH *D3DDFS,
                                 D3DFINDDEVICERESULT *D3DDevice)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d1(iface);
     TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, D3DDFS, D3DDevice);
     return IDirect3D3_FindDevice((IDirect3D3 *)&This->IDirect3D3_vtbl, D3DDFS, D3DDevice);
 }
@@ -743,7 +763,7 @@ IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface,
                              IDirectDrawSurface7 *Surface,
                              IDirect3DDevice7 **Device)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d7(iface);
     IDirect3DDeviceImpl *object;
     IParentImpl *IndexBufferParent;
     HRESULT hr;
@@ -922,7 +942,7 @@ Thunk_IDirect3DImpl_3_CreateDevice(IDirect3D3 *iface,
                                    IDirect3DDevice3 **Device,
                                    IUnknown *UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     HRESULT hr;
     TRACE("(%p)->(%s,%p,%p,%p): Thunking to IDirect3D7\n", This, debugstr_guid(refiid), Surface, Device, UnkOuter);
 
@@ -942,7 +962,7 @@ Thunk_IDirect3DImpl_2_CreateDevice(IDirect3D2 *iface,
                                    IDirectDrawSurface *Surface,
                                    IDirect3DDevice2 **Device)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D2, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d2(iface);
     HRESULT hr;
     TRACE("(%p)->(%s,%p,%p): Thunking to IDirect3D7\n", This, debugstr_guid(refiid), Surface, Device);
 
@@ -980,7 +1000,7 @@ IDirect3DImpl_7_CreateVertexBuffer(IDirect3D7 *iface,
                                    IDirect3DVertexBuffer7 **VertexBuffer,
                                    DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d7(iface);
     IDirect3DVertexBufferImpl *object;
     HRESULT hr;
     TRACE("(%p)->(%p,%p,%08x)\n", This, Desc, VertexBuffer, Flags);
@@ -1068,7 +1088,7 @@ Thunk_IDirect3DImpl_3_CreateVertexBuffer(IDirect3D3 *iface,
                                          DWORD Flags,
                                          IUnknown *UnkOuter)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     HRESULT hr;
     TRACE("(%p)->(%p,%p,%08x,%p): Relaying to IDirect3D7\n", This, Desc, VertexBuffer, Flags, UnkOuter);
 
@@ -1106,7 +1126,7 @@ IDirect3DImpl_7_EnumZBufferFormats(IDirect3D7 *iface,
                                    LPD3DENUMPIXELFORMATSCALLBACK Callback,
                                    void *Context)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d7(iface);
     HRESULT hr;
     unsigned int i;
     WINED3DDISPLAYMODE d3ddm;
@@ -1206,7 +1226,7 @@ Thunk_IDirect3DImpl_3_EnumZBufferFormats(IDirect3D3 *iface,
                                          LPD3DENUMPIXELFORMATSCALLBACK Callback,
                                          void *Context)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     TRACE("(%p)->(%s,%p,%p) thunking to IDirect3D7 interface.\n", This, debugstr_guid(riidDevice), Callback, Context);
     return IDirect3D7_EnumZBufferFormats((IDirect3D7 *)&This->IDirect3D7_vtbl, riidDevice, Callback, Context);
 }
@@ -1226,7 +1246,7 @@ Thunk_IDirect3DImpl_3_EnumZBufferFormats(IDirect3D3 *iface,
 static HRESULT WINAPI
 IDirect3DImpl_7_EvictManagedTextures(IDirect3D7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D7, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d7(iface);
     FIXME("(%p): Stub!\n", This);
 
     /* Implementation idea:
@@ -1240,7 +1260,7 @@ IDirect3DImpl_7_EvictManagedTextures(IDirect3D7 *iface)
 static HRESULT WINAPI
 Thunk_IDirect3DImpl_3_EvictManagedTextures(IDirect3D3 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawImpl, IDirect3D3, iface);
+    IDirectDrawImpl *This = ddraw_from_d3d3(iface);
     TRACE("(%p)->() thunking to IDirect3D7 interface.\n", This);
     return IDirect3D7_EvictManagedTextures((IDirect3D7 *)&This->IDirect3D7_vtbl);
 }
diff --git a/dlls/ddraw/executebuffer.c b/dlls/ddraw/executebuffer.c
index be48ed772af7a0ffc56655e3578104c9c42508d3..3ff794d93b8342df53a47ceba5cdca8a17be68ee 100644
--- a/dlls/ddraw/executebuffer.c
+++ b/dlls/ddraw/executebuffer.c
@@ -624,7 +624,7 @@ IDirect3DExecuteBufferImpl_QueryInterface(IDirect3DExecuteBuffer *iface,
 static ULONG WINAPI
 IDirect3DExecuteBufferImpl_AddRef(IDirect3DExecuteBuffer *iface)
 {
-    ICOM_THIS_FROM(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, iface);
+    IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
     FIXME("(%p)->()incrementing from %u.\n", This, ref - 1);
@@ -644,7 +644,7 @@ IDirect3DExecuteBufferImpl_AddRef(IDirect3DExecuteBuffer *iface)
 static ULONG WINAPI
 IDirect3DExecuteBufferImpl_Release(IDirect3DExecuteBuffer *iface)
 {
-    ICOM_THIS_FROM(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, iface);
+    IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->()decrementing from %u.\n", This, ref + 1);
@@ -676,7 +676,7 @@ IDirect3DExecuteBufferImpl_Initialize(IDirect3DExecuteBuffer *iface,
                                         IDirect3DDevice *lpDirect3DDevice,
                                         D3DEXECUTEBUFFERDESC *lpDesc)
 {
-    ICOM_THIS_FROM(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, iface);
+    IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
     TRACE("(%p)->(%p,%p) no-op....\n", This, lpDirect3DDevice, lpDesc);
     return D3D_OK;
 }
@@ -698,7 +698,7 @@ static HRESULT WINAPI
 IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface,
                                 D3DEXECUTEBUFFERDESC *lpDesc)
 {
-    ICOM_THIS_FROM(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, iface);
+    IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
     DWORD dwSize;
     TRACE("(%p)->(%p)\n", This, lpDesc);
 
@@ -725,7 +725,7 @@ IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface,
 static HRESULT WINAPI
 IDirect3DExecuteBufferImpl_Unlock(IDirect3DExecuteBuffer *iface)
 {
-    ICOM_THIS_FROM(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, iface);
+    IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
     TRACE("(%p)->() no-op...\n", This);
     return D3D_OK;
 }
@@ -748,7 +748,7 @@ static HRESULT WINAPI
 IDirect3DExecuteBufferImpl_SetExecuteData(IDirect3DExecuteBuffer *iface,
                                           D3DEXECUTEDATA *lpData)
 {
-    ICOM_THIS_FROM(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, iface);
+    IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
     DWORD nbvert;
     TRACE("(%p)->(%p)\n", This, lpData);
 
@@ -784,7 +784,7 @@ static HRESULT WINAPI
 IDirect3DExecuteBufferImpl_GetExecuteData(IDirect3DExecuteBuffer *iface,
                                           D3DEXECUTEDATA *lpData)
 {
-    ICOM_THIS_FROM(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, iface);
+    IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
     DWORD dwSize;
     TRACE("(%p)->(%p): stub!\n", This, lpData);
 
@@ -820,7 +820,7 @@ IDirect3DExecuteBufferImpl_Validate(IDirect3DExecuteBuffer *iface,
                                     void *UserArg,
                                     DWORD Reserved)
 {
-    ICOM_THIS_FROM(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, iface);
+    IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
     TRACE("(%p)->(%p,%p,%p,%08x): Unimplemented!\n", This, Offset, Func, UserArg, Reserved);
     return DDERR_UNSUPPORTED; /* Unchecked */
 }
@@ -842,7 +842,7 @@ static HRESULT WINAPI
 IDirect3DExecuteBufferImpl_Optimize(IDirect3DExecuteBuffer *iface,
                                     DWORD Dummy)
 {
-    ICOM_THIS_FROM(IDirect3DExecuteBufferImpl, IDirect3DExecuteBuffer, iface);
+    IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface;
     TRACE("(%p)->(%08x): Unimplemented\n", This, Dummy);
     return DDERR_UNSUPPORTED; /* Unchecked */
 }
diff --git a/dlls/ddraw/gamma.c b/dlls/ddraw/gamma.c
index 16018f0490a82db96498cb641eb2d01b72e30a02..df631a4d6bfed52798ccedc9323a2ebe84149a5e 100644
--- a/dlls/ddraw/gamma.c
+++ b/dlls/ddraw/gamma.c
@@ -43,6 +43,12 @@
 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
 WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk);
 
+static inline IDirectDrawSurfaceImpl *surface_from_gamma_control(IDirectDrawGammaControl *iface)
+{
+    return (IDirectDrawSurfaceImpl *)((char*)iface
+            - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawGammaControl_vtbl));
+}
+
 /**********************************************************
  * IUnknown parts follow
  **********************************************************/
@@ -64,7 +70,7 @@ static HRESULT WINAPI
 IDirectDrawGammaControlImpl_QueryInterface(IDirectDrawGammaControl *iface, REFIID riid,
                                            void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface);
     TRACE_(ddraw_thunk)("(%p)->(%s,%p): Thunking to IDirectDrawSurface7\n", This, debugstr_guid(riid), obj);
 
     return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)This, riid, obj);
@@ -82,7 +88,7 @@ IDirectDrawGammaControlImpl_QueryInterface(IDirectDrawGammaControl *iface, REFII
 static ULONG WINAPI
 IDirectDrawGammaControlImpl_AddRef(IDirectDrawGammaControl *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface);
     TRACE_(ddraw_thunk)("(%p)->() Thunking to IDirectDrawSurface7\n", This);
 
     return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This);
@@ -100,7 +106,7 @@ IDirectDrawGammaControlImpl_AddRef(IDirectDrawGammaControl *iface)
 static ULONG WINAPI
 IDirectDrawGammaControlImpl_Release(IDirectDrawGammaControl *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface);
     TRACE_(ddraw_thunk)("(%p)->() Thunking to IDirectDrawSurface7\n", This);
 
     return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This);
@@ -129,7 +135,7 @@ IDirectDrawGammaControlImpl_GetGammaRamp(IDirectDrawGammaControl *iface,
                                          DWORD Flags,
                                          DDGAMMARAMP *GammaRamp)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface);
     TRACE("(%p)->(%08x,%p)\n", This,Flags,GammaRamp);
 
     /* This looks sane */
@@ -175,7 +181,7 @@ IDirectDrawGammaControlImpl_SetGammaRamp(IDirectDrawGammaControl *iface,
                                          DWORD Flags,
                                          DDGAMMARAMP *GammaRamp)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface);
     TRACE("(%p)->(%08x,%p)\n", This,Flags,GammaRamp);
 
     /* This looks sane */
diff --git a/dlls/ddraw/light.c b/dlls/ddraw/light.c
index 6c5ef8a7b2aba3e64497cacd883a74d4a9c8ac81..446c66255e0fddd20a3b4c88cffee0ac6ecc73bc 100644
--- a/dlls/ddraw/light.c
+++ b/dlls/ddraw/light.c
@@ -65,7 +65,7 @@ IDirect3DLightImpl_QueryInterface(IDirect3DLight *iface,
                                   REFIID riid,
                                   void **obp)
 {
-    ICOM_THIS_FROM(IDirect3DLightImpl, IDirect3DLight, iface);
+    IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
     FIXME("(%p)->(%s,%p): stub!\n", This, debugstr_guid(riid), obp);
     *obp = NULL;
     return E_NOINTERFACE;
@@ -83,7 +83,7 @@ IDirect3DLightImpl_QueryInterface(IDirect3DLight *iface,
 static ULONG WINAPI
 IDirect3DLightImpl_AddRef(IDirect3DLight *iface)
 {
-    ICOM_THIS_FROM(IDirect3DLightImpl, IDirect3DLight, iface);
+    IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p)->() incrementing from %u.\n", This, ref - 1);
@@ -104,7 +104,7 @@ IDirect3DLightImpl_AddRef(IDirect3DLight *iface)
 static ULONG WINAPI
 IDirect3DLightImpl_Release(IDirect3DLight *iface)
 {
-    ICOM_THIS_FROM(IDirect3DLightImpl, IDirect3DLight, iface);
+    IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->() decrementing from %u.\n", This, ref + 1);
@@ -137,7 +137,7 @@ static HRESULT WINAPI
 IDirect3DLightImpl_Initialize(IDirect3DLight *iface,
                               IDirect3D *lpDirect3D)
 {
-    ICOM_THIS_FROM(IDirect3DLightImpl, IDirect3DLight, iface);
+    IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
     IDirectDrawImpl *d3d = ICOM_OBJECT(IDirectDrawImpl, IDirect3D, lpDirect3D);
     TRACE("(%p)->(%p) no-op...\n", This, d3d);
     return D3D_OK;
@@ -169,7 +169,7 @@ static HRESULT WINAPI
 IDirect3DLightImpl_SetLight(IDirect3DLight *iface,
                             D3DLIGHT *lpLight)
 {
-    ICOM_THIS_FROM(IDirect3DLightImpl, IDirect3DLight, iface);
+    IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
     LPD3DLIGHT7 light7 = &(This->light7);
     TRACE("(%p)->(%p)\n", This, lpLight);
     if (TRACE_ON(d3d7)) {
@@ -226,7 +226,7 @@ static HRESULT WINAPI
 IDirect3DLightImpl_GetLight(IDirect3DLight *iface,
                             D3DLIGHT *lpLight)
 {
-    ICOM_THIS_FROM(IDirect3DLightImpl, IDirect3DLight, iface);
+    IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface;
     TRACE("(%p/%p)->(%p)\n", This, iface, lpLight);
     if (TRACE_ON(d3d7)) {
         TRACE("  Returning light definition :\n");
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index 0abe903c06e0e2d1f4cd0d584aa5c6bb4bba1a32..6967547e19d1fe22b2969718af2c7f96eeadf2db 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -539,7 +539,7 @@ IDirectDrawClassFactoryImpl_QueryInterface(IClassFactory *iface,
                     REFIID riid,
                     void **obj)
 {
-    ICOM_THIS_FROM(IClassFactoryImpl, IClassFactory, iface);
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
 
     TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj);
 
@@ -567,7 +567,7 @@ IDirectDrawClassFactoryImpl_QueryInterface(IClassFactory *iface,
 static ULONG WINAPI
 IDirectDrawClassFactoryImpl_AddRef(IClassFactory *iface)
 {
-    ICOM_THIS_FROM(IClassFactoryImpl, IClassFactory, iface);
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p)->() incrementing from %d.\n", This, ref - 1);
@@ -588,7 +588,7 @@ IDirectDrawClassFactoryImpl_AddRef(IClassFactory *iface)
 static ULONG WINAPI
 IDirectDrawClassFactoryImpl_Release(IClassFactory *iface)
 {
-    ICOM_THIS_FROM(IClassFactoryImpl, IClassFactory, iface);
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
     TRACE("(%p)->() decrementing from %d.\n", This, ref+1);
 
@@ -617,7 +617,7 @@ IDirectDrawClassFactoryImpl_CreateInstance(IClassFactory *iface,
                                            REFIID riid,
                                            void **obj)
 {
-    ICOM_THIS_FROM(IClassFactoryImpl, IClassFactory, iface);
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
 
     TRACE("(%p)->(%p,%s,%p)\n",This,UnkOuter,debugstr_guid(riid),obj);
 
@@ -639,7 +639,7 @@ IDirectDrawClassFactoryImpl_CreateInstance(IClassFactory *iface,
 static HRESULT WINAPI
 IDirectDrawClassFactoryImpl_LockServer(IClassFactory *iface,BOOL dolock)
 {
-    ICOM_THIS_FROM(IClassFactoryImpl, IClassFactory, iface);
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
     FIXME("(%p)->(%d),stub!\n",This,dolock);
     return S_OK;
 }
diff --git a/dlls/ddraw/material.c b/dlls/ddraw/material.c
index a322e3a11416198af6cca9a669df0974a74b9a40..3a0722d14375b7c52f89e0f091adf44e3ffcb7ee 100644
--- a/dlls/ddraw/material.c
+++ b/dlls/ddraw/material.c
@@ -50,6 +50,11 @@ static void dump_material(const D3DMATERIAL *mat)
     TRACE("  dwSize : %d\n", mat->dwSize);
 }
 
+static inline IDirect3DMaterialImpl *material_from_material1(IDirect3DMaterial *iface)
+{
+    return (IDirect3DMaterialImpl *)((char*)iface - FIELD_OFFSET(IDirect3DMaterialImpl, IDirect3DMaterial_vtbl));
+}
+
 /*****************************************************************************
  * IUnknown Methods.
  *****************************************************************************/
@@ -74,7 +79,7 @@ IDirect3DMaterialImpl_QueryInterface(IDirect3DMaterial3 *iface,
                                      REFIID riid,
                                      LPVOID* obp)
 {
-    ICOM_THIS_FROM(IDirect3DMaterialImpl, IDirect3DMaterial3, iface);
+    IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
     TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obp);
 
     *obp = NULL;
@@ -119,7 +124,7 @@ IDirect3DMaterialImpl_QueryInterface(IDirect3DMaterial3 *iface,
 static ULONG WINAPI
 IDirect3DMaterialImpl_AddRef(IDirect3DMaterial3 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DMaterialImpl, IDirect3DMaterial3, iface);
+    IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p)->() incrementing from %u.\n", This, ref - 1);
@@ -140,7 +145,7 @@ IDirect3DMaterialImpl_AddRef(IDirect3DMaterial3 *iface)
 static ULONG WINAPI
 IDirect3DMaterialImpl_Release(IDirect3DMaterial3 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DMaterialImpl, IDirect3DMaterial3, iface);
+    IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->() decrementing from %u.\n", This, ref + 1);
@@ -181,7 +186,7 @@ static HRESULT WINAPI
 IDirect3DMaterialImpl_Initialize(IDirect3DMaterial *iface,
                                   IDirect3D *Direct3D)
 {
-    ICOM_THIS_FROM(IDirect3DMaterialImpl, IDirect3DMaterial, iface);
+    IDirect3DMaterialImpl *This = material_from_material1(iface);
 
     TRACE("(%p)->(%p) no-op...!\n", This, Direct3D);
 
@@ -201,7 +206,7 @@ IDirect3DMaterialImpl_Initialize(IDirect3DMaterial *iface,
 static HRESULT WINAPI
 IDirect3DMaterialImpl_Reserve(IDirect3DMaterial *iface)
 {
-    ICOM_THIS_FROM(IDirect3DMaterialImpl, IDirect3DMaterial, iface);
+    IDirect3DMaterialImpl *This = material_from_material1(iface);
     TRACE("(%p)->() not implemented\n", This);
 
     return DDERR_UNSUPPORTED;
@@ -219,7 +224,7 @@ IDirect3DMaterialImpl_Reserve(IDirect3DMaterial *iface)
 static HRESULT WINAPI
 IDirect3DMaterialImpl_Unreserve(IDirect3DMaterial *iface)
 {
-    ICOM_THIS_FROM(IDirect3DMaterialImpl, IDirect3DMaterial, iface);
+    IDirect3DMaterialImpl *This = material_from_material1(iface);
     TRACE("(%p)->() not implemented.\n", This);
 
     return DDERR_UNSUPPORTED;
@@ -242,7 +247,7 @@ static HRESULT WINAPI
 IDirect3DMaterialImpl_SetMaterial(IDirect3DMaterial3 *iface,
                                   D3DMATERIAL *lpMat)
 {
-    ICOM_THIS_FROM(IDirect3DMaterialImpl, IDirect3DMaterial3, iface);
+    IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
     TRACE("(%p)->(%p)\n", This, lpMat);
     if (TRACE_ON(d3d7))
         dump_material(lpMat);
@@ -273,7 +278,7 @@ static HRESULT WINAPI
 IDirect3DMaterialImpl_GetMaterial(IDirect3DMaterial3 *iface,
                                   D3DMATERIAL *lpMat)
 {
-    ICOM_THIS_FROM(IDirect3DMaterialImpl, IDirect3DMaterial3, iface);
+    IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
     DWORD dwSize;
     TRACE("(%p)->(%p)\n", This, lpMat);
     if (TRACE_ON(d3d7)) {
@@ -311,7 +316,7 @@ IDirect3DMaterialImpl_GetHandle(IDirect3DMaterial3 *iface,
                                 IDirect3DDevice3 *lpDirect3DDevice3,
                                 D3DMATERIALHANDLE *lpHandle)
 {
-    ICOM_THIS_FROM(IDirect3DMaterialImpl, IDirect3DMaterial3, iface);
+    IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface;
     IDirect3DDeviceImpl *device = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice3, lpDirect3DDevice3);
     TRACE("(%p/%p)->(%p,%p)\n", This, iface, device, lpHandle);
 
diff --git a/dlls/ddraw/palette.c b/dlls/ddraw/palette.c
index 7e9776e4fc6807978c95c6bf3a65fa319cb54645..9ef0a7ce031835146d237ffc64e6633a54680dc2 100644
--- a/dlls/ddraw/palette.c
+++ b/dlls/ddraw/palette.c
@@ -49,7 +49,7 @@ IDirectDrawPaletteImpl_QueryInterface(IDirectDrawPalette *iface,
                                       REFIID refiid,
                                       void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawPaletteImpl, IDirectDrawPalette, iface);
+    IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
 
     if (IsEqualGUID(refiid, &IID_IUnknown)
@@ -78,7 +78,7 @@ IDirectDrawPaletteImpl_QueryInterface(IDirectDrawPalette *iface,
 static ULONG WINAPI
 IDirectDrawPaletteImpl_AddRef(IDirectDrawPalette *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawPaletteImpl, IDirectDrawPalette, iface);
+    IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p)->() incrementing from %u.\n", This, ref - 1);
@@ -98,7 +98,7 @@ IDirectDrawPaletteImpl_AddRef(IDirectDrawPalette *iface)
 static ULONG WINAPI
 IDirectDrawPaletteImpl_Release(IDirectDrawPalette *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawPaletteImpl, IDirectDrawPalette, iface);
+    IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->() decrementing from %u.\n", This, ref + 1);
@@ -161,7 +161,7 @@ static HRESULT WINAPI
 IDirectDrawPaletteImpl_GetCaps(IDirectDrawPalette *iface,
                                DWORD *Caps)
 {
-    ICOM_THIS_FROM(IDirectDrawPaletteImpl, IDirectDrawPalette, iface);
+    IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p): Relay\n", This, Caps);
 
@@ -196,7 +196,7 @@ IDirectDrawPaletteImpl_SetEntries(IDirectDrawPalette *iface,
                                   DWORD Count,
                                   PALETTEENTRY *PalEnt)
 {
-    ICOM_THIS_FROM(IDirectDrawPaletteImpl, IDirectDrawPalette, iface);
+    IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%x,%d,%d,%p): Relay\n", This, Flags, Start, Count, PalEnt);
 
@@ -233,7 +233,7 @@ IDirectDrawPaletteImpl_GetEntries(IDirectDrawPalette *iface,
                                   DWORD Count,
                                   PALETTEENTRY *PalEnt)
 {
-    ICOM_THIS_FROM(IDirectDrawPaletteImpl, IDirectDrawPalette, iface);
+    IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%x,%d,%d,%p): Relay\n", This, Flags, Start, Count, PalEnt);
 
diff --git a/dlls/ddraw/parent.c b/dlls/ddraw/parent.c
index 7ecf0cf592e0558fe5b914ce719da8d0e2e65a37..ec4cfde7cfd01442c07e1ed63123f45776dce9ae 100644
--- a/dlls/ddraw/parent.c
+++ b/dlls/ddraw/parent.c
@@ -95,7 +95,7 @@ IParentImpl_QueryInterface(IParent *iface,
 static ULONG WINAPI
 IParentImpl_AddRef(IParent *iface)
 {
-    ICOM_THIS_FROM(IParentImpl, IParent, iface);
+    IParentImpl *This = (IParentImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p) : AddRef from %d\n", This, ref - 1);
@@ -120,7 +120,7 @@ IParentImpl_AddRef(IParent *iface)
 static ULONG WINAPI 
 IParentImpl_Release(IParent *iface)
 {
-    ICOM_THIS_FROM(IParentImpl, IParent, iface);
+    IParentImpl *This = (IParentImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p) : ReleaseRef to %d\n", This, ref);
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index c3789b41f65caaff4e3213709ad4400b9f4febe9..fc442655bca19c6187c4336d72817310c16c7ff5 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -75,7 +75,7 @@ IDirectDrawSurfaceImpl_QueryInterface(IDirectDrawSurface7 *iface,
                                       REFIID riid,
                                       void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
 
     /* According to COM docs, if the QueryInterface fails, obj should be set to NULL */
     *obj = NULL;
@@ -156,7 +156,7 @@ IDirectDrawSurfaceImpl_QueryInterface(IDirectDrawSurface7 *iface,
 static ULONG WINAPI
 IDirectDrawSurfaceImpl_AddRef(IDirectDrawSurface7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     ULONG refCount = InterlockedIncrement(&This->ref);
 
     TRACE("(%p) : AddRef increasing from %d\n", This, refCount - 1);
@@ -271,7 +271,7 @@ void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This)
 static ULONG WINAPI
 IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     ULONG ref;
     TRACE("(%p) : Releasing from %d\n", This, This->ref);
     ref = InterlockedDecrement(&This->ref);
@@ -463,7 +463,7 @@ IDirectDrawSurfaceImpl_GetAttachedSurface(IDirectDrawSurface7 *iface,
                                           DDSCAPS2 *Caps,
                                           IDirectDrawSurface7 **Surface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IDirectDrawSurfaceImpl *surf;
     DDSCAPS2 our_caps;
     int i;
@@ -574,7 +574,7 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface,
                             DWORD Flags,
                             HANDLE h)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     WINED3DLOCKED_RECT LockedRect;
     HRESULT hr;
     TRACE("(%p)->(%p,%p,%x,%p)\n", This, Rect, DDSD, Flags, h);
@@ -668,7 +668,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_Unlock(IDirectDrawSurface7 *iface,
                               RECT *pRect)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p)\n", This, pRect);
 
@@ -706,7 +706,7 @@ IDirectDrawSurfaceImpl_Flip(IDirectDrawSurface7 *iface,
                             IDirectDrawSurface7 *DestOverride,
                             DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IDirectDrawSurfaceImpl *Override = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, DestOverride);
     IDirectDrawSurface7 *Override7;
     HRESULT hr;
@@ -772,7 +772,7 @@ IDirectDrawSurfaceImpl_Blt(IDirectDrawSurface7 *iface,
                            DWORD Flags,
                            DDBLTFX *DDBltFx)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     IDirectDrawSurfaceImpl *Src = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, SrcSurface);
     TRACE("(%p)->(%p,%p,%p,%x,%p)\n", This, DestRect, Src, SrcRect, Flags, DDBltFx);
@@ -932,7 +932,7 @@ static HRESULT WINAPI
 IDirectDrawSurface7Impl_AddAttachedSurface(IDirectDrawSurface7 *iface,
                                            IDirectDrawSurface7 *Attach)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IDirectDrawSurfaceImpl *Surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, Attach);
 
     /* Version 7 of this interface seems to refuse everything except z buffers, as per msdn */
@@ -967,7 +967,7 @@ IDirectDrawSurfaceImpl_DeleteAttachedSurface(IDirectDrawSurface7 *iface,
                                              DWORD Flags,
                                              IDirectDrawSurface7 *Attach)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IDirectDrawSurfaceImpl *Surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, Attach);
     IDirectDrawSurfaceImpl *Prev = This;
     TRACE("(%p)->(%08x,%p)\n", This, Flags, Surf);
@@ -1030,7 +1030,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_AddOverlayDirtyRect(IDirectDrawSurface7 *iface,
                                            LPRECT Rect)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     TRACE("(%p)->(%p)\n",This,Rect);
 
     /* MSDN says it's not implemented. I could forward it to WineD3D, 
@@ -1061,7 +1061,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetDC(IDirectDrawSurface7 *iface,
                              HDC *hdc)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p): Relay\n", This, hdc);
 
@@ -1092,7 +1092,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_ReleaseDC(IDirectDrawSurface7 *iface,
                                  HDC hdc)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p): Relay\n", This, hdc);
 
@@ -1119,7 +1119,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetCaps(IDirectDrawSurface7 *iface,
                                DDSCAPS2 *Caps)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     TRACE("(%p)->(%p)\n",This,Caps);
 
     if(!Caps)
@@ -1145,7 +1145,7 @@ IDirectDrawSurfaceImpl_GetCaps(IDirectDrawSurface7 *iface,
 static HRESULT WINAPI
 IDirectDrawSurfaceImpl_SetPriority(IDirectDrawSurface7 *iface, DWORD Priority)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%d): Relay!\n",This,Priority);
 
@@ -1173,7 +1173,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetPriority(IDirectDrawSurface7 *iface,
                                    DWORD *Priority)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     TRACE("(%p)->(%p): Relay\n",This,Priority);
 
     if(!Priority)
@@ -1211,7 +1211,7 @@ IDirectDrawSurfaceImpl_SetPrivateData(IDirectDrawSurface7 *iface,
                                       DWORD Size,
                                       DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%s,%p,%d,%x): Relay\n", This, debugstr_guid(tag), Data, Size, Flags);
 
@@ -1251,7 +1251,7 @@ IDirectDrawSurfaceImpl_GetPrivateData(IDirectDrawSurface7 *iface,
                                       void *Data,
                                       DWORD *Size)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%s,%p,%p): Relay\n", This, debugstr_guid(tag), Data, Size);
 
@@ -1284,7 +1284,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_FreePrivateData(IDirectDrawSurface7 *iface,
                                        REFGUID tag)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%s): Relay\n", This, debugstr_guid(tag));
 
@@ -1376,7 +1376,7 @@ IDirectDrawSurfaceImpl_EnumAttachedSurfaces(IDirectDrawSurface7 *iface,
                                             void *context,
                                             LPDDENUMSURFACESCALLBACK7 cb)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IDirectDrawSurfaceImpl *surf;
     DDSURFACEDESC2 desc;
     int i;
@@ -1462,7 +1462,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetBltStatus(IDirectDrawSurface7 *iface,
                                     DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%x): Relay\n", This, Flags);
 
@@ -1495,7 +1495,7 @@ IDirectDrawSurfaceImpl_GetColorKey(IDirectDrawSurface7 *iface,
                                    DWORD Flags,
                                    DDCOLORKEY *CKey)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     TRACE("(%p)->(%08x,%p)\n", This, Flags, CKey);
 
     if(!CKey)
@@ -1566,7 +1566,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetFlipStatus(IDirectDrawSurface7 *iface,
                                      DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%x): Relay\n", This, Flags);
 
@@ -1596,7 +1596,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetOverlayPosition(IDirectDrawSurface7 *iface,
                                           LONG *X,
                                           LONG *Y) {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%p,%p): Relay\n", This, X, Y);
 
@@ -1627,7 +1627,7 @@ IDirectDrawSurfaceImpl_GetPixelFormat(IDirectDrawSurface7 *iface,
                                       DDPIXELFORMAT *PixelFormat)
 {
     /* What is DDERR_INVALIDSURFACETYPE for here? */
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     TRACE("(%p)->(%p)\n",This,PixelFormat);
 
     if(!PixelFormat)
@@ -1659,7 +1659,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetSurfaceDesc(IDirectDrawSurface7 *iface,
                                       DDSURFACEDESC2 *DDSD)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
 
     TRACE("(%p)->(%p)\n",This,DDSD);
 
@@ -1699,7 +1699,7 @@ IDirectDrawSurfaceImpl_Initialize(IDirectDrawSurface7 *iface,
                                   IDirectDraw *DD,
                                   DDSURFACEDESC2 *DDSD)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IDirectDrawImpl *ddimpl = ICOM_OBJECT(IDirectDrawImpl, IDirectDraw, DD);
     TRACE("(%p)->(%p,%p)\n",This,ddimpl,DDSD);
 
@@ -1720,7 +1720,7 @@ IDirectDrawSurfaceImpl_Initialize(IDirectDrawSurface7 *iface,
 static HRESULT WINAPI
 IDirectDrawSurfaceImpl_IsLost(IDirectDrawSurface7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)\n", This);
 
@@ -1763,7 +1763,7 @@ IDirectDrawSurfaceImpl_IsLost(IDirectDrawSurface7 *iface)
 static HRESULT WINAPI
 IDirectDrawSurfaceImpl_Restore(IDirectDrawSurface7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)\n", This);
 
@@ -1798,7 +1798,7 @@ IDirectDrawSurfaceImpl_SetOverlayPosition(IDirectDrawSurface7 *iface,
                                           LONG X,
                                           LONG Y)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%d,%d): Relay\n", This, X, Y);
 
@@ -1833,7 +1833,7 @@ IDirectDrawSurfaceImpl_UpdateOverlay(IDirectDrawSurface7 *iface,
                                      DWORD Flags,
                                      LPDDOVERLAYFX FX)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IDirectDrawSurfaceImpl *Dst = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, DstSurface);
     HRESULT hr;
     TRACE("(%p)->(%p,%p,%p,%x,%p): Relay\n", This, SrcRect, Dst, DstRect, Flags, FX);
@@ -1870,7 +1870,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_UpdateOverlayDisplay(IDirectDrawSurface7 *iface,
                                             DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     TRACE("(%p)->(%x)\n", This, Flags);
     return DDERR_UNSUPPORTED;
 }
@@ -1893,7 +1893,7 @@ IDirectDrawSurfaceImpl_UpdateOverlayZOrder(IDirectDrawSurface7 *iface,
                                            DWORD Flags,
                                            IDirectDrawSurface7 *DDSRef)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     IDirectDrawSurfaceImpl *Ref = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, DDSRef);
 
@@ -1924,7 +1924,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetDDInterface(IDirectDrawSurface7 *iface,
                                       void **DD)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
 
     TRACE("(%p)->(%p)\n",This,DD);
 
@@ -1958,7 +1958,7 @@ IDirectDrawSurfaceImpl_GetDDInterface(IDirectDrawSurface7 *iface,
 /* This seems also windows implementation specific - I don't think WineD3D needs this */
 static HRESULT WINAPI IDirectDrawSurfaceImpl_ChangeUniquenessValue(IDirectDrawSurface7 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     volatile IDirectDrawSurfaceImpl* vThis = This;
 
     TRACE("(%p)\n",This);
@@ -1987,7 +1987,7 @@ static HRESULT WINAPI IDirectDrawSurfaceImpl_ChangeUniquenessValue(IDirectDrawSu
 
 static HRESULT WINAPI IDirectDrawSurfaceImpl_GetUniquenessValue(IDirectDrawSurface7 *iface, LPDWORD pValue)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
 
     TRACE("(%p)->(%p)\n",This,pValue);
     EnterCriticalSection(&ddraw_cs);
@@ -2013,7 +2013,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_SetLOD(IDirectDrawSurface7 *iface,
                               DWORD MaxLOD)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->(%d)\n", This, MaxLOD);
 
@@ -2055,7 +2055,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetLOD(IDirectDrawSurface7 *iface,
                               DWORD *MaxLOD)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     TRACE("(%p)->(%p)\n", This, MaxLOD);
 
     if(!MaxLOD)
@@ -2098,7 +2098,7 @@ IDirectDrawSurfaceImpl_BltFast(IDirectDrawSurface7 *iface,
                                RECT *rsrc,
                                DWORD trans)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     HRESULT hr;
     IDirectDrawSurfaceImpl *src = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, Source);
     TRACE("(%p)->(%d,%d,%p,%p,%d): Relay\n", This, dstx, dsty, Source, rsrc, trans);
@@ -2166,7 +2166,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetClipper(IDirectDrawSurface7 *iface,
                                   IDirectDrawClipper **Clipper)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     TRACE("(%p)->(%p)\n", This, Clipper);
 
     if(!Clipper)
@@ -2204,7 +2204,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_SetClipper(IDirectDrawSurface7 *iface,
                                   IDirectDrawClipper *Clipper)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IDirectDrawClipperImpl *oldClipper = This->clipper;
     HWND clipWindow;
     HRESULT hr;
@@ -2266,7 +2266,7 @@ IDirectDrawSurfaceImpl_SetSurfaceDesc(IDirectDrawSurface7 *iface,
                                       DDSURFACEDESC2 *DDSD,
                                       DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     WINED3DFORMAT newFormat = WINED3DFMT_UNKNOWN;
     HRESULT hr;
     TRACE("(%p)->(%p,%x)\n", This, DDSD, Flags);
@@ -2361,7 +2361,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_GetPalette(IDirectDrawSurface7 *iface,
                                   IDirectDrawPalette **Pal)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IWineD3DPalette *wPal;
     HRESULT hr;
     TRACE("(%p)->(%p): Relay\n", This, Pal);
@@ -2410,7 +2410,7 @@ SetColorKeyEnum(IDirectDrawSurface7 *surface,
                 DDSURFACEDESC2 *desc,
                 void *context)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, surface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)surface;
     struct SCKContext *ctx = context;
     HRESULT hr;
 
@@ -2451,7 +2451,7 @@ IDirectDrawSurfaceImpl_SetColorKey(IDirectDrawSurface7 *iface,
                                    DWORD Flags,
                                    DDCOLORKEY *CKey)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     struct SCKContext ctx = { DD_OK, (WINEDDCOLORKEY *) CKey, Flags };
     TRACE("(%p)->(%x,%p)\n", This, Flags, CKey);
 
@@ -2540,7 +2540,7 @@ static HRESULT WINAPI
 IDirectDrawSurfaceImpl_SetPalette(IDirectDrawSurface7 *iface,
                                   IDirectDrawPalette *Pal)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
     IDirectDrawPalette *oldPal;
     IDirectDrawSurfaceImpl *surf;
     IDirectDrawPaletteImpl *PalImpl = ICOM_OBJECT(IDirectDrawPaletteImpl, IDirectDrawPalette, Pal);
diff --git a/dlls/ddraw/surface_thunks.c b/dlls/ddraw/surface_thunks.c
index a0786bb78b6b21e52425b27b5cccabaa390f6ebb..86bd0342f4624e58fc5b1da579804d17573c88f3 100644
--- a/dlls/ddraw/surface_thunks.c
+++ b/dlls/ddraw/surface_thunks.c
@@ -44,6 +44,11 @@
 WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk);
 WINE_DECLARE_DEBUG_CHANNEL(ddraw);
 
+static inline IDirectDrawSurfaceImpl *surface_from_surface3(IDirectDrawSurface3 *iface)
+{
+    return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawSurface3_vtbl));
+}
+
 static HRESULT WINAPI
 IDirectDrawSurface3Impl_QueryInterface(LPDIRECTDRAWSURFACE3 This, REFIID iid,
 				       LPVOID *ppObj)
@@ -60,7 +65,7 @@ IDirectDrawSurface3Impl_AddRef(LPDIRECTDRAWSURFACE3 This)
 static ULONG WINAPI
 IDirectDrawSurface3Impl_Release(LPDIRECTDRAWSURFACE3 iface)
 {
-    ICOM_THIS_FROM( IDirectDrawSurfaceImpl, IDirectDrawSurface3, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_surface3(iface);
     TRACE("(%p)\n", This);
     return IDirectDrawSurface7_Release(CONVERT(iface));
 }
@@ -69,7 +74,7 @@ static HRESULT WINAPI
 IDirectDrawSurface3Impl_AddAttachedSurface(LPDIRECTDRAWSURFACE3 iface,
 					   LPDIRECTDRAWSURFACE3 pAttach)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface3, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_surface3(iface);
     IDirectDrawSurfaceImpl *Surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface3, pAttach);
     TRACE("(%p)->(%p)\n", This, Surf);
 
@@ -303,7 +308,7 @@ static HRESULT WINAPI
 IDirectDrawSurface3Impl_GetSurfaceDesc(LPDIRECTDRAWSURFACE3 iface,
 				       LPDDSURFACEDESC pDDSD)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface3, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_surface3(iface);
 
     TRACE_(ddraw)("(%p)->(%p)\n",This,pDDSD);
 
diff --git a/dlls/ddraw/texture.c b/dlls/ddraw/texture.c
index b3caabbd8741b942770e5ba675944cc9c3a97aa8..b6759c620bd68c371b55f312b52a29f479c1b64c 100644
--- a/dlls/ddraw/texture.c
+++ b/dlls/ddraw/texture.c
@@ -45,6 +45,16 @@
 WINE_DEFAULT_DEBUG_CHANNEL(d3d7);
 WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk);
 
+static inline IDirectDrawSurfaceImpl *surface_from_texture1(IDirect3DTexture *iface)
+{
+    return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirect3DTexture_vtbl));
+}
+
+static inline IDirectDrawSurfaceImpl *surface_from_texture2(IDirect3DTexture2 *iface)
+{
+    return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirect3DTexture2_vtbl));
+}
+
 /*****************************************************************************
  * IUnknown interfaces. They are thunks to IDirectDrawSurface7
  *****************************************************************************/
@@ -53,7 +63,7 @@ Thunk_IDirect3DTextureImpl_2_QueryInterface(IDirect3DTexture2 *iface,
                                             REFIID riid,
                                             void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture2(iface);
     TRACE("(%p)->(%s,%p) thunking to IDirectDrawSurface7 interface.\n", This, debugstr_guid(riid), obj);
     return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)This, riid, obj);
 }
@@ -63,7 +73,7 @@ Thunk_IDirect3DTextureImpl_1_QueryInterface(IDirect3DTexture *iface,
                                             REFIID riid,
                                             void **obj)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     TRACE("(%p)->(%s,%p) thunking to IDirectDrawSurface7 interface.\n", This, debugstr_guid(riid), obj);
 
     return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)This, riid, obj);
@@ -72,7 +82,7 @@ Thunk_IDirect3DTextureImpl_1_QueryInterface(IDirect3DTexture *iface,
 static ULONG WINAPI
 Thunk_IDirect3DTextureImpl_2_AddRef(IDirect3DTexture2 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture2(iface);
     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
 
     return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This);
@@ -81,7 +91,7 @@ Thunk_IDirect3DTextureImpl_2_AddRef(IDirect3DTexture2 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DTextureImpl_1_AddRef(IDirect3DTexture *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
 
     return IDirectDrawSurface7_AddRef(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirectDrawSurface7, iface));
@@ -90,7 +100,7 @@ Thunk_IDirect3DTextureImpl_1_AddRef(IDirect3DTexture *iface)
 static ULONG WINAPI
 Thunk_IDirect3DTextureImpl_2_Release(IDirect3DTexture2 *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture2(iface);
     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
 
     return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This);
@@ -100,7 +110,7 @@ Thunk_IDirect3DTextureImpl_2_Release(IDirect3DTexture2 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DTextureImpl_1_Release(IDirect3DTexture *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This);
 
     return IDirectDrawSurface7_Release(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirectDrawSurface7, iface));
@@ -127,7 +137,7 @@ IDirect3DTextureImpl_1_Initialize(IDirect3DTexture *iface,
                                   IDirect3DDevice *Direct3DDevice,
                                   IDirectDrawSurface *DDSurface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     IDirect3DDeviceImpl *d3d = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice, Direct3DDevice);
     IDirectDrawSurfaceImpl *surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface3, DDSurface);
     TRACE("(%p)->(%p,%p) Not implemented\n", This, d3d, surf);
@@ -152,7 +162,7 @@ IDirect3DTextureImpl_PaletteChanged(IDirect3DTexture2 *iface,
                                          DWORD Start,
                                          DWORD Count)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture2(iface);
     FIXME("(%p)->(%08x,%08x): stub!\n", This, Start, Count);
     return D3D_OK;
 }
@@ -162,7 +172,7 @@ Thunk_IDirect3DTextureImpl_1_PaletteChanged(IDirect3DTexture *iface,
                                             DWORD Start,
                                             DWORD Count)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     TRACE("(%p)->(%08x,%08x) thunking to IDirect3DTexture2 interface.\n", This, Start, Count);
 
     return IDirect3DTexture2_PaletteChanged(COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, IDirect3DTexture, IDirect3DTexture2, iface),
@@ -184,7 +194,7 @@ Thunk_IDirect3DTextureImpl_1_PaletteChanged(IDirect3DTexture *iface,
 static HRESULT WINAPI
 IDirect3DTextureImpl_1_Unload(IDirect3DTexture *iface)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     TRACE("(%p)->(): not implemented!\n", This);
     return DDERR_UNSUPPORTED;
 }
@@ -208,7 +218,7 @@ IDirect3DTextureImpl_GetHandle(IDirect3DTexture2 *iface,
                                     IDirect3DDevice2 *Direct3DDevice2,
                                     D3DTEXTUREHANDLE *lpHandle)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture2(iface);
     IDirect3DDeviceImpl *d3d = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice2, Direct3DDevice2);
 
     TRACE("(%p)->(%p,%p)\n", This, d3d, lpHandle);
@@ -236,7 +246,7 @@ Thunk_IDirect3DTextureImpl_1_GetHandle(IDirect3DTexture *iface,
                                        LPDIRECT3DDEVICE lpDirect3DDevice,
                                        LPD3DTEXTUREHANDLE lpHandle)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     IDirect3DDeviceImpl *d3d = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice, lpDirect3DDevice);
     IDirect3DTexture2 *d3d_texture2 = (IDirect3DTexture2 *)&This->IDirect3DTexture2_vtbl;
     IDirect3DDevice2 *d3d_device2 = (IDirect3DDevice2 *)&d3d->IDirect3DDevice2_vtbl;
@@ -294,7 +304,7 @@ static HRESULT WINAPI
 IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface,
                           IDirect3DTexture2 *D3DTexture2)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture2, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture2(iface);
     IDirectDrawSurfaceImpl *src_ptr = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture2, D3DTexture2);
     HRESULT ret_value = D3D_OK;
     if(src_ptr == This)
@@ -468,7 +478,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DTextureImpl_1_Load(IDirect3DTexture *iface,
                                   IDirect3DTexture *D3DTexture)
 {
-    ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirect3DTexture, iface);
+    IDirectDrawSurfaceImpl *This = surface_from_texture1(iface);
     IDirectDrawSurfaceImpl *Texture = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirect3DTexture, D3DTexture);
     TRACE("(%p)->(%p) thunking to IDirect3DTexture2 interface.\n", This, Texture);
 
diff --git a/dlls/ddraw/vertexbuffer.c b/dlls/ddraw/vertexbuffer.c
index 3534616c9e7b158351cb7ad2f345aeae8edcb505..2e001178b88ac5102bfd16dbc7a42868d2900e9c 100644
--- a/dlls/ddraw/vertexbuffer.c
+++ b/dlls/ddraw/vertexbuffer.c
@@ -44,6 +44,11 @@
 WINE_DEFAULT_DEBUG_CHANNEL(d3d7);
 WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk);
 
+static inline IDirect3DVertexBufferImpl *vb_from_vb1(IDirect3DVertexBuffer *iface)
+{
+    return (IDirect3DVertexBufferImpl *)((char*)iface
+            - FIELD_OFFSET(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer_vtbl));
+}
 
 /*****************************************************************************
  * IUnknown Methods
@@ -69,7 +74,7 @@ IDirect3DVertexBufferImpl_QueryInterface(IDirect3DVertexBuffer7 *iface,
                                          REFIID riid,
                                          void  **obj)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
+    IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj);
 
     /* By default, set the object pointer to NULL */
@@ -105,7 +110,7 @@ Thunk_IDirect3DVertexBufferImpl_1_QueryInterface(IDirect3DVertexBuffer *iface,
                                                  REFIID riid,
                                                  void **obj)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, iface);
+    IDirect3DVertexBufferImpl *This = vb_from_vb1(iface);
     TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DVertexBuffer7 interface.\n", This, debugstr_guid(riid), obj);
 
     return IDirect3DVertexBuffer7_QueryInterface((IDirect3DVertexBuffer7 *)This, riid, obj);
@@ -123,7 +128,7 @@ Thunk_IDirect3DVertexBufferImpl_1_QueryInterface(IDirect3DVertexBuffer *iface,
 static ULONG WINAPI
 IDirect3DVertexBufferImpl_AddRef(IDirect3DVertexBuffer7 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
+    IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p/%p)->() incrementing from %u.\n", This, iface, ref - 1);
@@ -134,7 +139,7 @@ IDirect3DVertexBufferImpl_AddRef(IDirect3DVertexBuffer7 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DVertexBufferImpl_1_AddRef(IDirect3DVertexBuffer *iface)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, iface);
+    IDirect3DVertexBufferImpl *This = vb_from_vb1(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", This);
 
     return IDirect3DVertexBuffer7_AddRef((IDirect3DVertexBuffer7 *)This);
@@ -153,7 +158,7 @@ Thunk_IDirect3DVertexBufferImpl_1_AddRef(IDirect3DVertexBuffer *iface)
 static ULONG WINAPI
 IDirect3DVertexBufferImpl_Release(IDirect3DVertexBuffer7 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
+    IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->() decrementing from %u.\n", This, ref + 1);
@@ -199,7 +204,7 @@ IDirect3DVertexBufferImpl_Release(IDirect3DVertexBuffer7 *iface)
 static ULONG WINAPI
 Thunk_IDirect3DVertexBufferImpl_1_Release(IDirect3DVertexBuffer *iface)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, iface);
+    IDirect3DVertexBufferImpl *This = vb_from_vb1(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", This);
 
     return IDirect3DVertexBuffer7_Release((IDirect3DVertexBuffer7 *)This);
@@ -234,7 +239,7 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface,
                                void **Data,
                                DWORD *Size)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
+    IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     WINED3DVERTEXBUFFER_DESC Desc;
     HRESULT hr;
     TRACE("(%p)->(%08x,%p,%p)\n", This, Flags, Data, Size);
@@ -269,7 +274,7 @@ Thunk_IDirect3DVertexBufferImpl_1_Lock(IDirect3DVertexBuffer *iface,
                                        void **Data,
                                        DWORD *Size)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, iface);
+    IDirect3DVertexBufferImpl *This = vb_from_vb1(iface);
     TRACE_(ddraw_thunk)("(%p)->(%08x,%p,%p) thunking to IDirect3DVertexBuffer7 interface.\n", This, Flags, Data, Size);
 
     return IDirect3DVertexBuffer7_Lock((IDirect3DVertexBuffer7 *)This, Flags, Data, Size);
@@ -287,7 +292,7 @@ Thunk_IDirect3DVertexBufferImpl_1_Lock(IDirect3DVertexBuffer *iface,
 static HRESULT WINAPI
 IDirect3DVertexBufferImpl_Unlock(IDirect3DVertexBuffer7 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
+    IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     HRESULT hr;
     TRACE("(%p)->()\n", This);
 
@@ -301,7 +306,7 @@ IDirect3DVertexBufferImpl_Unlock(IDirect3DVertexBuffer7 *iface)
 static HRESULT WINAPI
 Thunk_IDirect3DVertexBufferImpl_1_Unlock(IDirect3DVertexBuffer *iface)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, iface);
+    IDirect3DVertexBufferImpl *This = vb_from_vb1(iface);
     TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", This);
 
     return IDirect3DVertexBuffer7_Unlock((IDirect3DVertexBuffer7 *)This);
@@ -340,7 +345,7 @@ IDirect3DVertexBufferImpl_ProcessVertices(IDirect3DVertexBuffer7 *iface,
                                           IDirect3DDevice7 *D3DDevice,
                                           DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
+    IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     IDirect3DVertexBufferImpl *Src = ICOM_OBJECT(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, SrcBuffer);
     IDirect3DDeviceImpl *D3D = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice7, D3DDevice);
     BOOL oldClip, doClip;
@@ -413,7 +418,7 @@ Thunk_IDirect3DVertexBufferImpl_1_ProcessVertices(IDirect3DVertexBuffer *iface,
                                                   IDirect3DDevice3 *D3DDevice,
                                                   DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, iface);
+    IDirect3DVertexBufferImpl *This = vb_from_vb1(iface);
     IDirect3DVertexBufferImpl *Src = ICOM_OBJECT(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, SrcBuffer);
     IDirect3DDeviceImpl *D3D = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice3, D3DDevice);
 
@@ -440,7 +445,7 @@ static HRESULT WINAPI
 IDirect3DVertexBufferImpl_GetVertexBufferDesc(IDirect3DVertexBuffer7 *iface,
                                               D3DVERTEXBUFFERDESC *Desc)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
+    IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     WINED3DVERTEXBUFFER_DESC WDesc;
     HRESULT hr;
     TRACE("(%p)->(%p)\n", This, Desc);
@@ -470,7 +475,7 @@ static HRESULT WINAPI
 Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc(IDirect3DVertexBuffer *iface,
                                                       D3DVERTEXBUFFERDESC *Desc)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, iface);
+    IDirect3DVertexBufferImpl *This = vb_from_vb1(iface);
     TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DVertexBuffer7 interface.\n", This, Desc);
 
     return IDirect3DVertexBuffer7_GetVertexBufferDesc((IDirect3DVertexBuffer7 *)This, Desc);
@@ -495,7 +500,7 @@ IDirect3DVertexBufferImpl_Optimize(IDirect3DVertexBuffer7 *iface,
                                    IDirect3DDevice7 *D3DDevice,
                                    DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
+    IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     IDirect3DDeviceImpl *D3D = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice7, D3DDevice);
     static BOOL hide = FALSE;
 
@@ -520,7 +525,7 @@ Thunk_IDirect3DVertexBufferImpl_1_Optimize(IDirect3DVertexBuffer *iface,
                                            IDirect3DDevice3 *D3DDevice,
                                            DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer, iface);
+    IDirect3DVertexBufferImpl *This = vb_from_vb1(iface);
     IDirect3DDeviceImpl *D3D = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice3, D3DDevice);
     TRACE_(ddraw_thunk)("(%p)->(%p,%08x) thunking to IDirect3DVertexBuffer7 interface.\n", This, D3D, Flags);
 
@@ -559,7 +564,7 @@ IDirect3DVertexBufferImpl_ProcessVerticesStrided(IDirect3DVertexBuffer7 *iface,
                                                  IDirect3DDevice7 *D3DDevice,
                                                  DWORD Flags)
 {
-    ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface);
+    IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface;
     IDirect3DDeviceImpl *D3D = ICOM_OBJECT(IDirect3DDeviceImpl, IDirect3DDevice7, D3DDevice);
     FIXME("(%p)->(%08x,%08x,%08x,%p,%08x,%p,%08x): stub!\n", This, VertexOp, DestIndex, Count, StrideData, VertexTypeDesc, D3D, Flags);
     return DD_OK;
diff --git a/dlls/ddraw/viewport.c b/dlls/ddraw/viewport.c
index 497a68c5c90fdd08d9d197f7cd46c156e1c0856b..c13396d7d51b4cd65e42610b01203950f738ad98 100644
--- a/dlls/ddraw/viewport.c
+++ b/dlls/ddraw/viewport.c
@@ -177,7 +177,7 @@ IDirect3DViewportImpl_QueryInterface(IDirect3DViewport3 *iface,
 static ULONG WINAPI
 IDirect3DViewportImpl_AddRef(IDirect3DViewport3 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p)->() incrementing from %u.\n", This, ref - 1);
@@ -197,7 +197,7 @@ IDirect3DViewportImpl_AddRef(IDirect3DViewport3 *iface)
 static ULONG WINAPI
 IDirect3DViewportImpl_Release(IDirect3DViewport3 *iface)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->() decrementing from %u.\n", This, ref + 1);
@@ -250,7 +250,7 @@ static HRESULT WINAPI
 IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface,
                                   D3DVIEWPORT *lpData)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     DWORD dwSize;
     TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
 
@@ -290,7 +290,7 @@ static HRESULT WINAPI
 IDirect3DViewportImpl_SetViewport(IDirect3DViewport3 *iface,
                                   D3DVIEWPORT *lpData)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     LPDIRECT3DVIEWPORT3 current_viewport;
     TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
 
@@ -358,7 +358,7 @@ IDirect3DViewportImpl_TransformVertices(IDirect3DViewport3 *iface,
                                         DWORD dwFlags,
                                         DWORD *lpOffScreen)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     D3DMATRIX view_mat, world_mat, proj_mat, mat;
     float *in;
     float *out;
@@ -497,7 +497,7 @@ IDirect3DViewportImpl_LightElements(IDirect3DViewport3 *iface,
                                     DWORD dwElementCount,
                                     LPD3DLIGHTDATA lpData)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     TRACE("(%p)->(%08x,%p): Unimplemented!\n", This, dwElementCount, lpData);
     return DDERR_UNSUPPORTED;
 }
@@ -518,7 +518,7 @@ static HRESULT WINAPI
 IDirect3DViewportImpl_SetBackground(IDirect3DViewport3 *iface,
                                     D3DMATERIALHANDLE hMat)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     TRACE("(%p)->(%d)\n", This, hMat);
 
     EnterCriticalSection(&ddraw_cs);
@@ -572,7 +572,7 @@ IDirect3DViewportImpl_GetBackground(IDirect3DViewport3 *iface,
                                     D3DMATERIALHANDLE *lphMat,
                                     BOOL *lpValid)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     TRACE("(%p)->(%p,%p)\n", This, lphMat, lpValid);
 
     EnterCriticalSection(&ddraw_cs);
@@ -612,7 +612,7 @@ static HRESULT WINAPI
 IDirect3DViewportImpl_SetBackgroundDepth(IDirect3DViewport3 *iface,
                                          IDirectDrawSurface *lpDDSurface)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     FIXME("(%p)->(%p): stub!\n", This, lpDDSurface);
     return D3D_OK;
 }
@@ -636,7 +636,7 @@ IDirect3DViewportImpl_GetBackgroundDepth(IDirect3DViewport3 *iface,
                                          IDirectDrawSurface **lplpDDSurface,
                                          LPBOOL lpValid)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     FIXME("(%p)->(%p,%p): stub!\n", This, lplpDDSurface, lpValid);
     return DD_OK;
 }
@@ -664,7 +664,7 @@ IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
                             D3DRECT *lpRects,
                             DWORD dwFlags)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     DWORD color = 0x00000000;
     HRESULT hr;
     LPDIRECT3DVIEWPORT3 current_viewport;
@@ -726,7 +726,7 @@ static HRESULT WINAPI
 IDirect3DViewportImpl_AddLight(IDirect3DViewport3 *iface,
                                IDirect3DLight *lpDirect3DLight)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     IDirect3DLightImpl *lpDirect3DLightImpl = ICOM_OBJECT(IDirect3DLightImpl, IDirect3DLight, lpDirect3DLight);
     DWORD i = 0;
     DWORD map = This->map_lights;
@@ -782,7 +782,7 @@ static HRESULT WINAPI
 IDirect3DViewportImpl_DeleteLight(IDirect3DViewport3 *iface,
                                   IDirect3DLight *lpDirect3DLight)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     IDirect3DLightImpl *lpDirect3DLightImpl = ICOM_OBJECT(IDirect3DLightImpl, IDirect3DLight, lpDirect3DLight);
     IDirect3DLightImpl *cur_light, *prev_light = NULL;
     
@@ -829,7 +829,7 @@ IDirect3DViewportImpl_NextLight(IDirect3DViewport3 *iface,
                                 IDirect3DLight **lplpDirect3DLight,
                                 DWORD dwFlags)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     FIXME("(%p)->(%p,%p,%08x): stub!\n", This, lpDirect3DLight, lplpDirect3DLight, dwFlags);
     return D3D_OK;
 }
@@ -858,7 +858,7 @@ static HRESULT WINAPI
 IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface,
                                    D3DVIEWPORT2 *lpData)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     DWORD dwSize;
     TRACE("(%p)->(%p)\n", This, lpData);
 
@@ -897,7 +897,7 @@ static HRESULT WINAPI
 IDirect3DViewportImpl_SetViewport2(IDirect3DViewport3 *iface,
                                    D3DVIEWPORT2 *lpData)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     LPDIRECT3DVIEWPORT3 current_viewport;
     TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
 
@@ -945,7 +945,7 @@ static HRESULT WINAPI
 IDirect3DViewportImpl_SetBackgroundDepth2(IDirect3DViewport3 *iface,
                                           IDirectDrawSurface4 *lpDDS)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     FIXME("(%p)->(%p): stub!\n", This, lpDDS);
     return D3D_OK;
 }
@@ -968,7 +968,7 @@ IDirect3DViewportImpl_GetBackgroundDepth2(IDirect3DViewport3 *iface,
                                           IDirectDrawSurface4 **lplpDDS,
                                           BOOL *lpValid)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpDDS, lpValid);
     return D3D_OK;
 }
@@ -998,7 +998,7 @@ IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface,
                              D3DVALUE dvZ,
                              DWORD dwStencil)
 {
-    ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
+    IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface;
     HRESULT hr;
     LPDIRECT3DVIEWPORT3 current_viewport;
     IDirect3DDevice3 *d3d_device3;