Huw Davies : ole32: Fix remote HMETAFILEPICT marshalling on 64 bit systems.

Alexandre Julliard julliard at winehq.org
Thu May 21 09:35:54 CDT 2009


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu May 21 12:16:20 2009 +0100

ole32: Fix remote HMETAFILEPICT marshalling on 64 bit systems.

---

 dlls/ole32/usrmarshal.c |  121 +++++++++++++++++++++++++++--------------------
 1 files changed, 70 insertions(+), 51 deletions(-)

diff --git a/dlls/ole32/usrmarshal.c b/dlls/ole32/usrmarshal.c
index 1337a39..98e0691 100644
--- a/dlls/ole32/usrmarshal.c
+++ b/dlls/ole32/usrmarshal.c
@@ -1378,19 +1378,25 @@ ULONG __RPC_USER HMETAFILEPICT_UserSize(ULONG *pFlags, ULONG StartingSize, HMETA
     TRACE("(%s, %d, &%p)\n", debugstr_user_flags(pFlags), StartingSize, *phMfp);
 
     size += sizeof(ULONG);
-    size += sizeof(HMETAFILEPICT);
 
-    if ((LOWORD(*pFlags) != MSHCTX_INPROC) && *phMfp)
+    if(LOWORD(*pFlags) == MSHCTX_INPROC)
+        size += sizeof(HMETAFILEPICT);
+    else
     {
-        METAFILEPICT *mfpict = GlobalLock(*phMfp);
-
-        /* FIXME: raise an exception if mfpict is NULL? */
-        size += FIELD_OFFSET(remoteMETAFILEPICT, hMF);
         size += sizeof(ULONG);
 
-        size = HMETAFILE_UserSize(pFlags, size, &mfpict->hMF);
+        if (*phMfp)
+        {
+            METAFILEPICT *mfpict = GlobalLock(*phMfp);
 
-        GlobalUnlock(*phMfp);
+            /* FIXME: raise an exception if mfpict is NULL? */
+            size += FIELD_OFFSET(remoteMETAFILEPICT, hMF);
+            size += sizeof(ULONG);
+
+            size = HMETAFILE_UserSize(pFlags, size, &mfpict->hMF);
+
+            GlobalUnlock(*phMfp);
+        }
     }
 
     return size;
@@ -1420,32 +1426,40 @@ unsigned char * __RPC_USER HMETAFILEPICT_UserMarshal(ULONG *pFlags, unsigned cha
     TRACE("(%s, %p, &%p)\n", debugstr_user_flags(pFlags), pBuffer, *phMfp);
 
     if (LOWORD(*pFlags) == MSHCTX_INPROC)
-        *(ULONG *)pBuffer = WDT_INPROC_CALL;
+    {
+        if (sizeof(HMETAFILEPICT) == 8)
+            *(ULONG *)pBuffer = WDT_INPROC64_CALL;
+        else
+            *(ULONG *)pBuffer = WDT_INPROC_CALL;
+        pBuffer += sizeof(ULONG);
+        *(HMETAFILEPICT *)pBuffer = *phMfp;
+        pBuffer += sizeof(HMETAFILEPICT);
+    }
     else
-        *(ULONG *)pBuffer = WDT_REMOTE_CALL;
-    pBuffer += sizeof(ULONG);
-
-    *(HMETAFILEPICT *)pBuffer = *phMfp;
-    pBuffer += sizeof(HMETAFILEPICT);
-
-    if ((LOWORD(*pFlags) != MSHCTX_INPROC) && *phMfp)
     {
-        METAFILEPICT *mfpict = GlobalLock(*phMfp);
-        remoteMETAFILEPICT * remmfpict = (remoteMETAFILEPICT *)pBuffer;
-
-        /* FIXME: raise an exception if mfpict is NULL? */
-        remmfpict->mm = mfpict->mm;
-        remmfpict->xExt = mfpict->xExt;
-        remmfpict->yExt = mfpict->yExt;
-        pBuffer += FIELD_OFFSET(remoteMETAFILEPICT, hMF);
-        *(ULONG *)pBuffer = USER_MARSHAL_PTR_PREFIX;
+        *(ULONG *)pBuffer = WDT_REMOTE_CALL;
+        pBuffer += sizeof(ULONG);
+        *(ULONG *)pBuffer = (ULONG)(ULONG_PTR)*phMfp;
         pBuffer += sizeof(ULONG);
 
-        pBuffer = HMETAFILE_UserMarshal(pFlags, pBuffer, &mfpict->hMF);
+        if (*phMfp)
+        {
+            METAFILEPICT *mfpict = GlobalLock(*phMfp);
+            remoteMETAFILEPICT * remmfpict = (remoteMETAFILEPICT *)pBuffer;
+
+            /* FIXME: raise an exception if mfpict is NULL? */
+            remmfpict->mm = mfpict->mm;
+            remmfpict->xExt = mfpict->xExt;
+            remmfpict->yExt = mfpict->yExt;
+            pBuffer += FIELD_OFFSET(remoteMETAFILEPICT, hMF);
+            *(ULONG *)pBuffer = USER_MARSHAL_PTR_PREFIX;
+            pBuffer += sizeof(ULONG);
 
-        GlobalUnlock(*phMfp);
-    }
+            pBuffer = HMETAFILE_UserMarshal(pFlags, pBuffer, &mfpict->hMF);
 
+            GlobalUnlock(*phMfp);
+        }
+    }
     return pBuffer;
 }
 
