Alexandre Julliard : gdi32: Don't allow Get/ SetDeviceGammaRamp on DIBs or memory DCs.

Alexandre Julliard julliard at winehq.org
Fri Jan 6 15:31:32 CST 2012


Module: wine
Branch: master
Commit: 56331e2a9a81cbe2af36ae24ead07d8b1b000efb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=56331e2a9a81cbe2af36ae24ead07d8b1b000efb

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Jan  6 17:45:16 2012 +0100

gdi32: Don't allow Get/SetDeviceGammaRamp on DIBs or memory DCs.

---

 dlls/gdi32/dibdrv/dc.c      |   22 ++++++++++++++++++++--
 dlls/gdi32/driver.c         |    2 ++
 dlls/gdi32/tests/dc.c       |   27 +++++++++++++++++++++++++--
 dlls/winex11.drv/xvidmode.c |   10 ++++++++++
 4 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 2fbd6dd..f223bc1 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -418,6 +418,15 @@ static INT dibdrv_DescribePixelFormat( PHYSDEV dev, INT fmt, UINT size, PIXELFOR
 }
 
 /***********************************************************************
+ *           dibdrv_GetDeviceGammaRamp
+ */
+static BOOL dibdrv_GetDeviceGammaRamp( PHYSDEV dev, void *ramp )
+{
+    SetLastError( ERROR_INVALID_PARAMETER );
+    return FALSE;
+}
+
+/***********************************************************************
  *           dibdrv_GetPixelFormat
  */
 static INT dibdrv_GetPixelFormat( PHYSDEV dev )
@@ -427,6 +436,15 @@ static INT dibdrv_GetPixelFormat( PHYSDEV dev )
 }
 
 /***********************************************************************
+ *           dibdrv_SetDeviceGammaRamp
+ */
+static BOOL dibdrv_SetDeviceGammaRamp( PHYSDEV dev, void *ramp )
+{
+    SetLastError( ERROR_INVALID_PARAMETER );
+    return FALSE;
+}
+
+/***********************************************************************
  *           dibdrv_SetPixelFormat
  */
 static BOOL dibdrv_SetPixelFormat( PHYSDEV dev, INT fmt, const PIXELFORMATDESCRIPTOR *pfd )
@@ -598,7 +616,7 @@ const struct gdi_dc_funcs dib_driver =
     NULL,                               /* pGetCharABCWidthsI */
     NULL,                               /* pGetCharWidth */
     NULL,                               /* pGetDeviceCaps */
-    NULL,                               /* pGetDeviceGammaRamp */
+    dibdrv_GetDeviceGammaRamp,          /* pGetDeviceGammaRamp */
     NULL,                               /* pGetFontData */
     NULL,                               /* pGetFontUnicodeRanges */
     NULL,                               /* pGetGlyphIndices */
@@ -660,7 +678,7 @@ const struct gdi_dc_funcs dib_driver =
     dibdrv_SetDIBColorTable,            /* pSetDIBColorTable */
     NULL,                               /* pSetDIBitsToDevice */
     dibdrv_SetDeviceClipping,           /* pSetDeviceClipping */
-    NULL,                               /* pSetDeviceGammaRamp */
+    dibdrv_SetDeviceGammaRamp,          /* pSetDeviceGammaRamp */
     NULL,                               /* pSetLayout */
     NULL,                               /* pSetMapMode */
     NULL,                               /* pSetMapperFlags */
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index b21fb74..abb2d6a 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -355,6 +355,7 @@ static INT nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap )
 
 static BOOL nulldrv_GetDeviceGammaRamp( PHYSDEV dev, void *ramp )
 {
+    SetLastError( ERROR_INVALID_PARAMETER );
     return FALSE;
 }
 
@@ -587,6 +588,7 @@ static DWORD nulldrv_SetLayout( PHYSDEV dev, DWORD layout )
 
 static BOOL nulldrv_SetDeviceGammaRamp( PHYSDEV dev, void *ramp )
 {
+    SetLastError( ERROR_INVALID_PARAMETER );
     return FALSE;
 }
 
diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c
index 8c92b5e..922907a 100644
--- a/dlls/gdi32/tests/dc.c
+++ b/dlls/gdi32/tests/dc.c
@@ -305,22 +305,39 @@ static void test_device_caps( HDC hdc, HDC ref_dc, const char *descr )
         DESKTOPVERTRES,
         DESKTOPHORZRES,
         BLTALIGNMENT,
