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
36 #include "wine/debug.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(ole
);
40 #define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align))
41 #define ALIGNED_POINTER(_Ptr, _Align) ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align))
42 #define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align)
43 #define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align)
45 #define USER_MARSHAL_PTR_PREFIX \
46 ( (DWORD)'U' | ( (DWORD)'s' << 8 ) | \
47 ( (DWORD)'e' << 16 ) | ( (DWORD)'r' << 24 ) )
49 ULONG __RPC_USER
WdtpInterfacePointer_UserSize(ULONG
*pFlags
, ULONG RealFlags
, ULONG StartingSize
, IUnknown
*punk
, REFIID riid
);
50 unsigned char * WINAPI
WdtpInterfacePointer_UserMarshal(ULONG
*pFlags
, ULONG RealFlags
, unsigned char *pBuffer
,
51 IUnknown
*punk
, REFIID riid
);
52 unsigned char * WINAPI
WdtpInterfacePointer_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, IUnknown
**ppunk
, REFIID riid
);
54 static const char* debugstr_user_flags(ULONG
*pFlags
)
58 switch (LOWORD(*pFlags
))
61 loword
="MSHCTX_LOCAL";
63 case MSHCTX_NOSHAREDMEM
:
64 loword
="MSHCTX_NOSHAREDMEM";
66 case MSHCTX_DIFFERENTMACHINE
:
67 loword
="MSHCTX_DIFFERENTMACHINE";
70 loword
="MSHCTX_INPROC";
73 sprintf(buf
, "%d", LOWORD(*pFlags
));
77 if (HIWORD(*pFlags
) == NDR_LOCAL_DATA_REPRESENTATION
)
78 return wine_dbg_sprintf("MAKELONG(%s, NDR_LOCAL_DATA_REPRESENTATION)", loword
);
80 return wine_dbg_sprintf("MAKELONG(%s, 0x%04x)", loword
, HIWORD(*pFlags
));
83 /******************************************************************************
84 * HMETAFILE_UserSize [OLE32.@]
86 * Calculates the buffer size required to marshal a metafile.
89 * pFlags [I] Flags. See notes.
90 * StartingSize [I] Starting size of the buffer. This value is added on to
91 * the buffer size required for the clip format.
92 * phmf [I] Metafile to size.
95 * The buffer size required to marshal a metafile plus the starting size.
98 * Even though the function is documented to take a pointer to a ULONG in
99 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
100 * the first parameter is a ULONG.
101 * This function is only intended to be called by the RPC runtime.
103 ULONG __RPC_USER
HMETAFILE_UserSize(ULONG
*pFlags
, ULONG StartingSize
, HMETAFILE
*phmf
)
105 ULONG size
= StartingSize
;
107 TRACE("%s, %lu, &%p.\n", debugstr_user_flags(pFlags
), StartingSize
, *phmf
);
109 ALIGN_LENGTH(size
, 3);
111 size
+= sizeof(ULONG
);
112 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
113 size
+= sizeof(ULONG_PTR
);
116 size
+= sizeof(ULONG
);
122 size
+= 2 * sizeof(ULONG
);
123 mfsize
= GetMetaFileBitsEx(*phmf
, 0, NULL
);
131 /******************************************************************************
132 * HMETAFILE_UserMarshal [OLE32.@]
134 * Marshals a metafile into a buffer.
137 * pFlags [I] Flags. See notes.
138 * pBuffer [I] Buffer to marshal the clip format into.
139 * phEmf [I] Metafile to marshal.
142 * The end of the marshaled data in the buffer.
145 * Even though the function is documented to take a pointer to a ULONG in
146 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
147 * the first parameter is a ULONG.
148 * This function is only intended to be called by the RPC runtime.
150 unsigned char * __RPC_USER
HMETAFILE_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HMETAFILE
*phmf
)
152 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags
), pBuffer
, *phmf
);
154 ALIGN_POINTER(pBuffer
, 3);
156 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
158 if (sizeof(*phmf
) == 8)
159 *(ULONG
*)pBuffer
= WDT_INPROC64_CALL
;
161 *(ULONG
*)pBuffer
= WDT_INPROC_CALL
;
162 pBuffer
+= sizeof(ULONG
);
163 *(HMETAFILE
*)pBuffer
= *phmf
;
164 pBuffer
+= sizeof(HMETAFILE
);
168 *(ULONG
*)pBuffer
= WDT_REMOTE_CALL
;
169 pBuffer
+= sizeof(ULONG
);
170 *(ULONG
*)pBuffer
= (ULONG
)(ULONG_PTR
)*phmf
;
171 pBuffer
+= sizeof(ULONG
);
175 UINT mfsize
= GetMetaFileBitsEx(*phmf
, 0, NULL
);
177 *(ULONG
*)pBuffer
= mfsize
;
178 pBuffer
+= sizeof(ULONG
);
179 *(ULONG
*)pBuffer
= mfsize
;
180 pBuffer
+= sizeof(ULONG
);
181 GetMetaFileBitsEx(*phmf
, mfsize
, pBuffer
);
189 /******************************************************************************
190 * HMETAFILE_UserUnmarshal [OLE32.@]
192 * Unmarshals a metafile from a buffer.
195 * pFlags [I] Flags. See notes.
196 * pBuffer [I] Buffer to marshal the clip format from.
197 * phmf [O] Address that receive the unmarshaled metafile.
200 * The end of the marshaled data in the buffer.
203 * Even though the function is documented to take a pointer to an ULONG in
204 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
205 * the first parameter is an ULONG.
206 * This function is only intended to be called by the RPC runtime.
208 unsigned char * __RPC_USER
HMETAFILE_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HMETAFILE
*phmf
)
212 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags
), pBuffer
, phmf
);
214 ALIGN_POINTER(pBuffer
, 3);
216 fContext
= *(ULONG
*)pBuffer
;
217 pBuffer
+= sizeof(ULONG
);
219 if (((fContext
== WDT_INPROC_CALL
) && (sizeof(*phmf
) < 8)) ||
220 ((fContext
== WDT_INPROC64_CALL
) && (sizeof(*phmf
) == 8)))
222 *phmf
= *(HMETAFILE
*)pBuffer
;
223 pBuffer
+= sizeof(*phmf
);
225 else if (fContext
== WDT_REMOTE_CALL
)
229 handle
= *(ULONG
*)pBuffer
;
230 pBuffer
+= sizeof(ULONG
);
235 size
= *(ULONG
*)pBuffer
;
236 pBuffer
+= sizeof(ULONG
);
237 if (size
!= *(ULONG
*)pBuffer
)
239 RaiseException(RPC_X_BAD_STUB_DATA
, 0, 0, NULL
);
242 pBuffer
+= sizeof(ULONG
);
243 *phmf
= SetMetaFileBitsEx(size
, pBuffer
);
250 RaiseException(RPC_S_INVALID_TAG
, 0, 0, NULL
);
255 /******************************************************************************
256 * HMETAFILE_UserFree [OLE32.@]
258 * Frees an unmarshaled metafile.
261 * pFlags [I] Flags. See notes.
262 * phmf [I] Metafile to free.
265 * The end of the marshaled data in the buffer.
268 * Even though the function is documented to take a pointer to a ULONG in
269 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
270 * which the first parameter is a ULONG.
271 * This function is only intended to be called by the RPC runtime.
273 void __RPC_USER
HMETAFILE_UserFree(ULONG
*pFlags
, HMETAFILE
*phmf
)
275 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags
), *phmf
);
277 if (LOWORD(*pFlags
) != MSHCTX_INPROC
)
278 DeleteMetaFile(*phmf
);
281 /******************************************************************************
282 * HENHMETAFILE_UserSize [OLE32.@]
284 * Calculates the buffer size required to marshal an enhanced metafile.
287 * pFlags [I] Flags. See notes.
288 * StartingSize [I] Starting size of the buffer. This value is added on to
289 * the buffer size required for the clip format.
290 * phEmf [I] Enhanced metafile to size.
293 * The buffer size required to marshal an enhanced metafile plus the starting size.
296 * Even though the function is documented to take a pointer to a ULONG in
297 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
298 * the first parameter is a ULONG.
299 * This function is only intended to be called by the RPC runtime.
301 ULONG __RPC_USER
HENHMETAFILE_UserSize(ULONG
*pFlags
, ULONG size
, HENHMETAFILE
*phEmf
)
303 TRACE("%s, %lu, %p.\n", debugstr_user_flags(pFlags
), size
, *phEmf
);
305 ALIGN_LENGTH(size
, 3);
307 size
+= sizeof(ULONG
);
308 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
309 size
+= sizeof(ULONG_PTR
);
312 size
+= sizeof(ULONG
);
318 size
+= 2 * sizeof(ULONG
);
319 emfsize
= GetEnhMetaFileBits(*phEmf
, 0, NULL
);
327 /******************************************************************************
328 * HENHMETAFILE_UserMarshal [OLE32.@]
330 * Marshals an enhance metafile into a buffer.
333 * pFlags [I] Flags. See notes.
334 * pBuffer [I] Buffer to marshal the clip format into.
335 * phEmf [I] Enhanced metafile to marshal.
338 * The end of the marshaled data in the buffer.
341 * Even though the function is documented to take a pointer to a ULONG in
342 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
343 * the first parameter is a ULONG.
344 * This function is only intended to be called by the RPC runtime.
346 unsigned char * __RPC_USER
HENHMETAFILE_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HENHMETAFILE
*phEmf
)
348 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags
), pBuffer
, *phEmf
);
350 ALIGN_POINTER(pBuffer
, 3);
352 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
354 if (sizeof(*phEmf
) == 8)
355 *(ULONG
*)pBuffer
= WDT_INPROC64_CALL
;
357 *(ULONG
*)pBuffer
= WDT_INPROC_CALL
;
358 pBuffer
+= sizeof(ULONG
);
359 *(HENHMETAFILE
*)pBuffer
= *phEmf
;
360 pBuffer
+= sizeof(HENHMETAFILE
);
364 *(ULONG
*)pBuffer
= WDT_REMOTE_CALL
;
365 pBuffer
+= sizeof(ULONG
);
366 *(ULONG
*)pBuffer
= (ULONG
)(ULONG_PTR
)*phEmf
;
367 pBuffer
+= sizeof(ULONG
);
371 UINT emfsize
= GetEnhMetaFileBits(*phEmf
, 0, NULL
);
373 *(ULONG
*)pBuffer
= emfsize
;
374 pBuffer
+= sizeof(ULONG
);
375 *(ULONG
*)pBuffer
= emfsize
;
376 pBuffer
+= sizeof(ULONG
);
377 GetEnhMetaFileBits(*phEmf
, emfsize
, pBuffer
);
385 /******************************************************************************
386 * HENHMETAFILE_UserUnmarshal [OLE32.@]
388 * Unmarshals an enhanced metafile from a buffer.
391 * pFlags [I] Flags. See notes.
392 * pBuffer [I] Buffer to marshal the clip format from.
393 * phEmf [O] Address that receive the unmarshaled enhanced metafile.
396 * The end of the marshaled data in the buffer.
399 * Even though the function is documented to take a pointer to an ULONG in
400 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
401 * the first parameter is an ULONG.
402 * This function is only intended to be called by the RPC runtime.
404 unsigned char * __RPC_USER
HENHMETAFILE_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HENHMETAFILE
*phEmf
)
408 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags
), pBuffer
, phEmf
);
410 ALIGN_POINTER(pBuffer
, 3);
412 fContext
= *(ULONG
*)pBuffer
;
413 pBuffer
+= sizeof(ULONG
);
415 if (((fContext
== WDT_INPROC_CALL
) && (sizeof(*phEmf
) < 8)) ||
416 ((fContext
== WDT_INPROC64_CALL
) && (sizeof(*phEmf
) == 8)))
418 *phEmf
= *(HENHMETAFILE
*)pBuffer
;
419 pBuffer
+= sizeof(*phEmf
);
421 else if (fContext
== WDT_REMOTE_CALL
)
425 handle
= *(ULONG
*)pBuffer
;
426 pBuffer
+= sizeof(ULONG
);
431 size
= *(ULONG
*)pBuffer
;
432 pBuffer
+= sizeof(ULONG
);
433 if (size
!= *(ULONG
*)pBuffer
)
435 RaiseException(RPC_X_BAD_STUB_DATA
, 0, 0, NULL
);
438 pBuffer
+= sizeof(ULONG
);
439 *phEmf
= SetEnhMetaFileBits(size
, pBuffer
);
446 RaiseException(RPC_S_INVALID_TAG
, 0, 0, NULL
);
451 /******************************************************************************
452 * HENHMETAFILE_UserFree [OLE32.@]
454 * Frees an unmarshaled enhanced metafile.
457 * pFlags [I] Flags. See notes.
458 * phEmf [I] Enhanced metafile to free.
461 * The end of the marshaled data in the buffer.
464 * Even though the function is documented to take a pointer to a ULONG in
465 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
466 * which the first parameter is a ULONG.
467 * This function is only intended to be called by the RPC runtime.
469 void __RPC_USER
HENHMETAFILE_UserFree(ULONG
*pFlags
, HENHMETAFILE
*phEmf
)
471 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags
), *phEmf
);
473 if (LOWORD(*pFlags
) != MSHCTX_INPROC
)
474 DeleteEnhMetaFile(*phEmf
);
477 /******************************************************************************
478 * HMETAFILEPICT_UserSize [OLE32.@]
480 * Calculates the buffer size required to marshal an metafile pict.
483 * pFlags [I] Flags. See notes.
484 * StartingSize [I] Starting size of the buffer. This value is added on to
485 * the buffer size required for the clip format.
486 * phMfp [I] Metafile pict to size.
489 * The buffer size required to marshal a metafile pict plus the starting size.
492 * Even though the function is documented to take a pointer to a ULONG in
493 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
494 * the first parameter is a ULONG.
495 * This function is only intended to be called by the RPC runtime.
497 ULONG __RPC_USER
HMETAFILEPICT_UserSize(ULONG
*pFlags
, ULONG size
, HMETAFILEPICT
*phMfp
)
499 TRACE("%s, %lu, &%p.\n", debugstr_user_flags(pFlags
), size
, *phMfp
);
501 ALIGN_LENGTH(size
, 3);
503 size
+= sizeof(ULONG
);
505 if(LOWORD(*pFlags
) == MSHCTX_INPROC
)
506 size
+= sizeof(HMETAFILEPICT
);
509 size
+= sizeof(ULONG
);
513 METAFILEPICT
*mfpict
= GlobalLock(*phMfp
);
515 /* FIXME: raise an exception if mfpict is NULL? */
516 size
+= 3 * sizeof(ULONG
);
517 size
+= sizeof(ULONG
);
519 size
= HMETAFILE_UserSize(pFlags
, size
, &mfpict
->hMF
);
521 GlobalUnlock(*phMfp
);
528 /******************************************************************************
529 * HMETAFILEPICT_UserMarshal [OLE32.@]
531 * Marshals a metafile pict into a buffer.
534 * pFlags [I] Flags. See notes.
535 * pBuffer [I] Buffer to marshal the clip format into.
536 * phMfp [I] Metafile pict to marshal.
539 * The end of the marshaled data in the buffer.
542 * Even though the function is documented to take a pointer to a ULONG in
543 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
544 * the first parameter is a ULONG.
545 * This function is only intended to be called by the RPC runtime.
547 unsigned char * __RPC_USER
HMETAFILEPICT_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HMETAFILEPICT
*phMfp
)
549 TRACE("(%s, %p, &%p)\n", debugstr_user_flags(pFlags
), pBuffer
, *phMfp
);
551 ALIGN_POINTER(pBuffer
, 3);
553 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
555 if (sizeof(HMETAFILEPICT
) == 8)
556 *(ULONG
*)pBuffer
= WDT_INPROC64_CALL
;
558 *(ULONG
*)pBuffer
= WDT_INPROC_CALL
;
559 pBuffer
+= sizeof(ULONG
);
560 *(HMETAFILEPICT
*)pBuffer
= *phMfp
;
561 pBuffer
+= sizeof(HMETAFILEPICT
);
565 *(ULONG
*)pBuffer
= WDT_REMOTE_CALL
;
566 pBuffer
+= sizeof(ULONG
);
567 *(ULONG
*)pBuffer
= (ULONG
)(ULONG_PTR
)*phMfp
;
568 pBuffer
+= sizeof(ULONG
);
572 METAFILEPICT
*mfpict
= GlobalLock(*phMfp
);
573 remoteMETAFILEPICT
* remmfpict
= (remoteMETAFILEPICT
*)pBuffer
;
575 /* FIXME: raise an exception if mfpict is NULL? */
576 remmfpict
->mm
= mfpict
->mm
;
577 remmfpict
->xExt
= mfpict
->xExt
;
578 remmfpict
->yExt
= mfpict
->yExt
;
579 pBuffer
+= 3 * sizeof(ULONG
);
580 *(ULONG
*)pBuffer
= USER_MARSHAL_PTR_PREFIX
;
581 pBuffer
+= sizeof(ULONG
);
583 pBuffer
= HMETAFILE_UserMarshal(pFlags
, pBuffer
, &mfpict
->hMF
);
585 GlobalUnlock(*phMfp
);
591 /******************************************************************************
592 * HMETAFILEPICT_UserUnmarshal [OLE32.@]
594 * Unmarshals an metafile pict from a buffer.
597 * pFlags [I] Flags. See notes.
598 * pBuffer [I] Buffer to marshal the clip format from.
599 * phMfp [O] Address that receive the unmarshaled metafile pict.
602 * The end of the marshaled data in the buffer.
605 * Even though the function is documented to take a pointer to an ULONG in
606 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
607 * the first parameter is an ULONG.
608 * This function is only intended to be called by the RPC runtime.
610 unsigned char * __RPC_USER
HMETAFILEPICT_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HMETAFILEPICT
*phMfp
)
614 TRACE("(%s, %p, %p)\n", debugstr_user_flags(pFlags
), pBuffer
, phMfp
);
616 ALIGN_POINTER(pBuffer
, 3);
618 fContext
= *(ULONG
*)pBuffer
;
619 pBuffer
+= sizeof(ULONG
);
621 if ((fContext
== WDT_INPROC_CALL
) || fContext
== WDT_INPROC64_CALL
)
623 *phMfp
= *(HMETAFILEPICT
*)pBuffer
;
624 pBuffer
+= sizeof(HMETAFILEPICT
);
628 ULONG handle
= *(ULONG
*)pBuffer
;
629 pBuffer
+= sizeof(ULONG
);
634 METAFILEPICT
*mfpict
;
635 const remoteMETAFILEPICT
*remmfpict
;
636 ULONG user_marshal_prefix
;
638 remmfpict
= (const remoteMETAFILEPICT
*)pBuffer
;
640 *phMfp
= GlobalAlloc(GMEM_MOVEABLE
, sizeof(METAFILEPICT
));
642 RpcRaiseException(E_OUTOFMEMORY
);
644 mfpict
= GlobalLock(*phMfp
);
645 mfpict
->mm
= remmfpict
->mm
;
646 mfpict
->xExt
= remmfpict
->xExt
;
647 mfpict
->yExt
= remmfpict
->yExt
;
648 pBuffer
+= 3 * sizeof(ULONG
);
649 user_marshal_prefix
= *(ULONG
*)pBuffer
;
650 pBuffer
+= sizeof(ULONG
);
652 if (user_marshal_prefix
!= USER_MARSHAL_PTR_PREFIX
)
653 RpcRaiseException(RPC_X_INVALID_TAG
);
655 pBuffer
= HMETAFILE_UserUnmarshal(pFlags
, pBuffer
, &mfpict
->hMF
);
657 GlobalUnlock(*phMfp
);
663 /******************************************************************************
664 * HMETAFILEPICT_UserFree [OLE32.@]
666 * Frees an unmarshaled metafile pict.
669 * pFlags [I] Flags. See notes.
670 * phMfp [I] Metafile pict to free.
673 * The end of the marshaled data in the buffer.
676 * Even though the function is documented to take a pointer to a ULONG in
677 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
678 * which the first parameter is a ULONG.
679 * This function is only intended to be called by the RPC runtime.
681 void __RPC_USER
HMETAFILEPICT_UserFree(ULONG
*pFlags
, HMETAFILEPICT
*phMfp
)
683 TRACE("(%s, &%p)\n", debugstr_user_flags(pFlags
), *phMfp
);
685 if ((LOWORD(*pFlags
) != MSHCTX_INPROC
) && *phMfp
)
687 METAFILEPICT
*mfpict
;
689 mfpict
= GlobalLock(*phMfp
);
690 /* FIXME: raise an exception if mfpict is NULL? */
691 HMETAFILE_UserFree(pFlags
, &mfpict
->hMF
);
692 GlobalUnlock(*phMfp
);
698 /******************************************************************************
699 * STGMEDIUM_UserSize [OLE32.@]
701 * Calculates the buffer size required to marshal an STGMEDIUM.
704 * pFlags [I] Flags. See notes.
705 * StartingSize [I] Starting size of the buffer. This value is added on to
706 * the buffer size required for the clip format.
707 * pStgMedium [I] STGMEDIUM to size.
710 * The buffer size required to marshal an STGMEDIUM plus the starting size.
713 * Even though the function is documented to take a pointer to a ULONG in
714 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
715 * the first parameter is a ULONG.
716 * This function is only intended to be called by the RPC runtime.
718 ULONG __RPC_USER
STGMEDIUM_UserSize(ULONG
*pFlags
, ULONG StartingSize
, STGMEDIUM
*pStgMedium
)
720 ULONG size
= StartingSize
;
722 TRACE("%s, %lu, %p.\n", debugstr_user_flags(pFlags
), StartingSize
, pStgMedium
);
724 ALIGN_LENGTH(size
, 3);
726 size
+= 2 * sizeof(DWORD
);
727 if (pStgMedium
->tymed
!= TYMED_NULL
)
728 size
+= sizeof(DWORD
);
730 switch (pStgMedium
->tymed
)
733 TRACE("TYMED_NULL\n");
736 TRACE("TYMED_HGLOBAL\n");
737 if (pStgMedium
->hGlobal
)
738 size
= HGLOBAL_UserSize(pFlags
, size
, &pStgMedium
->hGlobal
);
741 TRACE("TYMED_FILE\n");
742 if (pStgMedium
->lpszFileName
)
744 TRACE("file name is %s\n", debugstr_w(pStgMedium
->lpszFileName
));
745 size
+= 3 * sizeof(DWORD
) +
746 (lstrlenW(pStgMedium
->lpszFileName
) + 1) * sizeof(WCHAR
);
750 TRACE("TYMED_ISTREAM\n");
751 if (pStgMedium
->pstm
)
754 IStream_QueryInterface(pStgMedium
->pstm
, &IID_IUnknown
, (void**)&unk
);
755 size
= WdtpInterfacePointer_UserSize(pFlags
, LOWORD(*pFlags
), size
, unk
, &IID_IStream
);
756 IUnknown_Release(unk
);
760 TRACE("TYMED_ISTORAGE\n");
761 if (pStgMedium
->pstg
)
764 IStorage_QueryInterface(pStgMedium
->pstg
, &IID_IUnknown
, (void**)&unk
);
765 size
= WdtpInterfacePointer_UserSize(pFlags
, LOWORD(*pFlags
), size
, unk
, &IID_IStorage
);
766 IUnknown_Release(unk
);
770 TRACE("TYMED_GDI\n");
771 if (pStgMedium
->hBitmap
)
772 size
= HBITMAP_UserSize(pFlags
, size
, &pStgMedium
->hBitmap
);
775 TRACE("TYMED_MFPICT\n");
776 if (pStgMedium
->hMetaFilePict
)
777 size
= HMETAFILEPICT_UserSize(pFlags
, size
, &pStgMedium
->hMetaFilePict
);
780 TRACE("TYMED_ENHMF\n");
781 if (pStgMedium
->hEnhMetaFile
)
782 size
= HENHMETAFILE_UserSize(pFlags
, size
, &pStgMedium
->hEnhMetaFile
);
785 RaiseException(DV_E_TYMED
, 0, 0, NULL
);
788 if (pStgMedium
->pUnkForRelease
)
789 size
= WdtpInterfacePointer_UserSize(pFlags
, LOWORD(*pFlags
), size
, pStgMedium
->pUnkForRelease
, &IID_IUnknown
);
794 /******************************************************************************
795 * STGMEDIUM_UserMarshal [OLE32.@]
797 * Marshals a STGMEDIUM into a buffer.
800 * pFlags [I] Flags. See notes.
801 * pBuffer [I] Buffer to marshal the clip format into.
802 * pCF [I] STGMEDIUM to marshal.
805 * The end of the marshaled data in the buffer.
808 * Even though the function is documented to take a pointer to a ULONG in
809 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
810 * the first parameter is a ULONG.
811 * This function is only intended to be called by the RPC runtime.
813 unsigned char * __RPC_USER
STGMEDIUM_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, STGMEDIUM
*pStgMedium
)
815 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags
), pBuffer
, pStgMedium
);
817 ALIGN_POINTER(pBuffer
, 3);
819 *(DWORD
*)pBuffer
= pStgMedium
->tymed
;
820 pBuffer
+= sizeof(DWORD
);
821 if (pStgMedium
->tymed
!= TYMED_NULL
)
823 *(DWORD
*)pBuffer
= (DWORD
)(DWORD_PTR
)pStgMedium
->pstg
;
824 pBuffer
+= sizeof(DWORD
);
826 *(DWORD
*)pBuffer
= (DWORD
)(DWORD_PTR
)pStgMedium
->pUnkForRelease
;
827 pBuffer
+= sizeof(DWORD
);
829 switch (pStgMedium
->tymed
)
832 TRACE("TYMED_NULL\n");
835 TRACE("TYMED_HGLOBAL\n");
836 if (pStgMedium
->hGlobal
)
837 pBuffer
= HGLOBAL_UserMarshal(pFlags
, pBuffer
, &pStgMedium
->hGlobal
);
840 TRACE("TYMED_FILE\n");
841 if (pStgMedium
->lpszFileName
)
844 len
= lstrlenW(pStgMedium
->lpszFileName
);
846 *(DWORD
*)pBuffer
= len
+ 1;
847 pBuffer
+= sizeof(DWORD
);
849 *(DWORD
*)pBuffer
= 0;
850 pBuffer
+= sizeof(DWORD
);
852 *(DWORD
*)pBuffer
= len
+ 1;
853 pBuffer
+= sizeof(DWORD
);
855 TRACE("file name is %s\n", debugstr_w(pStgMedium
->lpszFileName
));
856 memcpy(pBuffer
, pStgMedium
->lpszFileName
, (len
+ 1) * sizeof(WCHAR
));
860 TRACE("TYMED_ISTREAM\n");
861 if (pStgMedium
->pstm
)
864 IStream_QueryInterface(pStgMedium
->pstm
, &IID_IUnknown
, (void**)&unk
);
865 pBuffer
= WdtpInterfacePointer_UserMarshal(pFlags
, LOWORD(*pFlags
), pBuffer
, unk
, &IID_IStream
);
866 IUnknown_Release(unk
);
870 TRACE("TYMED_ISTORAGE\n");
871 if (pStgMedium
->pstg
)
874 IStorage_QueryInterface(pStgMedium
->pstg
, &IID_IUnknown
, (void**)&unk
);
875 pBuffer
= WdtpInterfacePointer_UserMarshal(pFlags
, LOWORD(*pFlags
), pBuffer
, unk
, &IID_IStorage
);
876 IUnknown_Release(unk
);
880 TRACE("TYMED_GDI\n");
881 if (pStgMedium
->hBitmap
)
882 pBuffer
= HBITMAP_UserMarshal(pFlags
, pBuffer
, &pStgMedium
->hBitmap
);
885 TRACE("TYMED_MFPICT\n");
886 if (pStgMedium
->hMetaFilePict
)
887 pBuffer
= HMETAFILEPICT_UserMarshal(pFlags
, pBuffer
, &pStgMedium
->hMetaFilePict
);
890 TRACE("TYMED_ENHMF\n");
891 if (pStgMedium
->hEnhMetaFile
)
892 pBuffer
= HENHMETAFILE_UserMarshal(pFlags
, pBuffer
, &pStgMedium
->hEnhMetaFile
);
895 RaiseException(DV_E_TYMED
, 0, 0, NULL
);
898 if (pStgMedium
->pUnkForRelease
)
899 pBuffer
= WdtpInterfacePointer_UserMarshal(pFlags
, LOWORD(*pFlags
), pBuffer
, pStgMedium
->pUnkForRelease
, &IID_IUnknown
);
904 /******************************************************************************
905 * STGMEDIUM_UserUnmarshal [OLE32.@]
907 * Unmarshals a STGMEDIUM from a buffer.
910 * pFlags [I] Flags. See notes.
911 * pBuffer [I] Buffer to marshal the clip format from.
912 * pStgMedium [O] Address that receive the unmarshaled STGMEDIUM.
915 * The end of the marshaled data in the buffer.
918 * Even though the function is documented to take a pointer to an ULONG in
919 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
920 * the first parameter is an ULONG.
921 * This function is only intended to be called by the RPC runtime.
923 unsigned char * __RPC_USER
STGMEDIUM_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, STGMEDIUM
*pStgMedium
)
928 ALIGN_POINTER(pBuffer
, 3);
930 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags
), pBuffer
, pStgMedium
);
932 pStgMedium
->tymed
= *(DWORD
*)pBuffer
;
933 pBuffer
+= sizeof(DWORD
);
934 if (pStgMedium
->tymed
!= TYMED_NULL
)
936 content
= *(DWORD
*)pBuffer
;
937 pBuffer
+= sizeof(DWORD
);
939 releaseunk
= *(DWORD
*)pBuffer
;
940 pBuffer
+= sizeof(DWORD
);
942 switch (pStgMedium
->tymed
)
945 TRACE("TYMED_NULL\n");
948 TRACE("TYMED_HGLOBAL\n");
950 pBuffer
= HGLOBAL_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->hGlobal
);
953 TRACE("TYMED_FILE\n");
958 conformance
= *(DWORD
*)pBuffer
;
959 pBuffer
+= sizeof(DWORD
);
960 if (*(DWORD
*)pBuffer
!= 0)
962 ERR("invalid offset %ld\n", *(DWORD
*)pBuffer
);
963 RpcRaiseException(RPC_S_INVALID_BOUND
);
966 pBuffer
+= sizeof(DWORD
);
967 variance
= *(DWORD
*)pBuffer
;
968 pBuffer
+= sizeof(DWORD
);
969 if (conformance
!= variance
)
971 ERR("conformance (%ld) and variance (%ld) should be equal\n", conformance
, variance
);
972 RpcRaiseException(RPC_S_INVALID_BOUND
);
975 if (conformance
> 0x7fffffff)
977 ERR("conformance %#lx too large\n", conformance
);
978 RpcRaiseException(RPC_S_INVALID_BOUND
);
981 pStgMedium
->lpszFileName
= CoTaskMemAlloc(conformance
* sizeof(WCHAR
));
982 if (!pStgMedium
->lpszFileName
) RpcRaiseException(ERROR_OUTOFMEMORY
);
983 TRACE("unmarshalled file name is %s\n", debugstr_wn((const WCHAR
*)pBuffer
, variance
));
984 memcpy(pStgMedium
->lpszFileName
, pBuffer
, variance
* sizeof(WCHAR
));
985 pBuffer
+= variance
* sizeof(WCHAR
);
988 pStgMedium
->lpszFileName
= NULL
;
991 TRACE("TYMED_ISTREAM\n");
994 pBuffer
= WdtpInterfacePointer_UserUnmarshal(pFlags
, pBuffer
, (IUnknown
**)&pStgMedium
->pstm
, &IID_IStream
);
998 if (pStgMedium
->pstm
) IStream_Release( pStgMedium
->pstm
);
999 pStgMedium
->pstm
= NULL
;
1002 case TYMED_ISTORAGE
:
1003 TRACE("TYMED_ISTORAGE\n");
1006 pBuffer
= WdtpInterfacePointer_UserUnmarshal(pFlags
, pBuffer
, (IUnknown
**)&pStgMedium
->pstg
, &IID_IStorage
);
1010 if (pStgMedium
->pstg
) IStorage_Release( pStgMedium
->pstg
);
1011 pStgMedium
->pstg
= NULL
;
1015 TRACE("TYMED_GDI\n");
1017 pBuffer
= HBITMAP_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->hBitmap
);
1019 pStgMedium
->hBitmap
= NULL
;
1022 TRACE("TYMED_MFPICT\n");
1024 pBuffer
= HMETAFILEPICT_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->hMetaFilePict
);
1026 pStgMedium
->hMetaFilePict
= NULL
;
1029 TRACE("TYMED_ENHMF\n");
1031 pBuffer
= HENHMETAFILE_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->hEnhMetaFile
);
1033 pStgMedium
->hEnhMetaFile
= NULL
;
1036 RaiseException(DV_E_TYMED
, 0, 0, NULL
);
1040 pBuffer
= WdtpInterfacePointer_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->pUnkForRelease
, &IID_IUnknown
);
1041 /* Unlike the IStream / IStorage ifaces, the existing pUnkForRelease
1042 is left intact if a NULL ptr is unmarshalled - see the tests. */
1047 /******************************************************************************
1048 * STGMEDIUM_UserFree [OLE32.@]
1050 * Frees an unmarshaled STGMEDIUM.
1053 * pFlags [I] Flags. See notes.
1054 * pStgmedium [I] STGMEDIUM to free.
1057 * The end of the marshaled data in the buffer.
1060 * Even though the function is documented to take a pointer to a ULONG in
1061 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
1062 * which the first parameter is a ULONG.
1063 * This function is only intended to be called by the RPC runtime.
1065 void __RPC_USER
STGMEDIUM_UserFree(ULONG
*flags
, STGMEDIUM
*med
)
1067 TRACE("(%s, %p)\n", debugstr_user_flags(flags
), med
);
1074 case TYMED_ISTORAGE
:
1075 ReleaseStgMedium(med
);
1081 if (LOWORD(*flags
) == MSHCTX_INPROC
)
1082 med
->tymed
= TYMED_NULL
;
1083 ReleaseStgMedium(med
);
1086 RaiseException(DV_E_TYMED
, 0, 0, NULL
);
1090 ULONG __RPC_USER
ASYNC_STGMEDIUM_UserSize(ULONG
*pFlags
, ULONG StartingSize
, ASYNC_STGMEDIUM
*pStgMedium
)
1093 return STGMEDIUM_UserSize(pFlags
, StartingSize
, pStgMedium
);
1096 unsigned char * __RPC_USER
ASYNC_STGMEDIUM_UserMarshal( ULONG
*pFlags
, unsigned char *pBuffer
, ASYNC_STGMEDIUM
*pStgMedium
)
1099 return STGMEDIUM_UserMarshal(pFlags
, pBuffer
, pStgMedium
);
1102 unsigned char * __RPC_USER
ASYNC_STGMEDIUM_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, ASYNC_STGMEDIUM
*pStgMedium
)
1105 return STGMEDIUM_UserUnmarshal(pFlags
, pBuffer
, pStgMedium
);
1108 void __RPC_USER
ASYNC_STGMEDIUM_UserFree(ULONG
*pFlags
, ASYNC_STGMEDIUM
*pStgMedium
)
1111 STGMEDIUM_UserFree(pFlags
, pStgMedium
);
1114 ULONG __RPC_USER
FLAG_STGMEDIUM_UserSize(ULONG
*pFlags
, ULONG StartingSize
, FLAG_STGMEDIUM
*pStgMedium
)
1117 return StartingSize
;
1120 unsigned char * __RPC_USER
FLAG_STGMEDIUM_UserMarshal( ULONG
*pFlags
, unsigned char *pBuffer
, FLAG_STGMEDIUM
*pStgMedium
)
1126 unsigned char * __RPC_USER
FLAG_STGMEDIUM_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, FLAG_STGMEDIUM
*pStgMedium
)
1132 void __RPC_USER
FLAG_STGMEDIUM_UserFree(ULONG
*pFlags
, FLAG_STGMEDIUM
*pStgMedium
)
1137 ULONG __RPC_USER
SNB_UserSize(ULONG
*pFlags
, ULONG StartingSize
, SNB
*pSnb
)
1139 ULONG size
= StartingSize
;
1141 TRACE("%s, %lu, %p.\n", debugstr_user_flags(pFlags
), StartingSize
, pSnb
);
1143 ALIGN_LENGTH(size
, 3);
1145 /* two counters from RemSNB header, plus one more ULONG */
1146 size
+= 3*sizeof(ULONG
);
1148 /* now actual data length */
1151 WCHAR
**ptrW
= *pSnb
;
1155 size
+= (lstrlenW(*ptrW
) + 1)*sizeof(WCHAR
);
1170 unsigned char * __RPC_USER
SNB_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, SNB
*pSnb
)
1172 struct SNB_wire
*wire
;
1175 TRACE("(%s, %p, %p)\n", debugstr_user_flags(pFlags
), pBuffer
, pSnb
);
1177 ALIGN_POINTER(pBuffer
, 3);
1179 wire
= (struct SNB_wire
*)pBuffer
;
1180 wire
->charcnt
= wire
->strcnt
= 0;
1181 size
= 3*sizeof(ULONG
);
1185 WCHAR
**ptrW
= *pSnb
;
1186 WCHAR
*dataW
= wire
->data
;
1190 ULONG len
= lstrlenW(*ptrW
) + 1;
1193 wire
->charcnt
+= len
;
1194 memcpy(dataW
, *ptrW
, len
*sizeof(WCHAR
));
1197 size
+= len
*sizeof(WCHAR
);
1202 wire
->datalen
= wire
->charcnt
;
1203 return pBuffer
+ size
;
1206 unsigned char * __RPC_USER
SNB_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, SNB
*pSnb
)
1208 USER_MARSHAL_CB
*umcb
= (USER_MARSHAL_CB
*)pFlags
;
1209 struct SNB_wire
*wire
;
1211 TRACE("(%s, %p, %p)\n", debugstr_user_flags(pFlags
), pBuffer
, pSnb
);
1213 wire
= (struct SNB_wire
*)pBuffer
;
1216 umcb
->pStubMsg
->pfnFree(*pSnb
);
1218 if (wire
->datalen
== 0)
1222 WCHAR
*src
= wire
->data
, *dest
;
1226 ptrW
= *pSnb
= umcb
->pStubMsg
->pfnAllocate((wire
->strcnt
+1)*sizeof(WCHAR
*) + wire
->datalen
*sizeof(WCHAR
));
1227 dest
= (WCHAR
*)(*pSnb
+ wire
->strcnt
+ 1);
1229 for (i
= 0; i
< wire
->strcnt
; i
++)
1231 ULONG len
= lstrlenW(src
);
1232 memcpy(dest
, src
, (len
+ 1)*sizeof(WCHAR
));
1241 return pBuffer
+ 3*sizeof(ULONG
) + wire
->datalen
*sizeof(WCHAR
);
1244 void __RPC_USER
SNB_UserFree(ULONG
*pFlags
, SNB
*pSnb
)
1246 USER_MARSHAL_CB
*umcb
= (USER_MARSHAL_CB
*)pFlags
;
1247 TRACE("(%p)\n", pSnb
);
1249 umcb
->pStubMsg
->pfnFree(*pSnb
);
1252 /* call_as/local stubs for unknwn.idl */
1254 HRESULT CALLBACK
IClassFactory_CreateInstance_Proxy(
1255 IClassFactory
* This
,
1256 IUnknown
*pUnkOuter
,
1260 TRACE("(%p, %s, %p)\n", pUnkOuter
, debugstr_guid(riid
), ppvObject
);
1264 ERR("aggregation is not allowed on remote objects\n");
1265 return CLASS_E_NOAGGREGATION
;
1267 return IClassFactory_RemoteCreateInstance_Proxy(This
, riid
,
1268 (IUnknown
**) ppvObject
);
1271 HRESULT __RPC_STUB
IClassFactory_CreateInstance_Stub(
1272 IClassFactory
* This
,
1274 IUnknown
**ppvObject
)
1276 TRACE("(%s, %p)\n", debugstr_guid(riid
), ppvObject
);
1277 return IClassFactory_CreateInstance(This
, NULL
, riid
, (void **) ppvObject
);
1280 HRESULT CALLBACK
IClassFactory_LockServer_Proxy(
1281 IClassFactory
* This
,
1288 HRESULT __RPC_STUB
IClassFactory_LockServer_Stub(
1289 IClassFactory
* This
,
1296 /* call_as/local stubs for objidl.idl */
1298 HRESULT CALLBACK
IEnumUnknown_Next_Proxy(
1302 ULONG
*pceltFetched
)
1305 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1306 if (!pceltFetched
) pceltFetched
= &fetched
;
1307 return IEnumUnknown_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1310 HRESULT __RPC_STUB
IEnumUnknown_Next_Stub(
1314 ULONG
*pceltFetched
)
1317 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1319 hr
= IEnumUnknown_Next(This
, celt
, rgelt
, pceltFetched
);
1320 if (hr
== S_OK
) *pceltFetched
= celt
;
1324 HRESULT CALLBACK
IBindCtx_SetBindOptions_Proxy(
1326 BIND_OPTS
*pbindopts
)
1332 HRESULT __RPC_STUB
IBindCtx_SetBindOptions_Stub(
1334 BIND_OPTS2
*pbindopts
)
1340 HRESULT CALLBACK
IBindCtx_GetBindOptions_Proxy(
1342 BIND_OPTS
*pbindopts
)
1348 HRESULT __RPC_STUB
IBindCtx_GetBindOptions_Stub(
1350 BIND_OPTS2
*pbindopts
)
1356 HRESULT CALLBACK
IEnumMoniker_Next_Proxy(
1360 ULONG
*pceltFetched
)
1363 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1364 if (!pceltFetched
) pceltFetched
= &fetched
;
1365 return IEnumMoniker_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1368 HRESULT __RPC_STUB
IEnumMoniker_Next_Stub(
1372 ULONG
*pceltFetched
)
1375 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1377 hr
= IEnumMoniker_Next(This
, celt
, rgelt
, pceltFetched
);
1378 if (hr
== S_OK
) *pceltFetched
= celt
;
1382 BOOL CALLBACK
IRunnableObject_IsRunning_Proxy(
1383 IRunnableObject
* This
)
1387 memset(&rv
, 0, sizeof rv
);
1391 HRESULT __RPC_STUB
IRunnableObject_IsRunning_Stub(
1392 IRunnableObject
* This
)
1398 HRESULT CALLBACK
IMoniker_BindToObject_Proxy(
1401 IMoniker
*pmkToLeft
,
1409 HRESULT __RPC_STUB
IMoniker_BindToObject_Stub(
1412 IMoniker
*pmkToLeft
,
1414 IUnknown
**ppvResult
)
1420 HRESULT CALLBACK
IMoniker_BindToStorage_Proxy(
1423 IMoniker
*pmkToLeft
,
1427 TRACE("(%p)->(%p %p %s %p)\n", This
, pbc
, pmkToLeft
, debugstr_guid(riid
), ppvObj
);
1428 return IMoniker_RemoteBindToStorage_Proxy(This
, pbc
, pmkToLeft
, riid
, (IUnknown
**)ppvObj
);
1431 HRESULT __RPC_STUB
IMoniker_BindToStorage_Stub(
1434 IMoniker
*pmkToLeft
,
1438 TRACE("(%p)->(%p %p %s %p)\n", This
, pbc
, pmkToLeft
, debugstr_guid(riid
), ppvObj
);
1439 return IMoniker_BindToStorage(This
, pbc
, pmkToLeft
, riid
, (void**)ppvObj
);
1442 HRESULT CALLBACK
IEnumString_Next_Proxy(
1446 ULONG
*pceltFetched
)
1449 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1450 if (!pceltFetched
) pceltFetched
= &fetched
;
1451 return IEnumString_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1454 HRESULT __RPC_STUB
IEnumString_Next_Stub(
1458 ULONG
*pceltFetched
)
1461 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1463 hr
= IEnumString_Next(This
, celt
, rgelt
, pceltFetched
);
1464 if (hr
== S_OK
) *pceltFetched
= celt
;
1468 HRESULT CALLBACK
ISequentialStream_Read_Proxy(
1469 ISequentialStream
* This
,
1477 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbRead
);
1479 hr
= ISequentialStream_RemoteRead_Proxy(This
, pv
, cb
, &read
);
1480 if(pcbRead
) *pcbRead
= read
;
1485 HRESULT __RPC_STUB
ISequentialStream_Read_Stub(
1486 ISequentialStream
* This
,
1491 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbRead
);
1492 return ISequentialStream_Read(This
, pv
, cb
, pcbRead
);
1495 HRESULT CALLBACK
ISequentialStream_Write_Proxy(
1496 ISequentialStream
* This
,
1504 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbWritten
);
1506 hr
= ISequentialStream_RemoteWrite_Proxy(This
, pv
, cb
, &written
);
1507 if(pcbWritten
) *pcbWritten
= written
;
1512 HRESULT __RPC_STUB
ISequentialStream_Write_Stub(
1513 ISequentialStream
* This
,
1518 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbWritten
);
1519 return ISequentialStream_Write(This
, pv
, cb
, pcbWritten
);
1522 HRESULT CALLBACK
IStream_Seek_Proxy(
1524 LARGE_INTEGER dlibMove
,
1526 ULARGE_INTEGER
*plibNewPosition
)
1528 ULARGE_INTEGER newpos
;
1531 TRACE("%p, %s, %ld, %p.\n", This
, wine_dbgstr_longlong(dlibMove
.QuadPart
), dwOrigin
, plibNewPosition
);
1533 hr
= IStream_RemoteSeek_Proxy(This
, dlibMove
, dwOrigin
, &newpos
);
1534 if(plibNewPosition
) *plibNewPosition
= newpos
;
1539 HRESULT __RPC_STUB
IStream_Seek_Stub(
1541 LARGE_INTEGER dlibMove
,
1543 ULARGE_INTEGER
*plibNewPosition
)
1545 TRACE("%p, %s, %ld, %p.\n", This
, wine_dbgstr_longlong(dlibMove
.QuadPart
), dwOrigin
, plibNewPosition
);
1546 return IStream_Seek(This
, dlibMove
, dwOrigin
, plibNewPosition
);
1549 HRESULT CALLBACK
IStream_CopyTo_Proxy(
1553 ULARGE_INTEGER
*pcbRead
,
1554 ULARGE_INTEGER
*pcbWritten
)
1556 ULARGE_INTEGER read
, written
;
1559 TRACE("(%p)->(%p, %s, %p, %p)\n", This
, pstm
, wine_dbgstr_longlong(cb
.QuadPart
), pcbRead
, pcbWritten
);
1561 hr
= IStream_RemoteCopyTo_Proxy(This
, pstm
, cb
, &read
, &written
);
1562 if(pcbRead
) *pcbRead
= read
;
1563 if(pcbWritten
) *pcbWritten
= written
;
1568 HRESULT __RPC_STUB
IStream_CopyTo_Stub(
1572 ULARGE_INTEGER
*pcbRead
,
1573 ULARGE_INTEGER
*pcbWritten
)
1575 TRACE("(%p)->(%p, %s, %p, %p)\n", This
, pstm
, wine_dbgstr_longlong(cb
.QuadPart
), pcbRead
, pcbWritten
);
1577 return IStream_CopyTo(This
, pstm
, cb
, pcbRead
, pcbWritten
);
1580 HRESULT CALLBACK
IEnumSTATSTG_Next_Proxy(
1584 ULONG
*pceltFetched
)
1587 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1588 if (!pceltFetched
) pceltFetched
= &fetched
;
1589 return IEnumSTATSTG_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1592 HRESULT __RPC_STUB
IEnumSTATSTG_Next_Stub(
1596 ULONG
*pceltFetched
)
1599 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1601 hr
= IEnumSTATSTG_Next(This
, celt
, rgelt
, pceltFetched
);
1602 if (hr
== S_OK
) *pceltFetched
= celt
;
1606 HRESULT CALLBACK
IStorage_OpenStream_Proxy(
1614 TRACE("%p, %s, %p, %#lx, %ld, %p.\n", This
, debugstr_w(pwcsName
), reserved1
, grfMode
, reserved2
, ppstm
);
1615 if(reserved1
) WARN("reserved1 %p\n", reserved1
);
1617 return IStorage_RemoteOpenStream_Proxy(This
, pwcsName
, 0, NULL
, grfMode
, reserved2
, ppstm
);
1620 HRESULT __RPC_STUB
IStorage_OpenStream_Stub(
1629 TRACE("%p, %s, %ld, %p, %#lx, %ld, %p.\n", This
, debugstr_w(pwcsName
), cbReserved1
, reserved1
, grfMode
, reserved2
, ppstm
);
1630 if(cbReserved1
|| reserved1
) WARN("cbReserved1 %ld reserved1 %p\n", cbReserved1
, reserved1
);
1632 return IStorage_OpenStream(This
, pwcsName
, NULL
, grfMode
, reserved2
, ppstm
);
1635 HRESULT CALLBACK
IStorage_EnumElements_Proxy(
1640 IEnumSTATSTG
**ppenum
)
1642 TRACE("%p, %ld, %p, %ld, %p.\n", This
, reserved1
, reserved2
, reserved3
, ppenum
);
1643 if(reserved2
) WARN("reserved2 %p\n", reserved2
);
1645 return IStorage_RemoteEnumElements_Proxy(This
, reserved1
, 0, NULL
, reserved3
, ppenum
);
1648 HRESULT __RPC_STUB
IStorage_EnumElements_Stub(
1654 IEnumSTATSTG
**ppenum
)
1656 TRACE("%p, %ld, %ld, %p, %ld, %p.\n", This
, reserved1
, cbReserved2
, reserved2
, reserved3
, ppenum
);
1657 if(cbReserved2
|| reserved2
) WARN("cbReserved2 %ld reserved2 %p\n", cbReserved2
, reserved2
);
1659 return IStorage_EnumElements(This
, reserved1
, NULL
, reserved3
, ppenum
);
1662 HRESULT CALLBACK
ILockBytes_ReadAt_Proxy(
1664 ULARGE_INTEGER ulOffset
,
1672 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbRead
);
1674 hr
= ILockBytes_RemoteReadAt_Proxy(This
, ulOffset
, pv
, cb
, &read
);
1675 if(pcbRead
) *pcbRead
= read
;
1680 HRESULT __RPC_STUB
ILockBytes_ReadAt_Stub(
1682 ULARGE_INTEGER ulOffset
,
1687 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbRead
);
1688 return ILockBytes_ReadAt(This
, ulOffset
, pv
, cb
, pcbRead
);
1691 HRESULT CALLBACK
ILockBytes_WriteAt_Proxy(
1693 ULARGE_INTEGER ulOffset
,
1701 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbWritten
);
1703 hr
= ILockBytes_RemoteWriteAt_Proxy(This
, ulOffset
, pv
, cb
, &written
);
1704 if(pcbWritten
) *pcbWritten
= written
;
1709 HRESULT __RPC_STUB
ILockBytes_WriteAt_Stub(
1711 ULARGE_INTEGER ulOffset
,
1716 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbWritten
);
1717 return ILockBytes_WriteAt(This
, ulOffset
, pv
, cb
, pcbWritten
);
1720 HRESULT CALLBACK
IFillLockBytes_FillAppend_Proxy(
1721 IFillLockBytes
* This
,
1729 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbWritten
);
1731 hr
= IFillLockBytes_RemoteFillAppend_Proxy(This
, pv
, cb
, &written
);
1732 if(pcbWritten
) *pcbWritten
= written
;
1737 HRESULT __RPC_STUB
IFillLockBytes_FillAppend_Stub(
1738 IFillLockBytes
* This
,
1743 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbWritten
);
1744 return IFillLockBytes_FillAppend(This
, pv
, cb
, pcbWritten
);
1747 HRESULT CALLBACK
IFillLockBytes_FillAt_Proxy(
1748 IFillLockBytes
* This
,
1749 ULARGE_INTEGER ulOffset
,
1757 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbWritten
);
1759 hr
= IFillLockBytes_RemoteFillAt_Proxy(This
, ulOffset
, pv
, cb
, &written
);
1760 if(pcbWritten
) *pcbWritten
= written
;
1765 HRESULT __RPC_STUB
IFillLockBytes_FillAt_Stub(
1766 IFillLockBytes
* This
,
1767 ULARGE_INTEGER ulOffset
,
1772 TRACE("%p, %s, %p, %ld, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbWritten
);
1773 return IFillLockBytes_FillAt(This
, ulOffset
, pv
, cb
, pcbWritten
);
1776 HRESULT CALLBACK
IEnumFORMATETC_Next_Proxy(
1777 IEnumFORMATETC
* This
,
1780 ULONG
*pceltFetched
)
1783 if (!pceltFetched
) pceltFetched
= &fetched
;
1784 return IEnumFORMATETC_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1787 HRESULT __RPC_STUB
IEnumFORMATETC_Next_Stub(
1788 IEnumFORMATETC
* This
,
1791 ULONG
*pceltFetched
)
1795 hr
= IEnumFORMATETC_Next(This
, celt
, rgelt
, pceltFetched
);
1796 if (hr
== S_OK
) *pceltFetched
= celt
;
1800 HRESULT CALLBACK
IEnumSTATDATA_Next_Proxy(
1801 IEnumSTATDATA
* This
,
1804 ULONG
*pceltFetched
)
1807 TRACE("%p, %ld, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1808 if (!pceltFetched
) pceltFetched
= &fetched
;
1809 return IEnumSTATDATA_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1812 HRESULT __RPC_STUB
IEnumSTATDATA_Next_Stub(
1813 IEnumSTATDATA
* This
,
1816 ULONG
*pceltFetched
)
1819 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1821 hr
= IEnumSTATDATA_Next(This
, celt
, rgelt
, pceltFetched
);
1822 if (hr
== S_OK
) *pceltFetched
= celt
;
1826 void CALLBACK
IAdviseSink_OnDataChange_Proxy(
1828 FORMATETC
*pFormatetc
,
1831 TRACE("(%p)->(%p, %p)\n", This
, pFormatetc
, pStgmed
);
1832 IAdviseSink_RemoteOnDataChange_Proxy(This
, pFormatetc
, pStgmed
);
1835 HRESULT __RPC_STUB
IAdviseSink_OnDataChange_Stub(
1837 FORMATETC
*pFormatetc
,
1838 ASYNC_STGMEDIUM
*pStgmed
)
1840 TRACE("(%p)->(%p, %p)\n", This
, pFormatetc
, pStgmed
);
1841 IAdviseSink_OnDataChange(This
, pFormatetc
, pStgmed
);
1845 void CALLBACK
IAdviseSink_OnViewChange_Proxy(
1850 TRACE("%p, %ld, %ld.\n", This
, dwAspect
, lindex
);
1851 IAdviseSink_RemoteOnViewChange_Proxy(This
, dwAspect
, lindex
);
1854 HRESULT __RPC_STUB
IAdviseSink_OnViewChange_Stub(
1859 TRACE("%p, %ld, %ld.\n", This
, dwAspect
, lindex
);
1860 IAdviseSink_OnViewChange(This
, dwAspect
, lindex
);
1864 void CALLBACK
IAdviseSink_OnRename_Proxy(
1868 TRACE("(%p)->(%p)\n", This
, pmk
);
1869 IAdviseSink_RemoteOnRename_Proxy(This
, pmk
);
1872 HRESULT __RPC_STUB
IAdviseSink_OnRename_Stub(
1876 TRACE("(%p)->(%p)\n", This
, pmk
);
1877 IAdviseSink_OnRename(This
, pmk
);
1881 void CALLBACK
IAdviseSink_OnSave_Proxy(
1884 TRACE("(%p)\n", This
);
1885 IAdviseSink_RemoteOnSave_Proxy(This
);
1888 HRESULT __RPC_STUB
IAdviseSink_OnSave_Stub(
1891 TRACE("(%p)\n", This
);
1892 IAdviseSink_OnSave(This
);
1896 void CALLBACK
IAdviseSink_OnClose_Proxy(
1899 TRACE("(%p)\n", This
);
1900 IAdviseSink_RemoteOnClose_Proxy(This
);
1903 HRESULT __RPC_STUB
IAdviseSink_OnClose_Stub(
1906 TRACE("(%p)\n", This
);
1907 IAdviseSink_OnClose(This
);
1911 void CALLBACK
IAdviseSink2_OnLinkSrcChange_Proxy(
1915 TRACE("(%p)->(%p)\n", This
, pmk
);
1916 IAdviseSink2_RemoteOnLinkSrcChange_Proxy(This
, pmk
);
1919 HRESULT __RPC_STUB
IAdviseSink2_OnLinkSrcChange_Stub(
1923 TRACE("(%p)->(%p)\n", This
, pmk
);
1924 IAdviseSink2_OnLinkSrcChange(This
, pmk
);
1928 HRESULT CALLBACK
IDataObject_GetData_Proxy(
1930 FORMATETC
*pformatetcIn
,
1933 TRACE("(%p)->(%p, %p)\n", This
, pformatetcIn
, pmedium
);
1934 return IDataObject_RemoteGetData_Proxy(This
, pformatetcIn
, pmedium
);
1937 HRESULT __RPC_STUB
IDataObject_GetData_Stub(
1939 FORMATETC
*pformatetcIn
,
1940 STGMEDIUM
*pRemoteMedium
)
1942 TRACE("(%p)->(%p, %p)\n", This
, pformatetcIn
, pRemoteMedium
);
1943 return IDataObject_GetData(This
, pformatetcIn
, pRemoteMedium
);
1946 HRESULT CALLBACK
IDataObject_GetDataHere_Proxy(IDataObject
*iface
, FORMATETC
*fmt
, STGMEDIUM
*med
)
1949 IStorage
*stg
= NULL
;
1952 TRACE("(%p)->(%p, %p)\n", iface
, fmt
, med
);
1954 if ((med
->tymed
& (TYMED_HGLOBAL
| TYMED_FILE
| TYMED_ISTREAM
| TYMED_ISTORAGE
)) == 0)
1956 if (med
->tymed
!= fmt
->tymed
)
1959 release
= med
->pUnkForRelease
;
1960 med
->pUnkForRelease
= NULL
;
1962 if (med
->tymed
== TYMED_ISTREAM
|| med
->tymed
== TYMED_ISTORAGE
)
1964 stg
= med
->pstg
; /* This may actually be a stream, but that's ok */
1965 if (stg
) IStorage_AddRef( stg
);
1968 hr
= IDataObject_RemoteGetDataHere_Proxy(iface
, fmt
, med
);
1970 med
->pUnkForRelease
= release
;
1974 IStorage_Release( med
->pstg
);
1981 HRESULT __RPC_STUB
IDataObject_GetDataHere_Stub(
1983 FORMATETC
*pformatetc
,
1984 STGMEDIUM
*pRemoteMedium
)
1986 TRACE("(%p)->(%p, %p)\n", This
, pformatetc
, pRemoteMedium
);
1987 return IDataObject_GetDataHere(This
, pformatetc
, pRemoteMedium
);
1990 HRESULT CALLBACK
IDataObject_SetData_Proxy(
1992 FORMATETC
*pformatetc
,
2000 HRESULT __RPC_STUB
IDataObject_SetData_Stub(
2002 FORMATETC
*pformatetc
,
2003 FLAG_STGMEDIUM
*pmedium
,
2010 /* call_as/local stubs for oleidl.idl */
2012 HRESULT CALLBACK
IOleInPlaceActiveObject_TranslateAccelerator_Proxy(
2013 IOleInPlaceActiveObject
* This
,
2016 TRACE("(%p %p)\n", This
, lpmsg
);
2017 return IOleInPlaceActiveObject_RemoteTranslateAccelerator_Proxy(This
);
2020 HRESULT __RPC_STUB
IOleInPlaceActiveObject_TranslateAccelerator_Stub(
2021 IOleInPlaceActiveObject
* This
)
2023 TRACE("(%p)\n", This
);
2027 HRESULT CALLBACK
IOleInPlaceActiveObject_ResizeBorder_Proxy(
2028 IOleInPlaceActiveObject
* This
,
2030 IOleInPlaceUIWindow
*pUIWindow
,
2037 HRESULT __RPC_STUB
IOleInPlaceActiveObject_ResizeBorder_Stub(
2038 IOleInPlaceActiveObject
* This
,
2041 IOleInPlaceUIWindow
*pUIWindow
,
2048 HRESULT CALLBACK
IOleCache2_UpdateCache_Proxy(
2050 LPDATAOBJECT pDataObject
,
2054 TRACE("%p, %p, %#lx, %p.\n", This
, pDataObject
, grfUpdf
, pReserved
);
2055 return IOleCache2_RemoteUpdateCache_Proxy(This
, pDataObject
, grfUpdf
, (LONG_PTR
)pReserved
);
2058 HRESULT __RPC_STUB
IOleCache2_UpdateCache_Stub(
2060 LPDATAOBJECT pDataObject
,
2064 TRACE("%p, %p, %#lx, %Id.\n", This
, pDataObject
, grfUpdf
, pReserved
);
2065 return IOleCache2_UpdateCache(This
, pDataObject
, grfUpdf
, (void*)pReserved
);
2068 HRESULT CALLBACK
IEnumOLEVERB_Next_Proxy(
2072 ULONG
*pceltFetched
)
2075 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
2076 if (!pceltFetched
) pceltFetched
= &fetched
;
2077 return IEnumOLEVERB_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
2080 HRESULT __RPC_STUB
IEnumOLEVERB_Next_Stub(
2084 ULONG
*pceltFetched
)
2087 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
2089 hr
= IEnumOLEVERB_Next(This
, celt
, rgelt
, pceltFetched
);
2090 if (hr
== S_OK
) *pceltFetched
= celt
;
2094 HRESULT CALLBACK
IViewObject_Draw_Proxy(
2099 DVTARGETDEVICE
*ptd
,
2102 LPCRECTL lprcBounds
,
2103 LPCRECTL lprcWBounds
,
2104 BOOL (STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
),
2105 ULONG_PTR dwContinue
)
2111 HRESULT __RPC_STUB
IViewObject_Draw_Stub(
2116 DVTARGETDEVICE
*ptd
,
2117 ULONG_PTR hdcTargetDev
,
2119 LPCRECTL lprcBounds
,
2120 LPCRECTL lprcWBounds
,
2121 IContinue
*pContinue
)
2127 HRESULT CALLBACK
IViewObject_GetColorSet_Proxy(
2132 DVTARGETDEVICE
*ptd
,
2134 LOGPALETTE
**ppColorSet
)
2140 HRESULT __RPC_STUB
IViewObject_GetColorSet_Stub(
2145 DVTARGETDEVICE
*ptd
,
2146 ULONG_PTR hicTargetDev
,
2147 LOGPALETTE
**ppColorSet
)
2153 HRESULT CALLBACK
IViewObject_Freeze_Proxy(
2164 HRESULT __RPC_STUB
IViewObject_Freeze_Stub(
2175 HRESULT CALLBACK
IViewObject_GetAdvise_Proxy(
2179 IAdviseSink
**ppAdvSink
)
2185 HRESULT __RPC_STUB
IViewObject_GetAdvise_Stub(
2189 IAdviseSink
**ppAdvSink
)