DDraw: Write a warn in checked error conditions

Stefan Dösinger stefandoesinger at gmx.at
Thu Oct 12 12:55:34 CDT 2006


This patch modifies ddraw.c and direct3d.c to consistently write a WARN if an 
invalid parameter is passed and we return an error according to the msdn / 
unit tests, or when the application requests unsupported things and we are 
fine to return an error.

I decided to write a warn because the code itself is ok, but an invalid 
parameter can be a sign that something went wrong elsewhere, e.g. allocation 
error or a capatiblity flag problem.

-------------- next part --------------
From 8fed98607f221cd256d5771eefe565df0e6c47f4 Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Thu, 12 Oct 2006 19:52:43 +0200
Subject: [PATCH] DDraw: write a WARN in checked error conditions
---
 dlls/ddraw/ddraw.c    |   65 +++++++++++++++++++++++++++++++++++++------------
 dlls/ddraw/direct3d.c |   26 ++++++++++++++++++--
 2 files changed, 73 insertions(+), 18 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 9c7648b..12687df 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -103,7 +103,10 @@ IDirectDrawImpl_QueryInterface(IDirectDr
     *obj = NULL;
 
     if(!refiid)
+    {
+        WARN("refiid == NULL, returning DDERR_INVALIDPARAMS\n");
         return DDERR_INVALIDPARAMS;
+    }
 
     /* Check DirectDraw Interfaces */
     if ( IsEqualGUID( &IID_IUnknown, refiid ) ||
@@ -476,7 +479,7 @@ IDirectDrawImpl_SetCooperativeLevel(IDir
                       DDSCL_NORMAL         |
                       DDSCL_EXCLUSIVE      )))
     {
-        TRACE("Incorrect cooplevel flags, returning DDERR_INVALIDPARAMS\n");
+        WARN("Incorrect cooplevel flags, returning DDERR_INVALIDPARAMS\n");
         return DDERR_INVALIDPARAMS;
     }
 
@@ -496,13 +499,13 @@ IDirectDrawImpl_SetCooperativeLevel(IDir
                          DDSCL_FULLSCREEN      ) )
         {
             DDOBJ_UNLOCK(This);
-            TRACE("Called with incompatible flags, returning DDERR_INVALIDPARAMS\n");
+            WARN("Called with incompatible flags, returning DDERR_INVALIDPARAMS\n");
             return DDERR_INVALIDPARAMS;
         }
         else if( (This->cooperative_level & DDSCL_FULLSCREEN) && window)
         {
             DDOBJ_UNLOCK(This);
-            TRACE("Setting DDSCL_SETFOCUSWINDOW with an already set window, returning DDERR_HWNDALREADYSET\n");
+            WARN("Setting DDSCL_SETFOCUSWINDOW with an already set window, returning DDERR_HWNDALREADYSET\n");
             return DDERR_HWNDALREADYSET;
         }
 
