Module: wine Branch: master Commit: 815197f28caa9683838a97621680b1411122cb35 URL: http://source.winehq.org/git/wine.git/?a=commit;h=815197f28caa9683838a976216...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Jun 15 11:10:33 2015 +0300
ole32: Marshal HDC as remotable handle.
---
dlls/ole32/tests/usrmarshal.c | 32 ++++++++++++++ dlls/ole32/usrmarshal.c | 100 +----------------------------------------- 2 files changed, 33 insertions(+), 99 deletions(-)
diff --git a/dlls/ole32/tests/usrmarshal.c b/dlls/ole32/tests/usrmarshal.c index 83dedc7..53cd9fe 100644 --- a/dlls/ole32/tests/usrmarshal.c +++ b/dlls/ole32/tests/usrmarshal.c @@ -866,6 +866,37 @@ static void test_marshal_SNB(void) g_expect_user_free = FALSE; }
+static void test_marshal_HDC(void) +{ + MIDL_STUB_MESSAGE stub_msg; + HDC hdc = GetDC(0), hdc2; + USER_MARSHAL_CB umcb; + RPC_MESSAGE rpc_msg; + unsigned char *buffer; + wireHDC wirehdc; + ULONG size; + + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + size = HDC_UserSize(&umcb.Flags, 0, &hdc); + ok(size == sizeof(*wirehdc), "Wrong size %d\n", size); + + buffer = HeapAlloc(GetProcessHeap(), 0, size); + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HDC_UserMarshal(&umcb.Flags, buffer, &hdc); + wirehdc = (wireHDC)buffer; + ok(wirehdc->fContext == WDT_INPROC_CALL, "Context should be WDT_INPROC_CALL instead of 0x%08x\n", wirehdc->fContext); + ok(wirehdc->u.hInproc == (LONG_PTR)hdc, "Marshaled value should be %p instead of %x\n", hdc, wirehdc->u.hRemote); + + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); + HDC_UserUnmarshal(&umcb.Flags, buffer, &hdc2); + ok(hdc == hdc2, "Didn't unmarshal properly\n"); + HeapFree(GetProcessHeap(), 0, buffer); + + init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); + HDC_UserFree(&umcb.Flags, &hdc2); + ReleaseDC(0, hdc); +} + START_TEST(usrmarshal) { CoInitialize(NULL); @@ -879,6 +910,7 @@ START_TEST(usrmarshal) test_marshal_WdtpInterfacePointer(); test_marshal_STGMEDIUM(); test_marshal_SNB(); + test_marshal_HDC();
CoUninitialize(); } diff --git a/dlls/ole32/usrmarshal.c b/dlls/ole32/usrmarshal.c index d22f9f7..8f895f8 100644 --- a/dlls/ole32/usrmarshal.c +++ b/dlls/ole32/usrmarshal.c @@ -341,6 +341,7 @@ static void handle_UserFree(ULONG *pFlags, HANDLE *phMenu) IMPL_WIREM_HANDLE(HACCEL) IMPL_WIREM_HANDLE(HMENU) IMPL_WIREM_HANDLE(HWND) +IMPL_WIREM_HANDLE(HDC)
/****************************************************************************** * HGLOBAL_UserSize [OLE32.@] @@ -760,105 +761,6 @@ void __RPC_USER HICON_UserFree(ULONG *pFlags, HICON *phIcon) }
/****************************************************************************** - * HDC_UserSize [OLE32.@] - * - * Calculates the buffer size required to marshal an HDC. - * - * 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. - * phGlobal [I] HDC to size. - * - * RETURNS - * The buffer size required to marshal an HDC plus the starting size. - * - * NOTES - * Even though the function is documented to take a pointer to a ULONG in - * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which - * the first parameter is a ULONG. - * This function is only intended to be called by the RPC runtime. - */ -ULONG __RPC_USER HDC_UserSize(ULONG *pFlags, ULONG StartingSize, HDC *phdc) -{ - FIXME(":stub\n"); - return StartingSize; -} - -/****************************************************************************** - * HDC_UserMarshal [OLE32.@] - * - * Marshals an HDC into a buffer. - * - * PARAMS - * pFlags [I] Flags. See notes. - * pBuffer [I] Buffer to marshal the clip format into. - * phdc [I] HDC to marshal. - * - * RETURNS - * The end of the marshaled data in the buffer. - * - * NOTES - * Even though the function is documented to take a pointer to a ULONG in - * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which - * the first parameter is a ULONG. - * This function is only intended to be called by the RPC runtime. - */ -unsigned char * __RPC_USER HDC_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HDC *phdc) -{ - FIXME(":stub\n"); - return pBuffer; -} - -/****************************************************************************** - * HDC_UserUnmarshal [OLE32.@] - * - * Unmarshals an HDC from a buffer. - * - * PARAMS - * pFlags [I] Flags. See notes. - * pBuffer [I] Buffer to marshal the clip format from. - * phdc [O] Address that receive the unmarshaled HDC. - * - * RETURNS - * The end of the marshaled data in the buffer. - * - * NOTES - * Even though the function is documented to take a pointer to an ULONG in - * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which - * the first parameter is an ULONG. - * This function is only intended to be called by the RPC runtime. - */ -unsigned char * __RPC_USER HDC_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HDC *phdc) -{ - FIXME(":stub\n"); - return pBuffer; -} - -/****************************************************************************** - * HDC_UserFree [OLE32.@] - * - * Frees an unmarshaled HDC. - * - * PARAMS - * pFlags [I] Flags. See notes. - * phdc [I] HDC to free. - * - * RETURNS - * The end of the marshaled data in the buffer. - * - * NOTES - * Even though the function is documented to take a pointer to a ULONG in - * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of - * which the first parameter is a ULONG. - * This function is only intended to be called by the RPC runtime. - */ -void __RPC_USER HDC_UserFree(ULONG *pFlags, HDC *phdc) -{ - FIXME(":stub\n"); -} - -/****************************************************************************** * HPALETTE_UserSize [OLE32.@] * * Calculates the buffer size required to marshal a palette.