Alexandre Julliard : user32: Fix METAFILEPICT marshalling for 64-bit.

Alexandre Julliard julliard at winehq.org
Wed Sep 28 10:34:00 CDT 2016


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Sep 28 11:34:19 2016 +0900

user32: Fix METAFILEPICT marshalling for 64-bit.

Spotted by Sebastian Lackner.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/clipboard.c | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/dlls/user32/clipboard.c b/dlls/user32/clipboard.c
index 04d062d..0d48984 100644
--- a/dlls/user32/clipboard.c
+++ b/dlls/user32/clipboard.c
@@ -74,6 +74,15 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
 };
 static CRITICAL_SECTION clipboard_cs = { &critsect_debug, -1, 0, 0, 0, 0 };
 
+/* platform-independent version of METAFILEPICT */
+struct metafile_pict
+{
+    LONG       mm;
+    LONG       xExt;
+    LONG       yExt;
+    BYTE       bits[1];
+};
+
 /* get a debug string for a format id */
 static const char *debugstr_format( UINT id )
 {
@@ -155,21 +164,24 @@ static HANDLE marshal_data( UINT format, HANDLE handle, data_size_t *ret_size )
     case CF_METAFILEPICT:
     case CF_DSPMETAFILEPICT:
         {
-            METAFILEPICT *mf, *mfbits;
+            METAFILEPICT *mf;
+            struct metafile_pict *mfbits;
             if (!(mf = GlobalLock( handle ))) return 0;
             if (!(size = GetMetaFileBitsEx( mf->hMF, 0, NULL )))
             {
                 GlobalUnlock( handle );
                 return 0;
             }
-            *ret_size = sizeof(*mf) + size;
+            *ret_size = offsetof( struct metafile_pict, bits[size] );
             if (!(mfbits = GlobalAlloc( GMEM_FIXED, *ret_size )))
             {
                 GlobalUnlock( handle );
                 return 0;
             }
-            *mfbits = *mf;
-            GetMetaFileBitsEx( mf->hMF, size, mfbits + 1 );
+            mfbits->mm   = mf->mm;
+            mfbits->xExt = mf->xExt;
+            mfbits->yExt = mf->yExt;
+            GetMetaFileBitsEx( mf->hMF, size, mfbits->bits );
             GlobalUnlock( handle );
             return mfbits;
         }
@@ -235,9 +247,14 @@ static HANDLE unmarshal_data( UINT format, void *data, data_size_t size )
     case CF_METAFILEPICT:
     case CF_DSPMETAFILEPICT:
         {
-            METAFILEPICT *mf = handle;
-            if (size <= sizeof(*mf)) break;
-            mf->hMF = SetMetaFileBitsEx( size - sizeof(*mf), (BYTE *)(mf + 1) );
+            METAFILEPICT mf;
+            struct metafile_pict *mfbits = handle;
+            if (size <= sizeof(*mfbits)) break;
+            mf.mm   = mfbits->mm;
+            mf.xExt = mfbits->xExt;
+            mf.yExt = mfbits->yExt;
+            mf.hMF  = SetMetaFileBitsEx( size - offsetof( struct metafile_pict, bits ), mfbits->bits );
+            *(METAFILEPICT *)handle = mf;
             return handle;
         }
     }




More information about the wine-cvs mailing list