@@ -527,7 +530,7 @@ IDirectDrawImpl_SetCooperativeLevel(IDir
         if(cooplevel & (DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE) )
         {
             DDOBJ_UNLOCK(This);
-            TRACE("(%p) DDSCL_NORMAL is not compatible with DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE\n", This);
+            WARN("(%p) DDSCL_NORMAL is not compatible with DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE\n", This);
             return DDERR_INVALIDPARAMS;
         }
 
@@ -563,13 +566,13 @@ IDirectDrawImpl_SetCooperativeLevel(IDir
         if(!(cooplevel & DDSCL_EXCLUSIVE) )
         {
             DDOBJ_UNLOCK(This);
-            TRACE("(%p) DDSCL_FULLSCREEN needs DDSCL_EXCLUSIVE\n", This);
+            WARN("(%p) DDSCL_FULLSCREEN needs DDSCL_EXCLUSIVE\n", This);
             return DDERR_INVALIDPARAMS;
         }
         /* Need a HWND
         if(hwnd == 0)
         {
-            TRACE("(%p) DDSCL_FULLSCREEN needs a HWND\n", This);
+            WARN("(%p) DDSCL_FULLSCREEN needs a HWND\n", This);
             return DDERR_INVALIDPARAMS;
         }
         */
@@ -601,7 +604,7 @@ IDirectDrawImpl_SetCooperativeLevel(IDir
     else if(cooplevel & DDSCL_EXCLUSIVE)
     {
         DDOBJ_UNLOCK(This);
-        TRACE("(%p) DDSCL_EXCLUSIVE needs DDSCL_FULLSCREEN\n", This);
+        WARN("(%p) DDSCL_EXCLUSIVE needs DDSCL_FULLSCREEN\n", This);
         return DDERR_INVALIDPARAMS;
     }
 
@@ -812,7 +815,7 @@ IDirectDrawImpl_GetCaps(IDirectDraw7 *if
     /* One structure must be != NULL */
     if( (!DriverCaps) && (!HELCaps) )
     {
-        ERR("(%p) Invalid params to IDirectDrawImpl_GetCaps\n", This);
+        WARN("(%p) Invalid params to IDirectDrawImpl_GetCaps\n", This);
         return DDERR_INVALIDPARAMS;
     }
 
@@ -885,6 +888,7 @@ IDirectDrawImpl_GetDisplayMode(IDirectDr
     /* This seems sane */
     if(!DDSD) 
     {
+        WARN("No DDSD passed, returning DDERR_INVALIDPARAMS\n");
         return DDERR_INVALIDPARAMS;
     }
 
@@ -1001,7 +1005,11 @@ IDirectDrawImpl_GetVerticalBlankStatus(I
     TRACE("(%p)->(%p)\n", This, status);
 
     /* This looks sane, the MSDN suggests it too */
-    if(!status) return DDERR_INVALIDPARAMS;
+    if(!status)
+    {
+        WARN("status == NULL, returning DDERR_INVALIDPARAMS\n");
+        return DDERR_INVALIDPARAMS;
+    }
 
     DDOBJ_LOCK(This);
     *status = This->fake_vblank;
@@ -1044,7 +1052,11 @@ IDirectDrawImpl_GetAvailableVidMem(IDire
      * resources, but that's not important
      */
 
-    if( (!total) && (!free) ) return DDERR_INVALIDPARAMS;
+    if( (!total) && (!free) )
+    {
+        WARN("Not asking for total nor free memory, returning DDERR_INVALIDPARAMS\n");
+        return DDERR_INVALIDPARAMS;
+    }
 
     if(total) *total = This->total_vidmem;
     if(free) *free = IWineD3DDevice_GetAvailableTextureMem(This->wineD3DDevice);
@@ -1132,7 +1144,10 @@ IDirectDrawImpl_WaitForVerticalBlank(IDi
 
     /* MSDN says DDWAITVB_BLOCKBEGINEVENT is not supported */
     if(Flags & DDWAITVB_BLOCKBEGINEVENT)
+    {
+        WARN("DDWAITVB_BLOCKBEGINEVENT not supported by windows, returning DDERR_UNSUPPORTED\n");
         return DDERR_UNSUPPORTED; /* unchecked */
+    }
 
     return DD_OK;
 }
@@ -1377,7 +1392,11 @@ IDirectDrawImpl_EnumDisplayModes(IDirect
     TRACE("(%p)->(%p,%p,%p): Relay\n", This, DDSD, Context, cb);
 
     /* This looks sane */
-    if(!cb) return DDERR_INVALIDPARAMS;
+    if(!cb)
+    {
+        WARN("No callback passed, returning DDERR_INVALIDPARAMS\n");
+        return DDERR_INVALIDPARAMS;
+    }
 
     /* The private callback structure */
     cbs.callback = cb;
@@ -1453,7 +1472,10 @@ IDirectDrawImpl_GetDeviceIdentifier(IDir
     TRACE("(%p)->(%p,%08lx)\n", This, DDDI, Flags);
 
     if(!DDDI)
+    {
+        WARN("No destination pointer, returning DDERR_INVALIDPARAMS\n");
         return DDERR_INVALIDPARAMS;
+    }
 
     /* The DDGDI_GETHOSTIDENTIFIER returns the information about the 2D
      * host adapter, if there's a secondary 3D adapter. This doesn't apply
@@ -1550,7 +1572,11 @@ IDirectDrawImpl_StartModeTest(IDirectDra
     WARN("(%p)->(%p, %ld, %lx): Semi-Stub, most likely harmless\n", This, Modes, NumModes, Flags);
 
     /* This looks sane */
-    if( (!Modes) || (NumModes == 0) ) return DDERR_INVALIDPARAMS;
+    if( (!Modes) || (NumModes == 0) )
+    {
+        WARN("No mode array, or 0 modes given, returning DDERR_INVALIDPARAMS\n");
+        return DDERR_INVALIDPARAMS;
+    }
 
     /* DDSMT_ISTESTREQUIRED asks if a mode test is necessary.
      * As it is not, DDERR_TESTFINISHED is returned
@@ -2173,7 +2199,7 @@ IDirectDrawImpl_CreateSurface(IDirectDra
 
     if (UnkOuter != NULL)
     {
-        FIXME("(%p) : outer != NULL?\n", This);
+        WARN("(%p) : outer != NULL?\n", This);
         return CLASS_E_NOAGGREGATION; /* unchecked */
     }
 
@@ -2204,14 +2230,14 @@ IDirectDrawImpl_CreateSurface(IDirectDra
     if((DDSD->ddsCaps.dwCaps & (DDSCAPS_FLIP | DDSCAPS_PRIMARYSURFACE)) == (DDSCAPS_FLIP | DDSCAPS_PRIMARYSURFACE) &&
        !(This->cooperative_level & DDSCL_EXCLUSIVE))
     {
-        TRACE("(%p): Attempt to create a flipable primary surface without DDSCL_EXCLUSIVE set\n", This);
+        WARN("(%p): Attempt to create a flipable primary surface without DDSCL_EXCLUSIVE set\n", This);
         *Surf = NULL;
         return DDERR_NOEXCLUSIVEMODE;
     }
 
     if (Surf == NULL)
     {
-        FIXME("(%p) You want to get back a surface? Don't give NULL ptrs!\n", This);
+        WARN("(%p) You want to get back a surface? Don't give NULL ptrs!\n", This);
         return E_POINTER; /* unchecked */
     }
 
@@ -2695,7 +2721,10 @@ IDirectDrawImpl_EnumSurfaces(IDirectDraw
     TRACE("(%p)->(%lx,%p,%p,%p)\n", This, Flags, DDSD, Context, Callback);
 
     if(!Callback)
+    {
+        WARN("No callback, returning DDERR_INVALIDPARAMS\n");
         return DDERR_INVALIDPARAMS;
+    }
 
     DDOBJ_LOCK(This);
     for(surf = This->surface_list; surf; surf = surf->next)
@@ -3025,7 +3054,11 @@ DirectDrawCreateClipper(DWORD Flags,
     IDirectDrawClipperImpl* object;
     TRACE("(%08lx,%p,%p)\n", Flags, Clipper, UnkOuter);
 
-    if (UnkOuter != NULL) return CLASS_E_NOAGGREGATION;
+    if (UnkOuter != NULL)
+    {
+        ERR("UnkOuter = %p, returning CLASS_E_NOAGGREGATION\n", UnkOuter);
+        return CLASS_E_NOAGGREGATION;
+    }
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
                      sizeof(IDirectDrawClipperImpl));
diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c
index 1a5260a..a2b2fbc 100644
--- a/dlls/ddraw/direct3d.c
+++ b/dlls/ddraw/direct3d.c
@@ -401,7 +401,10 @@ IDirect3DImpl_3_CreateLight(IDirect3D3 *
     TRACE("(%p)->(%p,%p)\n", This, Light, UnkOuter);
 
     if(UnkOuter)
+    {
+        WARN("UnkOunter = %p, returning CLASS_E_NOAGGREGATION\n", UnkOuter);
         return CLASS_E_NOAGGREGATION;
+    }
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DLightImpl));
     if (object == NULL)
@@ -481,7 +484,10 @@ IDirect3DImpl_3_CreateMaterial(IDirect3D
     TRACE("(%p)->(%p,%p)\n", This, Material, UnkOuter);
 
     if(UnkOuter)
+    {
+        WARN("UnkOunter = %p, returning CLASS_E_NOAGGREGATION\n", UnkOuter);
         return CLASS_E_NOAGGREGATION;
+    }
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DMaterialImpl));
     if (object == NULL)
@@ -572,7 +578,10 @@ IDirect3DImpl_3_CreateViewport(IDirect3D
     IDirect3DViewportImpl *object;
 
     if(UnkOuter)
+    {
+        WARN("UnkOunter = %p, returning CLASS_E_NOAGGREGATION\n", UnkOuter);
         return CLASS_E_NOAGGREGATION;
+    }
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DViewportImpl));
     if (object == NULL)
@@ -652,7 +661,7 @@ IDirect3DImpl_3_FindDevice(IDirect3D3 *i
     if ((D3DDFS->dwFlags & D3DFDS_COLORMODEL) &&
         (D3DDFS->dcmColorModel != D3DCOLOR_RGB))
     {
-        TRACE(" trying to request a non-RGB D3D color model. Not supported.\n");
+        WARN(" trying to request a non-RGB D3D color model. Not supported.\n");
         return DDERR_INVALIDPARAMS; /* No real idea what to return here :-) */
     }
     if (D3DDFS->dwFlags & D3DFDS_GUID)
@@ -899,7 +908,10 @@ Thunk_IDirect3DImpl_3_CreateDevice(IDire
     TRACE("(%p)->(%s,%p,%p,%p): Thunking to IDirect3D7\n", This, debugstr_guid(refiid), Surface, Device, UnkOuter);
 
     if(UnkOuter != NULL)
+    {
+        WARN("UnkOunter = %p, returning CLASS_E_NOAGGREGATION\n", UnkOuter);
         return CLASS_E_NOAGGREGATION;
+    }
 
     hr =  IDirect3D7_CreateDevice(ICOM_INTERFACE(This, IDirect3D7),
                                   refiid,
@@ -979,7 +991,10 @@ IDirect3DImpl_7_CreateVertexBuffer(IDire
 
     /* Well, this sounds sane */
     if( (!VertexBuffer) || (!Desc) )
+    {
+        WARN("No destination pointer, or no vertex buffer description, returning DDERR_INVALIDPARAMS\n");
         return DDERR_INVALIDPARAMS;
+    }
 
     /* Now create the vertex buffer */
     object = HeapAlloc(GetProcessHeap(), 0, sizeof(IDirect3DVertexBufferImpl));
@@ -1031,7 +1046,11 @@ Thunk_IDirect3DImpl_3_CreateVertexBuffer
     HRESULT hr;
     TRACE("(%p)->(%p,%p,%08lx,%p): Relaying to IDirect3D7\n", This, Desc, VertexBuffer, Flags, UnkOuter);
 
-    if(UnkOuter != NULL) return CLASS_E_NOAGGREGATION;
+    if(UnkOuter != NULL)
+    {
+        WARN("UnkOunter = %p, returning CLASS_E_NOAGGREGATION\n", UnkOuter);
+        return CLASS_E_NOAGGREGATION;
+    }
 
     hr = IDirect3D7_CreateVertexBuffer(ICOM_INTERFACE(This, IDirect3D7),
                                        Desc,
@@ -1085,7 +1104,10 @@ IDirect3DImpl_7_EnumZBufferFormats(IDire
     TRACE("(%p)->(%s,%p,%p): Relay\n", iface, debugstr_guid(refiidDevice), Callback, Context);
 
     if(!Callback)
+    {
+        WARN("No enumeration callback, returning DDERR_INVALIDPARAMS\n");
         return DDERR_INVALIDPARAMS;
+    }
 
     for(i = 0; i < sizeof(FormatList) / sizeof(WINED3DFORMAT); i++)
     {
-- 
1.4.1.1



More information about the wine-patches mailing list