-        SHADEBLENDCAPS,
-        COLORMGMTCAPS
+        SHADEBLENDCAPS
     };
     unsigned int i;
+    WORD ramp[3][256];
+    BOOL ret;
 
     if (GetObjectType( hdc ) == OBJ_METADC)
+    {
         for (i = 0; i < sizeof(caps)/sizeof(caps[0]); i++)
             ok( GetDeviceCaps( hdc, caps[i] ) == (caps[i] == TECHNOLOGY ? DT_METAFILE : 0),
                 "wrong caps on %s for %u: %u\n", descr, caps[i],
                 GetDeviceCaps( hdc, caps[i] ) );
+
+        SetLastError( 0xdeadbeef );
+        ret = GetDeviceGammaRamp( hdc, &ramp );
+        ok( !ret, "GetDeviceGammaRamp succeeded on %s\n", descr );
+        ok( GetLastError() == ERROR_INVALID_PARAMETER || broken(GetLastError() == 0xdeadbeef), /* nt4 */
+            "wrong error %u on %s\n", GetLastError(), descr );
+    }
     else
+    {
         for (i = 0; i < sizeof(caps)/sizeof(caps[0]); i++)
             ok( GetDeviceCaps( hdc, caps[i] ) == GetDeviceCaps( ref_dc, caps[i] ),
                 "mismatched caps on %s for %u: %u/%u\n", descr, caps[i],
                 GetDeviceCaps( hdc, caps[i] ), GetDeviceCaps( ref_dc, caps[i] ) );
 
+        SetLastError( 0xdeadbeef );
+        ret = GetDeviceGammaRamp( hdc, &ramp );
+        ok( !ret, "GetDeviceGammaRamp succeeded on %s\n", descr );
+        ok( GetLastError() == ERROR_INVALID_PARAMETER || broken(GetLastError() == 0xdeadbeef), /* nt4 */
+            "wrong error %u on %s\n", GetLastError(), descr );
+    }
+
     if (GetObjectType( hdc ) == OBJ_MEMDC)
     {
         char buffer[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];
@@ -342,6 +359,12 @@ static void test_device_caps( HDC hdc, HDC ref_dc, const char *descr )
                 "mismatched caps on %s and DIB for %u: %u/%u\n", descr, caps[i],
                 GetDeviceCaps( hdc, caps[i] ), GetDeviceCaps( ref_dc, caps[i] ) );
 
+        SetLastError( 0xdeadbeef );
+        ret = GetDeviceGammaRamp( hdc, &ramp );
+        ok( !ret, "GetDeviceGammaRamp succeeded on %s\n", descr );
+        ok( GetLastError() == ERROR_INVALID_PARAMETER || broken(GetLastError() == 0xdeadbeef), /* nt4 */
+            "wrong error %u on %s\n", GetLastError(), descr );
+
         SelectObject( hdc, old );
         DeleteObject( dib );
     }
diff --git a/dlls/winex11.drv/xvidmode.c b/dlls/winex11.drv/xvidmode.c
index e279b70..e108dee 100644
--- a/dlls/winex11.drv/xvidmode.c
+++ b/dlls/winex11.drv/xvidmode.c
@@ -424,6 +424,11 @@ static BOOL X11DRV_XF86VM_SetGammaRamp(LPDDGAMMARAMP ramp)
  */
 BOOL X11DRV_GetDeviceGammaRamp(PHYSDEV dev, LPVOID ramp)
 {
+    if (GetObjectType( dev->hdc ) == OBJ_MEMDC)
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
 #ifdef SONAME_LIBXXF86VM
   return X11DRV_XF86VM_GetGammaRamp(ramp);
 #else
@@ -440,6 +445,11 @@ BOOL X11DRV_GetDeviceGammaRamp(PHYSDEV dev, LPVOID ramp)
  */
 BOOL X11DRV_SetDeviceGammaRamp(PHYSDEV dev, LPVOID ramp)
 {
+    if (GetObjectType( dev->hdc ) == OBJ_MEMDC)
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return FALSE;
+    }
 #ifdef SONAME_LIBXXF86VM
   return X11DRV_XF86VM_SetGammaRamp(ramp);
 #else




More information about the wine-cvs mailing list