Fixed QueryInterface functions for IDirect3D 1 and 2.

diff --git a/graphics/ddraw.c b/graphics/ddraw.c
index 4b427db..0413273 100644
--- a/graphics/ddraw.c
+++ b/graphics/ddraw.c
@@ -2043,24 +2043,20 @@
 
         WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
         TRACE(ddraw,"(%p)->(%s,%p)\n",This,xrefiid,obj);
-        if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
-                *obj = This;
+        if ((!memcmp(&IID_IDirectDraw,refiid,sizeof(IID_IDirectDraw))) ||
+	    (!memcmp(&IID_IDirectDraw2,refiid,sizeof(IID_IDirectDraw2))) ||
+	    (!memcmp(&IID_IDirectDraw4,refiid,sizeof(IID_IDirectDraw4)))) {
+                *obj = This->ddraw;
                 IDirect3D_AddRef(iface);
 
-		TRACE(ddraw, "  Creating IUnknown interface (%p)\n", *obj);
+		TRACE(ddraw, "  Creating IDirectDrawX interface (%p)\n", *obj);
 		
                 return S_OK;
         }
-        if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
-                IDirect3DImpl*   d3d;
-
-                d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
-                d3d->ref = 1;
-		/* FIXME: isn't this a bit weird ??? */
-                d3d->ddraw = (IDirectDrawImpl*)This;
+        if ((!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) ||
+	    (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)))) {
+                *obj = This;
                 IDirect3D_AddRef(iface);
-                d3d->lpvtbl = &d3dvt;
-                *obj = d3d;
 
 		TRACE(ddraw, "  Creating IDirect3D interface (%p)\n", *obj);
 
@@ -2071,8 +2067,7 @@
 
                 d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
                 d3d->ref = 1;
-		/* FIXME: isn't this a bit weird ??? */
-                d3d->ddraw = (IDirectDrawImpl*)This;
+                d3d->ddraw = This->ddraw;
                 IDirect3D_AddRef(iface);
                 d3d->lpvtbl = &d3d2vt;
                 *obj = d3d;
@@ -2196,12 +2191,49 @@
  *				IDirect3D2
  */
 static HRESULT WINAPI IDirect3D2Impl_QueryInterface(
-        LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {
-  ICOM_THIS(IDirect3D2Impl,iface);
-  /* For the moment, we use the same function as in IDirect3D */
-  TRACE(ddraw, "Calling IDirect3D enumerating function.\n");
-  
-  return IDirect3DImpl_QueryInterface((LPDIRECT3D) This, refiid, obj);
+        LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {  
+	ICOM_THIS(IDirect3D2Impl,iface);
+
+	/* FIXME: Not sure if this is correct */
+        char    xrefiid[50];
+
+        WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
+        TRACE(ddraw,"(%p)->(%s,%p)\n",This,xrefiid,obj);
+        if ((!memcmp(&IID_IDirectDraw,refiid,sizeof(IID_IDirectDraw))) ||
+	    (!memcmp(&IID_IDirectDraw2,refiid,sizeof(IID_IDirectDraw2))) ||
+	    (!memcmp(&IID_IDirectDraw4,refiid,sizeof(IID_IDirectDraw4)))) {
+                *obj = This->ddraw;
+                IDirect3D2_AddRef(iface);
+
+		TRACE(ddraw, "  Creating IDirectDrawX interface (%p)\n", *obj);
+		
+                return S_OK;
+        }
+        if ((!memcmp(&IID_IDirect3D2,refiid,sizeof(IID_IDirect3D2))) ||
+	    (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown)))) {
+                *obj = This;
+                IDirect3D2_AddRef(iface);
+
+		TRACE(ddraw, "  Creating IDirect3D2 interface (%p)\n", *obj);
+
+                return S_OK;
+        }
+        if (!memcmp(&IID_IDirect3D,refiid,sizeof(IID_IDirect3D))) {
+                IDirect3DImpl*  d3d;
+
+                d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
+                d3d->ref = 1;
+                d3d->ddraw = This->ddraw;
+                IDirect3D2_AddRef(iface);
+                d3d->lpvtbl = &d3dvt;
+                *obj = d3d;
+
+		TRACE(ddraw, "  Creating IDirect3D interface (%p)\n", *obj);
+
+                return S_OK;
+        }
+        FIXME(ddraw,"(%p):interface for IID %s NOT found!\n",This,xrefiid);
+        return OLE_E_ENUM_NOMORE;
 }
 
 static ULONG WINAPI IDirect3D2Impl_AddRef(LPDIRECT3D2 iface) {