[PATCH 3/5] combase: Move CLIPFORMAT marshalling functions.

Nikolay Sivov nsivov at codeweavers.com
Mon Aug 3 04:08:37 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/combase/Makefile.in  |   2 +-
 dlls/combase/combase.spec |   4 +
 dlls/combase/usrmarshal.c | 200 ++++++++++++++++++++++++++++++++++++++
 dlls/ole32/ole32.spec     |   8 +-
 dlls/ole32/usrmarshal.c   | 200 --------------------------------------
 5 files changed, 209 insertions(+), 205 deletions(-)

diff --git a/dlls/combase/Makefile.in b/dlls/combase/Makefile.in
index eedcbd8e1c2..f91f6bffc36 100644
--- a/dlls/combase/Makefile.in
+++ b/dlls/combase/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = combase.dll
 IMPORTLIB = combase
-IMPORTS   = advapi32 ole32 uuid
+IMPORTS   = advapi32 ole32 user32 uuid
 
 EXTRADLLFLAGS = -mno-cygwin
 
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index c005782a81e..10356b414d8 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -62,6 +62,10 @@
 @ stub RoFailFastWithErrorContextInternal2
 @ stub RoFailFastWithErrorContextInternal
 @ stub UpdateProcessTracing
+@ stdcall CLIPFORMAT_UserFree(ptr ptr)
+@ stdcall CLIPFORMAT_UserMarshal(ptr ptr ptr)
+@ stdcall CLIPFORMAT_UserSize(ptr long ptr)
+@ stdcall CLIPFORMAT_UserUnmarshal(ptr ptr ptr)
 @ stub CLSIDFromOle1Class
 @ stdcall CLSIDFromProgID(wstr ptr) ole32.CLSIDFromProgID
 @ stdcall CLSIDFromString(wstr ptr) ole32.CLSIDFromString
diff --git a/dlls/combase/usrmarshal.c b/dlls/combase/usrmarshal.c
index ef5228a513e..59198ccf3f3 100644
--- a/dlls/combase/usrmarshal.c
+++ b/dlls/combase/usrmarshal.c
@@ -140,6 +140,206 @@ IMPL_WIREM_HANDLE(HICON)
 IMPL_WIREM_HANDLE(HMENU)
 IMPL_WIREM_HANDLE(HWND)
 
