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
38 #include "wine/debug.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(ole
);
42 #define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align))
43 #define ALIGNED_POINTER(_Ptr, _Align) ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align))
44 #define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align)
45 #define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align)
47 #define USER_MARSHAL_PTR_PREFIX \
48 ( (DWORD)'U' | ( (DWORD)'s' << 8 ) | \
49 ( (DWORD)'e' << 16 ) | ( (DWORD)'r' << 24 ) )
51 ULONG __RPC_USER
WdtpInterfacePointer_UserSize(ULONG
*pFlags
, ULONG RealFlags
, ULONG StartingSize
, IUnknown
*punk
, REFIID riid
);
52 unsigned char * WINAPI
WdtpInterfacePointer_UserMarshal(ULONG
*pFlags
, ULONG RealFlags
, unsigned char *pBuffer
,
53 IUnknown
*punk
, REFIID riid
);
54 unsigned char * WINAPI
WdtpInterfacePointer_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, IUnknown
**ppunk
, REFIID riid
);
56 static const char* debugstr_user_flags(ULONG
*pFlags
)
60 switch (LOWORD(*pFlags
))
63 loword
="MSHCTX_LOCAL";
65 case MSHCTX_NOSHAREDMEM
:
66 loword
="MSHCTX_NOSHAREDMEM";
68 case MSHCTX_DIFFERENTMACHINE
:
69 loword
="MSHCTX_DIFFERENTMACHINE";
72 loword
="MSHCTX_INPROC";
75 sprintf(buf
, "%d", LOWORD(*pFlags
));
79 if (HIWORD(*pFlags
) == NDR_LOCAL_DATA_REPRESENTATION
)
80 return wine_dbg_sprintf("MAKELONG(%s, NDR_LOCAL_DATA_REPRESENTATION)", loword
);
82 return wine_dbg_sprintf("MAKELONG(%s, 0x%04x)", loword
, HIWORD(*pFlags
));
85 /******************************************************************************
86 * HMETAFILE_UserSize [OLE32.@]
88 * Calculates the buffer size required to marshal a metafile.
91 * pFlags [I] Flags. See notes.
92 * StartingSize [I] Starting size of the buffer. This value is added on to
93 * the buffer size required for the clip format.
94 * phmf [I] Metafile to size.
97 * The buffer size required to marshal a metafile plus the starting size.
100 * Even though the function is documented to take a pointer to a ULONG in
101 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
102 * the first parameter is a ULONG.
103 * This function is only intended to be called by the RPC runtime.
105 ULONG __RPC_USER
HMETAFILE_UserSize(ULONG
*pFlags
, ULONG StartingSize
, HMETAFILE
*phmf
)
107 ULONG size
= StartingSize
;
109 TRACE("%s, %lu, &%p.\n", debugstr_user_flags(pFlags
), StartingSize
, *phmf
);
111 ALIGN_LENGTH(size
, 3);
113 size
+= sizeof(ULONG
);
114 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
115 size
+= sizeof(ULONG_PTR
);
118 size
+= sizeof(ULONG
);
124 size
+= 2 * sizeof(ULONG
);
125 mfsize
= GetMetaFileBitsEx(*phmf
, 0, NULL
);
133 /******************************************************************************
134 * HMETAFILE_UserMarshal [OLE32.@]
136 * Marshals a metafile into a buffer.
139 * pFlags [I] Flags. See notes.
140 * pBuffer [I] Buffer to marshal the clip format into.
141 * phEmf [I] Metafile to marshal.
144 * The end of the marshaled data in the buffer.
147 * Even though the function is documented to take a pointer to a ULONG in
148 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
149 * the first parameter is a ULONG.
150 * This function is only intended to be called by the RPC runtime.
152 unsigned char * __RPC_USER
HMETAFILE_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HMETAFILE
*phmf
)
154 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags
), pBuffer
, *phmf
);
156 ALIGN_POINTER(pBuffer
, 3);
158 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
160 if (sizeof(*phmf
) == 8)
161 *(ULONG
*)pBuffer
= WDT_INPROC64_CALL
;
163 *(ULONG
*)pBuffer
= WDT_INPROC_CALL
;
164 pBuffer
+= sizeof(ULONG
);
165 *(HMETAFILE
*)pBuffer
= *phmf
;
166 pBuffer
+= sizeof(HMETAFILE
);
170 *(ULONG
*)pBuffer
= WDT_REMOTE_CALL
;
171 pBuffer
+= sizeof(ULONG
);
172 *(ULONG
*)pBuffer
= (ULONG
)(ULONG_PTR
)*phmf
;
173 pBuffer
+= sizeof(ULONG
);
177 UINT mfsize
= GetMetaFileBitsEx(*phmf
, 0, NULL
);
179 *(ULONG
*)pBuffer
= mfsize
;
180 pBuffer
+= sizeof(ULONG
);
181 *(ULONG
*)pBuffer
= mfsize
;
182 pBuffer
+= sizeof(ULONG
);
183 GetMetaFileBitsEx(*phmf
, mfsize
, pBuffer
);
191 /******************************************************************************
192 * HMETAFILE_UserUnmarshal [OLE32.@]
194 * Unmarshals a metafile from a buffer.
197 * pFlags [I] Flags. See notes.
198 * pBuffer [I] Buffer to marshal the clip format from.
199 * phmf [O] Address that receive the unmarshaled metafile.
202 * The end of the marshaled data in the buffer.
205 * Even though the function is documented to take a pointer to an ULONG in
206 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
207 * the first parameter is an ULONG.
208 * This function is only intended to be called by the RPC runtime.
210 unsigned char * __RPC_USER
HMETAFILE_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HMETAFILE
*phmf
)
214 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags
), pBuffer
, phmf
);
216 ALIGN_POINTER(pBuffer
, 3);
218 fContext
= *(ULONG
*)pBuffer
;
219 pBuffer
+= sizeof(ULONG
);
221 if (((fContext
== WDT_INPROC_CALL
) && (sizeof(*phmf
) < 8)) ||
222 ((fContext
== WDT_INPROC64_CALL
) && (sizeof(*phmf
) == 8)))
224 *phmf
= *(HMETAFILE
*)pBuffer
;
225 pBuffer
+= sizeof(*phmf
);
227 else if (fContext
== WDT_REMOTE_CALL
)
231 handle
= *(ULONG
*)pBuffer
;
232 pBuffer
+= sizeof(ULONG
);
237 size
= *(ULONG
*)pBuffer
;
238 pBuffer
+= sizeof(ULONG
);
239 if (size
!= *(ULONG
*)pBuffer
)
241 RaiseException(RPC_X_BAD_STUB_DATA
, 0, 0, NULL
);
244 pBuffer
+= sizeof(ULONG
);
245 *phmf
= SetMetaFileBitsEx(size
, pBuffer
);
252 RaiseException(RPC_S_INVALID_TAG
, 0, 0, NULL
);
257 /******************************************************************************
258 * HMETAFILE_UserFree [OLE32.@]
260 * Frees an unmarshaled metafile.
263 * pFlags [I] Flags. See notes.
264 * phmf [I] Metafile to free.
267 * The end of the marshaled data in the buffer.
270 * Even though the function is documented to take a pointer to a ULONG in
271 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
272 * which the first parameter is a ULONG.
273 * This function is only intended to be called by the RPC runtime.
275 void __RPC_USER
HMETAFILE_UserFree(ULONG
*pFlags
, HMETAFILE
*phmf
)
277 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags
), *phmf
);
279 if (LOWORD(*pFlags
) != MSHCTX_INPROC
)
280 DeleteMetaFile(*phmf
);
283 /******************************************************************************
284 * HENHMETAFILE_UserSize [OLE32.@]
286 * Calculates the buffer size required to marshal an enhanced metafile.
289 * pFlags [I] Flags. See notes.
290 * StartingSize [I] Starting size of the buffer. This value is added on to
291 * the buffer size required for the clip format.
292 * phEmf [I] Enhanced metafile to size.
295 * The buffer size required to marshal an enhanced metafile plus the starting size.
298 * Even though the function is documented to take a pointer to a ULONG in
299 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
300 * the first parameter is a ULONG.
301 * This function is only intended to be called by the RPC runtime.
303 ULONG __RPC_USER
HENHMETAFILE_UserSize(ULONG
*pFlags
, ULONG size
, HENHMETAFILE
*phEmf
)
305 TRACE("%s, %lu, %p.\n", debugstr_user_flags(pFlags
), size
, *phEmf
);
307 ALIGN_LENGTH(size
, 3);
309 size
+= sizeof(ULONG
);
310 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
311 size
+= sizeof(ULONG_PTR
);
314 size
+= sizeof(ULONG
);
320 size
+= 2 * sizeof(ULONG
);
321 emfsize
= GetEnhMetaFileBits(*phEmf
, 0, NULL
);
329 /******************************************************************************
330 * HENHMETAFILE_UserMarshal [OLE32.@]
332 * Marshals an enhance metafile into a buffer.
335 * pFlags [I] Flags. See notes.
336 * pBuffer [I] Buffer to marshal the clip format into.
337 * phEmf [I] Enhanced metafile to marshal.
340 * The end of the marshaled data in the buffer.
343 * Even though the function is documented to take a pointer to a ULONG in
344 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
345 * the first parameter is a ULONG.
346 * This function is only intended to be called by the RPC runtime.
348 unsigned char * __RPC_USER
HENHMETAFILE_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HENHMETAFILE
*phEmf
)
350 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags
), pBuffer
, *phEmf
);
352 ALIGN_POINTER(pBuffer
, 3);
354 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
356 if (sizeof(*phEmf
) == 8)
357 *(ULONG
*)pBuffer
= WDT_INPROC64_CALL
;
359 *(ULONG
*)pBuffer
= WDT_INPROC_CALL
;
360 pBuffer
+= sizeof(ULONG
);
361 *(HENHMETAFILE
*)pBuffer
= *phEmf
;
362 pBuffer
+= sizeof(HENHMETAFILE
);
366 *(ULONG
*)pBuffer
= WDT_REMOTE_CALL
;
367 pBuffer
+= sizeof(ULONG
);
368 *(ULONG
*)pBuffer
= (ULONG
)(ULONG_PTR
)*phEmf
;
369 pBuffer
+= sizeof(ULONG
);
373 UINT emfsize
= GetEnhMetaFileBits(*phEmf
, 0, NULL
);
375 *(ULONG
*)pBuffer
= emfsize
;
376 pBuffer
+= sizeof(ULONG
);
377 *(ULONG
*)pBuffer
= emfsize
;
378 pBuffer
+= sizeof(ULONG
);
379 GetEnhMetaFileBits(*phEmf
, emfsize
, pBuffer
);
387 /******************************************************************************
388 * HENHMETAFILE_UserUnmarshal [OLE32.@]
390 * Unmarshals an enhanced metafile from a buffer.
393 * pFlags [I] Flags. See notes.
394 * pBuffer [I] Buffer to marshal the clip format from.
395 * phEmf [O] Address that receive the unmarshaled enhanced metafile.
398 * The end of the marshaled data in the buffer.
401 * Even though the function is documented to take a pointer to an ULONG in
402 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
403 * the first parameter is an ULONG.
404 * This function is only intended to be called by the RPC runtime.
406 unsigned char * __RPC_USER
HENHMETAFILE_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HENHMETAFILE
*phEmf
)
410 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags
), pBuffer
, phEmf
);
412 ALIGN_POINTER(pBuffer
, 3);
414 fContext
= *(ULONG
*)pBuffer
;
415 pBuffer
+= sizeof(ULONG
);
417 if (((fContext
== WDT_INPROC_CALL
) && (sizeof(*phEmf
) < 8)) ||
418 ((fContext
== WDT_INPROC64_CALL
) && (sizeof(*phEmf
) == 8)))
420 *phEmf
= *(HENHMETAFILE
*)pBuffer
;
421 pBuffer
+= sizeof(*phEmf
);
423 else if (fContext
== WDT_REMOTE_CALL
)
427 handle
= *(ULONG
*)pBuffer
;
428 pBuffer
+= sizeof(ULONG
);
433 size
= *(ULONG
*)pBuffer
;
434 pBuffer
+= sizeof(ULONG
);
435 if (size
!= *(ULONG
*)pBuffer
)
437 RaiseException(RPC_X_BAD_STUB_DATA
, 0, 0, NULL
);
440 pBuffer
+= sizeof(ULONG
);
441 *phEmf
= SetEnhMetaFileBits(size
, pBuffer
);
448 RaiseException(RPC_S_INVALID_TAG
, 0, 0, NULL
);
453 /******************************************************************************
454 * HENHMETAFILE_UserFree [OLE32.@]
456 * Frees an unmarshaled enhanced metafile.
459 * pFlags [I] Flags. See notes.
460 * phEmf [I] Enhanced metafile to free.
463 * The end of the marshaled data in the buffer.
466 * Even though the function is documented to take a pointer to a ULONG in
467 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
468 * which the first parameter is a ULONG.
469 * This function is only intended to be called by the RPC runtime.
471 void __RPC_USER
HENHMETAFILE_UserFree(ULONG
*pFlags
, HENHMETAFILE
*phEmf
)
473 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags
), *phEmf
);
475 if (LOWORD(*pFlags
) != MSHCTX_INPROC
)
476 DeleteEnhMetaFile(*phEmf
);
479 /******************************************************************************
480 * HMETAFILEPICT_UserSize [OLE32.@]
482 * Calculates the buffer size required to marshal an metafile pict.
485 * pFlags [I] Flags. See notes.
486 * StartingSize [I] Starting size of the buffer. This value is added on to
487 * the buffer size required for the clip format.
488 * phMfp [I] Metafile pict to size.
491 * The buffer size required to marshal a metafile pict plus the starting size.
494 * Even though the function is documented to take a pointer to a ULONG in
495 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
496 * the first parameter is a ULONG.
497 * This function is only intended to be called by the RPC runtime.
499 ULONG __RPC_USER
HMETAFILEPICT_UserSize(ULONG
*pFlags
, ULONG size
, HMETAFILEPICT
*phMfp
)
501 TRACE("%s, %lu, &%p.\n", debugstr_user_flags(pFlags
), size
, *phMfp
);
503 ALIGN_LENGTH(size
, 3);
505 size
+= sizeof(ULONG
);
507 if(LOWORD(*pFlags
) == MSHCTX_INPROC
)
508 size
+= sizeof(HMETAFILEPICT
);
511 size
+= sizeof(ULONG
);
515 METAFILEPICT
*mfpict
= GlobalLock(*phMfp
);
517 /* FIXME: raise an exception if mfpict is NULL? */
518 size
+= 3 * sizeof(ULONG
);
519 size
+= sizeof(ULONG
);
521 size
= HMETAFILE_UserSize(pFlags
, size
, &mfpict
->hMF
);
523 GlobalUnlock(*phMfp
);
530 /******************************************************************************
531 * HMETAFILEPICT_UserMarshal [OLE32.@]
533 * Marshals a metafile pict into a buffer.
536 * pFlags [I] Flags. See notes.
537 * pBuffer [I] Buffer to marshal the clip format into.
538 * phMfp [I] Metafile pict to marshal.
541 * The end of the marshaled data in the buffer.
544 * Even though the function is documented to take a pointer to a ULONG in
545 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
546 * the first parameter is a ULONG.
547 * This function is only intended to be called by the RPC runtime.
549 unsigned char * __RPC_USER
HMETAFILEPICT_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HMETAFILEPICT
*phMfp
)
551 TRACE("(%s, %p, &%p)\n", debugstr_user_flags(pFlags
), pBuffer
, *phMfp
);
553 ALIGN_POINTER(pBuffer
, 3);
555 if (LOWORD(*pFlags
) == MSHCTX_INPROC
)
557 if (sizeof(HMETAFILEPICT
) == 8)
558 *(ULONG
*)pBuffer
= WDT_INPROC64_CALL
;
560 *(ULONG
*)pBuffer
= WDT_INPROC_CALL
;
561 pBuffer
+= sizeof(ULONG
);
562 *(HMETAFILEPICT
*)pBuffer
= *phMfp
;
563 pBuffer
+= sizeof(HMETAFILEPICT
);
567 *(ULONG
*)pBuffer
= WDT_REMOTE_CALL
;
568 pBuffer
+= sizeof(ULONG
);
569 *(ULONG
*)pBuffer
= (ULONG
)(ULONG_PTR
)*phMfp
;
570 pBuffer
+= sizeof(ULONG
);
574 METAFILEPICT
*mfpict
= GlobalLock(*phMfp
);
575 remoteMETAFILEPICT
* remmfpict
= (remoteMETAFILEPICT
*)pBuffer
;
577 /* FIXME: raise an exception if mfpict is NULL? */
578 remmfpict
->mm
= mfpict
->mm
;
579 remmfpict
->xExt
= mfpict
->xExt
;
580 remmfpict
->yExt
= mfpict
->yExt
;
581 pBuffer
+= 3 * sizeof(ULONG
);
582 *(ULONG
*)pBuffer
= USER_MARSHAL_PTR_PREFIX
;
583 pBuffer
+= sizeof(ULONG
);
585 pBuffer
= HMETAFILE_UserMarshal(pFlags
, pBuffer
, &mfpict
->hMF
);
587 GlobalUnlock(*phMfp
);
593 /******************************************************************************
594 * HMETAFILEPICT_UserUnmarshal [OLE32.@]
596 * Unmarshals an metafile pict from a buffer.
599 * pFlags [I] Flags. See notes.
600 * pBuffer [I] Buffer to marshal the clip format from.
601 * phMfp [O] Address that receive the unmarshaled metafile pict.
604 * The end of the marshaled data in the buffer.
607 * Even though the function is documented to take a pointer to an ULONG in
608 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
609 * the first parameter is an ULONG.
610 * This function is only intended to be called by the RPC runtime.
612 unsigned char * __RPC_USER
HMETAFILEPICT_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, HMETAFILEPICT
*phMfp
)
616 TRACE("(%s, %p, %p)\n", debugstr_user_flags(pFlags
), pBuffer
, phMfp
);
618 ALIGN_POINTER(pBuffer
, 3);
620 fContext
= *(ULONG
*)pBuffer
;
621 pBuffer
+= sizeof(ULONG
);
623 if ((fContext
== WDT_INPROC_CALL
) || fContext
== WDT_INPROC64_CALL
)
625 *phMfp
= *(HMETAFILEPICT
*)pBuffer
;
626 pBuffer
+= sizeof(HMETAFILEPICT
);
630 ULONG handle
= *(ULONG
*)pBuffer
;
631 pBuffer
+= sizeof(ULONG
);
636 METAFILEPICT
*mfpict
;
637 const remoteMETAFILEPICT
*remmfpict
;
638 ULONG user_marshal_prefix
;
640 remmfpict
= (const remoteMETAFILEPICT
*)pBuffer
;
642 *phMfp
= GlobalAlloc(GMEM_MOVEABLE
, sizeof(METAFILEPICT
));
644 RpcRaiseException(E_OUTOFMEMORY
);
646 mfpict
= GlobalLock(*phMfp
);
647 mfpict
->mm
= remmfpict
->mm
;
648 mfpict
->xExt
= remmfpict
->xExt
;
649 mfpict
->yExt
= remmfpict
->yExt
;
650 pBuffer
+= 3 * sizeof(ULONG
);
651 user_marshal_prefix
= *(ULONG
*)pBuffer
;
652 pBuffer
+= sizeof(ULONG
);
654 if (user_marshal_prefix
!= USER_MARSHAL_PTR_PREFIX
)
655 RpcRaiseException(RPC_X_INVALID_TAG
);
657 pBuffer
= HMETAFILE_UserUnmarshal(pFlags
, pBuffer
, &mfpict
->hMF
);
659 GlobalUnlock(*phMfp
);
665 /******************************************************************************
666 * HMETAFILEPICT_UserFree [OLE32.@]
668 * Frees an unmarshaled metafile pict.
671 * pFlags [I] Flags. See notes.
672 * phMfp [I] Metafile pict to free.
675 * The end of the marshaled data in the buffer.
678 * Even though the function is documented to take a pointer to a ULONG in
679 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
680 * which the first parameter is a ULONG.
681 * This function is only intended to be called by the RPC runtime.
683 void __RPC_USER
HMETAFILEPICT_UserFree(ULONG
*pFlags
, HMETAFILEPICT
*phMfp
)
685 TRACE("(%s, &%p)\n", debugstr_user_flags(pFlags
), *phMfp
);
687 if ((LOWORD(*pFlags
) != MSHCTX_INPROC
) && *phMfp
)
689 METAFILEPICT
*mfpict
;
691 mfpict
= GlobalLock(*phMfp
);
692 /* FIXME: raise an exception if mfpict is NULL? */
693 HMETAFILE_UserFree(pFlags
, &mfpict
->hMF
);
694 GlobalUnlock(*phMfp
);
700 /******************************************************************************
701 * STGMEDIUM_UserSize [OLE32.@]
703 * Calculates the buffer size required to marshal an STGMEDIUM.
706 * pFlags [I] Flags. See notes.
707 * StartingSize [I] Starting size of the buffer. This value is added on to
708 * the buffer size required for the clip format.
709 * pStgMedium [I] STGMEDIUM to size.
712 * The buffer size required to marshal an STGMEDIUM plus the starting size.
715 * Even though the function is documented to take a pointer to a ULONG in
716 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
717 * the first parameter is a ULONG.
718 * This function is only intended to be called by the RPC runtime.
720 ULONG __RPC_USER
STGMEDIUM_UserSize(ULONG
*pFlags
, ULONG StartingSize
, STGMEDIUM
*pStgMedium
)
722 ULONG size
= StartingSize
;
724 TRACE("%s, %lu, %p.\n", debugstr_user_flags(pFlags
), StartingSize
, pStgMedium
);
726 ALIGN_LENGTH(size
, 3);
728 size
+= 2 * sizeof(DWORD
);
729 if (pStgMedium
->tymed
!= TYMED_NULL
)
730 size
+= sizeof(DWORD
);
732 switch (pStgMedium
->tymed
)
735 TRACE("TYMED_NULL\n");
738 TRACE("TYMED_HGLOBAL\n");
739 if (pStgMedium
->u
.hGlobal
)
740 size
= HGLOBAL_UserSize(pFlags
, size
, &pStgMedium
->u
.hGlobal
);
743 TRACE("TYMED_FILE\n");
744 if (pStgMedium
->u
.lpszFileName
)
746 TRACE("file name is %s\n", debugstr_w(pStgMedium
->u
.lpszFileName
));
747 size
+= 3 * sizeof(DWORD
) +
748 (lstrlenW(pStgMedium
->u
.lpszFileName
) + 1) * sizeof(WCHAR
);
752 TRACE("TYMED_ISTREAM\n");
753 if (pStgMedium
->u
.pstm
)
756 IStream_QueryInterface(pStgMedium
->u
.pstm
, &IID_IUnknown
, (void**)&unk
);
757 size
= WdtpInterfacePointer_UserSize(pFlags
, LOWORD(*pFlags
), size
, unk
, &IID_IStream
);
758 IUnknown_Release(unk
);
762 TRACE("TYMED_ISTORAGE\n");
763 if (pStgMedium
->u
.pstg
)
766 IStorage_QueryInterface(pStgMedium
->u
.pstg
, &IID_IUnknown
, (void**)&unk
);
767 size
= WdtpInterfacePointer_UserSize(pFlags
, LOWORD(*pFlags
), size
, unk
, &IID_IStorage
);
768 IUnknown_Release(unk
);
772 TRACE("TYMED_GDI\n");
773 if (pStgMedium
->u
.hBitmap
)
774 size
= HBITMAP_UserSize(pFlags
, size
, &pStgMedium
->u
.hBitmap
);
777 TRACE("TYMED_MFPICT\n");
778 if (pStgMedium
->u
.hMetaFilePict
)
779 size
= HMETAFILEPICT_UserSize(pFlags
, size
, &pStgMedium
->u
.hMetaFilePict
);
782 TRACE("TYMED_ENHMF\n");
783 if (pStgMedium
->u
.hEnhMetaFile
)
784 size
= HENHMETAFILE_UserSize(pFlags
, size
, &pStgMedium
->u
.hEnhMetaFile
);
787 RaiseException(DV_E_TYMED
, 0, 0, NULL
);
790 if (pStgMedium
->pUnkForRelease
)
791 size
= WdtpInterfacePointer_UserSize(pFlags
, LOWORD(*pFlags
), size
, pStgMedium
->pUnkForRelease
, &IID_IUnknown
);
796 /******************************************************************************
797 * STGMEDIUM_UserMarshal [OLE32.@]
799 * Marshals a STGMEDIUM into a buffer.
802 * pFlags [I] Flags. See notes.
803 * pBuffer [I] Buffer to marshal the clip format into.
804 * pCF [I] STGMEDIUM to marshal.
807 * The end of the marshaled data in the buffer.
810 * Even though the function is documented to take a pointer to a ULONG in
811 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
812 * the first parameter is a ULONG.
813 * This function is only intended to be called by the RPC runtime.
815 unsigned char * __RPC_USER
STGMEDIUM_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, STGMEDIUM
*pStgMedium
)
817 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags
), pBuffer
, pStgMedium
);
819 ALIGN_POINTER(pBuffer
, 3);
821 *(DWORD
*)pBuffer
= pStgMedium
->tymed
;
822 pBuffer
+= sizeof(DWORD
);
823 if (pStgMedium
->tymed
!= TYMED_NULL
)
825 *(DWORD
*)pBuffer
= (DWORD
)(DWORD_PTR
)pStgMedium
->u
.pstg
;
826 pBuffer
+= sizeof(DWORD
);
828 *(DWORD
*)pBuffer
= (DWORD
)(DWORD_PTR
)pStgMedium
->pUnkForRelease
;
829 pBuffer
+= sizeof(DWORD
);
831 switch (pStgMedium
->tymed
)
834 TRACE("TYMED_NULL\n");
837 TRACE("TYMED_HGLOBAL\n");
838 if (pStgMedium
->u
.hGlobal
)
839 pBuffer
= HGLOBAL_UserMarshal(pFlags
, pBuffer
, &pStgMedium
->u
.hGlobal
);
842 TRACE("TYMED_FILE\n");
843 if (pStgMedium
->u
.lpszFileName
)
846 len
= lstrlenW(pStgMedium
->u
.lpszFileName
);
848 *(DWORD
*)pBuffer
= len
+ 1;
849 pBuffer
+= sizeof(DWORD
);
851 *(DWORD
*)pBuffer
= 0;
852 pBuffer
+= sizeof(DWORD
);
854 *(DWORD
*)pBuffer
= len
+ 1;
855 pBuffer
+= sizeof(DWORD
);
857 TRACE("file name is %s\n", debugstr_w(pStgMedium
->u
.lpszFileName
));
858 memcpy(pBuffer
, pStgMedium
->u
.lpszFileName
, (len
+ 1) * sizeof(WCHAR
));
862 TRACE("TYMED_ISTREAM\n");
863 if (pStgMedium
->u
.pstm
)
866 IStream_QueryInterface(pStgMedium
->u
.pstm
, &IID_IUnknown
, (void**)&unk
);
867 pBuffer
= WdtpInterfacePointer_UserMarshal(pFlags
, LOWORD(*pFlags
), pBuffer
, unk
, &IID_IStream
);
868 IUnknown_Release(unk
);
872 TRACE("TYMED_ISTORAGE\n");
873 if (pStgMedium
->u
.pstg
)
876 IStorage_QueryInterface(pStgMedium
->u
.pstg
, &IID_IUnknown
, (void**)&unk
);
877 pBuffer
= WdtpInterfacePointer_UserMarshal(pFlags
, LOWORD(*pFlags
), pBuffer
, unk
, &IID_IStorage
);
878 IUnknown_Release(unk
);
882 TRACE("TYMED_GDI\n");
883 if (pStgMedium
->u
.hBitmap
)
884 pBuffer
= HBITMAP_UserMarshal(pFlags
, pBuffer
, &pStgMedium
->u
.hBitmap
);
887 TRACE("TYMED_MFPICT\n");
888 if (pStgMedium
->u
.hMetaFilePict
)
889 pBuffer
= HMETAFILEPICT_UserMarshal(pFlags
, pBuffer
, &pStgMedium
->u
.hMetaFilePict
);
892 TRACE("TYMED_ENHMF\n");
893 if (pStgMedium
->u
.hEnhMetaFile
)
894 pBuffer
= HENHMETAFILE_UserMarshal(pFlags
, pBuffer
, &pStgMedium
->u
.hEnhMetaFile
);
897 RaiseException(DV_E_TYMED
, 0, 0, NULL
);
900 if (pStgMedium
->pUnkForRelease
)
901 pBuffer
= WdtpInterfacePointer_UserMarshal(pFlags
, LOWORD(*pFlags
), pBuffer
, pStgMedium
->pUnkForRelease
, &IID_IUnknown
);
906 /******************************************************************************
907 * STGMEDIUM_UserUnmarshal [OLE32.@]
909 * Unmarshals a STGMEDIUM from a buffer.
912 * pFlags [I] Flags. See notes.
913 * pBuffer [I] Buffer to marshal the clip format from.
914 * pStgMedium [O] Address that receive the unmarshaled STGMEDIUM.
917 * The end of the marshaled data in the buffer.
920 * Even though the function is documented to take a pointer to an ULONG in
921 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
922 * the first parameter is an ULONG.
923 * This function is only intended to be called by the RPC runtime.
925 unsigned char * __RPC_USER
STGMEDIUM_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, STGMEDIUM
*pStgMedium
)
930 ALIGN_POINTER(pBuffer
, 3);
932 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags
), pBuffer
, pStgMedium
);
934 pStgMedium
->tymed
= *(DWORD
*)pBuffer
;
935 pBuffer
+= sizeof(DWORD
);
936 if (pStgMedium
->tymed
!= TYMED_NULL
)
938 content
= *(DWORD
*)pBuffer
;
939 pBuffer
+= sizeof(DWORD
);
941 releaseunk
= *(DWORD
*)pBuffer
;
942 pBuffer
+= sizeof(DWORD
);
944 switch (pStgMedium
->tymed
)
947 TRACE("TYMED_NULL\n");
950 TRACE("TYMED_HGLOBAL\n");
952 pBuffer
= HGLOBAL_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->u
.hGlobal
);
955 TRACE("TYMED_FILE\n");
960 conformance
= *(DWORD
*)pBuffer
;
961 pBuffer
+= sizeof(DWORD
);
962 if (*(DWORD
*)pBuffer
!= 0)
964 ERR("invalid offset %ld\n", *(DWORD
*)pBuffer
);
965 RpcRaiseException(RPC_S_INVALID_BOUND
);
968 pBuffer
+= sizeof(DWORD
);
969 variance
= *(DWORD
*)pBuffer
;
970 pBuffer
+= sizeof(DWORD
);
971 if (conformance
!= variance
)
973 ERR("conformance (%ld) and variance (%ld) should be equal\n", conformance
, variance
);
974 RpcRaiseException(RPC_S_INVALID_BOUND
);
977 if (conformance
> 0x7fffffff)
979 ERR("conformance %#lx too large\n", conformance
);
980 RpcRaiseException(RPC_S_INVALID_BOUND
);
983 pStgMedium
->u
.lpszFileName
= CoTaskMemAlloc(conformance
* sizeof(WCHAR
));
984 if (!pStgMedium
->u
.lpszFileName
) RpcRaiseException(ERROR_OUTOFMEMORY
);
985 TRACE("unmarshalled file name is %s\n", debugstr_wn((const WCHAR
*)pBuffer
, variance
));
986 memcpy(pStgMedium
->u
.lpszFileName
, pBuffer
, variance
* sizeof(WCHAR
));
987 pBuffer
+= variance
* sizeof(WCHAR
);
990 pStgMedium
->u
.lpszFileName
= NULL
;
993 TRACE("TYMED_ISTREAM\n");
996 pBuffer
= WdtpInterfacePointer_UserUnmarshal(pFlags
, pBuffer
, (IUnknown
**)&pStgMedium
->u
.pstm
, &IID_IStream
);
1000 if (pStgMedium
->u
.pstm
) IStream_Release( pStgMedium
->u
.pstm
);
1001 pStgMedium
->u
.pstm
= NULL
;
1004 case TYMED_ISTORAGE
:
1005 TRACE("TYMED_ISTORAGE\n");
1008 pBuffer
= WdtpInterfacePointer_UserUnmarshal(pFlags
, pBuffer
, (IUnknown
**)&pStgMedium
->u
.pstg
, &IID_IStorage
);
1012 if (pStgMedium
->u
.pstg
) IStorage_Release( pStgMedium
->u
.pstg
);
1013 pStgMedium
->u
.pstg
= NULL
;
1017 TRACE("TYMED_GDI\n");
1019 pBuffer
= HBITMAP_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->u
.hBitmap
);
1021 pStgMedium
->u
.hBitmap
= NULL
;
1024 TRACE("TYMED_MFPICT\n");
1026 pBuffer
= HMETAFILEPICT_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->u
.hMetaFilePict
);
1028 pStgMedium
->u
.hMetaFilePict
= NULL
;
1031 TRACE("TYMED_ENHMF\n");
1033 pBuffer
= HENHMETAFILE_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->u
.hEnhMetaFile
);
1035 pStgMedium
->u
.hEnhMetaFile
= NULL
;
1038 RaiseException(DV_E_TYMED
, 0, 0, NULL
);
1042 pBuffer
= WdtpInterfacePointer_UserUnmarshal(pFlags
, pBuffer
, &pStgMedium
->pUnkForRelease
, &IID_IUnknown
);
1043 /* Unlike the IStream / IStorage ifaces, the existing pUnkForRelease
1044 is left intact if a NULL ptr is unmarshalled - see the tests. */
1049 /******************************************************************************
1050 * STGMEDIUM_UserFree [OLE32.@]
1052 * Frees an unmarshaled STGMEDIUM.
1055 * pFlags [I] Flags. See notes.
1056 * pStgmedium [I] STGMEDIUM to free.
1059 * The end of the marshaled data in the buffer.
1062 * Even though the function is documented to take a pointer to a ULONG in
1063 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
1064 * which the first parameter is a ULONG.
1065 * This function is only intended to be called by the RPC runtime.
1067 void __RPC_USER
STGMEDIUM_UserFree(ULONG
*flags
, STGMEDIUM
*med
)
1069 TRACE("(%s, %p)\n", debugstr_user_flags(flags
), med
);
1076 case TYMED_ISTORAGE
:
1077 ReleaseStgMedium(med
);
1083 if (LOWORD(*flags
) == MSHCTX_INPROC
)
1084 med
->tymed
= TYMED_NULL
;
1085 ReleaseStgMedium(med
);
1088 RaiseException(DV_E_TYMED
, 0, 0, NULL
);
1092 ULONG __RPC_USER
ASYNC_STGMEDIUM_UserSize(ULONG
*pFlags
, ULONG StartingSize
, ASYNC_STGMEDIUM
*pStgMedium
)
1095 return STGMEDIUM_UserSize(pFlags
, StartingSize
, pStgMedium
);
1098 unsigned char * __RPC_USER
ASYNC_STGMEDIUM_UserMarshal( ULONG
*pFlags
, unsigned char *pBuffer
, ASYNC_STGMEDIUM
*pStgMedium
)
1101 return STGMEDIUM_UserMarshal(pFlags
, pBuffer
, pStgMedium
);
1104 unsigned char * __RPC_USER
ASYNC_STGMEDIUM_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, ASYNC_STGMEDIUM
*pStgMedium
)
1107 return STGMEDIUM_UserUnmarshal(pFlags
, pBuffer
, pStgMedium
);
1110 void __RPC_USER
ASYNC_STGMEDIUM_UserFree(ULONG
*pFlags
, ASYNC_STGMEDIUM
*pStgMedium
)
1113 STGMEDIUM_UserFree(pFlags
, pStgMedium
);
1116 ULONG __RPC_USER
FLAG_STGMEDIUM_UserSize(ULONG
*pFlags
, ULONG StartingSize
, FLAG_STGMEDIUM
*pStgMedium
)
1119 return StartingSize
;
1122 unsigned char * __RPC_USER
FLAG_STGMEDIUM_UserMarshal( ULONG
*pFlags
, unsigned char *pBuffer
, FLAG_STGMEDIUM
*pStgMedium
)
1128 unsigned char * __RPC_USER
FLAG_STGMEDIUM_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, FLAG_STGMEDIUM
*pStgMedium
)
1134 void __RPC_USER
FLAG_STGMEDIUM_UserFree(ULONG
*pFlags
, FLAG_STGMEDIUM
*pStgMedium
)
1139 ULONG __RPC_USER
SNB_UserSize(ULONG
*pFlags
, ULONG StartingSize
, SNB
*pSnb
)
1141 ULONG size
= StartingSize
;
1143 TRACE("%s, %lu, %p.\n", debugstr_user_flags(pFlags
), StartingSize
, pSnb
);
1145 ALIGN_LENGTH(size
, 3);
1147 /* two counters from RemSNB header, plus one more ULONG */
1148 size
+= 3*sizeof(ULONG
);
1150 /* now actual data length */
1153 WCHAR
**ptrW
= *pSnb
;
1157 size
+= (lstrlenW(*ptrW
) + 1)*sizeof(WCHAR
);
1172 unsigned char * __RPC_USER
SNB_UserMarshal(ULONG
*pFlags
, unsigned char *pBuffer
, SNB
*pSnb
)
1174 struct SNB_wire
*wire
;
1177 TRACE("(%s, %p, %p)\n", debugstr_user_flags(pFlags
), pBuffer
, pSnb
);
1179 ALIGN_POINTER(pBuffer
, 3);
1181 wire
= (struct SNB_wire
*)pBuffer
;
1182 wire
->charcnt
= wire
->strcnt
= 0;
1183 size
= 3*sizeof(ULONG
);
1187 WCHAR
**ptrW
= *pSnb
;
1188 WCHAR
*dataW
= wire
->data
;
1192 ULONG len
= lstrlenW(*ptrW
) + 1;
1195 wire
->charcnt
+= len
;
1196 memcpy(dataW
, *ptrW
, len
*sizeof(WCHAR
));
1199 size
+= len
*sizeof(WCHAR
);
1204 wire
->datalen
= wire
->charcnt
;
1205 return pBuffer
+ size
;
1208 unsigned char * __RPC_USER
SNB_UserUnmarshal(ULONG
*pFlags
, unsigned char *pBuffer
, SNB
*pSnb
)
1210 USER_MARSHAL_CB
*umcb
= (USER_MARSHAL_CB
*)pFlags
;
1211 struct SNB_wire
*wire
;
1213 TRACE("(%s, %p, %p)\n", debugstr_user_flags(pFlags
), pBuffer
, pSnb
);
1215 wire
= (struct SNB_wire
*)pBuffer
;
1218 umcb
->pStubMsg
->pfnFree(*pSnb
);
1220 if (wire
->datalen
== 0)
1224 WCHAR
*src
= wire
->data
, *dest
;
1228 ptrW
= *pSnb
= umcb
->pStubMsg
->pfnAllocate((wire
->strcnt
+1)*sizeof(WCHAR
*) + wire
->datalen
*sizeof(WCHAR
));
1229 dest
= (WCHAR
*)(*pSnb
+ wire
->strcnt
+ 1);
1231 for (i
= 0; i
< wire
->strcnt
; i
++)
1233 ULONG len
= lstrlenW(src
);
1234 memcpy(dest
, src
, (len
+ 1)*sizeof(WCHAR
));
1243 return pBuffer
+ 3*sizeof(ULONG
) + wire
->datalen
*sizeof(WCHAR
);
1246 void __RPC_USER
SNB_UserFree(ULONG
*pFlags
, SNB
*pSnb
)
1248 USER_MARSHAL_CB
*umcb
= (USER_MARSHAL_CB
*)pFlags
;
1249 TRACE("(%p)\n", pSnb
);
1251 umcb
->pStubMsg
->pfnFree(*pSnb
);
1254 /* call_as/local stubs for unknwn.idl */
1256 HRESULT CALLBACK
IClassFactory_CreateInstance_Proxy(
1257 IClassFactory
* This
,
1258 IUnknown
*pUnkOuter
,
1262 TRACE("(%p, %s, %p)\n", pUnkOuter
, debugstr_guid(riid
), ppvObject
);
1266 ERR("aggregation is not allowed on remote objects\n");
1267 return CLASS_E_NOAGGREGATION
;
1269 return IClassFactory_RemoteCreateInstance_Proxy(This
, riid
,
1270 (IUnknown
**) ppvObject
);
1273 HRESULT __RPC_STUB
IClassFactory_CreateInstance_Stub(
1274 IClassFactory
* This
,
1276 IUnknown
**ppvObject
)
1278 TRACE("(%s, %p)\n", debugstr_guid(riid
), ppvObject
);
1279 return IClassFactory_CreateInstance(This
, NULL
, riid
, (void **) ppvObject
);
1282 HRESULT CALLBACK
IClassFactory_LockServer_Proxy(
1283 IClassFactory
* This
,
1290 HRESULT __RPC_STUB
IClassFactory_LockServer_Stub(
1291 IClassFactory
* This
,
1298 /* call_as/local stubs for objidl.idl */
1300 HRESULT CALLBACK
IEnumUnknown_Next_Proxy(
1304 ULONG
*pceltFetched
)
1307 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1308 if (!pceltFetched
) pceltFetched
= &fetched
;
1309 return IEnumUnknown_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1312 HRESULT __RPC_STUB
IEnumUnknown_Next_Stub(
1316 ULONG
*pceltFetched
)
1319 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1321 hr
= IEnumUnknown_Next(This
, celt
, rgelt
, pceltFetched
);
1322 if (hr
== S_OK
) *pceltFetched
= celt
;
1326 HRESULT CALLBACK
IBindCtx_SetBindOptions_Proxy(
1328 BIND_OPTS
*pbindopts
)
1334 HRESULT __RPC_STUB
IBindCtx_SetBindOptions_Stub(
1336 BIND_OPTS2
*pbindopts
)
1342 HRESULT CALLBACK
IBindCtx_GetBindOptions_Proxy(
1344 BIND_OPTS
*pbindopts
)
1350 HRESULT __RPC_STUB
IBindCtx_GetBindOptions_Stub(
1352 BIND_OPTS2
*pbindopts
)
1358 HRESULT CALLBACK
IEnumMoniker_Next_Proxy(
1362 ULONG
*pceltFetched
)
1365 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1366 if (!pceltFetched
) pceltFetched
= &fetched
;
1367 return IEnumMoniker_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1370 HRESULT __RPC_STUB
IEnumMoniker_Next_Stub(
1374 ULONG
*pceltFetched
)
1377 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1379 hr
= IEnumMoniker_Next(This
, celt
, rgelt
, pceltFetched
);
1380 if (hr
== S_OK
) *pceltFetched
= celt
;
1384 BOOL CALLBACK
IRunnableObject_IsRunning_Proxy(
1385 IRunnableObject
* This
)
1389 memset(&rv
, 0, sizeof rv
);
1393 HRESULT __RPC_STUB
IRunnableObject_IsRunning_Stub(
1394 IRunnableObject
* This
)
1400 HRESULT CALLBACK
IMoniker_BindToObject_Proxy(
1403 IMoniker
*pmkToLeft
,
1411 HRESULT __RPC_STUB
IMoniker_BindToObject_Stub(
1414 IMoniker
*pmkToLeft
,
1416 IUnknown
**ppvResult
)
1422 HRESULT CALLBACK
IMoniker_BindToStorage_Proxy(
1425 IMoniker
*pmkToLeft
,
1429 TRACE("(%p)->(%p %p %s %p)\n", This
, pbc
, pmkToLeft
, debugstr_guid(riid
), ppvObj
);
1430 return IMoniker_RemoteBindToStorage_Proxy(This
, pbc
, pmkToLeft
, riid
, (IUnknown
**)ppvObj
);
1433 HRESULT __RPC_STUB
IMoniker_BindToStorage_Stub(
1436 IMoniker
*pmkToLeft
,
1440 TRACE("(%p)->(%p %p %s %p)\n", This
, pbc
, pmkToLeft
, debugstr_guid(riid
), ppvObj
);
1441 return IMoniker_BindToStorage(This
, pbc
, pmkToLeft
, riid
, (void**)ppvObj
);
1444 HRESULT CALLBACK
IEnumString_Next_Proxy(
1448 ULONG
*pceltFetched
)
1451 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1452 if (!pceltFetched
) pceltFetched
= &fetched
;
1453 return IEnumString_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1456 HRESULT __RPC_STUB
IEnumString_Next_Stub(
1460 ULONG
*pceltFetched
)
1463 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1465 hr
= IEnumString_Next(This
, celt
, rgelt
, pceltFetched
);
1466 if (hr
== S_OK
) *pceltFetched
= celt
;
1470 HRESULT CALLBACK
ISequentialStream_Read_Proxy(
1471 ISequentialStream
* This
,
1479 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbRead
);
1481 hr
= ISequentialStream_RemoteRead_Proxy(This
, pv
, cb
, &read
);
1482 if(pcbRead
) *pcbRead
= read
;
1487 HRESULT __RPC_STUB
ISequentialStream_Read_Stub(
1488 ISequentialStream
* This
,
1493 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbRead
);
1494 return ISequentialStream_Read(This
, pv
, cb
, pcbRead
);
1497 HRESULT CALLBACK
ISequentialStream_Write_Proxy(
1498 ISequentialStream
* This
,
1506 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbWritten
);
1508 hr
= ISequentialStream_RemoteWrite_Proxy(This
, pv
, cb
, &written
);
1509 if(pcbWritten
) *pcbWritten
= written
;
1514 HRESULT __RPC_STUB
ISequentialStream_Write_Stub(
1515 ISequentialStream
* This
,
1520 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbWritten
);
1521 return ISequentialStream_Write(This
, pv
, cb
, pcbWritten
);
1524 HRESULT CALLBACK
IStream_Seek_Proxy(
1526 LARGE_INTEGER dlibMove
,
1528 ULARGE_INTEGER
*plibNewPosition
)
1530 ULARGE_INTEGER newpos
;
1533 TRACE("%p, %s, %ld, %p.\n", This
, wine_dbgstr_longlong(dlibMove
.QuadPart
), dwOrigin
, plibNewPosition
);
1535 hr
= IStream_RemoteSeek_Proxy(This
, dlibMove
, dwOrigin
, &newpos
);
1536 if(plibNewPosition
) *plibNewPosition
= newpos
;
1541 HRESULT __RPC_STUB
IStream_Seek_Stub(
1543 LARGE_INTEGER dlibMove
,
1545 ULARGE_INTEGER
*plibNewPosition
)
1547 TRACE("%p, %s, %ld, %p.\n", This
, wine_dbgstr_longlong(dlibMove
.QuadPart
), dwOrigin
, plibNewPosition
);
1548 return IStream_Seek(This
, dlibMove
, dwOrigin
, plibNewPosition
);
1551 HRESULT CALLBACK
IStream_CopyTo_Proxy(
1555 ULARGE_INTEGER
*pcbRead
,
1556 ULARGE_INTEGER
*pcbWritten
)
1558 ULARGE_INTEGER read
, written
;
1561 TRACE("(%p)->(%p, %s, %p, %p)\n", This
, pstm
, wine_dbgstr_longlong(cb
.QuadPart
), pcbRead
, pcbWritten
);
1563 hr
= IStream_RemoteCopyTo_Proxy(This
, pstm
, cb
, &read
, &written
);
1564 if(pcbRead
) *pcbRead
= read
;
1565 if(pcbWritten
) *pcbWritten
= written
;
1570 HRESULT __RPC_STUB
IStream_CopyTo_Stub(
1574 ULARGE_INTEGER
*pcbRead
,
1575 ULARGE_INTEGER
*pcbWritten
)
1577 TRACE("(%p)->(%p, %s, %p, %p)\n", This
, pstm
, wine_dbgstr_longlong(cb
.QuadPart
), pcbRead
, pcbWritten
);
1579 return IStream_CopyTo(This
, pstm
, cb
, pcbRead
, pcbWritten
);
1582 HRESULT CALLBACK
IEnumSTATSTG_Next_Proxy(
1586 ULONG
*pceltFetched
)
1589 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1590 if (!pceltFetched
) pceltFetched
= &fetched
;
1591 return IEnumSTATSTG_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1594 HRESULT __RPC_STUB
IEnumSTATSTG_Next_Stub(
1598 ULONG
*pceltFetched
)
1601 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1603 hr
= IEnumSTATSTG_Next(This
, celt
, rgelt
, pceltFetched
);
1604 if (hr
== S_OK
) *pceltFetched
= celt
;
1608 HRESULT CALLBACK
IStorage_OpenStream_Proxy(
1616 TRACE("%p, %s, %p, %#lx, %ld, %p.\n", This
, debugstr_w(pwcsName
), reserved1
, grfMode
, reserved2
, ppstm
);
1617 if(reserved1
) WARN("reserved1 %p\n", reserved1
);
1619 return IStorage_RemoteOpenStream_Proxy(This
, pwcsName
, 0, NULL
, grfMode
, reserved2
, ppstm
);
1622 HRESULT __RPC_STUB
IStorage_OpenStream_Stub(
1631 TRACE("%p, %s, %ld, %p, %#lx, %ld, %p.\n", This
, debugstr_w(pwcsName
), cbReserved1
, reserved1
, grfMode
, reserved2
, ppstm
);
1632 if(cbReserved1
|| reserved1
) WARN("cbReserved1 %ld reserved1 %p\n", cbReserved1
, reserved1
);
1634 return IStorage_OpenStream(This
, pwcsName
, NULL
, grfMode
, reserved2
, ppstm
);
1637 HRESULT CALLBACK
IStorage_EnumElements_Proxy(
1642 IEnumSTATSTG
**ppenum
)
1644 TRACE("%p, %ld, %p, %ld, %p.\n", This
, reserved1
, reserved2
, reserved3
, ppenum
);
1645 if(reserved2
) WARN("reserved2 %p\n", reserved2
);
1647 return IStorage_RemoteEnumElements_Proxy(This
, reserved1
, 0, NULL
, reserved3
, ppenum
);
1650 HRESULT __RPC_STUB
IStorage_EnumElements_Stub(
1656 IEnumSTATSTG
**ppenum
)
1658 TRACE("%p, %ld, %ld, %p, %ld, %p.\n", This
, reserved1
, cbReserved2
, reserved2
, reserved3
, ppenum
);
1659 if(cbReserved2
|| reserved2
) WARN("cbReserved2 %ld reserved2 %p\n", cbReserved2
, reserved2
);
1661 return IStorage_EnumElements(This
, reserved1
, NULL
, reserved3
, ppenum
);
1664 HRESULT CALLBACK
ILockBytes_ReadAt_Proxy(
1666 ULARGE_INTEGER ulOffset
,
1674 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbRead
);
1676 hr
= ILockBytes_RemoteReadAt_Proxy(This
, ulOffset
, pv
, cb
, &read
);
1677 if(pcbRead
) *pcbRead
= read
;
1682 HRESULT __RPC_STUB
ILockBytes_ReadAt_Stub(
1684 ULARGE_INTEGER ulOffset
,
1689 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbRead
);
1690 return ILockBytes_ReadAt(This
, ulOffset
, pv
, cb
, pcbRead
);
1693 HRESULT CALLBACK
ILockBytes_WriteAt_Proxy(
1695 ULARGE_INTEGER ulOffset
,
1703 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbWritten
);
1705 hr
= ILockBytes_RemoteWriteAt_Proxy(This
, ulOffset
, pv
, cb
, &written
);
1706 if(pcbWritten
) *pcbWritten
= written
;
1711 HRESULT __RPC_STUB
ILockBytes_WriteAt_Stub(
1713 ULARGE_INTEGER ulOffset
,
1718 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbWritten
);
1719 return ILockBytes_WriteAt(This
, ulOffset
, pv
, cb
, pcbWritten
);
1722 HRESULT CALLBACK
IFillLockBytes_FillAppend_Proxy(
1723 IFillLockBytes
* This
,
1731 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbWritten
);
1733 hr
= IFillLockBytes_RemoteFillAppend_Proxy(This
, pv
, cb
, &written
);
1734 if(pcbWritten
) *pcbWritten
= written
;
1739 HRESULT __RPC_STUB
IFillLockBytes_FillAppend_Stub(
1740 IFillLockBytes
* This
,
1745 TRACE("%p, %p, %lu, %p.\n", This
, pv
, cb
, pcbWritten
);
1746 return IFillLockBytes_FillAppend(This
, pv
, cb
, pcbWritten
);
1749 HRESULT CALLBACK
IFillLockBytes_FillAt_Proxy(
1750 IFillLockBytes
* This
,
1751 ULARGE_INTEGER ulOffset
,
1759 TRACE("%p, %s, %p, %lu, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbWritten
);
1761 hr
= IFillLockBytes_RemoteFillAt_Proxy(This
, ulOffset
, pv
, cb
, &written
);
1762 if(pcbWritten
) *pcbWritten
= written
;
1767 HRESULT __RPC_STUB
IFillLockBytes_FillAt_Stub(
1768 IFillLockBytes
* This
,
1769 ULARGE_INTEGER ulOffset
,
1774 TRACE("%p, %s, %p, %ld, %p.\n", This
, wine_dbgstr_longlong(ulOffset
.QuadPart
), pv
, cb
, pcbWritten
);
1775 return IFillLockBytes_FillAt(This
, ulOffset
, pv
, cb
, pcbWritten
);
1778 HRESULT CALLBACK
IEnumFORMATETC_Next_Proxy(
1779 IEnumFORMATETC
* This
,
1782 ULONG
*pceltFetched
)
1785 if (!pceltFetched
) pceltFetched
= &fetched
;
1786 return IEnumFORMATETC_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1789 HRESULT __RPC_STUB
IEnumFORMATETC_Next_Stub(
1790 IEnumFORMATETC
* This
,
1793 ULONG
*pceltFetched
)
1797 hr
= IEnumFORMATETC_Next(This
, celt
, rgelt
, pceltFetched
);
1798 if (hr
== S_OK
) *pceltFetched
= celt
;
1802 HRESULT CALLBACK
IEnumSTATDATA_Next_Proxy(
1803 IEnumSTATDATA
* This
,
1806 ULONG
*pceltFetched
)
1809 TRACE("%p, %ld, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1810 if (!pceltFetched
) pceltFetched
= &fetched
;
1811 return IEnumSTATDATA_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
1814 HRESULT __RPC_STUB
IEnumSTATDATA_Next_Stub(
1815 IEnumSTATDATA
* This
,
1818 ULONG
*pceltFetched
)
1821 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
1823 hr
= IEnumSTATDATA_Next(This
, celt
, rgelt
, pceltFetched
);
1824 if (hr
== S_OK
) *pceltFetched
= celt
;
1828 void CALLBACK
IAdviseSink_OnDataChange_Proxy(
1830 FORMATETC
*pFormatetc
,
1833 TRACE("(%p)->(%p, %p)\n", This
, pFormatetc
, pStgmed
);
1834 IAdviseSink_RemoteOnDataChange_Proxy(This
, pFormatetc
, pStgmed
);
1837 HRESULT __RPC_STUB
IAdviseSink_OnDataChange_Stub(
1839 FORMATETC
*pFormatetc
,
1840 ASYNC_STGMEDIUM
*pStgmed
)
1842 TRACE("(%p)->(%p, %p)\n", This
, pFormatetc
, pStgmed
);
1843 IAdviseSink_OnDataChange(This
, pFormatetc
, pStgmed
);
1847 void CALLBACK
IAdviseSink_OnViewChange_Proxy(
1852 TRACE("%p, %ld, %ld.\n", This
, dwAspect
, lindex
);
1853 IAdviseSink_RemoteOnViewChange_Proxy(This
, dwAspect
, lindex
);
1856 HRESULT __RPC_STUB
IAdviseSink_OnViewChange_Stub(
1861 TRACE("%p, %ld, %ld.\n", This
, dwAspect
, lindex
);
1862 IAdviseSink_OnViewChange(This
, dwAspect
, lindex
);
1866 void CALLBACK
IAdviseSink_OnRename_Proxy(
1870 TRACE("(%p)->(%p)\n", This
, pmk
);
1871 IAdviseSink_RemoteOnRename_Proxy(This
, pmk
);
1874 HRESULT __RPC_STUB
IAdviseSink_OnRename_Stub(
1878 TRACE("(%p)->(%p)\n", This
, pmk
);
1879 IAdviseSink_OnRename(This
, pmk
);
1883 void CALLBACK
IAdviseSink_OnSave_Proxy(
1886 TRACE("(%p)\n", This
);
1887 IAdviseSink_RemoteOnSave_Proxy(This
);
1890 HRESULT __RPC_STUB
IAdviseSink_OnSave_Stub(
1893 TRACE("(%p)\n", This
);
1894 IAdviseSink_OnSave(This
);
1898 void CALLBACK
IAdviseSink_OnClose_Proxy(
1901 TRACE("(%p)\n", This
);
1902 IAdviseSink_RemoteOnClose_Proxy(This
);
1905 HRESULT __RPC_STUB
IAdviseSink_OnClose_Stub(
1908 TRACE("(%p)\n", This
);
1909 IAdviseSink_OnClose(This
);
1913 void CALLBACK
IAdviseSink2_OnLinkSrcChange_Proxy(
1917 TRACE("(%p)->(%p)\n", This
, pmk
);
1918 IAdviseSink2_RemoteOnLinkSrcChange_Proxy(This
, pmk
);
1921 HRESULT __RPC_STUB
IAdviseSink2_OnLinkSrcChange_Stub(
1925 TRACE("(%p)->(%p)\n", This
, pmk
);
1926 IAdviseSink2_OnLinkSrcChange(This
, pmk
);
1930 HRESULT CALLBACK
IDataObject_GetData_Proxy(
1932 FORMATETC
*pformatetcIn
,
1935 TRACE("(%p)->(%p, %p)\n", This
, pformatetcIn
, pmedium
);
1936 return IDataObject_RemoteGetData_Proxy(This
, pformatetcIn
, pmedium
);
1939 HRESULT __RPC_STUB
IDataObject_GetData_Stub(
1941 FORMATETC
*pformatetcIn
,
1942 STGMEDIUM
*pRemoteMedium
)
1944 TRACE("(%p)->(%p, %p)\n", This
, pformatetcIn
, pRemoteMedium
);
1945 return IDataObject_GetData(This
, pformatetcIn
, pRemoteMedium
);
1948 HRESULT CALLBACK
IDataObject_GetDataHere_Proxy(IDataObject
*iface
, FORMATETC
*fmt
, STGMEDIUM
*med
)
1951 IStorage
*stg
= NULL
;
1954 TRACE("(%p)->(%p, %p)\n", iface
, fmt
, med
);
1956 if ((med
->tymed
& (TYMED_HGLOBAL
| TYMED_FILE
| TYMED_ISTREAM
| TYMED_ISTORAGE
)) == 0)
1958 if (med
->tymed
!= fmt
->tymed
)
1961 release
= med
->pUnkForRelease
;
1962 med
->pUnkForRelease
= NULL
;
1964 if (med
->tymed
== TYMED_ISTREAM
|| med
->tymed
== TYMED_ISTORAGE
)
1966 stg
= med
->u
.pstg
; /* This may actually be a stream, but that's ok */
1967 if (stg
) IStorage_AddRef( stg
);
1970 hr
= IDataObject_RemoteGetDataHere_Proxy(iface
, fmt
, med
);
1972 med
->pUnkForRelease
= release
;
1976 IStorage_Release( med
->u
.pstg
);
1983 HRESULT __RPC_STUB
IDataObject_GetDataHere_Stub(
1985 FORMATETC
*pformatetc
,
1986 STGMEDIUM
*pRemoteMedium
)
1988 TRACE("(%p)->(%p, %p)\n", This
, pformatetc
, pRemoteMedium
);
1989 return IDataObject_GetDataHere(This
, pformatetc
, pRemoteMedium
);
1992 HRESULT CALLBACK
IDataObject_SetData_Proxy(
1994 FORMATETC
*pformatetc
,
2002 HRESULT __RPC_STUB
IDataObject_SetData_Stub(
2004 FORMATETC
*pformatetc
,
2005 FLAG_STGMEDIUM
*pmedium
,
2012 /* call_as/local stubs for oleidl.idl */
2014 HRESULT CALLBACK
IOleInPlaceActiveObject_TranslateAccelerator_Proxy(
2015 IOleInPlaceActiveObject
* This
,
2018 TRACE("(%p %p)\n", This
, lpmsg
);
2019 return IOleInPlaceActiveObject_RemoteTranslateAccelerator_Proxy(This
);
2022 HRESULT __RPC_STUB
IOleInPlaceActiveObject_TranslateAccelerator_Stub(
2023 IOleInPlaceActiveObject
* This
)
2025 TRACE("(%p)\n", This
);
2029 HRESULT CALLBACK
IOleInPlaceActiveObject_ResizeBorder_Proxy(
2030 IOleInPlaceActiveObject
* This
,
2032 IOleInPlaceUIWindow
*pUIWindow
,
2039 HRESULT __RPC_STUB
IOleInPlaceActiveObject_ResizeBorder_Stub(
2040 IOleInPlaceActiveObject
* This
,
2043 IOleInPlaceUIWindow
*pUIWindow
,
2050 HRESULT CALLBACK
IOleCache2_UpdateCache_Proxy(
2052 LPDATAOBJECT pDataObject
,
2056 TRACE("%p, %p, %#lx, %p.\n", This
, pDataObject
, grfUpdf
, pReserved
);
2057 return IOleCache2_RemoteUpdateCache_Proxy(This
, pDataObject
, grfUpdf
, (LONG_PTR
)pReserved
);
2060 HRESULT __RPC_STUB
IOleCache2_UpdateCache_Stub(
2062 LPDATAOBJECT pDataObject
,
2066 TRACE("%p, %p, %#lx, %Id.\n", This
, pDataObject
, grfUpdf
, pReserved
);
2067 return IOleCache2_UpdateCache(This
, pDataObject
, grfUpdf
, (void*)pReserved
);
2070 HRESULT CALLBACK
IEnumOLEVERB_Next_Proxy(
2074 ULONG
*pceltFetched
)
2077 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
2078 if (!pceltFetched
) pceltFetched
= &fetched
;
2079 return IEnumOLEVERB_RemoteNext_Proxy(This
, celt
, rgelt
, pceltFetched
);
2082 HRESULT __RPC_STUB
IEnumOLEVERB_Next_Stub(
2086 ULONG
*pceltFetched
)
2089 TRACE("%p, %lu, %p, %p.\n", This
, celt
, rgelt
, pceltFetched
);
2091 hr
= IEnumOLEVERB_Next(This
, celt
, rgelt
, pceltFetched
);
2092 if (hr
== S_OK
) *pceltFetched
= celt
;
2096 HRESULT CALLBACK
IViewObject_Draw_Proxy(
2101 DVTARGETDEVICE
*ptd
,
2104 LPCRECTL lprcBounds
,
2105 LPCRECTL lprcWBounds
,
2106 BOOL (STDMETHODCALLTYPE
*pfnContinue
)(ULONG_PTR dwContinue
),
2107 ULONG_PTR dwContinue
)
2113 HRESULT __RPC_STUB
IViewObject_Draw_Stub(
2118 DVTARGETDEVICE
*ptd
,
2119 ULONG_PTR hdcTargetDev
,
2121 LPCRECTL lprcBounds
,
2122 LPCRECTL lprcWBounds
,
2123 IContinue
*pContinue
)
2129 HRESULT CALLBACK
IViewObject_GetColorSet_Proxy(
2134 DVTARGETDEVICE
*ptd
,
2136 LOGPALETTE
**ppColorSet
)
2142 HRESULT __RPC_STUB
IViewObject_GetColorSet_Stub(
2147 DVTARGETDEVICE
*ptd
,
2148 ULONG_PTR hicTargetDev
,
2149 LOGPALETTE
**ppColorSet
)
2155 HRESULT CALLBACK
IViewObject_Freeze_Proxy(
2166 HRESULT __RPC_STUB
IViewObject_Freeze_Stub(
2177 HRESULT CALLBACK
IViewObject_GetAdvise_Proxy(
2181 IAdviseSink
**ppAdvSink
)
2187 HRESULT __RPC_STUB
IViewObject_GetAdvise_Stub(
2191 IAdviseSink
**ppAdvSink
)