@@ -1477,40 +1491,45 @@ unsigned char * __RPC_USER HMETAFILEPICT_UserUnmarshal(ULONG *pFlags, unsigned c
     fContext = *(ULONG *)pBuffer;
     pBuffer += sizeof(ULONG);
 
-    if ((fContext == WDT_INPROC_CALL) || !*(HMETAFILEPICT *)pBuffer)
+    if ((fContext == WDT_INPROC_CALL) || fContext == WDT_INPROC64_CALL)
     {
         *phMfp = *(HMETAFILEPICT *)pBuffer;
         pBuffer += sizeof(HMETAFILEPICT);
     }
     else
     {
-        METAFILEPICT *mfpict;
-        const remoteMETAFILEPICT *remmfpict;
-        ULONG user_marshal_prefix;
-
-        pBuffer += sizeof(HMETAFILEPICT);
-        remmfpict = (const remoteMETAFILEPICT *)pBuffer;
-
-        *phMfp = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILEPICT));
-        if (!*phMfp)
-            RpcRaiseException(E_OUTOFMEMORY);
-
-        mfpict = GlobalLock(*phMfp);
-        mfpict->mm = remmfpict->mm;
-        mfpict->xExt = remmfpict->xExt;
-        mfpict->yExt = remmfpict->yExt;
-        pBuffer += FIELD_OFFSET(remoteMETAFILEPICT, hMF);
-        user_marshal_prefix = *(ULONG *)pBuffer;
+        ULONG handle = *(ULONG *)pBuffer;
         pBuffer += sizeof(ULONG);
+        *phMfp = NULL;
+
+        if(handle)
+        {
+            METAFILEPICT *mfpict;
+            const remoteMETAFILEPICT *remmfpict;
+            ULONG user_marshal_prefix;
+
+            remmfpict = (const remoteMETAFILEPICT *)pBuffer;
+
+            *phMfp = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILEPICT));
+            if (!*phMfp)
+                RpcRaiseException(E_OUTOFMEMORY);
+
+            mfpict = GlobalLock(*phMfp);
+            mfpict->mm = remmfpict->mm;
+            mfpict->xExt = remmfpict->xExt;
+            mfpict->yExt = remmfpict->yExt;
+            pBuffer += FIELD_OFFSET(remoteMETAFILEPICT, hMF);
+            user_marshal_prefix = *(ULONG *)pBuffer;
+            pBuffer += sizeof(ULONG);
 
-        if (user_marshal_prefix != USER_MARSHAL_PTR_PREFIX)
-            RpcRaiseException(RPC_X_INVALID_TAG);
+            if (user_marshal_prefix != USER_MARSHAL_PTR_PREFIX)
+                RpcRaiseException(RPC_X_INVALID_TAG);
 
-        pBuffer = HMETAFILE_UserUnmarshal(pFlags, pBuffer, &mfpict->hMF);
+            pBuffer = HMETAFILE_UserUnmarshal(pFlags, pBuffer, &mfpict->hMF);
 
-        GlobalUnlock(*phMfp);
+            GlobalUnlock(*phMfp);
+        }
     }
-
     return pBuffer;
 }
 




More information about the wine-cvs mailing list