Sync to trunk head (r47736)
[reactos.git] / dll / win32 / ole32 / usrmarshal.c
1 /*
2 * Miscellaneous Marshaling Routines
3 *
4 * Copyright 2005 Robert Shearman
5 *
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.
10 *
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.
15 *
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
19 */
20
21 #include <stdio.h>
22 #include <stdarg.h>
23 #include <string.h>
24
25 #define COBJMACROS
26 #define NONAMELESSUNION
27 #define NONAMELESSSTRUCT
28
29 #include "windef.h"
30 #include "winbase.h"
31 #include "wingdi.h"
32 #include "winuser.h"
33 #include "winerror.h"
34
35 #include "ole2.h"
36 #include "oleauto.h"
37 #include "rpcproxy.h"
38
39 #include "wine/unicode.h"
40 #include "wine/debug.h"
41
42 WINE_DEFAULT_DEBUG_CHANNEL(ole);
43
44 #define ALIGNED_LENGTH(_Len, _Align) (((_Len)+(_Align))&~(_Align))
45 #define ALIGNED_POINTER(_Ptr, _Align) ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align))
46 #define ALIGN_LENGTH(_Len, _Align) _Len = ALIGNED_LENGTH(_Len, _Align)
47 #define ALIGN_POINTER(_Ptr, _Align) _Ptr = ALIGNED_POINTER(_Ptr, _Align)
48
49 #define USER_MARSHAL_PTR_PREFIX \
50 ( (DWORD)'U' | ( (DWORD)'s' << 8 ) | \
51 ( (DWORD)'e' << 16 ) | ( (DWORD)'r' << 24 ) )
52
53 static const char* debugstr_user_flags(ULONG *pFlags)
54 {
55 char buf[12];
56 const char* loword;
57 switch (LOWORD(*pFlags))
58 {
59 case MSHCTX_LOCAL:
60 loword="MSHCTX_LOCAL";
61 break;
62 case MSHCTX_NOSHAREDMEM:
63 loword="MSHCTX_NOSHAREDMEM";
64 break;
65 case MSHCTX_DIFFERENTMACHINE:
66 loword="MSHCTX_DIFFERENTMACHINE";
67 break;
68 case MSHCTX_INPROC:
69 loword="MSHCTX_INPROC";
70 break;
71 default:
72 sprintf(buf, "%d", LOWORD(*pFlags));
73 loword=buf;
74 }
75
76 if (HIWORD(*pFlags) == NDR_LOCAL_DATA_REPRESENTATION)
77 return wine_dbg_sprintf("MAKELONG(NDR_LOCAL_REPRESENTATION, %s)", loword);
78 else
79 return wine_dbg_sprintf("MAKELONG(0x%04x, %s)", HIWORD(*pFlags), loword);
80 }
81
82 /******************************************************************************
83 * CLIPFORMAT_UserSize [OLE32.@]
84 *
85 * Calculates the buffer size required to marshal a clip format.
86 *
87 * PARAMS
88 * pFlags [I] Flags. See notes.
89 * StartingSize [I] Starting size of the buffer. This value is added on to
90 * the buffer size required for the clip format.
91 * pCF [I] Clip format to size.
92 *
93 * RETURNS
94 * The buffer size required to marshal a clip format plus the starting size.
95 *
96 * NOTES
97 * Even though the function is documented to take a pointer to an unsigned
98 * long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
99 * the first parameter is an unsigned long.
100 * This function is only intended to be called by the RPC runtime.
101 */
102 ULONG __RPC_USER CLIPFORMAT_UserSize(ULONG *pFlags, ULONG StartingSize, CLIPFORMAT *pCF)
103 {
104 ULONG size = StartingSize;
105
106 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, pCF);
107
108 size += 8;
109
110 /* only need to marshal the name if it is not a pre-defined type and
111 * we are going remote */
112 if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
113 {
114 WCHAR format[255];
115 INT ret;
116 size += 3 * sizeof(UINT);
117 /* urg! this function is badly designed because it won't tell us how
118 * much space is needed without doing a dummy run of storing the
119 * name into a buffer */
120 ret = GetClipboardFormatNameW(*pCF, format, sizeof(format)/sizeof(format[0])-1);
121 if (!ret)
122 RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
123 size += (ret + 1) * sizeof(WCHAR);
124 }
125 return size;
126 }
127
128 /******************************************************************************
129 * CLIPFORMAT_UserMarshal [OLE32.@]
130 *
131 * Marshals a clip format into a buffer.
132 *
133 * PARAMS
134 * pFlags [I] Flags. See notes.
135 * pBuffer [I] Buffer to marshal the clip format into.
136 * pCF [I] Clip format to marshal.
137 *
138 * RETURNS
139 * The end of the marshaled data in the buffer.
140 *
141 * NOTES
142 * Even though the function is documented to take a pointer to an unsigned
143 * long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
144 * the first parameter is an unsigned long.
145 * This function is only intended to be called by the RPC runtime.
146 */
147 unsigned char * __RPC_USER CLIPFORMAT_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
148 {
149 TRACE("(%s, %p, &0x%04x\n", debugstr_user_flags(pFlags), pBuffer, *pCF);
150
151 /* only need to marshal the name if it is not a pre-defined type and
152 * we are going remote */
153 if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
154 {
155 WCHAR format[255];
156 UINT len;
157
158 *(DWORD *)pBuffer = WDT_REMOTE_CALL;
159 pBuffer += 4;
160 *(DWORD *)pBuffer = *pCF;
161 pBuffer += 4;
162
163 len = GetClipboardFormatNameW(*pCF, format, sizeof(format)/sizeof(format[0])-1);
164 if (!len)
165 RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
166 len += 1;
167 *(UINT *)pBuffer = len;
168 pBuffer += sizeof(UINT);
169 *(UINT *)pBuffer = 0;
170 pBuffer += sizeof(UINT);
171 *(UINT *)pBuffer = len;
172 pBuffer += sizeof(UINT);
173 TRACE("marshaling format name %s\n", debugstr_w(format));
174 memcpy(pBuffer, format, len * sizeof(WCHAR));
175 pBuffer += len * sizeof(WCHAR);
176 }
177 else
178 {
179 *(DWORD *)pBuffer = WDT_INPROC_CALL;
180 pBuffer += 4;
181 *(DWORD *)pBuffer = *pCF;
182 pBuffer += 4;
183 }
184
185 return pBuffer;
186 }
187
188 /******************************************************************************
189 * CLIPFORMAT_UserUnmarshal [OLE32.@]
190 *
191 * Unmarshals a clip format from a buffer.
192 *
193 * PARAMS
194 * pFlags [I] Flags. See notes.
195 * pBuffer [I] Buffer to marshal the clip format from.
196 * pCF [O] Address that receive the unmarshaled clip format.
197 *
198 * RETURNS
199 * The end of the marshaled data in the buffer.
200 *
201 * NOTES
202 * Even though the function is documented to take a pointer to an unsigned
203 * long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
204 * the first parameter is an unsigned long.
205 * This function is only intended to be called by the RPC runtime.
206 */
207 unsigned char * __RPC_USER CLIPFORMAT_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
208 {
209 LONG fContext;
210
211 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, pCF);
212
213 fContext = *(DWORD *)pBuffer;
214 pBuffer += 4;
215
216 if (fContext == WDT_INPROC_CALL)
217 {
218 *pCF = *(CLIPFORMAT *)pBuffer;
219 pBuffer += 4;
220 }
221 else if (fContext == WDT_REMOTE_CALL)
222 {
223 CLIPFORMAT cf;
224 UINT len;
225
226 /* pointer ID for registered clip format string */
227 if (*(DWORD *)pBuffer == 0)
228 RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
229 pBuffer += 4;
230
231 len = *(UINT *)pBuffer;
232 pBuffer += sizeof(UINT);
233 if (*(UINT *)pBuffer != 0)
234 RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
235 pBuffer += sizeof(UINT);
236 if (*(UINT *)pBuffer != len)
237 RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
238 pBuffer += sizeof(UINT);
239 if (((WCHAR *)pBuffer)[len - 1] != '\0')
240 RaiseException(RPC_S_INVALID_BOUND, 0, 0, NULL);
241 TRACE("unmarshaling clip format %s\n", debugstr_w((LPCWSTR)pBuffer));
242 cf = RegisterClipboardFormatW((LPCWSTR)pBuffer);
243 pBuffer += len * sizeof(WCHAR);
244 if (!cf)
245 RaiseException(DV_E_CLIPFORMAT, 0, 0, NULL);
246 *pCF = cf;
247 }
248 else
249 /* code not really appropriate, but nearest I can find */
250 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
251 return pBuffer;
252 }
253
254 /******************************************************************************
255 * CLIPFORMAT_UserFree [OLE32.@]
256 *
257 * Frees an unmarshaled clip format.
258 *
259 * PARAMS
260 * pFlags [I] Flags. See notes.
261 * pCF [I] Clip format to free.
262 *
263 * RETURNS
264 * The end of the marshaled data in the buffer.
265 *
266 * NOTES
267 * Even though the function is documented to take a pointer to an unsigned
268 * long in pFlags, it actually takes a pointer to a USER_MARSHAL_CB
269 * structure, of which the first parameter is an unsigned long.
270 * This function is only intended to be called by the RPC runtime.
271 */
272 void __RPC_USER CLIPFORMAT_UserFree(ULONG *pFlags, CLIPFORMAT *pCF)
273 {
274 /* there is no inverse of the RegisterClipboardFormat function,
275 * so nothing to do */
276 }
277
278 static ULONG handle_UserSize(ULONG *pFlags, ULONG StartingSize, HANDLE *handle)
279 {
280 if (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE)
281 {
282 ERR("can't remote a local handle\n");
283 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
284 return StartingSize;
285 }
286 return StartingSize + sizeof(RemotableHandle);
287 }
288
289 static unsigned char * handle_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HANDLE *handle)
290 {
291 RemotableHandle *remhandle = (RemotableHandle *)pBuffer;
292 if (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE)
293 {
294 ERR("can't remote a local handle\n");
295 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
296 return pBuffer;
297 }
298 remhandle->fContext = WDT_INPROC_CALL;
299 remhandle->u.hInproc = (LONG_PTR)*handle;
300 return pBuffer + sizeof(RemotableHandle);
301 }
302
303 static unsigned char * handle_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HANDLE *handle)
304 {
305 RemotableHandle *remhandle = (RemotableHandle *)pBuffer;
306 if (remhandle->fContext != WDT_INPROC_CALL)
307 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
308 *handle = (HANDLE)(LONG_PTR)remhandle->u.hInproc;
309 return pBuffer + sizeof(RemotableHandle);
310 }
311
312 static void handle_UserFree(ULONG *pFlags, HANDLE *phMenu)
313 {
314 /* nothing to do */
315 }
316
317 #define IMPL_WIREM_HANDLE(type) \
318 ULONG __RPC_USER type##_UserSize(ULONG *pFlags, ULONG StartingSize, type *handle) \
319 { \
320 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, handle); \
321 return handle_UserSize(pFlags, StartingSize, (HANDLE *)handle); \
322 } \
323 \
324 unsigned char * __RPC_USER type##_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, type *handle) \
325 { \
326 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *handle); \
327 return handle_UserMarshal(pFlags, pBuffer, (HANDLE *)handle); \
328 } \
329 \
330 unsigned char * __RPC_USER type##_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, type *handle) \
331 { \
332 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, handle); \
333 return handle_UserUnmarshal(pFlags, pBuffer, (HANDLE *)handle); \
334 } \
335 \
336 void __RPC_USER type##_UserFree(ULONG *pFlags, type *handle) \
337 { \
338 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags), *handle); \
339 handle_UserFree(pFlags, (HANDLE *)handle); \
340 }
341
342 IMPL_WIREM_HANDLE(HACCEL)
343 IMPL_WIREM_HANDLE(HMENU)
344 IMPL_WIREM_HANDLE(HWND)
345
346 /******************************************************************************
347 * HGLOBAL_UserSize [OLE32.@]
348 *
349 * Calculates the buffer size required to marshal an HGLOBAL.
350 *
351 * PARAMS
352 * pFlags [I] Flags. See notes.
353 * StartingSize [I] Starting size of the buffer. This value is added on to
354 * the buffer size required for the clip format.
355 * phGlobal [I] HGLOBAL to size.
356 *
357 * RETURNS
358 * The buffer size required to marshal an HGLOBAL plus the starting size.
359 *
360 * NOTES
361 * Even though the function is documented to take a pointer to a ULONG in
362 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
363 * the first parameter is a ULONG.
364 * This function is only intended to be called by the RPC runtime.
365 */
366 ULONG __RPC_USER HGLOBAL_UserSize(ULONG *pFlags, ULONG StartingSize, HGLOBAL *phGlobal)
367 {
368 ULONG size = StartingSize;
369
370 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, phGlobal);
371
372 ALIGN_LENGTH(size, 3);
373
374 size += sizeof(ULONG);
375
376 if (LOWORD(*pFlags == MSHCTX_INPROC))
377 size += sizeof(HGLOBAL);
378 else
379 {
380 size += sizeof(ULONG);
381 if (*phGlobal)
382 {
383 SIZE_T ret;
384 size += 3 * sizeof(ULONG);
385 ret = GlobalSize(*phGlobal);
386 size += (ULONG)ret;
387 }
388 }
389
390 return size;
391 }
392
393 /******************************************************************************
394 * HGLOBAL_UserMarshal [OLE32.@]
395 *
396 * Marshals an HGLOBAL into a buffer.
397 *
398 * PARAMS
399 * pFlags [I] Flags. See notes.
400 * pBuffer [I] Buffer to marshal the clip format into.
401 * phGlobal [I] HGLOBAL to marshal.
402 *
403 * RETURNS
404 * The end of the marshaled data in the buffer.
405 *
406 * NOTES
407 * Even though the function is documented to take a pointer to a ULONG in
408 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
409 * the first parameter is a ULONG.
410 * This function is only intended to be called by the RPC runtime.
411 */
412 unsigned char * __RPC_USER HGLOBAL_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HGLOBAL *phGlobal)
413 {
414 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *phGlobal);
415
416 ALIGN_POINTER(pBuffer, 3);
417
418 if (LOWORD(*pFlags == MSHCTX_INPROC))
419 {
420 if (sizeof(*phGlobal) == 8)
421 *(ULONG *)pBuffer = WDT_INPROC64_CALL;
422 else
423 *(ULONG *)pBuffer = WDT_INPROC_CALL;
424 pBuffer += sizeof(ULONG);
425 *(HGLOBAL *)pBuffer = *phGlobal;
426 pBuffer += sizeof(HGLOBAL);
427 }
428 else
429 {
430 *(ULONG *)pBuffer = WDT_REMOTE_CALL;
431 pBuffer += sizeof(ULONG);
432 *(ULONG *)pBuffer = (ULONG)*phGlobal;
433 pBuffer += sizeof(ULONG);
434 if (*phGlobal)
435 {
436 const unsigned char *memory;
437 SIZE_T size = GlobalSize(*phGlobal);
438 *(ULONG *)pBuffer = (ULONG)size;
439 pBuffer += sizeof(ULONG);
440 *(ULONG *)pBuffer = (ULONG)*phGlobal;
441 pBuffer += sizeof(ULONG);
442 *(ULONG *)pBuffer = (ULONG)size;
443 pBuffer += sizeof(ULONG);
444
445 memory = GlobalLock(*phGlobal);
446 memcpy(pBuffer, memory, size);
447 pBuffer += size;
448 GlobalUnlock(*phGlobal);
449 }
450 }
451
452 return pBuffer;
453 }
454
455 /******************************************************************************
456 * HGLOBAL_UserUnmarshal [OLE32.@]
457 *
458 * Unmarshals an HGLOBAL from a buffer.
459 *
460 * PARAMS
461 * pFlags [I] Flags. See notes.
462 * pBuffer [I] Buffer to marshal the clip format from.
463 * phGlobal [O] Address that receive the unmarshaled HGLOBAL.
464 *
465 * RETURNS
466 * The end of the marshaled data in the buffer.
467 *
468 * NOTES
469 * Even though the function is documented to take a pointer to an ULONG in
470 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
471 * the first parameter is an ULONG.
472 * This function is only intended to be called by the RPC runtime.
473 */
474 unsigned char * __RPC_USER HGLOBAL_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HGLOBAL *phGlobal)
475 {
476 ULONG fContext;
477
478 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *phGlobal);
479
480 ALIGN_POINTER(pBuffer, 3);
481
482 fContext = *(ULONG *)pBuffer;
483 pBuffer += sizeof(ULONG);
484
485 if (((fContext == WDT_INPROC_CALL) && (sizeof(*phGlobal) < 8)) ||
486 ((fContext == WDT_INPROC64_CALL) && (sizeof(*phGlobal) == 8)))
487 {
488 *phGlobal = *(HGLOBAL *)pBuffer;
489 pBuffer += sizeof(*phGlobal);
490 }
491 else if (fContext == WDT_REMOTE_CALL)
492 {
493 ULONG handle;
494
495 handle = *(ULONG *)pBuffer;
496 pBuffer += sizeof(ULONG);
497
498 if (handle)
499 {
500 ULONG size;
501 void *memory;
502
503 size = *(ULONG *)pBuffer;
504 pBuffer += sizeof(ULONG);
505 /* redundancy is bad - it means you have to check consistency like
506 * this: */
507 if (*(ULONG *)pBuffer != handle)
508 {
509 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
510 return pBuffer;
511 }
512 pBuffer += sizeof(ULONG);
513 /* redundancy is bad - it means you have to check consistency like
514 * this: */
515 if (*(ULONG *)pBuffer != size)
516 {
517 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
518 return pBuffer;
519 }
520 pBuffer += sizeof(ULONG);
521
522 /* FIXME: check size is not too big */
523
524 *phGlobal = GlobalAlloc(GMEM_MOVEABLE, size);
525 memory = GlobalLock(*phGlobal);
526 memcpy(memory, pBuffer, size);
527 pBuffer += size;
528 GlobalUnlock(*phGlobal);
529 }
530 else
531 *phGlobal = NULL;
532 }
533 else
534 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
535
536 return pBuffer;
537 }
538
539 /******************************************************************************
540 * HGLOBAL_UserFree [OLE32.@]
541 *
542 * Frees an unmarshaled HGLOBAL.
543 *
544 * PARAMS
545 * pFlags [I] Flags. See notes.
546 * phGlobal [I] HGLOBAL to free.
547 *
548 * RETURNS
549 * The end of the marshaled data in the buffer.
550 *
551 * NOTES
552 * Even though the function is documented to take a pointer to a ULONG in
553 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
554 * which the first parameter is a ULONG.
555 * This function is only intended to be called by the RPC runtime.
556 */
557 void __RPC_USER HGLOBAL_UserFree(ULONG *pFlags, HGLOBAL *phGlobal)
558 {
559 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags), *phGlobal);
560
561 if (LOWORD(*pFlags != MSHCTX_INPROC) && *phGlobal)
562 GlobalFree(*phGlobal);
563 }
564
565 /******************************************************************************
566 * HBITMAP_UserSize [OLE32.@]
567 *
568 * Calculates the buffer size required to marshal a bitmap.
569 *
570 * PARAMS
571 * pFlags [I] Flags. See notes.
572 * StartingSize [I] Starting size of the buffer. This value is added on to
573 * the buffer size required for the clip format.
574 * phBmp [I] Bitmap to size.
575 *
576 * RETURNS
577 * The buffer size required to marshal an bitmap plus the starting size.
578 *
579 * NOTES
580 * Even though the function is documented to take a pointer to a ULONG in
581 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
582 * the first parameter is a ULONG.
583 * This function is only intended to be called by the RPC runtime.
584 */
585 ULONG __RPC_USER HBITMAP_UserSize(ULONG *pFlags, ULONG StartingSize, HBITMAP *phBmp)
586 {
587 FIXME(":stub\n");
588 return StartingSize;
589 }
590
591 /******************************************************************************
592 * HBITMAP_UserMarshal [OLE32.@]
593 *
594 * Marshals a bitmap into a buffer.
595 *
596 * PARAMS
597 * pFlags [I] Flags. See notes.
598 * pBuffer [I] Buffer to marshal the clip format into.
599 * phBmp [I] Bitmap to marshal.
600 *
601 * RETURNS
602 * The end of the marshaled data in the buffer.
603 *
604 * NOTES
605 * Even though the function is documented to take a pointer to a ULONG in
606 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
607 * the first parameter is a ULONG.
608 * This function is only intended to be called by the RPC runtime.
609 */
610 unsigned char * __RPC_USER HBITMAP_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HBITMAP *phBmp)
611 {
612 FIXME(":stub\n");
613 return pBuffer;
614 }
615
616 /******************************************************************************
617 * HBITMAP_UserUnmarshal [OLE32.@]
618 *
619 * Unmarshals a bitmap from a buffer.
620 *
621 * PARAMS
622 * pFlags [I] Flags. See notes.
623 * pBuffer [I] Buffer to marshal the clip format from.
624 * phBmp [O] Address that receive the unmarshaled bitmap.
625 *
626 * RETURNS
627 * The end of the marshaled data in the buffer.
628 *
629 * NOTES
630 * Even though the function is documented to take a pointer to an ULONG in
631 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
632 * the first parameter is an ULONG.
633 * This function is only intended to be called by the RPC runtime.
634 */
635 unsigned char * __RPC_USER HBITMAP_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HBITMAP *phBmp)
636 {
637 FIXME(":stub\n");
638 return pBuffer;
639 }
640
641 /******************************************************************************
642 * HBITMAP_UserFree [OLE32.@]
643 *
644 * Frees an unmarshaled bitmap.
645 *
646 * PARAMS
647 * pFlags [I] Flags. See notes.
648 * phBmp [I] Bitmap to free.
649 *
650 * RETURNS
651 * The end of the marshaled data in the buffer.
652 *
653 * NOTES
654 * Even though the function is documented to take a pointer to a ULONG in
655 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
656 * which the first parameter is a ULONG.
657 * This function is only intended to be called by the RPC runtime.
658 */
659 void __RPC_USER HBITMAP_UserFree(ULONG *pFlags, HBITMAP *phBmp)
660 {
661 FIXME(":stub\n");
662 }
663
664 /******************************************************************************
665 * HICON_UserSize [OLE32.@]
666 *
667 * Calculates the buffer size required to marshal an icon.
668 *
669 * PARAMS
670 * pFlags [I] Flags. See notes.
671 * StartingSize [I] Starting size of the buffer. This value is added on to
672 * the buffer size required for the icon.
673 * phIcon [I] Icon to size.
674 *
675 * RETURNS
676 * The buffer size required to marshal an icon plus the starting size.
677 *
678 * NOTES
679 * Even though the function is documented to take a pointer to a ULONG in
680 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
681 * the first parameter is a ULONG.
682 * This function is only intended to be called by the RPC runtime.
683 */
684 ULONG __RPC_USER HICON_UserSize(ULONG *pFlags, ULONG StartingSize, HICON *phIcon)
685 {
686 FIXME(":stub\n");
687 return StartingSize;
688 }
689
690 /******************************************************************************
691 * HICON_UserMarshal [OLE32.@]
692 *
693 * Marshals an icon into a buffer.
694 *
695 * PARAMS
696 * pFlags [I] Flags. See notes.
697 * pBuffer [I] Buffer to marshal the icon into.
698 * phIcon [I] Icon to marshal.
699 *
700 * RETURNS
701 * The end of the marshaled data in the buffer.
702 *
703 * NOTES
704 * Even though the function is documented to take a pointer to a ULONG in
705 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
706 * the first parameter is a ULONG.
707 * This function is only intended to be called by the RPC runtime.
708 */
709 unsigned char * __RPC_USER HICON_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HICON *phIcon)
710 {
711 FIXME(":stub\n");
712 return pBuffer;
713 }
714
715 /******************************************************************************
716 * HICON_UserUnmarshal [OLE32.@]
717 *
718 * Unmarshals an icon from a buffer.
719 *
720 * PARAMS
721 * pFlags [I] Flags. See notes.
722 * pBuffer [I] Buffer to marshal the icon from.
723 * phIcon [O] Address that receive the unmarshaled icon.
724 *
725 * RETURNS
726 * The end of the marshaled data in the buffer.
727 *
728 * NOTES
729 * Even though the function is documented to take a pointer to an ULONG in
730 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
731 * the first parameter is an ULONG.
732 * This function is only intended to be called by the RPC runtime.
733 */
734 unsigned char * __RPC_USER HICON_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HICON *phIcon)
735 {
736 FIXME(":stub\n");
737 return pBuffer;
738 }
739
740 /******************************************************************************
741 * HICON_UserFree [OLE32.@]
742 *
743 * Frees an unmarshaled icon.
744 *
745 * PARAMS
746 * pFlags [I] Flags. See notes.
747 * phIcon [I] Icon to free.
748 *
749 * RETURNS
750 * The end of the marshaled data in the buffer.
751 *
752 * NOTES
753 * Even though the function is documented to take a pointer to a ULONG in
754 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
755 * which the first parameter is a ULONG.
756 * This function is only intended to be called by the RPC runtime.
757 */
758 void __RPC_USER HICON_UserFree(ULONG *pFlags, HICON *phIcon)
759 {
760 FIXME(":stub\n");
761 }
762
763 /******************************************************************************
764 * HDC_UserSize [OLE32.@]
765 *
766 * Calculates the buffer size required to marshal an HDC.
767 *
768 * PARAMS
769 * pFlags [I] Flags. See notes.
770 * StartingSize [I] Starting size of the buffer. This value is added on to
771 * the buffer size required for the clip format.
772 * phGlobal [I] HDC to size.
773 *
774 * RETURNS
775 * The buffer size required to marshal an HDC plus the starting size.
776 *
777 * NOTES
778 * Even though the function is documented to take a pointer to a ULONG in
779 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
780 * the first parameter is a ULONG.
781 * This function is only intended to be called by the RPC runtime.
782 */
783 ULONG __RPC_USER HDC_UserSize(ULONG *pFlags, ULONG StartingSize, HDC *phdc)
784 {
785 FIXME(":stub\n");
786 return StartingSize;
787 }
788
789 /******************************************************************************
790 * HDC_UserMarshal [OLE32.@]
791 *
792 * Marshals an HDC into a buffer.
793 *
794 * PARAMS
795 * pFlags [I] Flags. See notes.
796 * pBuffer [I] Buffer to marshal the clip format into.
797 * phdc [I] HDC to marshal.
798 *
799 * RETURNS
800 * The end of the marshaled data in the buffer.
801 *
802 * NOTES
803 * Even though the function is documented to take a pointer to a ULONG in
804 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
805 * the first parameter is a ULONG.
806 * This function is only intended to be called by the RPC runtime.
807 */
808 unsigned char * __RPC_USER HDC_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HDC *phdc)
809 {
810 FIXME(":stub\n");
811 return pBuffer;
812 }
813
814 /******************************************************************************
815 * HDC_UserUnmarshal [OLE32.@]
816 *
817 * Unmarshals an HDC from a buffer.
818 *
819 * PARAMS
820 * pFlags [I] Flags. See notes.
821 * pBuffer [I] Buffer to marshal the clip format from.
822 * phdc [O] Address that receive the unmarshaled HDC.
823 *
824 * RETURNS
825 * The end of the marshaled data in the buffer.
826 *
827 * NOTES
828 * Even though the function is documented to take a pointer to an ULONG in
829 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
830 * the first parameter is an ULONG.
831 * This function is only intended to be called by the RPC runtime.
832 */
833 unsigned char * __RPC_USER HDC_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HDC *phdc)
834 {
835 FIXME(":stub\n");
836 return pBuffer;
837 }
838
839 /******************************************************************************
840 * HDC_UserFree [OLE32.@]
841 *
842 * Frees an unmarshaled HDC.
843 *
844 * PARAMS
845 * pFlags [I] Flags. See notes.
846 * phdc [I] HDC to free.
847 *
848 * RETURNS
849 * The end of the marshaled data in the buffer.
850 *
851 * NOTES
852 * Even though the function is documented to take a pointer to a ULONG in
853 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
854 * which the first parameter is a ULONG.
855 * This function is only intended to be called by the RPC runtime.
856 */
857 void __RPC_USER HDC_UserFree(ULONG *pFlags, HDC *phdc)
858 {
859 FIXME(":stub\n");
860 }
861
862 /******************************************************************************
863 * HPALETTE_UserSize [OLE32.@]
864 *
865 * Calculates the buffer size required to marshal a palette.
866 *
867 * PARAMS
868 * pFlags [I] Flags. See notes.
869 * StartingSize [I] Starting size of the buffer. This value is added on to
870 * the buffer size required for the clip format.
871 * phPal [I] Palette to size.
872 *
873 * RETURNS
874 * The buffer size required to marshal a palette plus the starting size.
875 *
876 * NOTES
877 * Even though the function is documented to take a pointer to a ULONG in
878 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
879 * the first parameter is a ULONG.
880 * This function is only intended to be called by the RPC runtime.
881 */
882 ULONG __RPC_USER HPALETTE_UserSize(ULONG *pFlags, ULONG StartingSize, HPALETTE *phPal)
883 {
884 FIXME(":stub\n");
885 return StartingSize;
886 }
887
888 /******************************************************************************
889 * HPALETTE_UserMarshal [OLE32.@]
890 *
891 * Marshals a palette into a buffer.
892 *
893 * PARAMS
894 * pFlags [I] Flags. See notes.
895 * pBuffer [I] Buffer to marshal the clip format into.
896 * phPal [I] Palette to marshal.
897 *
898 * RETURNS
899 * The end of the marshaled data in the buffer.
900 *
901 * NOTES
902 * Even though the function is documented to take a pointer to a ULONG in
903 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
904 * the first parameter is a ULONG.
905 * This function is only intended to be called by the RPC runtime.
906 */
907 unsigned char * __RPC_USER HPALETTE_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HPALETTE *phPal)
908 {
909 FIXME(":stub\n");
910 return pBuffer;
911 }
912
913 /******************************************************************************
914 * HPALETTE_UserUnmarshal [OLE32.@]
915 *
916 * Unmarshals a palette from a buffer.
917 *
918 * PARAMS
919 * pFlags [I] Flags. See notes.
920 * pBuffer [I] Buffer to marshal the clip format from.
921 * phPal [O] Address that receive the unmarshaled palette.
922 *
923 * RETURNS
924 * The end of the marshaled data in the buffer.
925 *
926 * NOTES
927 * Even though the function is documented to take a pointer to an ULONG in
928 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
929 * the first parameter is an ULONG.
930 * This function is only intended to be called by the RPC runtime.
931 */
932 unsigned char * __RPC_USER HPALETTE_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HPALETTE *phPal)
933 {
934 FIXME(":stub\n");
935 return pBuffer;
936 }
937
938 /******************************************************************************
939 * HPALETTE_UserFree [OLE32.@]
940 *
941 * Frees an unmarshaled palette.
942 *
943 * PARAMS
944 * pFlags [I] Flags. See notes.
945 * phPal [I] Palette to free.
946 *
947 * RETURNS
948 * The end of the marshaled data in the buffer.
949 *
950 * NOTES
951 * Even though the function is documented to take a pointer to a ULONG in
952 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
953 * which the first parameter is a ULONG.
954 * This function is only intended to be called by the RPC runtime.
955 */
956 void __RPC_USER HPALETTE_UserFree(ULONG *pFlags, HPALETTE *phPal)
957 {
958 FIXME(":stub\n");
959 }
960
961
962 /******************************************************************************
963 * HMETAFILE_UserSize [OLE32.@]
964 *
965 * Calculates the buffer size required to marshal a metafile.
966 *
967 * PARAMS
968 * pFlags [I] Flags. See notes.
969 * StartingSize [I] Starting size of the buffer. This value is added on to
970 * the buffer size required for the clip format.
971 * phmf [I] Metafile to size.
972 *
973 * RETURNS
974 * The buffer size required to marshal a metafile plus the starting size.
975 *
976 * NOTES
977 * Even though the function is documented to take a pointer to a ULONG in
978 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
979 * the first parameter is a ULONG.
980 * This function is only intended to be called by the RPC runtime.
981 */
982 ULONG __RPC_USER HMETAFILE_UserSize(ULONG *pFlags, ULONG StartingSize, HMETAFILE *phmf)
983 {
984 ULONG size = StartingSize;
985
986 TRACE("(%s, %d, &%p\n", debugstr_user_flags(pFlags), StartingSize, *phmf);
987
988 ALIGN_LENGTH(size, 3);
989
990 size += sizeof(ULONG);
991 if (LOWORD(*pFlags) == MSHCTX_INPROC)
992 size += sizeof(ULONG_PTR);
993 else
994 {
995 size += sizeof(ULONG);
996
997 if (*phmf)
998 {
999 UINT mfsize;
1000
1001 size += 2 * sizeof(ULONG);
1002 mfsize = GetMetaFileBitsEx(*phmf, 0, NULL);
1003 size += mfsize;
1004 }
1005 }
1006
1007 return size;
1008 }
1009
1010 /******************************************************************************
1011 * HMETAFILE_UserMarshal [OLE32.@]
1012 *
1013 * Marshals a metafile into a buffer.
1014 *
1015 * PARAMS
1016 * pFlags [I] Flags. See notes.
1017 * pBuffer [I] Buffer to marshal the clip format into.
1018 * phEmf [I] Metafile to marshal.
1019 *
1020 * RETURNS
1021 * The end of the marshaled data in the buffer.
1022 *
1023 * NOTES
1024 * Even though the function is documented to take a pointer to a ULONG in
1025 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1026 * the first parameter is a ULONG.
1027 * This function is only intended to be called by the RPC runtime.
1028 */
1029 unsigned char * __RPC_USER HMETAFILE_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HMETAFILE *phmf)
1030 {
1031 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *phmf);
1032
1033 ALIGN_POINTER(pBuffer, 3);
1034
1035 if (LOWORD(*pFlags) == MSHCTX_INPROC)
1036 {
1037 if (sizeof(*phmf) == 8)
1038 *(ULONG *)pBuffer = WDT_INPROC64_CALL;
1039 else
1040 *(ULONG *)pBuffer = WDT_INPROC_CALL;
1041 pBuffer += sizeof(ULONG);
1042 *(HMETAFILE *)pBuffer = *phmf;
1043 pBuffer += sizeof(HMETAFILE);
1044 }
1045 else
1046 {
1047 *(ULONG *)pBuffer = WDT_REMOTE_CALL;
1048 pBuffer += sizeof(ULONG);
1049 *(ULONG *)pBuffer = (ULONG)(ULONG_PTR)*phmf;
1050 pBuffer += sizeof(ULONG);
1051
1052 if (*phmf)
1053 {
1054 UINT mfsize = GetMetaFileBitsEx(*phmf, 0, NULL);
1055
1056 *(ULONG *)pBuffer = mfsize;
1057 pBuffer += sizeof(ULONG);
1058 *(ULONG *)pBuffer = mfsize;
1059 pBuffer += sizeof(ULONG);
1060 GetMetaFileBitsEx(*phmf, mfsize, pBuffer);
1061 pBuffer += mfsize;
1062 }
1063 }
1064
1065 return pBuffer;
1066 }
1067
1068 /******************************************************************************
1069 * HMETAFILE_UserUnmarshal [OLE32.@]
1070 *
1071 * Unmarshals a metafile from a buffer.
1072 *
1073 * PARAMS
1074 * pFlags [I] Flags. See notes.
1075 * pBuffer [I] Buffer to marshal the clip format from.
1076 * phmf [O] Address that receive the unmarshaled metafile.
1077 *
1078 * RETURNS
1079 * The end of the marshaled data in the buffer.
1080 *
1081 * NOTES
1082 * Even though the function is documented to take a pointer to an ULONG in
1083 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1084 * the first parameter is an ULONG.
1085 * This function is only intended to be called by the RPC runtime.
1086 */
1087 unsigned char * __RPC_USER HMETAFILE_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HMETAFILE *phmf)
1088 {
1089 ULONG fContext;
1090
1091 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, phmf);
1092
1093 ALIGN_POINTER(pBuffer, 3);
1094
1095 fContext = *(ULONG *)pBuffer;
1096 pBuffer += sizeof(ULONG);
1097
1098 if (((fContext == WDT_INPROC_CALL) && (sizeof(*phmf) < 8)) ||
1099 ((fContext == WDT_INPROC64_CALL) && (sizeof(*phmf) == 8)))
1100 {
1101 *phmf = *(HMETAFILE *)pBuffer;
1102 pBuffer += sizeof(*phmf);
1103 }
1104 else if (fContext == WDT_REMOTE_CALL)
1105 {
1106 ULONG handle;
1107
1108 handle = *(ULONG *)pBuffer;
1109 pBuffer += sizeof(ULONG);
1110
1111 if (handle)
1112 {
1113 ULONG size;
1114 size = *(ULONG *)pBuffer;
1115 pBuffer += sizeof(ULONG);
1116 if (size != *(ULONG *)pBuffer)
1117 {
1118 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
1119 return pBuffer;
1120 }
1121 pBuffer += sizeof(ULONG);
1122 *phmf = SetMetaFileBitsEx(size, pBuffer);
1123 pBuffer += size;
1124 }
1125 else
1126 *phmf = NULL;
1127 }
1128 else
1129 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
1130
1131 return pBuffer;
1132 }
1133
1134 /******************************************************************************
1135 * HMETAFILE_UserFree [OLE32.@]
1136 *
1137 * Frees an unmarshaled metafile.
1138 *
1139 * PARAMS
1140 * pFlags [I] Flags. See notes.
1141 * phmf [I] Metafile to free.
1142 *
1143 * RETURNS
1144 * The end of the marshaled data in the buffer.
1145 *
1146 * NOTES
1147 * Even though the function is documented to take a pointer to a ULONG in
1148 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
1149 * which the first parameter is a ULONG.
1150 * This function is only intended to be called by the RPC runtime.
1151 */
1152 void __RPC_USER HMETAFILE_UserFree(ULONG *pFlags, HMETAFILE *phmf)
1153 {
1154 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags), *phmf);
1155
1156 if (LOWORD(*pFlags) != MSHCTX_INPROC)
1157 DeleteMetaFile(*phmf);
1158 }
1159
1160 /******************************************************************************
1161 * HENHMETAFILE_UserSize [OLE32.@]
1162 *
1163 * Calculates the buffer size required to marshal an enhanced metafile.
1164 *
1165 * PARAMS
1166 * pFlags [I] Flags. See notes.
1167 * StartingSize [I] Starting size of the buffer. This value is added on to
1168 * the buffer size required for the clip format.
1169 * phEmf [I] Enhanced metafile to size.
1170 *
1171 * RETURNS
1172 * The buffer size required to marshal an enhanced metafile plus the starting size.
1173 *
1174 * NOTES
1175 * Even though the function is documented to take a pointer to a ULONG in
1176 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1177 * the first parameter is a ULONG.
1178 * This function is only intended to be called by the RPC runtime.
1179 */
1180 ULONG __RPC_USER HENHMETAFILE_UserSize(ULONG *pFlags, ULONG StartingSize, HENHMETAFILE *phEmf)
1181 {
1182 ULONG size = StartingSize;
1183
1184 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, *phEmf);
1185
1186 size += sizeof(ULONG);
1187 if (LOWORD(*pFlags) == MSHCTX_INPROC)
1188 size += sizeof(ULONG_PTR);
1189 else
1190 {
1191 size += sizeof(ULONG);
1192
1193 if (*phEmf)
1194 {
1195 UINT emfsize;
1196
1197 size += 2 * sizeof(ULONG);
1198 emfsize = GetEnhMetaFileBits(*phEmf, 0, NULL);
1199 size += emfsize;
1200 }
1201 }
1202
1203 return size;
1204 }
1205
1206 /******************************************************************************
1207 * HENHMETAFILE_UserMarshal [OLE32.@]
1208 *
1209 * Marshals an enhance metafile into a buffer.
1210 *
1211 * PARAMS
1212 * pFlags [I] Flags. See notes.
1213 * pBuffer [I] Buffer to marshal the clip format into.
1214 * phEmf [I] Enhanced metafile to marshal.
1215 *
1216 * RETURNS
1217 * The end of the marshaled data in the buffer.
1218 *
1219 * NOTES
1220 * Even though the function is documented to take a pointer to a ULONG in
1221 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1222 * the first parameter is a ULONG.
1223 * This function is only intended to be called by the RPC runtime.
1224 */
1225 unsigned char * __RPC_USER HENHMETAFILE_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HENHMETAFILE *phEmf)
1226 {
1227 TRACE("(%s, %p, &%p\n", debugstr_user_flags(pFlags), pBuffer, *phEmf);
1228
1229 if (LOWORD(*pFlags) == MSHCTX_INPROC)
1230 {
1231 if (sizeof(*phEmf) == 8)
1232 *(ULONG *)pBuffer = WDT_INPROC64_CALL;
1233 else
1234 *(ULONG *)pBuffer = WDT_INPROC_CALL;
1235 pBuffer += sizeof(ULONG);
1236 *(HENHMETAFILE *)pBuffer = *phEmf;
1237 pBuffer += sizeof(HENHMETAFILE);
1238 }
1239 else
1240 {
1241 *(ULONG *)pBuffer = WDT_REMOTE_CALL;
1242 pBuffer += sizeof(ULONG);
1243 *(ULONG *)pBuffer = (ULONG)(ULONG_PTR)*phEmf;
1244 pBuffer += sizeof(ULONG);
1245
1246 if (*phEmf)
1247 {
1248 UINT emfsize = GetEnhMetaFileBits(*phEmf, 0, NULL);
1249
1250 *(ULONG *)pBuffer = emfsize;
1251 pBuffer += sizeof(ULONG);
1252 *(ULONG *)pBuffer = emfsize;
1253 pBuffer += sizeof(ULONG);
1254 GetEnhMetaFileBits(*phEmf, emfsize, pBuffer);
1255 pBuffer += emfsize;
1256 }
1257 }
1258
1259 return pBuffer;
1260 }
1261
1262 /******************************************************************************
1263 * HENHMETAFILE_UserUnmarshal [OLE32.@]
1264 *
1265 * Unmarshals an enhanced metafile from a buffer.
1266 *
1267 * PARAMS
1268 * pFlags [I] Flags. See notes.
1269 * pBuffer [I] Buffer to marshal the clip format from.
1270 * phEmf [O] Address that receive the unmarshaled enhanced metafile.
1271 *
1272 * RETURNS
1273 * The end of the marshaled data in the buffer.
1274 *
1275 * NOTES
1276 * Even though the function is documented to take a pointer to an ULONG in
1277 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1278 * the first parameter is an ULONG.
1279 * This function is only intended to be called by the RPC runtime.
1280 */
1281 unsigned char * __RPC_USER HENHMETAFILE_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HENHMETAFILE *phEmf)
1282 {
1283 ULONG fContext;
1284
1285 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, phEmf);
1286
1287 fContext = *(ULONG *)pBuffer;
1288 pBuffer += sizeof(ULONG);
1289
1290 if (((fContext == WDT_INPROC_CALL) && (sizeof(*phEmf) < 8)) ||
1291 ((fContext == WDT_INPROC64_CALL) && (sizeof(*phEmf) == 8)))
1292 {
1293 *phEmf = *(HENHMETAFILE *)pBuffer;
1294 pBuffer += sizeof(*phEmf);
1295 }
1296 else if (fContext == WDT_REMOTE_CALL)
1297 {
1298 ULONG handle;
1299
1300 handle = *(ULONG *)pBuffer;
1301 pBuffer += sizeof(ULONG);
1302
1303 if (handle)
1304 {
1305 ULONG size;
1306 size = *(ULONG *)pBuffer;
1307 pBuffer += sizeof(ULONG);
1308 if (size != *(ULONG *)pBuffer)
1309 {
1310 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
1311 return pBuffer;
1312 }
1313 pBuffer += sizeof(ULONG);
1314 *phEmf = SetEnhMetaFileBits(size, pBuffer);
1315 pBuffer += size;
1316 }
1317 else
1318 *phEmf = NULL;
1319 }
1320 else
1321 RaiseException(RPC_S_INVALID_TAG, 0, 0, NULL);
1322
1323 return pBuffer;
1324 }
1325
1326 /******************************************************************************
1327 * HENHMETAFILE_UserFree [OLE32.@]
1328 *
1329 * Frees an unmarshaled enhanced metafile.
1330 *
1331 * PARAMS
1332 * pFlags [I] Flags. See notes.
1333 * phEmf [I] Enhanced metafile to free.
1334 *
1335 * RETURNS
1336 * The end of the marshaled data in the buffer.
1337 *
1338 * NOTES
1339 * Even though the function is documented to take a pointer to a ULONG in
1340 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
1341 * which the first parameter is a ULONG.
1342 * This function is only intended to be called by the RPC runtime.
1343 */
1344 void __RPC_USER HENHMETAFILE_UserFree(ULONG *pFlags, HENHMETAFILE *phEmf)
1345 {
1346 TRACE("(%s, &%p\n", debugstr_user_flags(pFlags), *phEmf);
1347
1348 if (LOWORD(*pFlags) != MSHCTX_INPROC)
1349 DeleteEnhMetaFile(*phEmf);
1350 }
1351
1352 /******************************************************************************
1353 * HMETAFILEPICT_UserSize [OLE32.@]
1354 *
1355 * Calculates the buffer size required to marshal an metafile pict.
1356 *
1357 * PARAMS
1358 * pFlags [I] Flags. See notes.
1359 * StartingSize [I] Starting size of the buffer. This value is added on to
1360 * the buffer size required for the clip format.
1361 * phMfp [I] Metafile pict to size.
1362 *
1363 * RETURNS
1364 * The buffer size required to marshal a metafile pict plus the starting size.
1365 *
1366 * NOTES
1367 * Even though the function is documented to take a pointer to a ULONG in
1368 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1369 * the first parameter is a ULONG.
1370 * This function is only intended to be called by the RPC runtime.
1371 */
1372 ULONG __RPC_USER HMETAFILEPICT_UserSize(ULONG *pFlags, ULONG StartingSize, HMETAFILEPICT *phMfp)
1373 {
1374 ULONG size = StartingSize;
1375
1376 TRACE("(%s, %d, &%p)\n", debugstr_user_flags(pFlags), StartingSize, *phMfp);
1377
1378 size += sizeof(ULONG);
1379
1380 if(LOWORD(*pFlags) == MSHCTX_INPROC)
1381 size += sizeof(HMETAFILEPICT);
1382 else
1383 {
1384 size += sizeof(ULONG);
1385
1386 if (*phMfp)
1387 {
1388 METAFILEPICT *mfpict = GlobalLock(*phMfp);
1389
1390 /* FIXME: raise an exception if mfpict is NULL? */
1391 size += 3 * sizeof(ULONG);
1392 size += sizeof(ULONG);
1393
1394 size = HMETAFILE_UserSize(pFlags, size, &mfpict->hMF);
1395
1396 GlobalUnlock(*phMfp);
1397 }
1398 }
1399
1400 return size;
1401 }
1402
1403 /******************************************************************************
1404 * HMETAFILEPICT_UserMarshal [OLE32.@]
1405 *
1406 * Marshals a metafile pict into a buffer.
1407 *
1408 * PARAMS
1409 * pFlags [I] Flags. See notes.
1410 * pBuffer [I] Buffer to marshal the clip format into.
1411 * phMfp [I] Metafile pict to marshal.
1412 *
1413 * RETURNS
1414 * The end of the marshaled data in the buffer.
1415 *
1416 * NOTES
1417 * Even though the function is documented to take a pointer to a ULONG in
1418 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1419 * the first parameter is a ULONG.
1420 * This function is only intended to be called by the RPC runtime.
1421 */
1422 unsigned char * __RPC_USER HMETAFILEPICT_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HMETAFILEPICT *phMfp)
1423 {
1424 TRACE("(%s, %p, &%p)\n", debugstr_user_flags(pFlags), pBuffer, *phMfp);
1425
1426 if (LOWORD(*pFlags) == MSHCTX_INPROC)
1427 {
1428 if (sizeof(HMETAFILEPICT) == 8)
1429 *(ULONG *)pBuffer = WDT_INPROC64_CALL;
1430 else
1431 *(ULONG *)pBuffer = WDT_INPROC_CALL;
1432 pBuffer += sizeof(ULONG);
1433 *(HMETAFILEPICT *)pBuffer = *phMfp;
1434 pBuffer += sizeof(HMETAFILEPICT);
1435 }
1436 else
1437 {
1438 *(ULONG *)pBuffer = WDT_REMOTE_CALL;
1439 pBuffer += sizeof(ULONG);
1440 *(ULONG *)pBuffer = (ULONG)(ULONG_PTR)*phMfp;
1441 pBuffer += sizeof(ULONG);
1442
1443 if (*phMfp)
1444 {
1445 METAFILEPICT *mfpict = GlobalLock(*phMfp);
1446 remoteMETAFILEPICT * remmfpict = (remoteMETAFILEPICT *)pBuffer;
1447
1448 /* FIXME: raise an exception if mfpict is NULL? */
1449 remmfpict->mm = mfpict->mm;
1450 remmfpict->xExt = mfpict->xExt;
1451 remmfpict->yExt = mfpict->yExt;
1452 pBuffer += 3 * sizeof(ULONG);
1453 *(ULONG *)pBuffer = USER_MARSHAL_PTR_PREFIX;
1454 pBuffer += sizeof(ULONG);
1455
1456 pBuffer = HMETAFILE_UserMarshal(pFlags, pBuffer, &mfpict->hMF);
1457
1458 GlobalUnlock(*phMfp);
1459 }
1460 }
1461 return pBuffer;
1462 }
1463
1464 /******************************************************************************
1465 * HMETAFILEPICT_UserUnmarshal [OLE32.@]
1466 *
1467 * Unmarshals an metafile pict from a buffer.
1468 *
1469 * PARAMS
1470 * pFlags [I] Flags. See notes.
1471 * pBuffer [I] Buffer to marshal the clip format from.
1472 * phMfp [O] Address that receive the unmarshaled metafile pict.
1473 *
1474 * RETURNS
1475 * The end of the marshaled data in the buffer.
1476 *
1477 * NOTES
1478 * Even though the function is documented to take a pointer to an ULONG in
1479 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1480 * the first parameter is an ULONG.
1481 * This function is only intended to be called by the RPC runtime.
1482 */
1483 unsigned char * __RPC_USER HMETAFILEPICT_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HMETAFILEPICT *phMfp)
1484 {
1485 ULONG fContext;
1486
1487 TRACE("(%s, %p, %p)\n", debugstr_user_flags(pFlags), pBuffer, phMfp);
1488
1489 fContext = *(ULONG *)pBuffer;
1490 pBuffer += sizeof(ULONG);
1491
1492 if ((fContext == WDT_INPROC_CALL) || fContext == WDT_INPROC64_CALL)
1493 {
1494 *phMfp = *(HMETAFILEPICT *)pBuffer;
1495 pBuffer += sizeof(HMETAFILEPICT);
1496 }
1497 else
1498 {
1499 ULONG handle = *(ULONG *)pBuffer;
1500 pBuffer += sizeof(ULONG);
1501 *phMfp = NULL;
1502
1503 if(handle)
1504 {
1505 METAFILEPICT *mfpict;
1506 const remoteMETAFILEPICT *remmfpict;
1507 ULONG user_marshal_prefix;
1508
1509 remmfpict = (const remoteMETAFILEPICT *)pBuffer;
1510
1511 *phMfp = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILEPICT));
1512 if (!*phMfp)
1513 RpcRaiseException(E_OUTOFMEMORY);
1514
1515 mfpict = GlobalLock(*phMfp);
1516 mfpict->mm = remmfpict->mm;
1517 mfpict->xExt = remmfpict->xExt;
1518 mfpict->yExt = remmfpict->yExt;
1519 pBuffer += 3 * sizeof(ULONG);
1520 user_marshal_prefix = *(ULONG *)pBuffer;
1521 pBuffer += sizeof(ULONG);
1522
1523 if (user_marshal_prefix != USER_MARSHAL_PTR_PREFIX)
1524 RpcRaiseException(RPC_X_INVALID_TAG);
1525
1526 pBuffer = HMETAFILE_UserUnmarshal(pFlags, pBuffer, &mfpict->hMF);
1527
1528 GlobalUnlock(*phMfp);
1529 }
1530 }
1531 return pBuffer;
1532 }
1533
1534 /******************************************************************************
1535 * HMETAFILEPICT_UserFree [OLE32.@]
1536 *
1537 * Frees an unmarshaled metafile pict.
1538 *
1539 * PARAMS
1540 * pFlags [I] Flags. See notes.
1541 * phMfp [I] Metafile pict to free.
1542 *
1543 * RETURNS
1544 * The end of the marshaled data in the buffer.
1545 *
1546 * NOTES
1547 * Even though the function is documented to take a pointer to a ULONG in
1548 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
1549 * which the first parameter is a ULONG.
1550 * This function is only intended to be called by the RPC runtime.
1551 */
1552 void __RPC_USER HMETAFILEPICT_UserFree(ULONG *pFlags, HMETAFILEPICT *phMfp)
1553 {
1554 TRACE("(%s, &%p)\n", debugstr_user_flags(pFlags), *phMfp);
1555
1556 if ((LOWORD(*pFlags) != MSHCTX_INPROC) && *phMfp)
1557 {
1558 METAFILEPICT *mfpict;
1559
1560 mfpict = GlobalLock(*phMfp);
1561 /* FIXME: raise an exception if mfpict is NULL? */
1562 HMETAFILE_UserFree(pFlags, &mfpict->hMF);
1563 GlobalUnlock(*phMfp);
1564
1565 GlobalFree(*phMfp);
1566 }
1567 }
1568
1569 /******************************************************************************
1570 * WdtpInterfacePointer_UserSize [OLE32.@]
1571 *
1572 * Calculates the buffer size required to marshal an interface pointer.
1573 *
1574 * PARAMS
1575 * pFlags [I] Flags. See notes.
1576 * RealFlags [I] The MSHCTX to use when marshaling the interface.
1577 * punk [I] Interface pointer to size.
1578 * StartingSize [I] Starting size of the buffer. This value is added on to
1579 * the buffer size required for the clip format.
1580 * riid [I] ID of interface to size.
1581 *
1582 * RETURNS
1583 * The buffer size required to marshal an interface pointer plus the starting size.
1584 *
1585 * NOTES
1586 * Even though the function is documented to take a pointer to a ULONG in
1587 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1588 * the first parameter is a ULONG.
1589 */
1590 ULONG __RPC_USER WdtpInterfacePointer_UserSize(ULONG *pFlags, ULONG RealFlags, ULONG StartingSize, IUnknown *punk, REFIID riid)
1591 {
1592 DWORD marshal_size = 0;
1593 HRESULT hr;
1594
1595 TRACE("(%s, 0%x, %d, %p, %s)\n", debugstr_user_flags(pFlags), RealFlags, StartingSize, punk, debugstr_guid(riid));
1596
1597 hr = CoGetMarshalSizeMax(&marshal_size, riid, punk, LOWORD(RealFlags), NULL, MSHLFLAGS_NORMAL);
1598 if(FAILED(hr)) return StartingSize;
1599
1600 ALIGN_LENGTH(StartingSize, 3);
1601 StartingSize += 2 * sizeof(DWORD);
1602 return StartingSize + marshal_size;
1603 }
1604
1605 /******************************************************************************
1606 * WdtpInterfacePointer_UserMarshal [OLE32.@]
1607 *
1608 * Marshals an interface pointer into a buffer.
1609 *
1610 * PARAMS
1611 * pFlags [I] Flags. See notes.
1612 * RealFlags [I] The MSHCTX to use when marshaling the interface.
1613 * pBuffer [I] Buffer to marshal the clip format into.
1614 * punk [I] Interface pointer to marshal.
1615 * riid [I] ID of interface to marshal.
1616 *
1617 * RETURNS
1618 * The end of the marshaled data in the buffer.
1619 *
1620 * NOTES
1621 * Even though the function is documented to take a pointer to a ULONG in
1622 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1623 * the first parameter is a ULONG.
1624 */
1625 unsigned char * WINAPI WdtpInterfacePointer_UserMarshal(ULONG *pFlags, ULONG RealFlags, unsigned char *pBuffer, IUnknown *punk, REFIID riid)
1626 {
1627 HGLOBAL h = GlobalAlloc(GMEM_MOVEABLE, 0);
1628 IStream *stm;
1629 DWORD size;
1630 void *ptr;
1631
1632 TRACE("(%s, 0x%x, %p, &%p, %s)\n", debugstr_user_flags(pFlags), RealFlags, pBuffer, punk, debugstr_guid(riid));
1633
1634 if(!h) return NULL;
1635 if(CreateStreamOnHGlobal(h, TRUE, &stm) != S_OK)
1636 {
1637 GlobalFree(h);
1638 return NULL;
1639 }
1640
1641 if(CoMarshalInterface(stm, riid, punk, LOWORD(RealFlags), NULL, MSHLFLAGS_NORMAL) != S_OK)
1642 {
1643 IStream_Release(stm);
1644 return NULL;
1645 }
1646
1647 ALIGN_POINTER(pBuffer, 3);
1648 size = GlobalSize(h);
1649
1650 *(DWORD *)pBuffer = size;
1651 pBuffer += sizeof(DWORD);
1652 *(DWORD *)pBuffer = size;
1653 pBuffer += sizeof(DWORD);
1654
1655 ptr = GlobalLock(h);
1656 memcpy(pBuffer, ptr, size);
1657 GlobalUnlock(h);
1658
1659 IStream_Release(stm);
1660 return pBuffer + size;
1661 }
1662
1663 /******************************************************************************
1664 * WdtpInterfacePointer_UserUnmarshal [OLE32.@]
1665 *
1666 * Unmarshals an interface pointer from a buffer.
1667 *
1668 * PARAMS
1669 * pFlags [I] Flags. See notes.
1670 * pBuffer [I] Buffer to marshal the clip format from.
1671 * ppunk [I/O] Address that receives the unmarshaled interface pointer.
1672 * riid [I] ID of interface to unmarshal.
1673 *
1674 * RETURNS
1675 * The end of the marshaled data in the buffer.
1676 *
1677 * NOTES
1678 * Even though the function is documented to take a pointer to an ULONG in
1679 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1680 * the first parameter is an ULONG.
1681 */
1682 unsigned char * WINAPI WdtpInterfacePointer_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, IUnknown **ppunk, REFIID riid)
1683 {
1684 HRESULT hr;
1685 HGLOBAL h;
1686 IStream *stm;
1687 DWORD size;
1688 void *ptr;
1689
1690 TRACE("(%s, %p, %p, %s)\n", debugstr_user_flags(pFlags), pBuffer, ppunk, debugstr_guid(riid));
1691
1692 ALIGN_POINTER(pBuffer, 3);
1693
1694 size = *(DWORD *)pBuffer;
1695 pBuffer += sizeof(DWORD);
1696 if(size != *(DWORD *)pBuffer)
1697 RaiseException(RPC_X_BAD_STUB_DATA, 0, 0, NULL);
1698
1699 pBuffer += sizeof(DWORD);
1700
1701 /* FIXME: sanity check on size */
1702
1703 h = GlobalAlloc(GMEM_MOVEABLE, size);
1704 if(!h) RaiseException(RPC_X_NO_MEMORY, 0, 0, NULL);
1705
1706 if(CreateStreamOnHGlobal(h, TRUE, &stm) != S_OK)
1707 {
1708 GlobalFree(h);
1709 RaiseException(RPC_X_NO_MEMORY, 0, 0, NULL);
1710 }
1711
1712 ptr = GlobalLock(h);
1713 memcpy(ptr, pBuffer, size);
1714 GlobalUnlock(h);
1715
1716 hr = CoUnmarshalInterface(stm, riid, (void**)ppunk);
1717 IStream_Release(stm);
1718
1719 if(hr != S_OK) RaiseException(hr, 0, 0, NULL);
1720
1721 return pBuffer + size;
1722 }
1723
1724 /******************************************************************************
1725 * WdtpInterfacePointer_UserFree [OLE32.@]
1726 *
1727 * Releases an unmarshaled interface pointer.
1728 *
1729 * PARAMS
1730 * punk [I] Interface pointer to release.
1731 *
1732 * RETURNS
1733 * Nothing.
1734 */
1735 void WINAPI WdtpInterfacePointer_UserFree(IUnknown *punk)
1736 {
1737 TRACE("(%p)\n", punk);
1738 if(punk) IUnknown_Release(punk);
1739 }
1740
1741 /******************************************************************************
1742 * STGMEDIUM_UserSize [OLE32.@]
1743 *
1744 * Calculates the buffer size required to marshal an STGMEDIUM.
1745 *
1746 * PARAMS
1747 * pFlags [I] Flags. See notes.
1748 * StartingSize [I] Starting size of the buffer. This value is added on to
1749 * the buffer size required for the clip format.
1750 * pStgMedium [I] STGMEDIUM to size.
1751 *
1752 * RETURNS
1753 * The buffer size required to marshal an STGMEDIUM plus the starting size.
1754 *
1755 * NOTES
1756 * Even though the function is documented to take a pointer to a ULONG in
1757 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1758 * the first parameter is a ULONG.
1759 * This function is only intended to be called by the RPC runtime.
1760 */
1761 ULONG __RPC_USER STGMEDIUM_UserSize(ULONG *pFlags, ULONG StartingSize, STGMEDIUM *pStgMedium)
1762 {
1763 ULONG size = StartingSize;
1764
1765 TRACE("(%s, %d, %p\n", debugstr_user_flags(pFlags), StartingSize, pStgMedium);
1766
1767 ALIGN_LENGTH(size, 3);
1768
1769 size += 2 * sizeof(DWORD);
1770 if (pStgMedium->tymed != TYMED_NULL)
1771 size += sizeof(DWORD);
1772
1773 switch (pStgMedium->tymed)
1774 {
1775 case TYMED_NULL:
1776 TRACE("TYMED_NULL\n");
1777 break;
1778 case TYMED_HGLOBAL:
1779 TRACE("TYMED_HGLOBAL\n");
1780 if (pStgMedium->u.hGlobal)
1781 size = HGLOBAL_UserSize(pFlags, size, &pStgMedium->u.hGlobal);
1782 break;
1783 case TYMED_FILE:
1784 TRACE("TYMED_FILE\n");
1785 if (pStgMedium->u.lpszFileName)
1786 {
1787 TRACE("file name is %s\n", debugstr_w(pStgMedium->u.lpszFileName));
1788 size += 3 * sizeof(DWORD) +
1789 (strlenW(pStgMedium->u.lpszFileName) + 1) * sizeof(WCHAR);
1790 }
1791 break;
1792 case TYMED_ISTREAM:
1793 TRACE("TYMED_ISTREAM\n");
1794 if (pStgMedium->u.pstm)
1795 {
1796 IUnknown *unk;
1797 IStream_QueryInterface(pStgMedium->u.pstm, &IID_IUnknown, (void**)&unk);
1798 size = WdtpInterfacePointer_UserSize(pFlags, LOWORD(*pFlags), size, unk, &IID_IStream);
1799 IUnknown_Release(unk);
1800 }
1801 break;
1802 case TYMED_ISTORAGE:
1803 TRACE("TYMED_ISTORAGE\n");
1804 if (pStgMedium->u.pstg)
1805 {
1806 IUnknown *unk;
1807 IStorage_QueryInterface(pStgMedium->u.pstg, &IID_IUnknown, (void**)&unk);
1808 size = WdtpInterfacePointer_UserSize(pFlags, LOWORD(*pFlags), size, unk, &IID_IStorage);
1809 IUnknown_Release(unk);
1810 }
1811 break;
1812 case TYMED_GDI:
1813 TRACE("TYMED_GDI\n");
1814 if (pStgMedium->u.hBitmap)
1815 {
1816 FIXME("not implemented for GDI object %p\n", pStgMedium->u.hBitmap);
1817 }
1818 break;
1819 case TYMED_MFPICT:
1820 TRACE("TYMED_MFPICT\n");
1821 if (pStgMedium->u.hMetaFilePict)
1822 size = HMETAFILEPICT_UserSize(pFlags, size, &pStgMedium->u.hMetaFilePict);
1823 break;
1824 case TYMED_ENHMF:
1825 TRACE("TYMED_ENHMF\n");
1826 if (pStgMedium->u.hEnhMetaFile)
1827 size = HENHMETAFILE_UserSize(pFlags, size, &pStgMedium->u.hEnhMetaFile);
1828 break;
1829 default:
1830 RaiseException(DV_E_TYMED, 0, 0, NULL);
1831 }
1832
1833 if (pStgMedium->pUnkForRelease)
1834 size = WdtpInterfacePointer_UserSize(pFlags, LOWORD(*pFlags), size, pStgMedium->pUnkForRelease, &IID_IUnknown);
1835
1836 return size;
1837 }
1838
1839 /******************************************************************************
1840 * STGMEDIUM_UserMarshal [OLE32.@]
1841 *
1842 * Marshals a STGMEDIUM into a buffer.
1843 *
1844 * PARAMS
1845 * pFlags [I] Flags. See notes.
1846 * pBuffer [I] Buffer to marshal the clip format into.
1847 * pCF [I] STGMEDIUM to marshal.
1848 *
1849 * RETURNS
1850 * The end of the marshaled data in the buffer.
1851 *
1852 * NOTES
1853 * Even though the function is documented to take a pointer to a ULONG in
1854 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1855 * the first parameter is a ULONG.
1856 * This function is only intended to be called by the RPC runtime.
1857 */
1858 unsigned char * __RPC_USER STGMEDIUM_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, STGMEDIUM *pStgMedium)
1859 {
1860 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, pStgMedium);
1861
1862 ALIGN_POINTER(pBuffer, 3);
1863
1864 *(DWORD *)pBuffer = pStgMedium->tymed;
1865 pBuffer += sizeof(DWORD);
1866 if (pStgMedium->tymed != TYMED_NULL)
1867 {
1868 *(DWORD *)pBuffer = (DWORD)(DWORD_PTR)pStgMedium->u.pstg;
1869 pBuffer += sizeof(DWORD);
1870 }
1871 *(DWORD *)pBuffer = (DWORD)(DWORD_PTR)pStgMedium->pUnkForRelease;
1872 pBuffer += sizeof(DWORD);
1873
1874 switch (pStgMedium->tymed)
1875 {
1876 case TYMED_NULL:
1877 TRACE("TYMED_NULL\n");
1878 break;
1879 case TYMED_HGLOBAL:
1880 TRACE("TYMED_HGLOBAL\n");
1881 if (pStgMedium->u.hGlobal)
1882 pBuffer = HGLOBAL_UserMarshal(pFlags, pBuffer, &pStgMedium->u.hGlobal);
1883 break;
1884 case TYMED_FILE:
1885 TRACE("TYMED_FILE\n");
1886 if (pStgMedium->u.lpszFileName)
1887 {
1888 DWORD len;
1889 len = strlenW(pStgMedium->u.lpszFileName);
1890 /* conformance */
1891 *(DWORD *)pBuffer = len + 1;
1892 pBuffer += sizeof(DWORD);
1893 /* offset */
1894 *(DWORD *)pBuffer = 0;
1895 pBuffer += sizeof(DWORD);
1896 /* variance */
1897 *(DWORD *)pBuffer = len + 1;
1898 pBuffer += sizeof(DWORD);
1899
1900 TRACE("file name is %s\n", debugstr_w(pStgMedium->u.lpszFileName));
1901 memcpy(pBuffer, pStgMedium->u.lpszFileName, (len + 1) * sizeof(WCHAR));
1902 }
1903 break;
1904 case TYMED_ISTREAM:
1905 TRACE("TYMED_ISTREAM\n");
1906 if (pStgMedium->u.pstm)
1907 {
1908 IUnknown *unk;
1909 IStream_QueryInterface(pStgMedium->u.pstm, &IID_IUnknown, (void**)&unk);
1910 pBuffer = WdtpInterfacePointer_UserMarshal(pFlags, LOWORD(*pFlags), pBuffer, unk, &IID_IStream);
1911 IUnknown_Release(unk);
1912 }
1913 break;
1914 case TYMED_ISTORAGE:
1915 TRACE("TYMED_ISTORAGE\n");
1916 if (pStgMedium->u.pstg)
1917 {
1918 IUnknown *unk;
1919 IStorage_QueryInterface(pStgMedium->u.pstg, &IID_IUnknown, (void**)&unk);
1920 pBuffer = WdtpInterfacePointer_UserMarshal(pFlags, LOWORD(*pFlags), pBuffer, unk, &IID_IStorage);
1921 IUnknown_Release(unk);
1922 }
1923 break;
1924 case TYMED_GDI:
1925 TRACE("TYMED_GDI\n");
1926 if (pStgMedium->u.hBitmap)
1927 {
1928 FIXME("not implemented for GDI object %p\n", pStgMedium->u.hBitmap);
1929 }
1930 break;
1931 case TYMED_MFPICT:
1932 TRACE("TYMED_MFPICT\n");
1933 if (pStgMedium->u.hMetaFilePict)
1934 pBuffer = HMETAFILEPICT_UserMarshal(pFlags, pBuffer, &pStgMedium->u.hMetaFilePict);
1935 break;
1936 case TYMED_ENHMF:
1937 TRACE("TYMED_ENHMF\n");
1938 if (pStgMedium->u.hEnhMetaFile)
1939 pBuffer = HENHMETAFILE_UserMarshal(pFlags, pBuffer, &pStgMedium->u.hEnhMetaFile);
1940 break;
1941 default:
1942 RaiseException(DV_E_TYMED, 0, 0, NULL);
1943 }
1944
1945 if (pStgMedium->pUnkForRelease)
1946 pBuffer = WdtpInterfacePointer_UserMarshal(pFlags, LOWORD(*pFlags), pBuffer, pStgMedium->pUnkForRelease, &IID_IUnknown);
1947
1948 return pBuffer;
1949 }
1950
1951 /******************************************************************************
1952 * STGMEDIUM_UserUnmarshal [OLE32.@]
1953 *
1954 * Unmarshals a STGMEDIUM from a buffer.
1955 *
1956 * PARAMS
1957 * pFlags [I] Flags. See notes.
1958 * pBuffer [I] Buffer to marshal the clip format from.
1959 * pStgMedium [O] Address that receive the unmarshaled STGMEDIUM.
1960 *
1961 * RETURNS
1962 * The end of the marshaled data in the buffer.
1963 *
1964 * NOTES
1965 * Even though the function is documented to take a pointer to an ULONG in
1966 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of which
1967 * the first parameter is an ULONG.
1968 * This function is only intended to be called by the RPC runtime.
1969 */
1970 unsigned char * __RPC_USER STGMEDIUM_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, STGMEDIUM *pStgMedium)
1971 {
1972 DWORD content = 0;
1973 DWORD releaseunk;
1974
1975 ALIGN_POINTER(pBuffer, 3);
1976
1977 TRACE("(%s, %p, %p\n", debugstr_user_flags(pFlags), pBuffer, pStgMedium);
1978
1979 pStgMedium->tymed = *(DWORD *)pBuffer;
1980 pBuffer += sizeof(DWORD);
1981 if (pStgMedium->tymed != TYMED_NULL)
1982 {
1983 content = *(DWORD *)pBuffer;
1984 pBuffer += sizeof(DWORD);
1985 }
1986 releaseunk = *(DWORD *)pBuffer;
1987 pBuffer += sizeof(DWORD);
1988
1989 switch (pStgMedium->tymed)
1990 {
1991 case TYMED_NULL:
1992 TRACE("TYMED_NULL\n");
1993 break;
1994 case TYMED_HGLOBAL:
1995 TRACE("TYMED_HGLOBAL\n");
1996 if (content)
1997 pBuffer = HGLOBAL_UserUnmarshal(pFlags, pBuffer, &pStgMedium->u.hGlobal);
1998 break;
1999 case TYMED_FILE:
2000 TRACE("TYMED_FILE\n");
2001 if (content)
2002 {
2003 DWORD conformance;
2004 DWORD variance;
2005 conformance = *(DWORD *)pBuffer;
2006 pBuffer += sizeof(DWORD);
2007 if (*(DWORD *)pBuffer != 0)
2008 {
2009 ERR("invalid offset %d\n", *(DWORD *)pBuffer);
2010 RpcRaiseException(RPC_S_INVALID_BOUND);
2011 return NULL;
2012 }
2013 pBuffer += sizeof(DWORD);
2014 variance = *(DWORD *)pBuffer;
2015 pBuffer += sizeof(DWORD);
2016 if (conformance != variance)
2017 {
2018 ERR("conformance (%d) and variance (%d) should be equal\n",
2019 conformance, variance);
2020 RpcRaiseException(RPC_S_INVALID_BOUND);
2021 return NULL;
2022 }
2023 if (conformance > 0x7fffffff)
2024 {
2025 ERR("conformance 0x%x too large\n", conformance);
2026 RpcRaiseException(RPC_S_INVALID_BOUND);
2027 return NULL;
2028 }
2029 pStgMedium->u.lpszFileName = CoTaskMemAlloc(conformance * sizeof(WCHAR));
2030 if (!pStgMedium->u.lpszFileName) RpcRaiseException(ERROR_OUTOFMEMORY);
2031 TRACE("unmarshalled file name is %s\n", debugstr_wn((const WCHAR *)pBuffer, variance));
2032 memcpy(pStgMedium->u.lpszFileName, pBuffer, variance * sizeof(WCHAR));
2033 pBuffer += variance * sizeof(WCHAR);
2034 }
2035 else
2036 pStgMedium->u.lpszFileName = NULL;
2037 break;
2038 case TYMED_ISTREAM:
2039 TRACE("TYMED_ISTREAM\n");
2040 if (content)
2041 {
2042 pBuffer = WdtpInterfacePointer_UserUnmarshal(pFlags, pBuffer, (IUnknown**)&pStgMedium->u.pstm, &IID_IStream);
2043 }
2044 else
2045 pStgMedium->u.pstm = NULL;
2046 break;
2047 case TYMED_ISTORAGE:
2048 TRACE("TYMED_ISTORAGE\n");
2049 if (content)
2050 {
2051 pBuffer = WdtpInterfacePointer_UserUnmarshal(pFlags, pBuffer, (IUnknown**)&pStgMedium->u.pstg, &IID_IStorage);
2052 }
2053 else
2054 pStgMedium->u.pstg = NULL;
2055 break;
2056 case TYMED_GDI:
2057 TRACE("TYMED_GDI\n");
2058 if (content)
2059 {
2060 FIXME("not implemented for GDI object\n");
2061 }
2062 else
2063 pStgMedium->u.hBitmap = NULL;
2064 break;
2065 case TYMED_MFPICT:
2066 TRACE("TYMED_MFPICT\n");
2067 if (content)
2068 pBuffer = HMETAFILEPICT_UserUnmarshal(pFlags, pBuffer, &pStgMedium->u.hMetaFilePict);
2069 else
2070 pStgMedium->u.hMetaFilePict = NULL;
2071 break;
2072 case TYMED_ENHMF:
2073 TRACE("TYMED_ENHMF\n");
2074 if (content)
2075 pBuffer = HENHMETAFILE_UserUnmarshal(pFlags, pBuffer, &pStgMedium->u.hEnhMetaFile);
2076 else
2077 pStgMedium->u.hEnhMetaFile = NULL;
2078 break;
2079 default:
2080 RaiseException(DV_E_TYMED, 0, 0, NULL);
2081 }
2082
2083 pStgMedium->pUnkForRelease = NULL;
2084 if (releaseunk)
2085 pBuffer = WdtpInterfacePointer_UserUnmarshal(pFlags, pBuffer, &pStgMedium->pUnkForRelease, &IID_IUnknown);
2086
2087 return pBuffer;
2088 }
2089
2090 /******************************************************************************
2091 * STGMEDIUM_UserFree [OLE32.@]
2092 *
2093 * Frees an unmarshaled STGMEDIUM.
2094 *
2095 * PARAMS
2096 * pFlags [I] Flags. See notes.
2097 * pStgmedium [I] STGMEDIUM to free.
2098 *
2099 * RETURNS
2100 * The end of the marshaled data in the buffer.
2101 *
2102 * NOTES
2103 * Even though the function is documented to take a pointer to a ULONG in
2104 * pFlags, it actually takes a pointer to a USER_MARSHAL_CB structure, of
2105 * which the first parameter is a ULONG.
2106 * This function is only intended to be called by the RPC runtime.
2107 */
2108 void __RPC_USER STGMEDIUM_UserFree(ULONG *pFlags, STGMEDIUM *pStgMedium)
2109 {
2110 TRACE("(%s, %p\n", debugstr_user_flags(pFlags), pStgMedium);
2111
2112 ReleaseStgMedium(pStgMedium);
2113 }
2114
2115 ULONG __RPC_USER ASYNC_STGMEDIUM_UserSize(ULONG *pFlags, ULONG StartingSize, ASYNC_STGMEDIUM *pStgMedium)
2116 {
2117 TRACE("\n");
2118 return STGMEDIUM_UserSize(pFlags, StartingSize, pStgMedium);
2119 }
2120
2121 unsigned char * __RPC_USER ASYNC_STGMEDIUM_UserMarshal( ULONG *pFlags, unsigned char *pBuffer, ASYNC_STGMEDIUM *pStgMedium)
2122 {
2123 TRACE("\n");
2124 return STGMEDIUM_UserMarshal(pFlags, pBuffer, pStgMedium);
2125 }
2126
2127 unsigned char * __RPC_USER ASYNC_STGMEDIUM_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, ASYNC_STGMEDIUM *pStgMedium)
2128 {
2129 TRACE("\n");
2130 return STGMEDIUM_UserUnmarshal(pFlags, pBuffer, pStgMedium);
2131 }
2132
2133 void __RPC_USER ASYNC_STGMEDIUM_UserFree(ULONG *pFlags, ASYNC_STGMEDIUM *pStgMedium)
2134 {
2135 TRACE("\n");
2136 STGMEDIUM_UserFree(pFlags, pStgMedium);
2137 }
2138
2139 ULONG __RPC_USER FLAG_STGMEDIUM_UserSize(ULONG *pFlags, ULONG StartingSize, FLAG_STGMEDIUM *pStgMedium)
2140 {
2141 FIXME(":stub\n");
2142 return StartingSize;
2143 }
2144
2145 unsigned char * __RPC_USER FLAG_STGMEDIUM_UserMarshal( ULONG *pFlags, unsigned char *pBuffer, FLAG_STGMEDIUM *pStgMedium)
2146 {
2147 FIXME(":stub\n");
2148 return pBuffer;
2149 }
2150
2151 unsigned char * __RPC_USER FLAG_STGMEDIUM_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, FLAG_STGMEDIUM *pStgMedium)
2152 {
2153 FIXME(":stub\n");
2154 return pBuffer;
2155 }
2156
2157 void __RPC_USER FLAG_STGMEDIUM_UserFree(ULONG *pFlags, FLAG_STGMEDIUM *pStgMedium)
2158 {
2159 FIXME(":stub\n");
2160 }
2161
2162 ULONG __RPC_USER SNB_UserSize(ULONG *pFlags, ULONG StartingSize, SNB *pSnb)
2163 {
2164 FIXME(":stub\n");
2165 return StartingSize;
2166 }
2167
2168 unsigned char * __RPC_USER SNB_UserMarshal( ULONG *pFlags, unsigned char *pBuffer, SNB *pSnb)
2169 {
2170 FIXME(":stub\n");
2171 return pBuffer;
2172 }
2173
2174 unsigned char * __RPC_USER SNB_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, SNB *pSnb)
2175 {
2176 FIXME(":stub\n");
2177 return pBuffer;
2178 }
2179
2180 void __RPC_USER SNB_UserFree(ULONG *pFlags, SNB *pSnb)
2181 {
2182 FIXME(":stub\n");
2183 }
2184
2185 /* call_as/local stubs for unknwn.idl */
2186
2187 HRESULT CALLBACK IClassFactory_CreateInstance_Proxy(
2188 IClassFactory* This,
2189 IUnknown *pUnkOuter,
2190 REFIID riid,
2191 void **ppvObject)
2192 {
2193 TRACE("(%p, %s, %p)\n", pUnkOuter, debugstr_guid(riid), ppvObject);
2194 *ppvObject = NULL;
2195 if (pUnkOuter)
2196 {
2197 ERR("aggregation is not allowed on remote objects\n");
2198 return CLASS_E_NOAGGREGATION;
2199 }
2200 return IClassFactory_RemoteCreateInstance_Proxy(This, riid,
2201 (IUnknown **) ppvObject);
2202 }
2203
2204 HRESULT __RPC_STUB IClassFactory_CreateInstance_Stub(
2205 IClassFactory* This,
2206 REFIID riid,
2207 IUnknown **ppvObject)
2208 {
2209 TRACE("(%s, %p)\n", debugstr_guid(riid), ppvObject);
2210 return IClassFactory_CreateInstance(This, NULL, riid, (void **) ppvObject);
2211 }
2212
2213 HRESULT CALLBACK IClassFactory_LockServer_Proxy(
2214 IClassFactory* This,
2215 BOOL fLock)
2216 {
2217 FIXME(":stub\n");
2218 return E_NOTIMPL;
2219 }
2220
2221 HRESULT __RPC_STUB IClassFactory_LockServer_Stub(
2222 IClassFactory* This,
2223 BOOL fLock)
2224 {
2225 FIXME(":stub\n");
2226 return E_NOTIMPL;
2227 }
2228
2229 /* call_as/local stubs for objidl.idl */
2230
2231 HRESULT CALLBACK IEnumUnknown_Next_Proxy(
2232 IEnumUnknown* This,
2233 ULONG celt,
2234 IUnknown **rgelt,
2235 ULONG *pceltFetched)
2236 {
2237 ULONG fetched;
2238 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2239 if (!pceltFetched) pceltFetched = &fetched;
2240 return IEnumUnknown_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2241 }
2242
2243 HRESULT __RPC_STUB IEnumUnknown_Next_Stub(
2244 IEnumUnknown* This,
2245 ULONG celt,
2246 IUnknown **rgelt,
2247 ULONG *pceltFetched)
2248 {
2249 HRESULT hr;
2250 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2251 *pceltFetched = 0;
2252 hr = IEnumUnknown_Next(This, celt, rgelt, pceltFetched);
2253 if (hr == S_OK) *pceltFetched = celt;
2254 return hr;
2255 }
2256
2257 HRESULT CALLBACK IBindCtx_SetBindOptions_Proxy(
2258 IBindCtx* This,
2259 BIND_OPTS *pbindopts)
2260 {
2261 FIXME(":stub\n");
2262 return E_NOTIMPL;
2263 }
2264
2265 HRESULT __RPC_STUB IBindCtx_SetBindOptions_Stub(
2266 IBindCtx* This,
2267 BIND_OPTS2 *pbindopts)
2268 {
2269 FIXME(":stub\n");
2270 return E_NOTIMPL;
2271 }
2272
2273 HRESULT CALLBACK IBindCtx_GetBindOptions_Proxy(
2274 IBindCtx* This,
2275 BIND_OPTS *pbindopts)
2276 {
2277 FIXME(":stub\n");
2278 return E_NOTIMPL;
2279 }
2280
2281 HRESULT __RPC_STUB IBindCtx_GetBindOptions_Stub(
2282 IBindCtx* This,
2283 BIND_OPTS2 *pbindopts)
2284 {
2285 FIXME(":stub\n");
2286 return E_NOTIMPL;
2287 }
2288
2289 HRESULT CALLBACK IEnumMoniker_Next_Proxy(
2290 IEnumMoniker* This,
2291 ULONG celt,
2292 IMoniker **rgelt,
2293 ULONG *pceltFetched)
2294 {
2295 ULONG fetched;
2296 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2297 if (!pceltFetched) pceltFetched = &fetched;
2298 return IEnumMoniker_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2299 }
2300
2301 HRESULT __RPC_STUB IEnumMoniker_Next_Stub(
2302 IEnumMoniker* This,
2303 ULONG celt,
2304 IMoniker **rgelt,
2305 ULONG *pceltFetched)
2306 {
2307 HRESULT hr;
2308 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2309 *pceltFetched = 0;
2310 hr = IEnumMoniker_Next(This, celt, rgelt, pceltFetched);
2311 if (hr == S_OK) *pceltFetched = celt;
2312 return hr;
2313 }
2314
2315 BOOL CALLBACK IRunnableObject_IsRunning_Proxy(
2316 IRunnableObject* This)
2317 {
2318 BOOL rv;
2319 FIXME(":stub\n");
2320 memset(&rv, 0, sizeof rv);
2321 return rv;
2322 }
2323
2324 HRESULT __RPC_STUB IRunnableObject_IsRunning_Stub(
2325 IRunnableObject* This)
2326 {
2327 FIXME(":stub\n");
2328 return E_NOTIMPL;
2329 }
2330
2331 HRESULT CALLBACK IMoniker_BindToObject_Proxy(
2332 IMoniker* This,
2333 IBindCtx *pbc,
2334 IMoniker *pmkToLeft,
2335 REFIID riidResult,
2336 void **ppvResult)
2337 {
2338 FIXME(":stub\n");
2339 return E_NOTIMPL;
2340 }
2341
2342 HRESULT __RPC_STUB IMoniker_BindToObject_Stub(
2343 IMoniker* This,
2344 IBindCtx *pbc,
2345 IMoniker *pmkToLeft,
2346 REFIID riidResult,
2347 IUnknown **ppvResult)
2348 {
2349 FIXME(":stub\n");
2350 return E_NOTIMPL;
2351 }
2352
2353 HRESULT CALLBACK IMoniker_BindToStorage_Proxy(
2354 IMoniker* This,
2355 IBindCtx *pbc,
2356 IMoniker *pmkToLeft,
2357 REFIID riid,
2358 void **ppvObj)
2359 {
2360 FIXME(":stub\n");
2361 return E_NOTIMPL;
2362 }
2363
2364 HRESULT __RPC_STUB IMoniker_BindToStorage_Stub(
2365 IMoniker* This,
2366 IBindCtx *pbc,
2367 IMoniker *pmkToLeft,
2368 REFIID riid,
2369 IUnknown **ppvObj)
2370 {
2371 FIXME(":stub\n");
2372 return E_NOTIMPL;
2373 }
2374
2375 HRESULT CALLBACK IEnumString_Next_Proxy(
2376 IEnumString* This,
2377 ULONG celt,
2378 LPOLESTR *rgelt,
2379 ULONG *pceltFetched)
2380 {
2381 ULONG fetched;
2382 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2383 if (!pceltFetched) pceltFetched = &fetched;
2384 return IEnumString_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2385 }
2386
2387 HRESULT __RPC_STUB IEnumString_Next_Stub(
2388 IEnumString* This,
2389 ULONG celt,
2390 LPOLESTR *rgelt,
2391 ULONG *pceltFetched)
2392 {
2393 HRESULT hr;
2394 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2395 *pceltFetched = 0;
2396 hr = IEnumString_Next(This, celt, rgelt, pceltFetched);
2397 if (hr == S_OK) *pceltFetched = celt;
2398 return hr;
2399 }
2400
2401 HRESULT CALLBACK ISequentialStream_Read_Proxy(
2402 ISequentialStream* This,
2403 void *pv,
2404 ULONG cb,
2405 ULONG *pcbRead)
2406 {
2407 ULONG read;
2408 HRESULT hr;
2409
2410 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbRead);
2411
2412 hr = ISequentialStream_RemoteRead_Proxy(This, pv, cb, &read);
2413 if(pcbRead) *pcbRead = read;
2414
2415 return hr;
2416 }
2417
2418 HRESULT __RPC_STUB ISequentialStream_Read_Stub(
2419 ISequentialStream* This,
2420 byte *pv,
2421 ULONG cb,
2422 ULONG *pcbRead)
2423 {
2424 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbRead);
2425 return ISequentialStream_Read(This, pv, cb, pcbRead);
2426 }
2427
2428 HRESULT CALLBACK ISequentialStream_Write_Proxy(
2429 ISequentialStream* This,
2430 const void *pv,
2431 ULONG cb,
2432 ULONG *pcbWritten)
2433 {
2434 ULONG written;
2435 HRESULT hr;
2436
2437 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbWritten);
2438
2439 hr = ISequentialStream_RemoteWrite_Proxy(This, pv, cb, &written);
2440 if(pcbWritten) *pcbWritten = written;
2441
2442 return hr;
2443 }
2444
2445 HRESULT __RPC_STUB ISequentialStream_Write_Stub(
2446 ISequentialStream* This,
2447 const byte *pv,
2448 ULONG cb,
2449 ULONG *pcbWritten)
2450 {
2451 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbWritten);
2452 return ISequentialStream_Write(This, pv, cb, pcbWritten);
2453 }
2454
2455 HRESULT CALLBACK IStream_Seek_Proxy(
2456 IStream* This,
2457 LARGE_INTEGER dlibMove,
2458 DWORD dwOrigin,
2459 ULARGE_INTEGER *plibNewPosition)
2460 {
2461 ULARGE_INTEGER newpos;
2462 HRESULT hr;
2463
2464 TRACE("(%p)->(%s, %d, %p)\n", This, wine_dbgstr_longlong(dlibMove.QuadPart), dwOrigin, plibNewPosition);
2465
2466 hr = IStream_RemoteSeek_Proxy(This, dlibMove, dwOrigin, &newpos);
2467 if(plibNewPosition) *plibNewPosition = newpos;
2468
2469 return hr;
2470 }
2471
2472 HRESULT __RPC_STUB IStream_Seek_Stub(
2473 IStream* This,
2474 LARGE_INTEGER dlibMove,
2475 DWORD dwOrigin,
2476 ULARGE_INTEGER *plibNewPosition)
2477 {
2478 TRACE("(%p)->(%s, %d, %p)\n", This, wine_dbgstr_longlong(dlibMove.QuadPart), dwOrigin, plibNewPosition);
2479 return IStream_Seek(This, dlibMove, dwOrigin, plibNewPosition);
2480 }
2481
2482 HRESULT CALLBACK IStream_CopyTo_Proxy(
2483 IStream* This,
2484 IStream *pstm,
2485 ULARGE_INTEGER cb,
2486 ULARGE_INTEGER *pcbRead,
2487 ULARGE_INTEGER *pcbWritten)
2488 {
2489 ULARGE_INTEGER read, written;
2490 HRESULT hr;
2491
2492 TRACE("(%p)->(%p, %s, %p, %p)\n", This, pstm, wine_dbgstr_longlong(cb.QuadPart), pcbRead, pcbWritten);
2493
2494 hr = IStream_RemoteCopyTo_Proxy(This, pstm, cb, &read, &written);
2495 if(pcbRead) *pcbRead = read;
2496 if(pcbWritten) *pcbWritten = written;
2497
2498 return hr;
2499 }
2500
2501 HRESULT __RPC_STUB IStream_CopyTo_Stub(
2502 IStream* This,
2503 IStream *pstm,
2504 ULARGE_INTEGER cb,
2505 ULARGE_INTEGER *pcbRead,
2506 ULARGE_INTEGER *pcbWritten)
2507 {
2508 TRACE("(%p)->(%p, %s, %p, %p)\n", This, pstm, wine_dbgstr_longlong(cb.QuadPart), pcbRead, pcbWritten);
2509
2510 return IStream_CopyTo(This, pstm, cb, pcbRead, pcbWritten);
2511 }
2512
2513 HRESULT CALLBACK IEnumSTATSTG_Next_Proxy(
2514 IEnumSTATSTG* This,
2515 ULONG celt,
2516 STATSTG *rgelt,
2517 ULONG *pceltFetched)
2518 {
2519 ULONG fetched;
2520 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2521 if (!pceltFetched) pceltFetched = &fetched;
2522 return IEnumSTATSTG_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2523 }
2524
2525 HRESULT __RPC_STUB IEnumSTATSTG_Next_Stub(
2526 IEnumSTATSTG* This,
2527 ULONG celt,
2528 STATSTG *rgelt,
2529 ULONG *pceltFetched)
2530 {
2531 HRESULT hr;
2532 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2533 *pceltFetched = 0;
2534 hr = IEnumSTATSTG_Next(This, celt, rgelt, pceltFetched);
2535 if (hr == S_OK) *pceltFetched = celt;
2536 return hr;
2537 }
2538
2539 HRESULT CALLBACK IStorage_OpenStream_Proxy(
2540 IStorage* This,
2541 LPCOLESTR pwcsName,
2542 void *reserved1,
2543 DWORD grfMode,
2544 DWORD reserved2,
2545 IStream **ppstm)
2546 {
2547 TRACE("(%p)->(%s, %p, %08x, %d %p)\n", This, debugstr_w(pwcsName), reserved1, grfMode, reserved2, ppstm);
2548 if(reserved1) WARN("reserved1 %p\n", reserved1);
2549
2550 return IStorage_RemoteOpenStream_Proxy(This, pwcsName, 0, NULL, grfMode, reserved2, ppstm);
2551 }
2552
2553 HRESULT __RPC_STUB IStorage_OpenStream_Stub(
2554 IStorage* This,
2555 LPCOLESTR pwcsName,
2556 ULONG cbReserved1,
2557 byte *reserved1,
2558 DWORD grfMode,
2559 DWORD reserved2,
2560 IStream **ppstm)
2561 {
2562 TRACE("(%p)->(%s, %d, %p, %08x, %d %p)\n", This, debugstr_w(pwcsName), cbReserved1, reserved1, grfMode, reserved2, ppstm);
2563 if(cbReserved1 || reserved1) WARN("cbReserved1 %d reserved1 %p\n", cbReserved1, reserved1);
2564
2565 return IStorage_OpenStream(This, pwcsName, NULL, grfMode, reserved2, ppstm);
2566 }
2567
2568 HRESULT CALLBACK IStorage_EnumElements_Proxy(
2569 IStorage* This,
2570 DWORD reserved1,
2571 void *reserved2,
2572 DWORD reserved3,
2573 IEnumSTATSTG **ppenum)
2574 {
2575 TRACE("(%p)->(%d, %p, %d, %p)\n", This, reserved1, reserved2, reserved3, ppenum);
2576 if(reserved2) WARN("reserved2 %p\n", reserved2);
2577
2578 return IStorage_RemoteEnumElements_Proxy(This, reserved1, 0, NULL, reserved3, ppenum);
2579 }
2580
2581 HRESULT __RPC_STUB IStorage_EnumElements_Stub(
2582 IStorage* This,
2583 DWORD reserved1,
2584 ULONG cbReserved2,
2585 byte *reserved2,
2586 DWORD reserved3,
2587 IEnumSTATSTG **ppenum)
2588 {
2589 TRACE("(%p)->(%d, %d, %p, %d, %p)\n", This, reserved1, cbReserved2, reserved2, reserved3, ppenum);
2590 if(cbReserved2 || reserved2) WARN("cbReserved2 %d reserved2 %p\n", cbReserved2, reserved2);
2591
2592 return IStorage_EnumElements(This, reserved1, NULL, reserved3, ppenum);
2593 }
2594
2595 HRESULT CALLBACK ILockBytes_ReadAt_Proxy(
2596 ILockBytes* This,
2597 ULARGE_INTEGER ulOffset,
2598 void *pv,
2599 ULONG cb,
2600 ULONG *pcbRead)
2601 {
2602 ULONG read;
2603 HRESULT hr;
2604
2605 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbRead);
2606
2607 hr = ILockBytes_RemoteReadAt_Proxy(This, ulOffset, pv, cb, &read);
2608 if(pcbRead) *pcbRead = read;
2609
2610 return hr;
2611 }
2612
2613 HRESULT __RPC_STUB ILockBytes_ReadAt_Stub(
2614 ILockBytes* This,
2615 ULARGE_INTEGER ulOffset,
2616 byte *pv,
2617 ULONG cb,
2618 ULONG *pcbRead)
2619 {
2620 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbRead);
2621 return ILockBytes_ReadAt(This, ulOffset, pv, cb, pcbRead);
2622 }
2623
2624 HRESULT CALLBACK ILockBytes_WriteAt_Proxy(
2625 ILockBytes* This,
2626 ULARGE_INTEGER ulOffset,
2627 const void *pv,
2628 ULONG cb,
2629 ULONG *pcbWritten)
2630 {
2631 ULONG written;
2632 HRESULT hr;
2633
2634 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbWritten);
2635
2636 hr = ILockBytes_RemoteWriteAt_Proxy(This, ulOffset, pv, cb, &written);
2637 if(pcbWritten) *pcbWritten = written;
2638
2639 return hr;
2640 }
2641
2642 HRESULT __RPC_STUB ILockBytes_WriteAt_Stub(
2643 ILockBytes* This,
2644 ULARGE_INTEGER ulOffset,
2645 const byte *pv,
2646 ULONG cb,
2647 ULONG *pcbWritten)
2648 {
2649 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbWritten);
2650 return ILockBytes_WriteAt(This, ulOffset, pv, cb, pcbWritten);
2651 }
2652
2653 HRESULT CALLBACK IFillLockBytes_FillAppend_Proxy(
2654 IFillLockBytes* This,
2655 const void *pv,
2656 ULONG cb,
2657 ULONG *pcbWritten)
2658 {
2659 ULONG written;
2660 HRESULT hr;
2661
2662 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbWritten);
2663
2664 hr = IFillLockBytes_RemoteFillAppend_Proxy(This, pv, cb, &written);
2665 if(pcbWritten) *pcbWritten = written;
2666
2667 return hr;
2668 }
2669
2670 HRESULT __RPC_STUB IFillLockBytes_FillAppend_Stub(
2671 IFillLockBytes* This,
2672 const byte *pv,
2673 ULONG cb,
2674 ULONG *pcbWritten)
2675 {
2676 TRACE("(%p)->(%p, %d, %p)\n", This, pv, cb, pcbWritten);
2677 return IFillLockBytes_FillAppend(This, pv, cb, pcbWritten);
2678 }
2679
2680 HRESULT CALLBACK IFillLockBytes_FillAt_Proxy(
2681 IFillLockBytes* This,
2682 ULARGE_INTEGER ulOffset,
2683 const void *pv,
2684 ULONG cb,
2685 ULONG *pcbWritten)
2686 {
2687 ULONG written;
2688 HRESULT hr;
2689
2690 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbWritten);
2691
2692 hr = IFillLockBytes_RemoteFillAt_Proxy(This, ulOffset, pv, cb, &written);
2693 if(pcbWritten) *pcbWritten = written;
2694
2695 return hr;
2696 }
2697
2698 HRESULT __RPC_STUB IFillLockBytes_FillAt_Stub(
2699 IFillLockBytes* This,
2700 ULARGE_INTEGER ulOffset,
2701 const byte *pv,
2702 ULONG cb,
2703 ULONG *pcbWritten)
2704 {
2705 TRACE("(%p)->(%s, %p, %d, %p)\n", This, wine_dbgstr_longlong(ulOffset.QuadPart), pv, cb, pcbWritten);
2706 return IFillLockBytes_FillAt(This, ulOffset, pv, cb, pcbWritten);
2707 }
2708
2709 HRESULT CALLBACK IEnumFORMATETC_Next_Proxy(
2710 IEnumFORMATETC* This,
2711 ULONG celt,
2712 FORMATETC *rgelt,
2713 ULONG *pceltFetched)
2714 {
2715 ULONG fetched;
2716 if (!pceltFetched) pceltFetched = &fetched;
2717 return IEnumFORMATETC_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2718 }
2719
2720 HRESULT __RPC_STUB IEnumFORMATETC_Next_Stub(
2721 IEnumFORMATETC* This,
2722 ULONG celt,
2723 FORMATETC *rgelt,
2724 ULONG *pceltFetched)
2725 {
2726 HRESULT hr;
2727 *pceltFetched = 0;
2728 hr = IEnumFORMATETC_Next(This, celt, rgelt, pceltFetched);
2729 if (hr == S_OK) *pceltFetched = celt;
2730 return hr;
2731 }
2732
2733 HRESULT CALLBACK IEnumSTATDATA_Next_Proxy(
2734 IEnumSTATDATA* This,
2735 ULONG celt,
2736 STATDATA *rgelt,
2737 ULONG *pceltFetched)
2738 {
2739 ULONG fetched;
2740 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2741 if (!pceltFetched) pceltFetched = &fetched;
2742 return IEnumSTATDATA_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2743 }
2744
2745 HRESULT __RPC_STUB IEnumSTATDATA_Next_Stub(
2746 IEnumSTATDATA* This,
2747 ULONG celt,
2748 STATDATA *rgelt,
2749 ULONG *pceltFetched)
2750 {
2751 HRESULT hr;
2752 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2753 *pceltFetched = 0;
2754 hr = IEnumSTATDATA_Next(This, celt, rgelt, pceltFetched);
2755 if (hr == S_OK) *pceltFetched = celt;
2756 return hr;
2757 }
2758
2759 void CALLBACK IAdviseSink_OnDataChange_Proxy(
2760 IAdviseSink* This,
2761 FORMATETC *pFormatetc,
2762 STGMEDIUM *pStgmed)
2763 {
2764 TRACE("(%p)->(%p, %p)\n", This, pFormatetc, pStgmed);
2765 IAdviseSink_RemoteOnDataChange_Proxy(This, pFormatetc, pStgmed);
2766 }
2767
2768 HRESULT __RPC_STUB IAdviseSink_OnDataChange_Stub(
2769 IAdviseSink* This,
2770 FORMATETC *pFormatetc,
2771 ASYNC_STGMEDIUM *pStgmed)
2772 {
2773 TRACE("(%p)->(%p, %p)\n", This, pFormatetc, pStgmed);
2774 IAdviseSink_OnDataChange(This, pFormatetc, pStgmed);
2775 return S_OK;
2776 }
2777
2778 void CALLBACK IAdviseSink_OnViewChange_Proxy(
2779 IAdviseSink* This,
2780 DWORD dwAspect,
2781 LONG lindex)
2782 {
2783 TRACE("(%p)->(%d, %d)\n", This, dwAspect, lindex);
2784 IAdviseSink_RemoteOnViewChange_Proxy(This, dwAspect, lindex);
2785 }
2786
2787 HRESULT __RPC_STUB IAdviseSink_OnViewChange_Stub(
2788 IAdviseSink* This,
2789 DWORD dwAspect,
2790 LONG lindex)
2791 {
2792 TRACE("(%p)->(%d, %d)\n", This, dwAspect, lindex);
2793 IAdviseSink_OnViewChange(This, dwAspect, lindex);
2794 return S_OK;
2795 }
2796
2797 void CALLBACK IAdviseSink_OnRename_Proxy(
2798 IAdviseSink* This,
2799 IMoniker *pmk)
2800 {
2801 TRACE("(%p)->(%p)\n", This, pmk);
2802 IAdviseSink_RemoteOnRename_Proxy(This, pmk);
2803 }
2804
2805 HRESULT __RPC_STUB IAdviseSink_OnRename_Stub(
2806 IAdviseSink* This,
2807 IMoniker *pmk)
2808 {
2809 TRACE("(%p)->(%p)\n", This, pmk);
2810 IAdviseSink_OnRename(This, pmk);
2811 return S_OK;
2812 }
2813
2814 void CALLBACK IAdviseSink_OnSave_Proxy(
2815 IAdviseSink* This)
2816 {
2817 TRACE("(%p)\n", This);
2818 IAdviseSink_RemoteOnSave_Proxy(This);
2819 }
2820
2821 HRESULT __RPC_STUB IAdviseSink_OnSave_Stub(
2822 IAdviseSink* This)
2823 {
2824 TRACE("(%p)\n", This);
2825 IAdviseSink_OnSave(This);
2826 return S_OK;
2827 }
2828
2829 void CALLBACK IAdviseSink_OnClose_Proxy(
2830 IAdviseSink* This)
2831 {
2832 TRACE("(%p)\n", This);
2833 IAdviseSink_RemoteOnClose_Proxy(This);
2834 }
2835
2836 HRESULT __RPC_STUB IAdviseSink_OnClose_Stub(
2837 IAdviseSink* This)
2838 {
2839 TRACE("(%p)\n", This);
2840 IAdviseSink_OnClose(This);
2841 return S_OK;
2842 }
2843
2844 void CALLBACK IAdviseSink2_OnLinkSrcChange_Proxy(
2845 IAdviseSink2* This,
2846 IMoniker *pmk)
2847 {
2848 TRACE("(%p)->(%p)\n", This, pmk);
2849 IAdviseSink2_RemoteOnLinkSrcChange_Proxy(This, pmk);
2850 }
2851
2852 HRESULT __RPC_STUB IAdviseSink2_OnLinkSrcChange_Stub(
2853 IAdviseSink2* This,
2854 IMoniker *pmk)
2855 {
2856 TRACE("(%p)->(%p)\n", This, pmk);
2857 IAdviseSink2_OnLinkSrcChange(This, pmk);
2858 return S_OK;
2859 }
2860
2861 HRESULT CALLBACK IDataObject_GetData_Proxy(
2862 IDataObject* This,
2863 FORMATETC *pformatetcIn,
2864 STGMEDIUM *pmedium)
2865 {
2866 TRACE("(%p)->(%p, %p)\n", This, pformatetcIn, pmedium);
2867 return IDataObject_RemoteGetData_Proxy(This, pformatetcIn, pmedium);
2868 }
2869
2870 HRESULT __RPC_STUB IDataObject_GetData_Stub(
2871 IDataObject* This,
2872 FORMATETC *pformatetcIn,
2873 STGMEDIUM *pRemoteMedium)
2874 {
2875 TRACE("(%p)->(%p, %p)\n", This, pformatetcIn, pRemoteMedium);
2876 return IDataObject_GetData(This, pformatetcIn, pRemoteMedium);
2877 }
2878
2879 HRESULT CALLBACK IDataObject_GetDataHere_Proxy(
2880 IDataObject* This,
2881 FORMATETC *pformatetc,
2882 STGMEDIUM *pmedium)
2883 {
2884 TRACE("(%p)->(%p, %p)\n", This, pformatetc, pmedium);
2885 return IDataObject_RemoteGetDataHere_Proxy(This, pformatetc, pmedium);
2886 }
2887
2888 HRESULT __RPC_STUB IDataObject_GetDataHere_Stub(
2889 IDataObject* This,
2890 FORMATETC *pformatetc,
2891 STGMEDIUM *pRemoteMedium)
2892 {
2893 TRACE("(%p)->(%p, %p)\n", This, pformatetc, pRemoteMedium);
2894 return IDataObject_GetDataHere(This, pformatetc, pRemoteMedium);
2895 }
2896
2897 HRESULT CALLBACK IDataObject_SetData_Proxy(
2898 IDataObject* This,
2899 FORMATETC *pformatetc,
2900 STGMEDIUM *pmedium,
2901 BOOL fRelease)
2902 {
2903 FIXME(":stub\n");
2904 return E_NOTIMPL;
2905 }
2906
2907 HRESULT __RPC_STUB IDataObject_SetData_Stub(
2908 IDataObject* This,
2909 FORMATETC *pformatetc,
2910 FLAG_STGMEDIUM *pmedium,
2911 BOOL fRelease)
2912 {
2913 FIXME(":stub\n");
2914 return E_NOTIMPL;
2915 }
2916
2917 /* call_as/local stubs for oleidl.idl */
2918
2919 HRESULT CALLBACK IOleInPlaceActiveObject_TranslateAccelerator_Proxy(
2920 IOleInPlaceActiveObject* This,
2921 LPMSG lpmsg)
2922 {
2923 FIXME(":stub\n");
2924 return E_NOTIMPL;
2925 }
2926
2927 HRESULT __RPC_STUB IOleInPlaceActiveObject_TranslateAccelerator_Stub(
2928 IOleInPlaceActiveObject* This)
2929 {
2930 FIXME(":stub\n");
2931 return E_NOTIMPL;
2932 }
2933
2934 HRESULT CALLBACK IOleInPlaceActiveObject_ResizeBorder_Proxy(
2935 IOleInPlaceActiveObject* This,
2936 LPCRECT prcBorder,
2937 IOleInPlaceUIWindow *pUIWindow,
2938 BOOL fFrameWindow)
2939 {
2940 FIXME(":stub\n");
2941 return E_NOTIMPL;
2942 }
2943
2944 HRESULT __RPC_STUB IOleInPlaceActiveObject_ResizeBorder_Stub(
2945 IOleInPlaceActiveObject* This,
2946 LPCRECT prcBorder,
2947 REFIID riid,
2948 IOleInPlaceUIWindow *pUIWindow,
2949 BOOL fFrameWindow)
2950 {
2951 FIXME(":stub\n");
2952 return E_NOTIMPL;
2953 }
2954
2955 HRESULT CALLBACK IOleCache2_UpdateCache_Proxy(
2956 IOleCache2* This,
2957 LPDATAOBJECT pDataObject,
2958 DWORD grfUpdf,
2959 LPVOID pReserved)
2960 {
2961 FIXME(":stub\n");
2962 return E_NOTIMPL;
2963 }
2964
2965 HRESULT __RPC_STUB IOleCache2_UpdateCache_Stub(
2966 IOleCache2* This,
2967 LPDATAOBJECT pDataObject,
2968 DWORD grfUpdf,
2969 LONG_PTR pReserved)
2970 {
2971 FIXME(":stub\n");
2972 return E_NOTIMPL;
2973 }
2974
2975 HRESULT CALLBACK IEnumOLEVERB_Next_Proxy(
2976 IEnumOLEVERB* This,
2977 ULONG celt,
2978 LPOLEVERB rgelt,
2979 ULONG *pceltFetched)
2980 {
2981 ULONG fetched;
2982 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2983 if (!pceltFetched) pceltFetched = &fetched;
2984 return IEnumOLEVERB_RemoteNext_Proxy(This, celt, rgelt, pceltFetched);
2985 }
2986
2987 HRESULT __RPC_STUB IEnumOLEVERB_Next_Stub(
2988 IEnumOLEVERB* This,
2989 ULONG celt,
2990 LPOLEVERB rgelt,
2991 ULONG *pceltFetched)
2992 {
2993 HRESULT hr;
2994 TRACE("(%p)->(%d, %p, %p)\n", This, celt, rgelt, pceltFetched);
2995 *pceltFetched = 0;
2996 hr = IEnumOLEVERB_Next(This, celt, rgelt, pceltFetched);
2997 if (hr == S_OK) *pceltFetched = celt;
2998 return hr;
2999 }
3000
3001 HRESULT CALLBACK IViewObject_Draw_Proxy(
3002 IViewObject* This,
3003 DWORD dwDrawAspect,
3004 LONG lindex,
3005 void *pvAspect,
3006 DVTARGETDEVICE *ptd,
3007 HDC hdcTargetDev,
3008 HDC hdcDraw,
3009 LPCRECTL lprcBounds,
3010 LPCRECTL lprcWBounds,
3011 BOOL (STDMETHODCALLTYPE *pfnContinue)(ULONG_PTR dwContinue),
3012 ULONG_PTR dwContinue)
3013 {
3014 FIXME(":stub\n");
3015 return E_NOTIMPL;
3016 }
3017
3018 HRESULT __RPC_STUB IViewObject_Draw_Stub(
3019 IViewObject* This,
3020 DWORD dwDrawAspect,
3021 LONG lindex,
3022 ULONG_PTR pvAspect,
3023 DVTARGETDEVICE *ptd,
3024 ULONG_PTR hdcTargetDev,
3025 ULONG_PTR hdcDraw,
3026 LPCRECTL lprcBounds,
3027 LPCRECTL lprcWBounds,
3028 IContinue *pContinue)
3029 {
3030 FIXME(":stub\n");
3031 return E_NOTIMPL;
3032 }
3033
3034 HRESULT CALLBACK IViewObject_GetColorSet_Proxy(
3035 IViewObject* This,
3036 DWORD dwDrawAspect,
3037 LONG lindex,
3038 void *pvAspect,
3039 DVTARGETDEVICE *ptd,
3040 HDC hicTargetDev,
3041 LOGPALETTE **ppColorSet)
3042 {
3043 FIXME(":stub\n");
3044 return E_NOTIMPL;
3045 }
3046
3047 HRESULT __RPC_STUB IViewObject_GetColorSet_Stub(
3048 IViewObject* This,
3049 DWORD dwDrawAspect,
3050 LONG lindex,
3051 ULONG_PTR pvAspect,
3052 DVTARGETDEVICE *ptd,
3053 ULONG_PTR hicTargetDev,
3054 LOGPALETTE **ppColorSet)
3055 {
3056 FIXME(":stub\n");
3057 return E_NOTIMPL;
3058 }
3059
3060 HRESULT CALLBACK IViewObject_Freeze_Proxy(
3061 IViewObject* This,
3062 DWORD dwDrawAspect,
3063 LONG lindex,
3064 void *pvAspect,
3065 DWORD *pdwFreeze)
3066 {
3067 FIXME(":stub\n");
3068 return E_NOTIMPL;
3069 }
3070
3071 HRESULT __RPC_STUB IViewObject_Freeze_Stub(
3072 IViewObject* This,
3073 DWORD dwDrawAspect,
3074 LONG lindex,
3075 ULONG_PTR pvAspect,
3076 DWORD *pdwFreeze)
3077 {
3078 FIXME(":stub\n");
3079 return E_NOTIMPL;
3080 }
3081
3082 HRESULT CALLBACK IViewObject_GetAdvise_Proxy(
3083 IViewObject* This,
3084 DWORD *pAspects,
3085 DWORD *pAdvf,
3086 IAdviseSink **ppAdvSink)
3087 {
3088 FIXME(":stub\n");
3089 return E_NOTIMPL;
3090 }
3091
3092 HRESULT __RPC_STUB IViewObject_GetAdvise_Stub(
3093 IViewObject* This,
3094 DWORD *pAspects,
3095 DWORD *pAdvf,
3096 IAdviseSink **ppAdvSink)
3097 {
3098 FIXME(":stub\n");
3099 return E_NOTIMPL;
3100 }