2 * Miscellaneous Marshaling Routines
4 * Copyright 2005 Robert Shearman
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #define NONAMELESSUNION
27 #define NONAMELESSSTRUCT
39 #include "wine/unicode.h"
40 #include "wine/debug.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(ole);
44 #define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align))
45 #define ALIGNED_POINTER(_Ptr, _Align) ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align))
46 #define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align)
47 #define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align)
49 #define USER_MARSHAL_PTR_PREFIX \
50 ( (DWORD)'U' | ( (DWORD)'s' << 8 ) | \
51 ( (DWORD)'e' << 16 ) | ( (DWORD)'r' << 24 ) )
53 static const char* debugstr_user_flags(ULONG *pFlags)
57 switch (LOWORD(*pFlags))
60 loword="MSHCTX_LOCAL";
62 case MSHCTX_NOSHAREDMEM:
63 loword="MSHCTX_NOSHAREDMEM";
65 case MSHCTX_DIFFERENTMACHINE:
66 loword="MSHCTX_DIFFERENTMACHINE";
69 loword="MSHCTX_INPROC";
72 sprintf(buf, "%d", LOWORD(*pFlags));
76 if (HIWORD(*pFlags) == NDR_LOCAL_DATA_REPRESENTATION)
77 return wine_dbg_sprintf("MAKELONG(%s, NDR_LOCAL_DATA_REPRESENTATION)", loword);
79 return wine_dbg_sprintf("MAKELONG(%s, 0x%04x)", loword, HIWORD(*pFlags));
82 /******************************************************************************
83 * CLIPFORMAT_UserSize [OLE32.@]
85 * Calculates the buffer size required to marshal a clip format.
88 * pFlags [I] Flags. See notes.
89 * StartingSize [I] Starting size of the buffer. This value is added on to
90 * the buffer size required for the clip format.
91 * pCF [I] Clip format to size.
94 * The buffer size required to marshal a clip format plus the starting size.
97 * Even though the function is documented to take a pointer to an unsigned
98 * long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
99 * the first parameter is an unsigned long.
100 * This function is only intended to be called by the RPC runtime.
102 ULONG __RPC_USER CLIPFORMAT_UserSize(ULONG *pFlags, ULONG StartingSize, CLIPFORMAT *pCF)
104 ULONG size = StartingSize;
106 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, pCF);
110 /* only need to marshal the name if it is not a pre-defined type and
111 * we are going remote */
112 if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
116 size += 3 * sizeof(UINT);
117 /* urg! this function is badly designed because it won't tell us how
118 * much space is needed without doing a dummy run of storing the
119 * name into a buffer */
120 ret = GetClipboardFormatNameW(*pCF, format, sizeof(format)/sizeof(format[0])-1);
122 RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
123 size += (ret + 1) * sizeof(WCHAR);
128 /******************************************************************************
129 * CLIPFORMAT_UserMarshal [OLE32.@]
131 * Marshals a clip format into a buffer.
134 * pFlags [I] Flags. See notes.
135 * pBuffer [I] Buffer to marshal the clip format into.
136 * pCF [I] Clip format to marshal.
139 * The end of the marshaled data in the buffer.
142 * Even though the function is documented to take a pointer to an unsigned
143 * long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
144 * the first parameter is an unsigned long.
145 * This function is only intended to be called by the RPC runtime.
147 unsigned char * __RPC_USER CLIPFORMAT_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
149 TRACE("(%s, %p, &0x%04x\n", debugstr_user_flags(pFlags), pBuffer, *pCF);
151 /* only need to marshal the name if it is not a pre-defined type and
152 * we are going remote */
153 if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
158 *(DWORD *)pBuffer = WDT_REMOTE_CALL;
160 *(DWORD *)pBuffer = *pCF;
163 len = GetClipboardFormatNameW(*pCF, format, sizeof(format)/sizeof(format[0])-1);
165 RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
167 *(UINT *)pBuffer = len;
168 pBuffer += sizeof(UINT);
169 *(UINT *)pBuffer = 0;
170 pBuffer += sizeof(UINT);
171 *(UINT *)pBuffer = len;
172 pBuffer += sizeof(UINT);
173 TRACE("marshaling format name %s\n", debugstr_w(format));
174 memcpy(pBuffer, format, len * sizeof(WCHAR));
175 pBuffer += len * sizeof(WCHAR);
179 *(DWORD *)pBuffer = WDT_INPROC_CALL;
181 *(DWORD *)pBuffer = *pCF;
188 /******************************************************************************
189 * CLIPFORMAT_UserUnmarshal [OLE32.@]
191 * Unmarshals a clip format from a buffer.
194 * pFlags [I] Flags. See notes.
195 * pBuffer [I] Buffer to marshal the clip format from.
196 * pCF [O] Address that receive the unmarshaled clip format.
199 * The end of the marshaled data in the buffer.
202 * Even though the function is documented to take a pointer to an unsigned
203 * long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
204 * the first parameter is an unsigned long.
205 * This function is only intended to be called by the RPC runtime.
207 unsigned char * __RPC_USER CLIPFORMAT_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
211 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, pCF);
213 fContext = *(DWORD *)pBuffer;
216 if (fContext == WDT_INPROC_CALL)
218 *pCF = *(CLIPFORMAT *)pBuffer;
221 else if (fContext == WDT_REMOTE_CALL)
226 /* pointer ID for registered clip format string */
227 if (*(DWORD *)pBuffer == 0)
228 RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
231 len = *(UINT *)pBuffer;
232 pBuffer += sizeof(UINT);
233 if (*(UINT *)pBuffer != 0)
234 RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
235 pBuffer += sizeof(UINT);
236 if (*(UINT *)pBuffer != len)
237 RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
238 pBuffer += sizeof(UINT);
239 if (((WCHAR *)pBuffer)[len - 1] != '\0')
240 RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
241 TRACE("unmarshaling clip format %s\n", debugstr_w((LPCWSTR)pBuffer));
242 cf = RegisterClipboardFormatW((LPCWSTR)pBuffer);
243 pBuffer += len * sizeof(WCHAR);
245 RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
249 /* code not really appropriate, but nearest I can find */
250 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
254 /******************************************************************************
255 * CLIPFORMAT_UserFree [OLE32.@]
257 * Frees an unmarshaled clip format.
260 * pFlags [I] Flags. See notes.
261 * pCF [I] Clip format to free.
264 * The end of the marshaled data in the buffer.
267 * Even though the function is documented to take a pointer to an unsigned
268 * long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB
269 * structure, of which the first parameter is an unsigned long.
270 * This function is only intended to be called by the RPC runtime.
272 void __RPC_USER CLIPFORMAT_UserFree(ULONG *pFlags, CLIPFORMAT *pCF)
274 /* there is no inverse of the RegisterClipboardFormat function,
275 * so nothing to do */
278 static ULONG handle_UserSize(ULONG *pFlags, ULONG StartingSize, HANDLE *handle)
280 if (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE)
282 ERR("can't remote a local handle\n");
283 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
286 return StartingSize + sizeof(RemotableHandle);
289 static unsigned char * handle_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HANDLE *handle)
291 RemotableHandle *remhandle = (RemotableHandle *)pBuffer;
292 if (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE)
294 ERR("can't remote a local handle\n");
295 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
298 remhandle->fContext = WDT_INPROC_CALL;
299 remhandle->u.hInproc = (LONG_PTR)*handle;
300 return pBuffer + sizeof(RemotableHandle);
303 static unsigned char * handle_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HANDLE *handle)
305 RemotableHandle *remhandle = (RemotableHandle *)pBuffer;
306 if (remhandle->fContext != WDT_INPROC_CALL)
307 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
308 *handle = (HANDLE)(LONG_PTR)remhandle->u.hInproc;
309 return pBuffer + sizeof(RemotableHandle);
312 static void handle_UserFree(ULONG *pFlags, HANDLE *phMenu)
317 #define IMPL_WIREM_HANDLE(type) \
318 ULONG __RPC_USER type##_UserSize(ULONG *pFlags, ULONG StartingSize, type *handle) \
320 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, handle); \
321 return handle_UserSize(pFlags, StartingSize, (HANDLE *)handle); \
324 unsigned char * __RPC_USER type##_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, type *handle) \
326 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *handle); \
327 return handle_UserMarshal(pFlags, pBuffer, (HANDLE *)handle); \
330 unsigned char * __RPC_USER type##_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, type *handle) \
332 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, handle); \
333 return handle_UserUnmarshal(pFlags, pBuffer, (HANDLE *)handle); \
336 void __RPC_USER type##_UserFree(ULONG *pFlags, type *handle) \
338 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags), *handle); \
339 handle_UserFree(pFlags, (HANDLE *)handle); \
342 IMPL_WIREM_HANDLE(HACCEL)
343 IMPL_WIREM_HANDLE(HMENU)
344 IMPL_WIREM_HANDLE(HWND)
346 /******************************************************************************
347 * HGLOBAL_UserSize [OLE32.@]
349 * Calculates the buffer size required to marshal an HGLOBAL.
352 * pFlags [I] Flags. See notes.
353 * StartingSize [I] Starting size of the buffer. This value is added on to
354 * the buffer size required for the clip format.
355 * phGlobal [I] HGLOBAL to size.
358 * The buffer size required to marshal an HGLOBAL plus the starting size.
361 * Even though the function is documented to take a pointer to a ULONG in
362 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
363 * the first parameter is a ULONG.
364 * This function is only intended to be called by the RPC runtime.
366 ULONG __RPC_USER HGLOBAL_UserSize(ULONG *pFlags, ULONG StartingSize, HGLOBAL *phGlobal)
368 ULONG size = StartingSize;
370 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, phGlobal);
372 ALIGN_LENGTH(size, 3);
374 size += sizeof(ULONG);
376 if (LOWORD(*pFlags == MSHCTX_INPROC))
377 size += sizeof(HGLOBAL);
380 size += sizeof(ULONG);
384 size += 3 * sizeof(ULONG);
385 ret = GlobalSize(*phGlobal);
393 /******************************************************************************
394 * HGLOBAL_UserMarshal [OLE32.@]
396 * Marshals an HGLOBAL into a buffer.
399 * pFlags [I] Flags. See notes.
400 * pBuffer [I] Buffer to marshal the clip format into.
401 * phGlobal [I] HGLOBAL to marshal.
404 * The end of the marshaled data in the buffer.
407 * Even though the function is documented to take a pointer to a ULONG in
408 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
409 * the first parameter is a ULONG.
410 * This function is only intended to be called by the RPC runtime.
412 unsigned char * __RPC_USER HGLOBAL_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HGLOBAL *phGlobal)
414 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *phGlobal);
416 ALIGN_POINTER(pBuffer, 3);
418 if (LOWORD(*pFlags == MSHCTX_INPROC))
420 if (sizeof(*phGlobal) == 8)
421 *(ULONG *)pBuffer = WDT_INPROC64_CALL;
423 *(ULONG *)pBuffer = WDT_INPROC_CALL;
424 pBuffer += sizeof(ULONG);
425 *(HGLOBAL *)pBuffer = *phGlobal;
426 pBuffer += sizeof(HGLOBAL);
430 *(ULONG *)pBuffer = WDT_REMOTE_CALL;
431 pBuffer += sizeof(ULONG);
432 *(ULONG *)pBuffer = HandleToULong(*phGlobal);
433 pBuffer += sizeof(ULONG);
436 const unsigned char *memory;
437 SIZE_T size = GlobalSize(*phGlobal);
438 *(ULONG *)pBuffer = (ULONG)size;
439 pBuffer += sizeof(ULONG);
440 *(ULONG *)pBuffer = HandleToULong(*phGlobal);
441 pBuffer += sizeof(ULONG);
442 *(ULONG *)pBuffer = (ULONG)size;
443 pBuffer += sizeof(ULONG);
445 memory = GlobalLock(*phGlobal);
446 memcpy(pBuffer, memory, size);
448 GlobalUnlock(*phGlobal);
455 /******************************************************************************
456 * HGLOBAL_UserUnmarshal [OLE32.@]
458 * Unmarshals an HGLOBAL from a buffer.
461 * pFlags [I] Flags. See notes.
462 * pBuffer [I] Buffer to marshal the clip format from.
463 * phGlobal [O] Address that receive the unmarshaled HGLOBAL.
466 * The end of the marshaled data in the buffer.
469 * Even though the function is documented to take a pointer to an ULONG in
470 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
471 * the first parameter is an ULONG.
472 * This function is only intended to be called by the RPC runtime.
474 unsigned char * __RPC_USER HGLOBAL_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HGLOBAL *phGlobal)
478 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *phGlobal);
480 ALIGN_POINTER(pBuffer, 3);
482 fContext = *(ULONG *)pBuffer;
483 pBuffer += sizeof(ULONG);
485 if (((fContext == WDT_INPROC_CALL) && (sizeof(*phGlobal) < 8)) ||
486 ((fContext == WDT_INPROC64_CALL) && (sizeof(*phGlobal) == 8)))
488 *phGlobal = *(HGLOBAL *)pBuffer;
489 pBuffer += sizeof(*phGlobal);
491 else if (fContext == WDT_REMOTE_CALL)
495 handle = *(ULONG *)pBuffer;
496 pBuffer += sizeof(ULONG);
503 size = *(ULONG *)pBuffer;
504 pBuffer += sizeof(ULONG);
505 /* redundancy is bad - it means you have to check consistency like
507 if (*(ULONG *)pBuffer != handle)
509 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
512 pBuffer += sizeof(ULONG);
513 /* redundancy is bad - it means you have to check consistency like
515 if (*(ULONG *)pBuffer != size)
517 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
520 pBuffer += sizeof(ULONG);
522 /* FIXME: check size is not too big */
524 *phGlobal = GlobalAlloc(GMEM_MOVEABLE, size);
525 memory = GlobalLock(*phGlobal);
526 memcpy(memory, pBuffer, size);
528 GlobalUnlock(*phGlobal);
534 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
539 /******************************************************************************
540 * HGLOBAL_UserFree [OLE32.@]
542 * Frees an unmarshaled HGLOBAL.
545 * pFlags [I] Flags. See notes.
546 * phGlobal [I] HGLOBAL to free.
549 * The end of the marshaled data in the buffer.
552 * Even though the function is documented to take a pointer to a ULONG in
553 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
554 * which the first parameter is a ULONG.
555 * This function is only intended to be called by the RPC runtime.
557 void __RPC_USER HGLOBAL_UserFree(ULONG *pFlags, HGLOBAL *phGlobal)
559 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags), *phGlobal);
561 if (LOWORD(*pFlags != MSHCTX_INPROC) && *phGlobal)
562 GlobalFree(*phGlobal);
565 /******************************************************************************
566 * HBITMAP_UserSize [OLE32.@]
568 * Calculates the buffer size required to marshal a bitmap.
571 * pFlags [I] Flags. See notes.
572 * StartingSize [I] Starting size of the buffer. This value is added on to
573 * the buffer size required for the clip format.
574 * phBmp [I] Bitmap to size.
577 * The buffer size required to marshal an bitmap plus the starting size.
580 * Even though the function is documented to take a pointer to a ULONG in
581 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
582 * the first parameter is a ULONG.
583 * This function is only intended to be called by the RPC runtime.
585 ULONG __RPC_USER HBITMAP_UserSize(ULONG *pFlags, ULONG StartingSize, HBITMAP *phBmp)
591 /******************************************************************************
592 * HBITMAP_UserMarshal [OLE32.@]
594 * Marshals a bitmap into a buffer.
597 * pFlags [I] Flags. See notes.
598 * pBuffer [I] Buffer to marshal the clip format into.
599 * phBmp [I] Bitmap to marshal.
602 * The end of the marshaled data in the buffer.
605 * Even though the function is documented to take a pointer to a ULONG in
606 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
607 * the first parameter is a ULONG.
608 * This function is only intended to be called by the RPC runtime.
610 unsigned char * __RPC_USER HBITMAP_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HBITMAP *phBmp)
616 /******************************************************************************
617 * HBITMAP_UserUnmarshal [OLE32.@]
619 * Unmarshals a bitmap from a buffer.
622 * pFlags [I] Flags. See notes.
623 * pBuffer [I] Buffer to marshal the clip format from.
624 * phBmp [O] Address that receive the unmarshaled bitmap.
627 * The end of the marshaled data in the buffer.
630 * Even though the function is documented to take a pointer to an ULONG in
631 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
632 * the first parameter is an ULONG.
633 * This function is only intended to be called by the RPC runtime.
635 unsigned char * __RPC_USER HBITMAP_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HBITMAP *phBmp)
641 /******************************************************************************
642 * HBITMAP_UserFree [OLE32.@]
644 * Frees an unmarshaled bitmap.
647 * pFlags [I] Flags. See notes.
648 * phBmp [I] Bitmap to free.
651 * The end of the marshaled data in the buffer.
654 * Even though the function is documented to take a pointer to a ULONG in
655 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
656 * which the first parameter is a ULONG.
657 * This function is only intended to be called by the RPC runtime.
659 void __RPC_USER HBITMAP_UserFree(ULONG *pFlags, HBITMAP *phBmp)
664 /******************************************************************************
665 * HICON_UserSize [OLE32.@]
667 * Calculates the buffer size required to marshal an icon.
670 * pFlags [I] Flags. See notes.
671 * StartingSize [I] Starting size of the buffer. This value is added on to
672 * the buffer size required for the icon.
673 * phIcon [I] Icon to size.
676 * The buffer size required to marshal an icon plus the starting size.
679 * Even though the function is documented to take a pointer to a ULONG in
680 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
681 * the first parameter is a ULONG.
682 * This function is only intended to be called by the RPC runtime.
684 ULONG __RPC_USER HICON_UserSize(ULONG *pFlags, ULONG StartingSize, HICON *phIcon)
690 /******************************************************************************
691 * HICON_UserMarshal [OLE32.@]
693 * Marshals an icon into a buffer.
696 * pFlags [I] Flags. See notes.
697 * pBuffer [I] Buffer to marshal the icon into.
698 * phIcon [I] Icon to marshal.
701 * The end of the marshaled data in the buffer.
704 * Even though the function is documented to take a pointer to a ULONG in
705 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
706 * the first parameter is a ULONG.
707 * This function is only intended to be called by the RPC runtime.
709 unsigned char * __RPC_USER HICON_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HICON *phIcon)
715 /******************************************************************************
716 * HICON_UserUnmarshal [OLE32.@]
718 * Unmarshals an icon from a buffer.
721 * pFlags [I] Flags. See notes.
722 * pBuffer [I] Buffer to marshal the icon from.
723 * phIcon [O] Address that receive the unmarshaled icon.
726 * The end of the marshaled data in the buffer.
729 * Even though the function is documented to take a pointer to an ULONG in
730 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
731 * the first parameter is an ULONG.
732 * This function is only intended to be called by the RPC runtime.
734 unsigned char * __RPC_USER HICON_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HICON *phIcon)
740 /******************************************************************************
741 * HICON_UserFree [OLE32.@]
743 * Frees an unmarshaled icon.
746 * pFlags [I] Flags. See notes.
747 * phIcon [I] Icon to free.
750 * The end of the marshaled data in the buffer.
753 * Even though the function is documented to take a pointer to a ULONG in
754 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
755 * which the first parameter is a ULONG.
756 * This function is only intended to be called by the RPC runtime.
758 void __RPC_USER HICON_UserFree(ULONG *pFlags, HICON *phIcon)
763 /******************************************************************************
764 * HDC_UserSize [OLE32.@]
766 * Calculates the buffer size required to marshal an HDC.
769 * pFlags [I] Flags. See notes.
770 * StartingSize [I] Starting size of the buffer. This value is added on to
771 * the buffer size required for the clip format.
772 * phGlobal [I] HDC to size.
775 * The buffer size required to marshal an HDC plus the starting size.
778 * Even though the function is documented to take a pointer to a ULONG in
779 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
780 * the first parameter is a ULONG.
781 * This function is only intended to be called by the RPC runtime.
783 ULONG __RPC_USER HDC_UserSize(ULONG *pFlags, ULONG StartingSize, HDC *phdc)
789 /******************************************************************************
790 * HDC_UserMarshal [OLE32.@]
792 * Marshals an HDC into a buffer.
795 * pFlags [I] Flags. See notes.
796 * pBuffer [I] Buffer to marshal the clip format into.
797 * phdc [I] HDC to marshal.
800 * The end of the marshaled data in the buffer.
803 * Even though the function is documented to take a pointer to a ULONG in
804 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
805 * the first parameter is a ULONG.
806 * This function is only intended to be called by the RPC runtime.
808 unsigned char * __RPC_USER HDC_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HDC *phdc)
814 /******************************************************************************
815 * HDC_UserUnmarshal [OLE32.@]
817 * Unmarshals an HDC from a buffer.
820 * pFlags [I] Flags. See notes.
821 * pBuffer [I] Buffer to marshal the clip format from.
822 * phdc [O] Address that receive the unmarshaled HDC.
825 * The end of the marshaled data in the buffer.
828 * Even though the function is documented to take a pointer to an ULONG in
829 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
830 * the first parameter is an ULONG.
831 * This function is only intended to be called by the RPC runtime.
833 unsigned char * __RPC_USER HDC_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HDC *phdc)
839 /******************************************************************************
840 * HDC_UserFree [OLE32.@]
842 * Frees an unmarshaled HDC.
845 * pFlags [I] Flags. See notes.
846 * phdc [I] HDC to free.
849 * The end of the marshaled data in the buffer.
852 * Even though the function is documented to take a pointer to a ULONG in
853 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
854 * which the first parameter is a ULONG.
855 * This function is only intended to be called by the RPC runtime.
857 void __RPC_USER HDC_UserFree(ULONG *pFlags, HDC *phdc)
862 /******************************************************************************
863 * HPALETTE_UserSize [OLE32.@]
865 * Calculates the buffer size required to marshal a palette.
868 * pFlags [I] Flags. See notes.
869 * StartingSize [I] Starting size of the buffer. This value is added on to
870 * the buffer size required for the clip format.
871 * phPal [I] Palette to size.
874 * The buffer size required to marshal a palette plus the starting size.
877 * Even though the function is documented to take a pointer to a ULONG in
878 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
879 * the first parameter is a ULONG.
880 * This function is only intended to be called by the RPC runtime.
882 ULONG __RPC_USER HPALETTE_UserSize(ULONG *pFlags, ULONG StartingSize, HPALETTE *phPal)
888 /******************************************************************************
889 * HPALETTE_UserMarshal [OLE32.@]
891 * Marshals a palette into a buffer.
894 * pFlags [I] Flags. See notes.
895 * pBuffer [I] Buffer to marshal the clip format into.
896 * phPal [I] Palette to marshal.
899 * The end of the marshaled data in the buffer.
902 * Even though the function is documented to take a pointer to a ULONG in
903 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
904 * the first parameter is a ULONG.
905 * This function is only intended to be called by the RPC runtime.
907 unsigned char * __RPC_USER HPALETTE_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HPALETTE *phPal)
913 /******************************************************************************
914 * HPALETTE_UserUnmarshal [OLE32.@]
916 * Unmarshals a palette from a buffer.
919 * pFlags [I] Flags. See notes.
920 * pBuffer [I] Buffer to marshal the clip format from.
921 * phPal [O] Address that receive the unmarshaled palette.
924 * The end of the marshaled data in the buffer.
927 * Even though the function is documented to take a pointer to an ULONG in
928 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
929 * the first parameter is an ULONG.
930 * This function is only intended to be called by the RPC runtime.
932 unsigned char * __RPC_USER HPALETTE_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HPALETTE *phPal)
938 /******************************************************************************
939 * HPALETTE_UserFree [OLE32.@]
941 * Frees an unmarshaled palette.
944 * pFlags [I] Flags. See notes.
945 * phPal [I] Palette to free.
948 * The end of the marshaled data in the buffer.
951 * Even though the function is documented to take a pointer to a ULONG in
952 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
953 * which the first parameter is a ULONG.
954 * This function is only intended to be called by the RPC runtime.
956 void __RPC_USER HPALETTE_UserFree(ULONG *pFlags, HPALETTE *phPal)
962 /******************************************************************************
963 * HMETAFILE_UserSize [OLE32.@]
965 * Calculates the buffer size required to marshal a metafile.
968 * pFlags [I] Flags. See notes.
969 * StartingSize [I] Starting size of the buffer. This value is added on to
970 * the buffer size required for the clip format.
971 * phmf [I] Metafile to size.
974 * The buffer size required to marshal a metafile plus the starting size.
977 * Even though the function is documented to take a pointer to a ULONG in
978 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
979 * the first parameter is a ULONG.
980 * This function is only intended to be called by the RPC runtime.
982 ULONG __RPC_USER HMETAFILE_UserSize(ULONG *pFlags, ULONG StartingSize, HMETAFILE *phmf)
984 ULONG size = StartingSize;
986 TRACE("(%s, %d, &%p\n", debugstr_user_flags(pFlags), StartingSize, *phmf);
988 ALIGN_LENGTH(size, 3);
990 size += sizeof(ULONG);
991 if (LOWORD(*pFlags) == MSHCTX_INPROC)
992 size += sizeof(ULONG_PTR);
995 size += sizeof(ULONG);
1001 size += 2 * sizeof(ULONG);
1002 mfsize = GetMetaFileBitsEx(*phmf, 0, NULL);
1010 /******************************************************************************
1011 * HMETAFILE_UserMarshal [OLE32.@]
1013 * Marshals a metafile into a buffer.
1016 * pFlags [I] Flags. See notes.
1017 * pBuffer [I] Buffer to marshal the clip format into.
1018 * phEmf [I] Metafile to marshal.
1021 * The end of the marshaled data in the buffer.
1024 * Even though the function is documented to take a pointer to a ULONG in
1025 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1026 * the first parameter is a ULONG.
1027 * This function is only intended to be called by the RPC runtime.
1029 unsigned char * __RPC_USER HMETAFILE_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HMETAFILE *phmf)
1031 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *phmf);
1033 ALIGN_POINTER(pBuffer, 3);
1035 if (LOWORD(*pFlags) == MSHCTX_INPROC)
1037 if (sizeof(*phmf) == 8)
1038 *(ULONG *)pBuffer = WDT_INPROC64_CALL;
1040 *(ULONG *)pBuffer = WDT_INPROC_CALL;
1041 pBuffer += sizeof(ULONG);
1042 *(HMETAFILE *)pBuffer = *phmf;
1043 pBuffer += sizeof(HMETAFILE);
1047 *(ULONG *)pBuffer = WDT_REMOTE_CALL;
1048 pBuffer += sizeof(ULONG);
1049 *(ULONG *)pBuffer = (ULONG)(ULONG_PTR)*phmf;
1050 pBuffer += sizeof(ULONG);
1054 UINT mfsize = GetMetaFileBitsEx(*phmf, 0, NULL);
1056 *(ULONG *)pBuffer = mfsize;
1057 pBuffer += sizeof(ULONG);
1058 *(ULONG *)pBuffer = mfsize;
1059 pBuffer += sizeof(ULONG);
1060 GetMetaFileBitsEx(*phmf, mfsize, pBuffer);
1068 /******************************************************************************
1069 * HMETAFILE_UserUnmarshal [OLE32.@]
1071 * Unmarshals a metafile from a buffer.
1074 * pFlags [I] Flags. See notes.
1075 * pBuffer [I] Buffer to marshal the clip format from.
1076 * phmf [O] Address that receive the unmarshaled metafile.
1079 * The end of the marshaled data in the buffer.
1082 * Even though the function is documented to take a pointer to an ULONG in
1083 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1084 * the first parameter is an ULONG.
1085 * This function is only intended to be called by the RPC runtime.
1087 unsigned char * __RPC_USER HMETAFILE_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HMETAFILE *phmf)
1091 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, phmf);
1093 ALIGN_POINTER(pBuffer, 3);
1095 fContext = *(ULONG *)pBuffer;
1096 pBuffer += sizeof(ULONG);
1098 if (((fContext == WDT_INPROC_CALL) && (sizeof(*phmf) < 8)) ||
1099 ((fContext == WDT_INPROC64_CALL) && (sizeof(*phmf) == 8)))
1101 *phmf = *(HMETAFILE *)pBuffer;
1102 pBuffer += sizeof(*phmf);
1104 else if (fContext == WDT_REMOTE_CALL)
1108 handle = *(ULONG *)pBuffer;
1109 pBuffer += sizeof(ULONG);
1114 size = *(ULONG *)pBuffer;
1115 pBuffer += sizeof(ULONG);
1116 if (size != *(ULONG *)pBuffer)
1118 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
1121 pBuffer += sizeof(ULONG);
1122 *phmf = SetMetaFileBitsEx(size, pBuffer);
1129 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
1134 /******************************************************************************
1135 * HMETAFILE_UserFree [OLE32.@]
1137 * Frees an unmarshaled metafile.
1140 * pFlags [I] Flags. See notes.
1141 * phmf [I] Metafile to free.
1144 * The end of the marshaled data in the buffer.
1147 * Even though the function is documented to take a pointer to a ULONG in
1148 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
1149 * which the first parameter is a ULONG.
1150 * This function is only intended to be called by the RPC runtime.
1152 void __RPC_USER HMETAFILE_UserFree(ULONG *pFlags, HMETAFILE *phmf)
1154 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags), *phmf);
1156 if (LOWORD(*pFlags) != MSHCTX_INPROC)
1157 DeleteMetaFile(*phmf);
1160 /******************************************************************************
1161 * HENHMETAFILE_UserSize [OLE32.@]
1163 * Calculates the buffer size required to marshal an enhanced metafile.
1166 * pFlags [I] Flags. See notes.
1167 * StartingSize [I] Starting size of the buffer. This value is added on to
1168 * the buffer size required for the clip format.
1169 * phEmf [I] Enhanced metafile to size.
1172 * The buffer size required to marshal an enhanced metafile plus the starting size.
1175 * Even though the function is documented to take a pointer to a ULONG in
1176 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1177 * the first parameter is a ULONG.
1178 * This function is only intended to be called by the RPC runtime.
1180 ULONG __RPC_USER HENHMETAFILE_UserSize(ULONG *pFlags, ULONG StartingSize, HENHMETAFILE *phEmf)
1182 ULONG size = StartingSize;
1184 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, *phEmf);
1186 size += sizeof(ULONG);
1187 if (LOWORD(*pFlags) == MSHCTX_INPROC)
1188 size += sizeof(ULONG_PTR);
1191 size += sizeof(ULONG);
1197 size += 2 * sizeof(ULONG);
1198 emfsize = GetEnhMetaFileBits(*phEmf, 0, NULL);
1206 /******************************************************************************
1207 * HENHMETAFILE_UserMarshal [OLE32.@]
1209 * Marshals an enhance metafile into a buffer.
1212 * pFlags [I] Flags. See notes.
1213 * pBuffer [I] Buffer to marshal the clip format into.
1214 * phEmf [I] Enhanced metafile to marshal.
1217 * The end of the marshaled data in the buffer.
1220 * Even though the function is documented to take a pointer to a ULONG in
1221 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1222 * the first parameter is a ULONG.
1223 * This function is only intended to be called by the RPC runtime.
1225 unsigned char * __RPC_USER HENHMETAFILE_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HENHMETAFILE *phEmf)
1227 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *phEmf);
1229 if (LOWORD(*pFlags) == MSHCTX_INPROC)
1231 if (sizeof(*phEmf) == 8)
1232 *(ULONG *)pBuffer = WDT_INPROC64_CALL;
1234 *(ULONG *)pBuffer = WDT_INPROC_CALL;
1235 pBuffer += sizeof(ULONG);
1236 *(HENHMETAFILE *)pBuffer = *phEmf;
1237 pBuffer += sizeof(HENHMETAFILE);
1241 *(ULONG *)pBuffer = WDT_REMOTE_CALL;
1242 pBuffer += sizeof(ULONG);
1243 *(ULONG *)pBuffer = (ULONG)(ULONG_PTR)*phEmf;
1244 pBuffer += sizeof(ULONG);
1248 UINT emfsize = GetEnhMetaFileBits(*phEmf, 0, NULL);
1250 *(ULONG *)pBuffer = emfsize;
1251 pBuffer += sizeof(ULONG);
1252 *(ULONG *)pBuffer = emfsize;
1253 pBuffer += sizeof(ULONG);
1254 GetEnhMetaFileBits(*phEmf, emfsize, pBuffer);
1262 /******************************************************************************
1263 * HENHMETAFILE_UserUnmarshal [OLE32.@]
1265 * Unmarshals an enhanced metafile from a buffer.
1268 * pFlags [I] Flags. See notes.
1269 * pBuffer [I] Buffer to marshal the clip format from.
1270 * phEmf [O] Address that receive the unmarshaled enhanced metafile.
1273 * The end of the marshaled data in the buffer.
1276 * Even though the function is documented to take a pointer to an ULONG in
1277 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1278 * the first parameter is an ULONG.
1279 * This function is only intended to be called by the RPC runtime.
1281 unsigned char * __RPC_USER HENHMETAFILE_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HENHMETAFILE *phEmf)
1285 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, phEmf);
1287 fContext = *(ULONG *)pBuffer;
1288 pBuffer += sizeof(ULONG);
1290 if (((fContext == WDT_INPROC_CALL) && (sizeof(*phEmf) < 8)) ||
1291 ((fContext == WDT_INPROC64_CALL) && (sizeof(*phEmf) == 8)))
1293 *phEmf = *(HENHMETAFILE *)pBuffer;
1294 pBuffer += sizeof(*phEmf);
1296 else if (fContext == WDT_REMOTE_CALL)
1300 handle = *(ULONG *)pBuffer;
1301 pBuffer += sizeof(ULONG);
1306 size = *(ULONG *)pBuffer;
1307 pBuffer += sizeof(ULONG);
1308 if (size != *(ULONG *)pBuffer)
1310 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
1313 pBuffer += sizeof(ULONG);
1314 *phEmf = SetEnhMetaFileBits(size, pBuffer);
1321 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
1326 /******************************************************************************
1327 * HENHMETAFILE_UserFree [OLE32.@]
1329 * Frees an unmarshaled enhanced metafile.
1332 * pFlags [I] Flags. See notes.
1333 * phEmf [I] Enhanced metafile to free.
1336 * The end of the marshaled data in the buffer.
1339 * Even though the function is documented to take a pointer to a ULONG in
1340 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
1341 * which the first parameter is a ULONG.
1342 * This function is only intended to be called by the RPC runtime.
1344 void __RPC_USER HENHMETAFILE_UserFree(ULONG *pFlags, HENHMETAFILE *phEmf)
1346 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags), *phEmf);
1348 if (LOWORD(*pFlags) != MSHCTX_INPROC)
1349 DeleteEnhMetaFile(*phEmf);
1352 /******************************************************************************
1353 * HMETAFILEPICT_UserSize [OLE32.@]
1355 * Calculates the buffer size required to marshal an metafile pict.
1358 * pFlags [I] Flags. See notes.
1359 * StartingSize [I] Starting size of the buffer. This value is added on to
1360 * the buffer size required for the clip format.
1361 * phMfp [I] Metafile pict to size.
1364 * The buffer size required to marshal a metafile pict plus the starting size.
1367 * Even though the function is documented to take a pointer to a ULONG in
1368 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1369 * the first parameter is a ULONG.
1370 * This function is only intended to be called by the RPC runtime.
1372 ULONG __RPC_USER HMETAFILEPICT_UserSize(ULONG *pFlags, ULONG StartingSize, HMETAFILEPICT *phMfp)
1374 ULONG size = StartingSize;
1376 TRACE("(%s, %d, &%p)\n", debugstr_user_flags(pFlags), StartingSize, *phMfp);
1378 size += sizeof(ULONG);
1380 if(LOWORD(*pFlags) == MSHCTX_INPROC)
1381 size += sizeof(HMETAFILEPICT);
1384 size += sizeof(ULONG);
1388 METAFILEPICT *mfpict = GlobalLock(*phMfp);
1390 /* FIXME: raise an exception if mfpict is NULL? */
1391 size += 3 * sizeof(ULONG);
1392 size += sizeof(ULONG);
1394 size = HMETAFILE_UserSize(pFlags, size, &mfpict->hMF);
1396 GlobalUnlock(*phMfp);
1403 /******************************************************************************
1404 * HMETAFILEPICT_UserMarshal [OLE32.@]
1406 * Marshals a metafile pict into a buffer.
1409 * pFlags [I] Flags. See notes.
1410 * pBuffer [I] Buffer to marshal the clip format into.
1411 * phMfp [I] Metafile pict to marshal.
1414 * The end of the marshaled data in the buffer.
1417 * Even though the function is documented to take a pointer to a ULONG in
1418 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1419 * the first parameter is a ULONG.
1420 * This function is only intended to be called by the RPC runtime.
1422 unsigned char * __RPC_USER HMETAFILEPICT_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HMETAFILEPICT *phMfp)
1424 TRACE("(%s, %p, &%p)\n", debugstr_user_flags(pFlags), pBuffer, *phMfp);
1426 if (LOWORD(*pFlags) == MSHCTX_INPROC)
1428 if (sizeof(HMETAFILEPICT) == 8)
1429 *(ULONG *)pBuffer = WDT_INPROC64_CALL;
1431 *(ULONG *)pBuffer = WDT_INPROC_CALL;
1432 pBuffer += sizeof(ULONG);
1433 *(HMETAFILEPICT *)pBuffer = *phMfp;
1434 pBuffer += sizeof(HMETAFILEPICT);
1438 *(ULONG *)pBuffer = WDT_REMOTE_CALL;
1439 pBuffer += sizeof(ULONG);
1440 *(ULONG *)pBuffer = (ULONG)(ULONG_PTR)*phMfp;
1441 pBuffer += sizeof(ULONG);
1445 METAFILEPICT *mfpict = GlobalLock(*phMfp);
1446 remoteMETAFILEPICT * remmfpict = (remoteMETAFILEPICT *)pBuffer;
1448 /* FIXME: raise an exception if mfpict is NULL? */
1449 remmfpict->mm = mfpict->mm;
1450 remmfpict->xExt = mfpict->xExt;
1451 remmfpict->yExt = mfpict->yExt;
1452 pBuffer += 3 * sizeof(ULONG);
1453 *(ULONG *)pBuffer = USER_MARSHAL_PTR_PREFIX;
1454 pBuffer += sizeof(ULONG);
1456 pBuffer = HMETAFILE_UserMarshal(pFlags, pBuffer, &mfpict->hMF);
1458 GlobalUnlock(*phMfp);
1464 /******************************************************************************
1465 * HMETAFILEPICT_UserUnmarshal [OLE32.@]
1467 * Unmarshals an metafile pict from a buffer.
1470 * pFlags [I] Flags. See notes.
1471 * pBuffer [I] Buffer to marshal the clip format from.
1472 * phMfp [O] Address that receive the unmarshaled metafile pict.
1475 * The end of the marshaled data in the buffer.
1478 * Even though the function is documented to take a pointer to an ULONG in
1479 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1480 * the first parameter is an ULONG.
1481 * This function is only intended to be called by the RPC runtime.
1483 unsigned char * __RPC_USER HMETAFILEPICT_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HMETAFILEPICT *phMfp)
1487 TRACE("(%s, %p, %p)\n", debugstr_user_flags(pFlags), pBuffer, phMfp);
1489 fContext = *(ULONG *)pBuffer;
1490 pBuffer += sizeof(ULONG);
1492 if ((fContext == WDT_INPROC_CALL) || fContext == WDT_INPROC64_CALL)
1494 *phMfp = *(HMETAFILEPICT *)pBuffer;
1495 pBuffer += sizeof(HMETAFILEPICT);
1499 ULONG handle = *(ULONG *)pBuffer;
1500 pBuffer += sizeof(ULONG);
1505 METAFILEPICT *mfpict;
1506 const remoteMETAFILEPICT *remmfpict;
1507 ULONG user_marshal_prefix;
1509 remmfpict = (const remoteMETAFILEPICT *)pBuffer;
1511 *phMfp = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILEPICT));
1513 RpcRaiseException(E_OUTOFMEMORY);
1515 mfpict = GlobalLock(*phMfp);
1516 mfpict->mm = remmfpict->mm;
1517 mfpict->xExt = remmfpict->xExt;
1518 mfpict->yExt = remmfpict->yExt;
1519 pBuffer += 3 * sizeof(ULONG);
1520 user_marshal_prefix = *(ULONG *)pBuffer;
1521 pBuffer += sizeof(ULONG);
1523 if (user_marshal_prefix != USER_MARSHAL_PTR_PREFIX)
1524 RpcRaiseException(RPC_X_INVALID_TAG);
1526 pBuffer = HMETAFILE_UserUnmarshal(pFlags, pBuffer, &mfpict->hMF);
1528 GlobalUnlock(*phMfp);
1534 /******************************************************************************
1535 * HMETAFILEPICT_UserFree [OLE32.@]
1537 * Frees an unmarshaled metafile pict.
1540 * pFlags [I] Flags. See notes.
1541 * phMfp [I] Metafile pict to free.
1544 * The end of the marshaled data in the buffer.
1547 * Even though the function is documented to take a pointer to a ULONG in
1548 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
1549 * which the first parameter is a ULONG.
1550 * This function is only intended to be called by the RPC runtime.
1552 void __RPC_USER HMETAFILEPICT_UserFree(ULONG *pFlags, HMETAFILEPICT *phMfp)
1554 TRACE("(%s, &%p)\n", debugstr_user_flags(pFlags), *phMfp);
1556 if ((LOWORD(*pFlags) != MSHCTX_INPROC) && *phMfp)
1558 METAFILEPICT *mfpict;
1560 mfpict = GlobalLock(*phMfp);
1561 /* FIXME: raise an exception if mfpict is NULL? */
1562 HMETAFILE_UserFree(pFlags, &mfpict->hMF);
1563 GlobalUnlock(*phMfp);
1569 /******************************************************************************
1570 * WdtpInterfacePointer_UserSize [OLE32.@]
1572 * Calculates the buffer size required to marshal an interface pointer.
1575 * pFlags [I] Flags. See notes.
1576 * RealFlags [I] The MSHCTX to use when marshaling the interface.
1577 * punk [I] Interface pointer to size.
1578 * StartingSize [I] Starting size of the buffer. This value is added on to
1579 * the buffer size required for the clip format.
1580 * riid [I] ID of interface to size.
1583 * The buffer size required to marshal an interface pointer plus the starting size.
1586 * Even though the function is documented to take a pointer to a ULONG in
1587 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1588 * the first parameter is a ULONG.
1590 ULONG __RPC_USER WdtpInterfacePointer_UserSize(ULONG *pFlags, ULONG RealFlags, ULONG StartingSize, IUnknown *punk, REFIID riid)
1592 DWORD marshal_size = 0;
1595 TRACE("(%s, 0%x, %d, %p, %s)\n", debugstr_user_flags(pFlags), RealFlags, StartingSize, punk, debugstr_guid(riid));
1597 hr = CoGetMarshalSizeMax(&marshal_size, riid, punk, LOWORD(RealFlags), NULL, MSHLFLAGS_NORMAL);
1598 if(FAILED(hr)) return StartingSize;
1600 ALIGN_LENGTH(StartingSize, 3);
1601 StartingSize += 2 * sizeof(DWORD);
1602 return StartingSize + marshal_size;
1605 /******************************************************************************
1606 * WdtpInterfacePointer_UserMarshal [OLE32.@]
1608 * Marshals an interface pointer into a buffer.
1611 * pFlags [I] Flags. See notes.
1612 * RealFlags [I] The MSHCTX to use when marshaling the interface.
1613 * pBuffer [I] Buffer to marshal the clip format into.
1614 * punk [I] Interface pointer to marshal.
1615 * riid [I] ID of interface to marshal.
1618 * The end of the marshaled data in the buffer.
1621 * Even though the function is documented to take a pointer to a ULONG in
1622 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1623 * the first parameter is a ULONG.
1625 unsigned char * WINAPI WdtpInterfacePointer_UserMarshal(ULONG *pFlags, ULONG RealFlags, unsigned char *pBuffer, IUnknown *punk, REFIID riid)
1627 HGLOBAL h = GlobalAlloc(GMEM_MOVEABLE, 0);
1632 TRACE("(%s, 0x%x, %p, &%p, %s)\n", debugstr_user_flags(pFlags), RealFlags, pBuffer, punk, debugstr_guid(riid));
1635 if(CreateStreamOnHGlobal(h, TRUE, &stm) != S_OK)
1641 if(CoMarshalInterface(stm, riid, punk, LOWORD(RealFlags), NULL, MSHLFLAGS_NORMAL) != S_OK)
1643 IStream_Release(stm);
1647 ALIGN_POINTER(pBuffer, 3);
1648 size = GlobalSize(h);
1650 *(DWORD *)pBuffer = size;
1651 pBuffer += sizeof(DWORD);
1652 *(DWORD *)pBuffer = size;
1653 pBuffer += sizeof(DWORD);
1655 ptr = GlobalLock(h);
1656 memcpy(pBuffer, ptr, size);
1659 IStream_Release(stm);
1660 return pBuffer + size;
1663 /******************************************************************************
1664 * WdtpInterfacePointer_UserUnmarshal [OLE32.@]
1666 * Unmarshals an interface pointer from a buffer.
1669 * pFlags [I] Flags. See notes.
1670 * pBuffer [I] Buffer to marshal the clip format from.
1671 * ppunk [I/O] Address that receives the unmarshaled interface pointer.
1672 * riid [I] ID of interface to unmarshal.
1675 * The end of the marshaled data in the buffer.
1678 * Even though the function is documented to take a pointer to an ULONG in
1679 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1680 * the first parameter is an ULONG.
1682 unsigned char * WINAPI WdtpInterfacePointer_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, IUnknown **ppunk, REFIID riid)
1690 TRACE("(%s, %p, %p, %s)\n", debugstr_user_flags(pFlags), pBuffer, ppunk, debugstr_guid(riid));
1692 ALIGN_POINTER(pBuffer, 3);
1694 size = *(DWORD *)pBuffer;
1695 pBuffer += sizeof(DWORD);
1696 if(size != *(DWORD *)pBuffer)
1697 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
1699 pBuffer += sizeof(DWORD);
1701 /* FIXME: sanity check on size */
1703 h = GlobalAlloc(GMEM_MOVEABLE, size);
1704 if(!h) RaiseException(RPC_X_NO_MEMORY, 0, 0, NULL);
1706 if(CreateStreamOnHGlobal(h, TRUE, &stm) != S_OK)
1709 RaiseException(RPC_X_NO_MEMORY, 0, 0, NULL);
1712 ptr = GlobalLock(h);
1713 memcpy(ptr, pBuffer, size);
1716 hr = CoUnmarshalInterface(stm, riid, (void**)ppunk);
1717 IStream_Release(stm);
1719 if(hr != S_OK) RaiseException(hr, 0, 0, NULL);
1721 return pBuffer + size;
1724 /******************************************************************************
1725 * WdtpInterfacePointer_UserFree [OLE32.@]
1727 * Releases an unmarshaled interface pointer.
1730 * punk [I] Interface pointer to release.
1735 void WINAPI WdtpInterfacePointer_UserFree(IUnknown *punk)
1737 TRACE("(%p)\n", punk);
1738 if(punk) IUnknown_Release(punk);
1741 /******************************************************************************
1742 * STGMEDIUM_UserSize [OLE32.@]
1744 * Calculates the buffer size required to marshal an STGMEDIUM.
1747 * pFlags [I] Flags. See notes.
1748 * StartingSize [I] Starting size of the buffer. This value is added on to
1749 * the buffer size required for the clip format.
1750 * pStgMedium [I] STGMEDIUM to size.
1753 * The buffer size required to marshal an STGMEDIUM plus the starting size.
1756 * Even though the function is documented to take a pointer to a ULONG in
1757 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1758 * the first parameter is a ULONG.
1759 * This function is only intended to be called by the RPC runtime.
1761 ULONG __RPC_USER STGMEDIUM_UserSize(ULONG *pFlags, ULONG StartingSize, STGMEDIUM *pStgMedium)
1763 ULONG size = StartingSize;
1765 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, pStgMedium);
1767 ALIGN_LENGTH(size, 3);
1769 size += 2 * sizeof(DWORD);
1770 if (pStgMedium->tymed != TYMED_NULL)
1771 size += sizeof(DWORD);
1773 switch (pStgMedium->tymed)
1776 TRACE("TYMED_NULL\n");
1779 TRACE("TYMED_HGLOBAL\n");
1780 if (pStgMedium->u.hGlobal)
1781 size = HGLOBAL_UserSize(pFlags, size, &pStgMedium->u.hGlobal);
1784 TRACE("TYMED_FILE\n");
1785 if (pStgMedium->u.lpszFileName)
1787 TRACE("file name is %s\n", debugstr_w(pStgMedium->u.lpszFileName));
1788 size += 3 * sizeof(DWORD) +
1789 (strlenW(pStgMedium->u.lpszFileName) + 1) * sizeof(WCHAR);
1793 TRACE("TYMED_ISTREAM\n");
1794 if (pStgMedium->u.pstm)
1797 IStream_QueryInterface(pStgMedium->u.pstm, &IID_IUnknown, (void**)&unk);
1798 size = WdtpInterfacePointer_UserSize(pFlags, LOWORD(*pFlags), size, unk, &IID_IStream);
1799 IUnknown_Release(unk);
1802 case TYMED_ISTORAGE:
1803 TRACE("TYMED_ISTORAGE\n");
1804 if (pStgMedium->u.pstg)
1807 IStorage_QueryInterface(pStgMedium->u.pstg, &IID_IUnknown, (void**)&unk);
1808 size = WdtpInterfacePointer_UserSize(pFlags, LOWORD(*pFlags), size, unk, &IID_IStorage);
1809 IUnknown_Release(unk);
1813 TRACE("TYMED_GDI\n");
1814 if (pStgMedium->u.hBitmap)
1816 FIXME("not implemented for GDI object %p\n", pStgMedium->u.hBitmap);
1820 TRACE("TYMED_MFPICT\n");
1821 if (pStgMedium->u.hMetaFilePict)
1822 size = HMETAFILEPICT_UserSize(pFlags, size, &pStgMedium->u.hMetaFilePict);
1825 TRACE("TYMED_ENHMF\n");
1826 if (pStgMedium->u.hEnhMetaFile)
1827 size = HENHMETAFILE_UserSize(pFlags, size, &pStgMedium->u.hEnhMetaFile);
1830 RaiseException(DV_E_TYMED, 0, 0, NULL);
1833 if (pStgMedium->pUnkForRelease)
1834 size = WdtpInterfacePointer_UserSize(pFlags, LOWORD(*pFlags), size, pStgMedium->pUnkForRelease, &IID_IUnknown);
1839 /******************************************************************************
1840 * STGMEDIUM_UserMarshal [OLE32.@]
1842 * Marshals a STGMEDIUM into a buffer.
1845 * pFlags [I] Flags. See notes.
1846 * pBuffer [I] Buffer to marshal the clip format into.
1847 * pCF [I] STGMEDIUM to marshal.
1850 * The end of the marshaled data in the buffer.
1853 * Even though the function is documented to take a pointer to a ULONG in
1854 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1855 * the first parameter is a ULONG.
1856 * This function is only intended to be called by the RPC runtime.
1858 unsigned char * __RPC_USER STGMEDIUM_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, STGMEDIUM *pStgMedium)
1860 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, pStgMedium);
1862 ALIGN_POINTER(pBuffer, 3);
1864 *(DWORD *)pBuffer = pStgMedium->tymed;
1865 pBuffer += sizeof(DWORD);
1866 if (pStgMedium->tymed != TYMED_NULL)
1868 *(DWORD *)pBuffer = (DWORD)(DWORD_PTR)pStgMedium->u.pstg;
1869 pBuffer += sizeof(DWORD);
1871 *(DWORD *)pBuffer = (DWORD)(DWORD_PTR)pStgMedium->pUnkForRelease;
1872 pBuffer += sizeof(DWORD);
1874 switch (pStgMedium->tymed)
1877 TRACE("TYMED_NULL\n");
1880 TRACE("TYMED_HGLOBAL\n");
1881 if (pStgMedium->u.hGlobal)
1882 pBuffer = HGLOBAL_UserMarshal(pFlags, pBuffer, &pStgMedium->u.hGlobal);
1885 TRACE("TYMED_FILE\n");
1886 if (pStgMedium->u.lpszFileName)
1889 len = strlenW(pStgMedium->u.lpszFileName);
1891 *(DWORD *)pBuffer = len + 1;
1892 pBuffer += sizeof(DWORD);
1894 *(DWORD *)pBuffer = 0;
1895 pBuffer += sizeof(DWORD);
1897 *(DWORD *)pBuffer = len + 1;
1898 pBuffer += sizeof(DWORD);
1900 TRACE("file name is %s\n", debugstr_w(pStgMedium->u.lpszFileName));
1901 memcpy(pBuffer, pStgMedium->u.lpszFileName, (len + 1) * sizeof(WCHAR));
1905 TRACE("TYMED_ISTREAM\n");
1906 if (pStgMedium->u.pstm)
1909 IStream_QueryInterface(pStgMedium->u.pstm, &IID_IUnknown, (void**)&unk);
1910 pBuffer = WdtpInterfacePointer_UserMarshal(pFlags, LOWORD(*pFlags), pBuffer, unk, &IID_IStream);
1911 IUnknown_Release(unk);
1914 case TYMED_ISTORAGE:
1915 TRACE("TYMED_ISTORAGE\n");
1916 if (pStgMedium->u.pstg)
1919 IStorage_QueryInterface(pStgMedium->u.pstg, &IID_IUnknown, (void**)&unk);
1920 pBuffer = WdtpInterfacePointer_UserMarshal(pFlags, LOWORD(*pFlags), pBuffer, unk, &IID_IStorage);
1921 IUnknown_Release(unk);
1925 TRACE("TYMED_GDI\n");
1926 if (pStgMedium->u.hBitmap)
1928 FIXME("not implemented for GDI object %p\n", pStgMedium->u.hBitmap);
1932 TRACE("TYMED_MFPICT\n");
1933 if (pStgMedium->u.hMetaFilePict)
1934 pBuffer = HMETAFILEPICT_UserMarshal(pFlags, pBuffer, &pStgMedium->u.hMetaFilePict);
1937 TRACE("TYMED_ENHMF\n");
1938 if (pStgMedium->u.hEnhMetaFile)
1939 pBuffer = HENHMETAFILE_UserMarshal(pFlags, pBuffer, &pStgMedium->u.hEnhMetaFile);
1942 RaiseException(DV_E_TYMED, 0, 0, NULL);
1945 if (pStgMedium->pUnkForRelease)
1946 pBuffer = WdtpInterfacePointer_UserMarshal(pFlags, LOWORD(*pFlags), pBuffer, pStgMedium->pUnkForRelease, &IID_IUnknown);
1951 /******************************************************************************
1952 * STGMEDIUM_UserUnmarshal [OLE32.@]
1954 * Unmarshals a STGMEDIUM from a buffer.
1957 * pFlags [I] Flags. See notes.
1958 * pBuffer [I] Buffer to marshal the clip format from.
1959 * pStgMedium [O] Address that receive the unmarshaled STGMEDIUM.
1962 * The end of the marshaled data in the buffer.
1965 * Even though the function is documented to take a pointer to an ULONG in
1966 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1967 * the first parameter is an ULONG.
1968 * This function is only intended to be called by the RPC runtime.
1970 unsigned char * __RPC_USER STGMEDIUM_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, STGMEDIUM *pStgMedium)
1975 ALIGN_POINTER(pBuffer, 3);
1977 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, pStgMedium);
1979 pStgMedium->tymed = *(DWORD *)pBuffer;
1980 pBuffer += sizeof(DWORD);
1981 if (pStgMedium->tymed != TYMED_NULL)
1983 content = *(DWORD *)pBuffer;
1984 pBuffer += sizeof(DWORD);
1986 releaseunk = *(DWORD *)pBuffer;
1987 pBuffer += sizeof(DWORD);
1989 switch (pStgMedium->tymed)
1992 TRACE("TYMED_NULL\n");
1995 TRACE("TYMED_HGLOBAL\n");
1997 pBuffer = HGLOBAL_UserUnmarshal(pFlags, pBuffer, &pStgMedium->u.hGlobal);
2000 TRACE("TYMED_FILE\n");
2005 conformance = *(DWORD *)pBuffer;
2006 pBuffer += sizeof(DWORD);
2007 if (*(DWORD *)pBuffer != 0)
2009 ERR("invalid offset %d\n", *(DWORD *)pBuffer);
2010 RpcRaiseException(RPC_S_INVALID_BOUND);
2013 pBuffer += sizeof(DWORD);
2014 variance = *(DWORD *)pBuffer;
2015 pBuffer += sizeof(DWORD);
2016 if (conformance != variance)
2018 ERR("conformance (%d) and variance (%d) should be equal\n",
2019 conformance, variance);
2020 RpcRaiseException(RPC_S_INVALID_BOUND);
2023 if (conformance > 0x7fffffff)
2025 ERR("conformance 0x%x too large\n", conformance);
2026 RpcRaiseException(RPC_S_INVALID_BOUND);
2029 pStgMedium->u.lpszFileName = CoTaskMemAlloc(conformance * sizeof(WCHAR));
2030 if (!pStgMedium->u.lpszFileName) RpcRaiseException(ERROR_OUTOFMEMORY);
2031 TRACE("unmarshalled file name is %s\n", debugstr_wn((const WCHAR *)pBuffer, variance));
2032 memcpy(pStgMedium->u.lpszFileName, pBuffer, variance * sizeof(WCHAR));
2033 pBuffer += variance * sizeof(WCHAR);
2036 pStgMedium->u.lpszFileName = NULL;
2039 TRACE("TYMED_ISTREAM\n");
2042 pBuffer = WdtpInterfacePointer_UserUnmarshal(pFlags, pBuffer, (IUnknown**)&pStgMedium->u.pstm, &IID_IStream);
2045 pStgMedium->u.pstm = NULL;
2047 case TYMED_ISTORAGE:
2048 TRACE("TYMED_ISTORAGE\n");
2051 pBuffer = WdtpInterfacePointer_UserUnmarshal(pFlags, pBuffer, (IUnknown**)&pStgMedium->u.pstg, &IID_IStorage);
2054 pStgMedium->u.pstg = NULL;
2057 TRACE("TYMED_GDI\n");
2060 FIXME("not implemented for GDI object\n");
2063 pStgMedium->u.hBitmap = NULL;
2066 TRACE("TYMED_MFPICT\n");
2068 pBuffer = HMETAFILEPICT_UserUnmarshal(pFlags, pBuffer, &pStgMedium->u.hMetaFilePict);
2070 pStgMedium->u.hMetaFilePict = NULL;
2073 TRACE("TYMED_ENHMF\n");
2075 pBuffer = HENHMETAFILE_UserUnmarshal(pFlags, pBuffer, &pStgMedium->u.hEnhMetaFile);
2077 pStgMedium->u.hEnhMetaFile = NULL;
2080 RaiseException(DV_E_TYMED, 0, 0, NULL);
2083 pStgMedium->pUnkForRelease = NULL;
2085 pBuffer = WdtpInterfacePointer_UserUnmarshal(pFlags, pBuffer, &pStgMedium->pUnkForRelease, &IID_IUnknown);
2090 /******************************************************************************
2091 * STGMEDIUM_UserFree [OLE32.@]
2093 * Frees an unmarshaled STGMEDIUM.
2096 * pFlags [I] Flags. See notes.
2097 * pStgmedium [I] STGMEDIUM to free.
2100 * The end of the marshaled data in the buffer.
2103 * Even though the function is documented to take a pointer to a ULONG in
2104 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
2105 * which the first parameter is a ULONG.
2106 * This function is only intended to be called by the RPC runtime.
2108 void __RPC_USER STGMEDIUM_UserFree(ULONG *pFlags, STGMEDIUM *pStgMedium)
2110 TRACE("(%s, %p\n", debugstr_user_flags(pFlags), pStgMedium);
2112 ReleaseStgMedium(pStgMedium);
2115 ULONG __RPC_USER ASYNC_STGMEDIUM_UserSize(ULONG *pFlags, ULONG StartingSize, ASYNC_STGMEDIUM *pStgMedium)
2118 return STGMEDIUM_UserSize(pFlags, StartingSize, pStgMedium);
2121 unsigned char * __RPC_USER ASYNC_STGMEDIUM_UserMarshal( ULONG *pFlags, unsigned char *pBuffer, ASYNC_STGMEDIUM *pStgMedium)
2124 return STGMEDIUM_UserMarshal(pFlags, pBuffer, pStgMedium);
2127 unsigned char * __RPC_USER ASYNC_STGMEDIUM_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, ASYNC_STGMEDIUM *pStgMedium)
2130 return STGMEDIUM_UserUnmarshal(pFlags, pBuffer, pStgMedium);
2133 void __RPC_USER ASYNC_STGMEDIUM_UserFree(ULONG *pFlags, ASYNC_STGMEDIUM *pStgMedium)
2136 STGMEDIUM_UserFree(pFlags, pStgMedium);
2139 ULONG __RPC_USER FLAG_STGMEDIUM_UserSize(ULONG *pFlags, ULONG StartingSize, FLAG_STGMEDIUM *pStgMedium)
2142 return StartingSize;
2145 unsigned char * __RPC_USER FLAG_STGMEDIUM_UserMarshal( ULONG *pFlags, unsigned char *pBuffer, FLAG_STGMEDIUM *pStgMedium)
2151 unsigned char * __RPC_USER FLAG_STGMEDIUM_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, FLAG_STGMEDIUM *pStgMedium)
2157 void __RPC_USER FLAG_STGMEDIUM_UserFree(ULONG *pFlags, FLAG_STGMEDIUM *pStgMedium)
2162 ULONG __RPC_USER SNB_UserSize(ULONG *pFlags, ULONG StartingSize, SNB *pSnb)
2165 return StartingSize;
2168 unsigned char * __RPC_USER SNB_UserMarshal( ULONG *pFlags, unsigned char *pBuffer, SNB *pSnb)
2174 unsigned char * __RPC_USER SNB_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, SNB *pSnb)
2180 void __RPC_USER SNB_UserFree(ULONG *pFlags, SNB *pSnb)
2185 /* call_as/local stubs for unknwn.idl */
2187 HRESULT CALLBACK IClassFactory_CreateInstance_Proxy(
2188 IClassFactory* This,
2189 IUnknown *pUnkOuter,
2193 TRACE("(%p, %s, %p)\n", pUnkOuter, debugstr_guid(riid), ppvObject);
2197 ERR("aggregation is not allowed on remote objects\n");
2198 return CLASS_E_NOAGGREGATION;
2200 return IClassFactory_RemoteCreateInstance_Proxy(This, riid,
2201 (IUnknown **) ppvObject);
2204 HRESULT __RPC_STUB IClassFactory_CreateInstance_Stub(
2205 IClassFactory* This,
2207 IUnknown **ppvObject)
2209 TRACE("(%s, %p)\n", debugstr_guid(riid), ppvObject);
2210 return IClassFactory_CreateInstance(This, NULL, riid, (void **) ppvObject);
2213 HRESULT CALLBACK IClassFactory_LockServer_Proxy(
2214 IClassFactory* This,
2221 HRESULT __RPC_STUB IClassFactory_LockServer_Stub(
2222 IClassFactory* This,
2229 /* call_as/local stubs for objidl.idl */
2231 HRESULT CALLBACK IEnumUnknown_Next_Proxy(
2235 ULONG *pceltFetched)
2238 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2239 if (!pceltFetched) pceltFetched = &fetched;
2240 return IEnumUnknown_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2243 HRESULT __RPC_STUB IEnumUnknown_Next_Stub(
2247 ULONG *pceltFetched)
2250 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2252 hr = IEnumUnknown_Next(This, celt, rgelt, pceltFetched);
2253 if (hr == S_OK) *pceltFetched = celt;
2257 HRESULT CALLBACK IBindCtx_SetBindOptions_Proxy(
2259 BIND_OPTS *pbindopts)
2265 HRESULT __RPC_STUB IBindCtx_SetBindOptions_Stub(
2267 BIND_OPTS2 *pbindopts)
2273 HRESULT CALLBACK IBindCtx_GetBindOptions_Proxy(
2275 BIND_OPTS *pbindopts)
2281 HRESULT __RPC_STUB IBindCtx_GetBindOptions_Stub(
2283 BIND_OPTS2 *pbindopts)
2289 HRESULT CALLBACK IEnumMoniker_Next_Proxy(
2293 ULONG *pceltFetched)
2296 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2297 if (!pceltFetched) pceltFetched = &fetched;
2298 return IEnumMoniker_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2301 HRESULT __RPC_STUB IEnumMoniker_Next_Stub(
2305 ULONG *pceltFetched)
2308 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2310 hr = IEnumMoniker_Next(This, celt, rgelt, pceltFetched);
2311 if (hr == S_OK) *pceltFetched = celt;
2315 BOOL CALLBACK IRunnableObject_IsRunning_Proxy(
2316 IRunnableObject* This)
2320 memset(&rv, 0, sizeof rv);
2324 HRESULT __RPC_STUB IRunnableObject_IsRunning_Stub(
2325 IRunnableObject* This)
2331 HRESULT CALLBACK IMoniker_BindToObject_Proxy(
2334 IMoniker *pmkToLeft,
2342 HRESULT __RPC_STUB IMoniker_BindToObject_Stub(
2345 IMoniker *pmkToLeft,
2347 IUnknown **ppvResult)
2353 HRESULT CALLBACK IMoniker_BindToStorage_Proxy(
2356 IMoniker *pmkToLeft,
2364 HRESULT __RPC_STUB IMoniker_BindToStorage_Stub(
2367 IMoniker *pmkToLeft,
2375 HRESULT CALLBACK IEnumString_Next_Proxy(
2379 ULONG *pceltFetched)
2382 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2383 if (!pceltFetched) pceltFetched = &fetched;
2384 return IEnumString_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2387 HRESULT __RPC_STUB IEnumString_Next_Stub(
2391 ULONG *pceltFetched)
2394 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2396 hr = IEnumString_Next(This, celt, rgelt, pceltFetched);
2397 if (hr == S_OK) *pceltFetched = celt;
2401 HRESULT CALLBACK ISequentialStream_Read_Proxy(
2402 ISequentialStream* This,
2410 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbRead);
2412 hr = ISequentialStream_RemoteRead_Proxy(This, pv, cb, &read);
2413 if(pcbRead) *pcbRead = read;
2418 HRESULT __RPC_STUB ISequentialStream_Read_Stub(
2419 ISequentialStream* This,
2424 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbRead);
2425 return ISequentialStream_Read(This, pv, cb, pcbRead);
2428 HRESULT CALLBACK ISequentialStream_Write_Proxy(
2429 ISequentialStream* This,
2437 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbWritten);
2439 hr = ISequentialStream_RemoteWrite_Proxy(This, pv, cb, &written);
2440 if(pcbWritten) *pcbWritten = written;
2445 HRESULT __RPC_STUB ISequentialStream_Write_Stub(
2446 ISequentialStream* This,
2451 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbWritten);
2452 return ISequentialStream_Write(This, pv, cb, pcbWritten);
2455 HRESULT CALLBACK IStream_Seek_Proxy(
2457 LARGE_INTEGER dlibMove,
2459 ULARGE_INTEGER *plibNewPosition)
2461 ULARGE_INTEGER newpos;
2464 TRACE("(%p)->(%s, %d, %p)\n", This, wine_dbgstr_longlong(dlibMove.QuadPart), dwOrigin, plibNewPosition);
2466 hr = IStream_RemoteSeek_Proxy(This, dlibMove, dwOrigin, &newpos);
2467 if(plibNewPosition) *plibNewPosition = newpos;
2472 HRESULT __RPC_STUB IStream_Seek_Stub(
2474 LARGE_INTEGER dlibMove,
2476 ULARGE_INTEGER *plibNewPosition)
2478 TRACE("(%p)->(%s, %d, %p)\n", This, wine_dbgstr_longlong(dlibMove.QuadPart), dwOrigin, plibNewPosition);
2479 return IStream_Seek(This, dlibMove, dwOrigin, plibNewPosition);
2482 HRESULT CALLBACK IStream_CopyTo_Proxy(
2486 ULARGE_INTEGER *pcbRead,
2487 ULARGE_INTEGER *pcbWritten)
2489 ULARGE_INTEGER read, written;
2492 TRACE("(%p)->(%p, %s, %p, %p)\n", This, pstm, wine_dbgstr_longlong(cb.QuadPart), pcbRead, pcbWritten);
2494 hr = IStream_RemoteCopyTo_Proxy(This, pstm, cb, &read, &written);
2495 if(pcbRead) *pcbRead = read;
2496 if(pcbWritten) *pcbWritten = written;
2501 HRESULT __RPC_STUB IStream_CopyTo_Stub(
2505 ULARGE_INTEGER *pcbRead,
2506 ULARGE_INTEGER *pcbWritten)
2508 TRACE("(%p)->(%p, %s, %p, %p)\n", This, pstm, wine_dbgstr_longlong(cb.QuadPart), pcbRead, pcbWritten);
2510 return IStream_CopyTo(This, pstm, cb, pcbRead, pcbWritten);
2513 HRESULT CALLBACK IEnumSTATSTG_Next_Proxy(
2517 ULONG *pceltFetched)
2520 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2521 if (!pceltFetched) pceltFetched = &fetched;
2522 return IEnumSTATSTG_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2525 HRESULT __RPC_STUB IEnumSTATSTG_Next_Stub(
2529 ULONG *pceltFetched)
2532 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2534 hr = IEnumSTATSTG_Next(This, celt, rgelt, pceltFetched);
2535 if (hr == S_OK) *pceltFetched = celt;
2539 HRESULT CALLBACK IStorage_OpenStream_Proxy(
2547 TRACE("(%p)->(%s, %p, %08x, %d %p)\n", This, debugstr_w(pwcsName), reserved1, grfMode, reserved2, ppstm);
2548 if(reserved1) WARN("reserved1 %p\n", reserved1);
2550 return IStorage_RemoteOpenStream_Proxy(This, pwcsName, 0, NULL, grfMode, reserved2, ppstm);
2553 HRESULT __RPC_STUB IStorage_OpenStream_Stub(
2562 TRACE("(%p)->(%s, %d, %p, %08x, %d %p)\n", This, debugstr_w(pwcsName), cbReserved1, reserved1, grfMode, reserved2, ppstm);
2563 if(cbReserved1 || reserved1) WARN("cbReserved1 %d reserved1 %p\n", cbReserved1, reserved1);
2565 return IStorage_OpenStream(This, pwcsName, NULL, grfMode, reserved2, ppstm);
2568 HRESULT CALLBACK IStorage_EnumElements_Proxy(
2573 IEnumSTATSTG **ppenum)
2575 TRACE("(%p)->(%d, %p, %d, %p)\n", This, reserved1, reserved2, reserved3, ppenum);
2576 if(reserved2) WARN("reserved2 %p\n", reserved2);
2578 return IStorage_RemoteEnumElements_Proxy(This, reserved1, 0, NULL, reserved3, ppenum);
2581 HRESULT __RPC_STUB IStorage_EnumElements_Stub(
2587 IEnumSTATSTG **ppenum)
2589 TRACE("(%p)->(%d, %d, %p, %d, %p)\n", This, reserved1, cbReserved2, reserved2, reserved3, ppenum);
2590 if(cbReserved2 || reserved2) WARN("cbReserved2 %d reserved2 %p\n", cbReserved2, reserved2);
2592 return IStorage_EnumElements(This, reserved1, NULL, reserved3, ppenum);
2595 HRESULT CALLBACK ILockBytes_ReadAt_Proxy(
2597 ULARGE_INTEGER ulOffset,
2605 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbRead);
2607 hr = ILockBytes_RemoteReadAt_Proxy(This, ulOffset, pv, cb, &read);
2608 if(pcbRead) *pcbRead = read;
2613 HRESULT __RPC_STUB ILockBytes_ReadAt_Stub(
2615 ULARGE_INTEGER ulOffset,
2620 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbRead);
2621 return ILockBytes_ReadAt(This, ulOffset, pv, cb, pcbRead);
2624 HRESULT CALLBACK ILockBytes_WriteAt_Proxy(
2626 ULARGE_INTEGER ulOffset,
2634 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbWritten);
2636 hr = ILockBytes_RemoteWriteAt_Proxy(This, ulOffset, pv, cb, &written);
2637 if(pcbWritten) *pcbWritten = written;
2642 HRESULT __RPC_STUB ILockBytes_WriteAt_Stub(
2644 ULARGE_INTEGER ulOffset,
2649 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbWritten);
2650 return ILockBytes_WriteAt(This, ulOffset, pv, cb, pcbWritten);
2653 HRESULT CALLBACK IFillLockBytes_FillAppend_Proxy(
2654 IFillLockBytes* This,
2662 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbWritten);
2664 hr = IFillLockBytes_RemoteFillAppend_Proxy(This, pv, cb, &written);
2665 if(pcbWritten) *pcbWritten = written;
2670 HRESULT __RPC_STUB IFillLockBytes_FillAppend_Stub(
2671 IFillLockBytes* This,
2676 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbWritten);
2677 return IFillLockBytes_FillAppend(This, pv, cb, pcbWritten);
2680 HRESULT CALLBACK IFillLockBytes_FillAt_Proxy(
2681 IFillLockBytes* This,
2682 ULARGE_INTEGER ulOffset,
2690 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbWritten);
2692 hr = IFillLockBytes_RemoteFillAt_Proxy(This, ulOffset, pv, cb, &written);
2693 if(pcbWritten) *pcbWritten = written;
2698 HRESULT __RPC_STUB IFillLockBytes_FillAt_Stub(
2699 IFillLockBytes* This,
2700 ULARGE_INTEGER ulOffset,
2705 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbWritten);
2706 return IFillLockBytes_FillAt(This, ulOffset, pv, cb, pcbWritten);
2709 HRESULT CALLBACK IEnumFORMATETC_Next_Proxy(
2710 IEnumFORMATETC* This,
2713 ULONG *pceltFetched)
2716 if (!pceltFetched) pceltFetched = &fetched;
2717 return IEnumFORMATETC_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2720 HRESULT __RPC_STUB IEnumFORMATETC_Next_Stub(
2721 IEnumFORMATETC* This,
2724 ULONG *pceltFetched)
2728 hr = IEnumFORMATETC_Next(This, celt, rgelt, pceltFetched);
2729 if (hr == S_OK) *pceltFetched = celt;
2733 HRESULT CALLBACK IEnumSTATDATA_Next_Proxy(
2734 IEnumSTATDATA* This,
2737 ULONG *pceltFetched)
2740 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2741 if (!pceltFetched) pceltFetched = &fetched;
2742 return IEnumSTATDATA_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2745 HRESULT __RPC_STUB IEnumSTATDATA_Next_Stub(
2746 IEnumSTATDATA* This,
2749 ULONG *pceltFetched)
2752 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2754 hr = IEnumSTATDATA_Next(This, celt, rgelt, pceltFetched);
2755 if (hr == S_OK) *pceltFetched = celt;
2759 void CALLBACK IAdviseSink_OnDataChange_Proxy(
2761 FORMATETC *pFormatetc,
2764 TRACE("(%p)->(%p, %p)\n", This, pFormatetc, pStgmed);
2765 IAdviseSink_RemoteOnDataChange_Proxy(This, pFormatetc, pStgmed);
2768 HRESULT __RPC_STUB IAdviseSink_OnDataChange_Stub(
2770 FORMATETC *pFormatetc,
2771 ASYNC_STGMEDIUM *pStgmed)
2773 TRACE("(%p)->(%p, %p)\n", This, pFormatetc, pStgmed);
2774 IAdviseSink_OnDataChange(This, pFormatetc, pStgmed);
2778 void CALLBACK IAdviseSink_OnViewChange_Proxy(
2783 TRACE("(%p)->(%d, %d)\n", This, dwAspect, lindex);
2784 IAdviseSink_RemoteOnViewChange_Proxy(This, dwAspect, lindex);
2787 HRESULT __RPC_STUB IAdviseSink_OnViewChange_Stub(
2792 TRACE("(%p)->(%d, %d)\n", This, dwAspect, lindex);
2793 IAdviseSink_OnViewChange(This, dwAspect, lindex);
2797 void CALLBACK IAdviseSink_OnRename_Proxy(
2801 TRACE("(%p)->(%p)\n", This, pmk);
2802 IAdviseSink_RemoteOnRename_Proxy(This, pmk);
2805 HRESULT __RPC_STUB IAdviseSink_OnRename_Stub(
2809 TRACE("(%p)->(%p)\n", This, pmk);
2810 IAdviseSink_OnRename(This, pmk);
2814 void CALLBACK IAdviseSink_OnSave_Proxy(
2817 TRACE("(%p)\n", This);
2818 IAdviseSink_RemoteOnSave_Proxy(This);
2821 HRESULT __RPC_STUB IAdviseSink_OnSave_Stub(
2824 TRACE("(%p)\n", This);
2825 IAdviseSink_OnSave(This);
2829 void CALLBACK IAdviseSink_OnClose_Proxy(
2832 TRACE("(%p)\n", This);
2833 IAdviseSink_RemoteOnClose_Proxy(This);
2836 HRESULT __RPC_STUB IAdviseSink_OnClose_Stub(
2839 TRACE("(%p)\n", This);
2840 IAdviseSink_OnClose(This);
2844 void CALLBACK IAdviseSink2_OnLinkSrcChange_Proxy(
2848 TRACE("(%p)->(%p)\n", This, pmk);
2849 IAdviseSink2_RemoteOnLinkSrcChange_Proxy(This, pmk);
2852 HRESULT __RPC_STUB IAdviseSink2_OnLinkSrcChange_Stub(
2856 TRACE("(%p)->(%p)\n", This, pmk);
2857 IAdviseSink2_OnLinkSrcChange(This, pmk);
2861 HRESULT CALLBACK IDataObject_GetData_Proxy(
2863 FORMATETC *pformatetcIn,
2866 TRACE("(%p)->(%p, %p)\n", This, pformatetcIn, pmedium);
2867 return IDataObject_RemoteGetData_Proxy(This, pformatetcIn, pmedium);
2870 HRESULT __RPC_STUB IDataObject_GetData_Stub(
2872 FORMATETC *pformatetcIn,
2873 STGMEDIUM *pRemoteMedium)
2875 TRACE("(%p)->(%p, %p)\n", This, pformatetcIn, pRemoteMedium);
2876 return IDataObject_GetData(This, pformatetcIn, pRemoteMedium);
2879 HRESULT CALLBACK IDataObject_GetDataHere_Proxy(
2881 FORMATETC *pformatetc,
2884 TRACE("(%p)->(%p, %p)\n", This, pformatetc, pmedium);
2885 return IDataObject_RemoteGetDataHere_Proxy(This, pformatetc, pmedium);
2888 HRESULT __RPC_STUB IDataObject_GetDataHere_Stub(
2890 FORMATETC *pformatetc,
2891 STGMEDIUM *pRemoteMedium)
2893 TRACE("(%p)->(%p, %p)\n", This, pformatetc, pRemoteMedium);
2894 return IDataObject_GetDataHere(This, pformatetc, pRemoteMedium);
2897 HRESULT CALLBACK IDataObject_SetData_Proxy(
2899 FORMATETC *pformatetc,
2907 HRESULT __RPC_STUB IDataObject_SetData_Stub(
2909 FORMATETC *pformatetc,
2910 FLAG_STGMEDIUM *pmedium,
2917 /* call_as/local stubs for oleidl.idl */
2919 HRESULT CALLBACK IOleInPlaceActiveObject_TranslateAccelerator_Proxy(
2920 IOleInPlaceActiveObject* This,
2927 HRESULT __RPC_STUB IOleInPlaceActiveObject_TranslateAccelerator_Stub(
2928 IOleInPlaceActiveObject* This)
2934 HRESULT CALLBACK IOleInPlaceActiveObject_ResizeBorder_Proxy(
2935 IOleInPlaceActiveObject* This,
2937 IOleInPlaceUIWindow *pUIWindow,
2944 HRESULT __RPC_STUB IOleInPlaceActiveObject_ResizeBorder_Stub(
2945 IOleInPlaceActiveObject* This,
2948 IOleInPlaceUIWindow *pUIWindow,
2955 HRESULT CALLBACK IOleCache2_UpdateCache_Proxy(
2957 LPDATAOBJECT pDataObject,
2965 HRESULT __RPC_STUB IOleCache2_UpdateCache_Stub(
2967 LPDATAOBJECT pDataObject,
2975 HRESULT CALLBACK IEnumOLEVERB_Next_Proxy(
2979 ULONG *pceltFetched)
2982 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2983 if (!pceltFetched) pceltFetched = &fetched;
2984 return IEnumOLEVERB_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2987 HRESULT __RPC_STUB IEnumOLEVERB_Next_Stub(
2991 ULONG *pceltFetched)
2994 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2996 hr = IEnumOLEVERB_Next(This, celt, rgelt, pceltFetched);
2997 if (hr == S_OK) *pceltFetched = celt;
3001 HRESULT CALLBACK IViewObject_Draw_Proxy(
3006 DVTARGETDEVICE *ptd,
3009 LPCRECTL lprcBounds,
3010 LPCRECTL lprcWBounds,
3011 BOOL (STDMETHODCALLTYPE *pfnContinue)(ULONG_PTR dwContinue),
3012 ULONG_PTR dwContinue)
3018 HRESULT __RPC_STUB IViewObject_Draw_Stub(
3023 DVTARGETDEVICE *ptd,
3024 ULONG_PTR hdcTargetDev,
3026 LPCRECTL lprcBounds,
3027 LPCRECTL lprcWBounds,
3028 IContinue *pContinue)
3034 HRESULT CALLBACK IViewObject_GetColorSet_Proxy(
3039 DVTARGETDEVICE *ptd,
3041 LOGPALETTE **ppColorSet)
3047 HRESULT __RPC_STUB IViewObject_GetColorSet_Stub(
3052 DVTARGETDEVICE *ptd,
3053 ULONG_PTR hicTargetDev,
3054 LOGPALETTE **ppColorSet)
3060 HRESULT CALLBACK IViewObject_Freeze_Proxy(
3071 HRESULT __RPC_STUB IViewObject_Freeze_Stub(
3082 HRESULT CALLBACK IViewObject_GetAdvise_Proxy(
3086 IAdviseSink **ppAdvSink)
3092 HRESULT __RPC_STUB IViewObject_GetAdvise_Stub(
3096 IAdviseSink **ppAdvSink)