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