+/******************************************************************************
+ *           CLIPFORMAT_UserSize (combase.@)
+ *
+ * Calculates the buffer size required to marshal a clip format.
+ *
+ * PARAMS
+ *  pFlags       [I] Flags. See notes.
+ *  StartingSize [I] Starting size of the buffer. This value is added on to
+ *                   the buffer size required for the clip format.
+ *  pCF          [I] Clip format to size.
+ *
+ * RETURNS
+ *  The buffer size required to marshal a clip format plus the starting size.
+ *
+ * NOTES
+ *  Even though the function is documented to take a pointer to an unsigned
+ *  long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
+ *  the first parameter is an unsigned long.
+ *  This function is only intended to be called by the RPC runtime.
+ */
+ULONG __RPC_USER CLIPFORMAT_UserSize(ULONG *pFlags, ULONG size, CLIPFORMAT *pCF)
+{
+    TRACE("%s, %u, %p.n", debugstr_user_flags(pFlags), size, pCF);
+
+    ALIGN_LENGTH(size, 3);
+
+    size += 8;
+
+    /* only need to marshal the name if it is not a pre-defined type and
+     * we are going remote */
+    if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
+    {
+        WCHAR format[255];
+        INT ret;
+        size += 3 * sizeof(UINT);
+        /* urg! this function is badly designed because it won't tell us how
+         * much space is needed without doing a dummy run of storing the
+         * name into a buffer */
+        ret = GetClipboardFormatNameW(*pCF, format, ARRAY_SIZE(format)-1);
+        if (!ret)
+            RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
+        size += (ret + 1) * sizeof(WCHAR);
+    }
+    return size;
+}
+
+/******************************************************************************
+ *           CLIPFORMAT_UserMarshal (combase.@)
+ *
+ * Marshals a clip format into a buffer.
+ *
+ * PARAMS
+ *  pFlags  [I] Flags. See notes.
+ *  pBuffer [I] Buffer to marshal the clip format into.
+ *  pCF     [I] Clip format to marshal.
+ *
+ * RETURNS
+ *  The end of the marshaled data in the buffer.
+ *
+ * NOTES
+ *  Even though the function is documented to take a pointer to an unsigned
+ *  long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
+ *  the first parameter is an unsigned long.
+ *  This function is only intended to be called by the RPC runtime.
+ */
+unsigned char * __RPC_USER CLIPFORMAT_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
+{
+    TRACE("%s, %p, &0x%04x.\n", debugstr_user_flags(pFlags), pBuffer, *pCF);
+
+    ALIGN_POINTER(pBuffer, 3);
+
+    /* only need to marshal the name if it is not a pre-defined type and
+     * we are going remote */
+    if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
+    {
+        WCHAR format[255];
+        UINT len;
+
+        *(DWORD *)pBuffer = WDT_REMOTE_CALL;
+        pBuffer += 4;
+        *(DWORD *)pBuffer = *pCF;
+        pBuffer += 4;
+
+        len = GetClipboardFormatNameW(*pCF, format, ARRAY_SIZE(format)-1);
+        if (!len)
+            RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
+        len += 1;
+        *(UINT *)pBuffer = len;
+        pBuffer += sizeof(UINT);
+        *(UINT *)pBuffer = 0;
+        pBuffer += sizeof(UINT);
+        *(UINT *)pBuffer = len;
+        pBuffer += sizeof(UINT);
+        TRACE("marshaling format name %s\n", debugstr_w(format));
+        memcpy(pBuffer, format, len * sizeof(WCHAR));
+        pBuffer += len * sizeof(WCHAR);
+    }
+    else
+    {
+        *(DWORD *)pBuffer = WDT_INPROC_CALL;
+        pBuffer += 4;
+        *(DWORD *)pBuffer = *pCF;
+        pBuffer += 4;
+    }
+
+    return pBuffer;
+}
+
+/******************************************************************************
+ *           CLIPFORMAT_UserUnmarshal (combase.@)
+ *
+ * Unmarshals a clip format from a buffer.
+ *
+ * PARAMS
+ *  pFlags  [I] Flags. See notes.
+ *  pBuffer [I] Buffer to marshal the clip format from.
+ *  pCF     [O] Address that receive the unmarshaled clip format.
+ *
+ * RETURNS
+ *  The end of the marshaled data in the buffer.
+ *
+ * NOTES
+ *  Even though the function is documented to take a pointer to an unsigned
+ *  long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
+ *  the first parameter is an unsigned long.
+ *  This function is only intended to be called by the RPC runtime.
+ */
+unsigned char * __RPC_USER CLIPFORMAT_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
+{
+    LONG fContext;
+
+    TRACE("%s, %p, %p.\n", debugstr_user_flags(pFlags), pBuffer, pCF);
+
+    ALIGN_POINTER(pBuffer, 3);
+
+    fContext = *(DWORD *)pBuffer;
+    pBuffer += 4;
+
+    if (fContext == WDT_INPROC_CALL)
+    {
+        *pCF = *(CLIPFORMAT *)pBuffer;
+        pBuffer += 4;
+    }
+    else if (fContext == WDT_REMOTE_CALL)
+    {
+        CLIPFORMAT cf;
+        UINT len;
+
+        /* pointer ID for registered clip format string */
+        if (*(DWORD *)pBuffer == 0)
+            RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
+        pBuffer += 4;
+
+        len = *(UINT *)pBuffer;
+        pBuffer += sizeof(UINT);
+        if (*(UINT *)pBuffer != 0)
+            RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
+        pBuffer += sizeof(UINT);
+        if (*(UINT *)pBuffer != len)
+            RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
+        pBuffer += sizeof(UINT);
+        if (((WCHAR *)pBuffer)[len - 1] != '\0')
+            RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
+        TRACE("unmarshaling clip format %s\n", debugstr_w((LPCWSTR)pBuffer));
+        cf = RegisterClipboardFormatW((LPCWSTR)pBuffer);
+        pBuffer += len * sizeof(WCHAR);
+        if (!cf)
+            RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
+        *pCF = cf;
+    }
+    else
+        /* code not really appropriate, but nearest I can find */
+        RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
+    return pBuffer;
+}
+
+/******************************************************************************
+ *           CLIPFORMAT_UserFree (combase.@)
+ *
+ * Frees an unmarshaled clip format.
+ *
+ * PARAMS
+ *  pFlags  [I] Flags. See notes.
+ *  pCF     [I] Clip format to free.
+ *
+ * RETURNS
+ *  The end of the marshaled data in the buffer.
+ *
+ * NOTES
+ *  Even though the function is documented to take a pointer to an unsigned
+ *  long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB
+ *  structure, of which the first parameter is an unsigned long.
+ *  This function is only intended to be called by the RPC runtime.
+ */
+void __RPC_USER CLIPFORMAT_UserFree(ULONG *pFlags, CLIPFORMAT *pCF)
+{
+    /* there is no inverse of the RegisterClipboardFormat function,
+     * so nothing to do */
+}
+
 /******************************************************************************
  *           WdtpInterfacePointer_UserSize (combase.@)
  *
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index 3d56a8bcbf7..c58a406d278 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -1,8 +1,8 @@
 @ stdcall BindMoniker(ptr long ptr ptr)
-@ stdcall CLIPFORMAT_UserFree(ptr ptr)
-@ stdcall CLIPFORMAT_UserMarshal(ptr ptr ptr)
-@ stdcall CLIPFORMAT_UserSize(ptr long ptr)
-@ stdcall CLIPFORMAT_UserUnmarshal(ptr ptr ptr)
+@ stdcall CLIPFORMAT_UserFree(ptr ptr) combase.CLIPFORMAT_UserFree
+@ stdcall CLIPFORMAT_UserMarshal(ptr ptr ptr) combase.CLIPFORMAT_UserMarshal
+@ stdcall CLIPFORMAT_UserSize(ptr long ptr) combase.CLIPFORMAT_UserSize
+@ stdcall CLIPFORMAT_UserUnmarshal(ptr ptr ptr) combase.CLIPFORMAT_UserUnmarshal
 @ stdcall CLSIDFromProgID(wstr ptr)
 @ stdcall CLSIDFromProgIDEx(wstr ptr)
 @ stdcall CLSIDFromString(wstr ptr)
diff --git a/dlls/ole32/usrmarshal.c b/dlls/ole32/usrmarshal.c
index 8456bd20ee9..b7cacf7f620 100644
--- a/dlls/ole32/usrmarshal.c
+++ b/dlls/ole32/usrmarshal.c
@@ -82,206 +82,6 @@ static const char* debugstr_user_flags(ULONG *pFlags)
         return wine_dbg_sprintf("MAKELONG(%s, 0x%04x)", loword, HIWORD(*pFlags));
 }
 
-/******************************************************************************
- *           CLIPFORMAT_UserSize [OLE32.@]
- *
- * Calculates the buffer size required to marshal a clip format.
- *
- * PARAMS
- *  pFlags       [I] Flags. See notes.
- *  StartingSize [I] Starting size of the buffer. This value is added on to
- *                   the buffer size required for the clip format.
- *  pCF          [I] Clip format to size.
- *
- * RETURNS
- *  The buffer size required to marshal a clip format plus the starting size.
- *
- * NOTES
- *  Even though the function is documented to take a pointer to an unsigned
- *  long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
- *  the first parameter is an unsigned long.
- *  This function is only intended to be called by the RPC runtime.
- */
-ULONG __RPC_USER CLIPFORMAT_UserSize(ULONG *pFlags, ULONG size, CLIPFORMAT *pCF)
-{
-    TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), size, pCF);
-
-    ALIGN_LENGTH(size, 3);
-
-    size += 8;
-
-    /* only need to marshal the name if it is not a pre-defined type and
-     * we are going remote */
-    if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
-    {
-        WCHAR format[255];
-        INT ret;
-        size += 3 * sizeof(UINT);
-        /* urg! this function is badly designed because it won't tell us how
-         * much space is needed without doing a dummy run of storing the
-         * name into a buffer */
-        ret = GetClipboardFormatNameW(*pCF, format, ARRAY_SIZE(format)-1);
-        if (!ret)
-            RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
-        size += (ret + 1) * sizeof(WCHAR);
-    }
-    return size;
-}
-
-/******************************************************************************
- *           CLIPFORMAT_UserMarshal [OLE32.@]
- *
- * Marshals a clip format into a buffer.
- *
- * PARAMS
- *  pFlags  [I] Flags. See notes.
- *  pBuffer [I] Buffer to marshal the clip format into.
- *  pCF     [I] Clip format to marshal.
- *
- * RETURNS
- *  The end of the marshaled data in the buffer.
- *
- * NOTES
- *  Even though the function is documented to take a pointer to an unsigned
- *  long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
- *  the first parameter is an unsigned long.
- *  This function is only intended to be called by the RPC runtime.
- */
-unsigned char * __RPC_USER CLIPFORMAT_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
-{
-    TRACE("(%s, %p, &0x%04x\n", debugstr_user_flags(pFlags), pBuffer, *pCF);
-
-    ALIGN_POINTER(pBuffer, 3);
-
-    /* only need to marshal the name if it is not a pre-defined type and
-     * we are going remote */
-    if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
-    {
-        WCHAR format[255];
-        UINT len;
-
-        *(DWORD *)pBuffer = WDT_REMOTE_CALL;
-        pBuffer += 4;
-        *(DWORD *)pBuffer = *pCF;
-        pBuffer += 4;
-
-        len = GetClipboardFormatNameW(*pCF, format, ARRAY_SIZE(format)-1);
-        if (!len)
-            RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
-        len += 1;
-        *(UINT *)pBuffer = len;
-        pBuffer += sizeof(UINT);
-        *(UINT *)pBuffer = 0;
-        pBuffer += sizeof(UINT);
-        *(UINT *)pBuffer = len;
-        pBuffer += sizeof(UINT);
-        TRACE("marshaling format name %s\n", debugstr_w(format));
-        memcpy(pBuffer, format, len * sizeof(WCHAR));
-        pBuffer += len * sizeof(WCHAR);
-    }
-    else
-    {
-        *(DWORD *)pBuffer = WDT_INPROC_CALL;
-        pBuffer += 4;
-        *(DWORD *)pBuffer = *pCF;
-        pBuffer += 4;
-    }
-
-    return pBuffer;
-}
-
-/******************************************************************************
- *           CLIPFORMAT_UserUnmarshal [OLE32.@]
- *
- * Unmarshals a clip format from a buffer.
- *
- * PARAMS
- *  pFlags  [I] Flags. See notes.
- *  pBuffer [I] Buffer to marshal the clip format from.
- *  pCF     [O] Address that receive the unmarshaled clip format.
- *
- * RETURNS
- *  The end of the marshaled data in the buffer.
- *
- * NOTES
- *  Even though the function is documented to take a pointer to an unsigned
- *  long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
- *  the first parameter is an unsigned long.
- *  This function is only intended to be called by the RPC runtime.
- */
-unsigned char * __RPC_USER CLIPFORMAT_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
-{
-    LONG fContext;
-
-    TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, pCF);
-
-    ALIGN_POINTER(pBuffer, 3);
-
-    fContext = *(DWORD *)pBuffer;
-    pBuffer += 4;
-
-    if (fContext == WDT_INPROC_CALL)
-    {
-        *pCF = *(CLIPFORMAT *)pBuffer;
-        pBuffer += 4;
-    }
-    else if (fContext == WDT_REMOTE_CALL)
-    {
-        CLIPFORMAT cf;
-        UINT len;
-
-        /* pointer ID for registered clip format string */
-        if (*(DWORD *)pBuffer == 0)
-            RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
-        pBuffer += 4;
-
-        len = *(UINT *)pBuffer;
-        pBuffer += sizeof(UINT);
-        if (*(UINT *)pBuffer != 0)
-            RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
-        pBuffer += sizeof(UINT);
-        if (*(UINT *)pBuffer != len)
-            RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
-        pBuffer += sizeof(UINT);
-        if (((WCHAR *)pBuffer)[len - 1] != '\0')
-            RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
-        TRACE("unmarshaling clip format %s\n", debugstr_w((LPCWSTR)pBuffer));
-        cf = RegisterClipboardFormatW((LPCWSTR)pBuffer);
-        pBuffer += len * sizeof(WCHAR);
-        if (!cf)
-            RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
-        *pCF = cf;
-    }
-    else
-        /* code not really appropriate, but nearest I can find */
-        RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
-    return pBuffer;
-}
-
-/******************************************************************************
- *           CLIPFORMAT_UserFree [OLE32.@]
- *
- * Frees an unmarshaled clip format.
- *
- * PARAMS
- *  pFlags  [I] Flags. See notes.
- *  pCF     [I] Clip format to free.
- *
- * RETURNS
- *  The end of the marshaled data in the buffer.
- *
- * NOTES
- *  Even though the function is documented to take a pointer to an unsigned
- *  long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB
- *  structure, of which the first parameter is an unsigned long.
- *  This function is only intended to be called by the RPC runtime.
- */
-void __RPC_USER CLIPFORMAT_UserFree(ULONG *pFlags, CLIPFORMAT *pCF)
-{
-    /* there is no inverse of the RegisterClipboardFormat function,
-     * so nothing to do */
-}
-
 static ULONG handle_UserSize(ULONG *pFlags, ULONG StartingSize, HANDLE *handle)
 {
     if (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE)
-- 
2.27.0




More information about the wine-devel mailing list