ReactOS 0.4.16-dev-2320-ge1853c6
usrmarshal.c File Reference
#include "ole2.h"
#include "wine/debug.h"
Include dependency graph for usrmarshal.c:

Go to the source code of this file.

Macros

#define COBJMACROS
 
#define ALIGNED_LENGTH(_Len, _Align)   (((_Len)+(_Align))&~(_Align))
 
#define ALIGNED_POINTER(_Ptr, _Align)   ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align))
 
#define ALIGN_LENGTH(_Len, _Align)   _Len = ALIGNED_LENGTH(_Len, _Align)
 
#define ALIGN_POINTER(_Ptr, _Align)   _Ptr = ALIGNED_POINTER(_Ptr, _Align)
 
#define IMPL_WIREM_HANDLE(type)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (ole)
 
static const chardebugstr_user_flags (ULONG *pFlags)
 
static ULONG handle_UserSize (ULONG *pFlags, ULONG StartingSize, HANDLE *handle)
 
static unsigned charhandle_UserMarshal (ULONG *pFlags, unsigned char *pBuffer, HANDLE *handle)
 
static unsigned charhandle_UserUnmarshal (ULONG *pFlags, unsigned char *pBuffer, HANDLE *handle)
 
static void handle_UserFree (ULONG *pFlags, HANDLE *handle)
 
ULONG __RPC_USER CLIPFORMAT_UserSize (ULONG *pFlags, ULONG size, CLIPFORMAT *pCF)
 
unsigned char *__RPC_USER CLIPFORMAT_UserMarshal (ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
 
unsigned char *__RPC_USER CLIPFORMAT_UserUnmarshal (ULONG *pFlags, unsigned char *pBuffer, CLIPFORMAT *pCF)
 
void __RPC_USER CLIPFORMAT_UserFree (ULONG *pFlags, CLIPFORMAT *pCF)
 
ULONG __RPC_USER HBITMAP_UserSize (ULONG *flags, ULONG size, HBITMAP *bmp)
 
unsigned char *__RPC_USER HBITMAP_UserMarshal (ULONG *flags, unsigned char *buffer, HBITMAP *bmp)
 
unsigned char *__RPC_USER HBITMAP_UserUnmarshal (ULONG *flags, unsigned char *buffer, HBITMAP *bmp)
 
void __RPC_USER HBITMAP_UserFree (ULONG *flags, HBITMAP *bmp)
 
ULONG __RPC_USER HPALETTE_UserSize (ULONG *pFlags, ULONG StartingSize, HPALETTE *phPal)
 
unsigned char *__RPC_USER HPALETTE_UserMarshal (ULONG *pFlags, unsigned char *pBuffer, HPALETTE *phPal)
 
unsigned char *__RPC_USER HPALETTE_UserUnmarshal (ULONG *pFlags, unsigned char *pBuffer, HPALETTE *phPal)
 
ULONG __RPC_USER HGLOBAL_UserSize (ULONG *pFlags, ULONG StartingSize, HGLOBAL *phGlobal)
 
unsigned char *__RPC_USER HGLOBAL_UserMarshal (ULONG *pFlags, unsigned char *pBuffer, HGLOBAL *phGlobal)
 
unsigned char *__RPC_USER HGLOBAL_UserUnmarshal (ULONG *pFlags, unsigned char *pBuffer, HGLOBAL *phGlobal)
 
void __RPC_USER HGLOBAL_UserFree (ULONG *pFlags, HGLOBAL *phGlobal)
 
void __RPC_USER HPALETTE_UserFree (ULONG *pFlags, HPALETTE *phPal)
 
ULONG __RPC_USER WdtpInterfacePointer_UserSize (ULONG *pFlags, ULONG RealFlags, ULONG StartingSize, IUnknown *punk, REFIID riid)
 
unsigned char *WINAPI WdtpInterfacePointer_UserMarshal (ULONG *pFlags, ULONG RealFlags, unsigned char *pBuffer, IUnknown *punk, REFIID riid)
 
unsigned char *WINAPI WdtpInterfacePointer_UserUnmarshal (ULONG *pFlags, unsigned char *pBuffer, IUnknown **ppunk, REFIID riid)
 
void WINAPI WdtpInterfacePointer_UserFree (IUnknown *punk)
 

Macro Definition Documentation

◆ ALIGN_LENGTH

#define ALIGN_LENGTH (   _Len,
  _Align 
)    _Len = ALIGNED_LENGTH(_Len, _Align)

Definition at line 31 of file usrmarshal.c.

◆ ALIGN_POINTER

#define ALIGN_POINTER (   _Ptr,
  _Align 
)    _Ptr = ALIGNED_POINTER(_Ptr, _Align)

Definition at line 32 of file usrmarshal.c.

◆ ALIGNED_LENGTH

#define ALIGNED_LENGTH (   _Len,
  _Align 
)    (((_Len)+(_Align))&~(_Align))

Definition at line 29 of file usrmarshal.c.

◆ ALIGNED_POINTER

#define ALIGNED_POINTER (   _Ptr,
  _Align 
)    ((LPVOID)ALIGNED_LENGTH((ULONG_PTR)(_Ptr), _Align))

Definition at line 30 of file usrmarshal.c.

◆ COBJMACROS

#define COBJMACROS

Definition at line 22 of file usrmarshal.c.

◆ IMPL_WIREM_HANDLE

#define IMPL_WIREM_HANDLE (   type)
Value:
ULONG __RPC_USER type##_UserSize(ULONG *pFlags, ULONG StartingSize, type *handle) \
{ \
TRACE("%s, %lu, %p.\n", debugstr_user_flags(pFlags), StartingSize, handle); \
return handle_UserSize(pFlags, StartingSize, (HANDLE *)handle); \
} \
\
unsigned char * __RPC_USER type##_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, type *handle) \
{ \
TRACE("%s, %p, &%p.\n", debugstr_user_flags(pFlags), pBuffer, *handle); \
return handle_UserMarshal(pFlags, pBuffer, (HANDLE *)handle); \
} \
\
unsigned char * __RPC_USER type##_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, type *handle) \
{ \
TRACE("%s, %p, %p.\n", debugstr_user_flags(pFlags), pBuffer, handle); \
return handle_UserUnmarshal(pFlags, pBuffer, (HANDLE *)handle); \
} \
\
void __RPC_USER type##_UserFree(ULONG *pFlags, type *handle) \
{ \
TRACE("%s, &%p.\n", debugstr_user_flags(pFlags), *handle); \
handle_UserFree(pFlags, (HANDLE *)handle); \
}
static ULONG handle_UserSize(ULONG *pFlags, ULONG StartingSize, HANDLE *handle)
Definition: usrmarshal.c:63
static const char * debugstr_user_flags(ULONG *pFlags)
Definition: usrmarshal.c:34
static unsigned char * handle_UserUnmarshal(ULONG *pFlags, unsigned char *pBuffer, HANDLE *handle)
Definition: usrmarshal.c:93
static unsigned char * handle_UserMarshal(ULONG *pFlags, unsigned char *pBuffer, HANDLE *handle)
Definition: usrmarshal.c:76
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
PVOID pBuffer
#define __RPC_USER
Definition: rpc.h:61
uint32_t ULONG
Definition: typedefs.h:59

Definition at line 110 of file usrmarshal.c.

Function Documentation

◆ CLIPFORMAT_UserFree()

void __RPC_USER CLIPFORMAT_UserFree ( ULONG pFlags,
CLIPFORMAT *  pCF 
)

Definition at line 336 of file usrmarshal.c.

337{
338 /* there is no inverse of the RegisterClipboardFormat function,
339 * so nothing to do */
340}

Referenced by test_marshal_CLIPFORMAT().

◆ CLIPFORMAT_UserMarshal()

unsigned char *__RPC_USER CLIPFORMAT_UserMarshal ( ULONG pFlags,
unsigned char pBuffer,
CLIPFORMAT *  pCF 
)

Definition at line 207 of file usrmarshal.c.

208{
209 TRACE("%s, %p, &0x%04x.\n", debugstr_user_flags(pFlags), pBuffer, *pCF);
210
212
213 /* only need to marshal the name if it is not a pre-defined type and
214 * we are going remote */
215 if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
216 {
217 WCHAR format[255];
218 UINT len;
219
220 *(DWORD *)pBuffer = WDT_REMOTE_CALL;
221 pBuffer += 4;
222 *(DWORD *)pBuffer = *pCF;
223 pBuffer += 4;
224
226 if (!len)
228 len += 1;
229 *(UINT *)pBuffer = len;
230 pBuffer += sizeof(UINT);
231 *(UINT *)pBuffer = 0;
232 pBuffer += sizeof(UINT);
233 *(UINT *)pBuffer = len;
234 pBuffer += sizeof(UINT);
235 TRACE("marshaling format name %s\n", debugstr_w(format));
236 memcpy(pBuffer, format, len * sizeof(WCHAR));
237 pBuffer += len * sizeof(WCHAR);
238 }
239 else
240 {
241 *(DWORD *)pBuffer = WDT_INPROC_CALL;
242 pBuffer += 4;
243 *(DWORD *)pBuffer = *pCF;
244 pBuffer += 4;
245 }
246
247 return pBuffer;
248}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define NULL
Definition: types.h:112
#define ALIGN_POINTER(_Ptr, _Align)
Definition: usrmarshal.c:32
VOID WINAPI RaiseException(_In_ DWORD dwExceptionCode, _In_ DWORD dwExceptionFlags, _In_ DWORD nNumberOfArguments, _In_opt_ const ULONG_PTR *lpArguments)
Definition: except.c:700
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLsizei len
Definition: glext.h:6722
#define debugstr_w
Definition: kernel32.h:32
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned int UINT
Definition: ndis.h:50
#define LOWORD(l)
Definition: pedump.c:82
#define TRACE(s)
Definition: solgame.cpp:4
Definition: format.c:58
#define DV_E_CLIPFORMAT
Definition: winerror.h:3750
int WINAPI GetClipboardFormatNameW(_In_ UINT format, _Out_writes_(cchMaxCount) LPWSTR lpszFormatName, _In_ int cchMaxCount)
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by test_marshal_CLIPFORMAT().

◆ CLIPFORMAT_UserSize()

ULONG __RPC_USER CLIPFORMAT_UserSize ( ULONG pFlags,
ULONG  size,
CLIPFORMAT *  pCF 
)

Definition at line 162 of file usrmarshal.c.

163{
164 TRACE("%s, %lu, %p.\n", debugstr_user_flags(pFlags), size, pCF);
165
166 ALIGN_LENGTH(size, 3);
167
168 size += 8;
169
170 /* only need to marshal the name if it is not a pre-defined type and
171 * we are going remote */
172 if ((*pCF >= 0xc000) && (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE))
173 {
174 WCHAR format[255];
175 INT ret;
176 size += 3 * sizeof(UINT);
177 /* urg! this function is badly designed because it won't tell us how
178 * much space is needed without doing a dummy run of storing the
179 * name into a buffer */
181 if (!ret)
183 size += (ret + 1) * sizeof(WCHAR);
184 }
185 return size;
186}
#define ALIGN_LENGTH(_Len, _Align)
Definition: usrmarshal.c:31
return ret
Definition: mutex.c:146
GLsizeiptr size
Definition: glext.h:5919
int32_t INT
Definition: typedefs.h:58

Referenced by test_marshal_CLIPFORMAT().

◆ CLIPFORMAT_UserUnmarshal()

unsigned char *__RPC_USER CLIPFORMAT_UserUnmarshal ( ULONG pFlags,
unsigned char pBuffer,
CLIPFORMAT *  pCF 
)

Definition at line 269 of file usrmarshal.c.

270{
271 LONG fContext;
272
273 TRACE("%s, %p, %p.\n", debugstr_user_flags(pFlags), pBuffer, pCF);
274
276
277 fContext = *(DWORD *)pBuffer;
278 pBuffer += 4;
279
280 if (fContext == WDT_INPROC_CALL)
281 {
282 *pCF = *(CLIPFORMAT *)pBuffer;
283 pBuffer += 4;
284 }
285 else if (fContext == WDT_REMOTE_CALL)
286 {
287 CLIPFORMAT cf;
288 UINT len;
289
290 /* pointer ID for registered clip format string */
291 if (*(DWORD *)pBuffer == 0)
293 pBuffer += 4;
294
295 len = *(UINT *)pBuffer;
296 pBuffer += sizeof(UINT);
297 if (*(UINT *)pBuffer != 0)
299 pBuffer += sizeof(UINT);
300 if (*(UINT *)pBuffer != len)
302 pBuffer += sizeof(UINT);
303 if (((WCHAR *)pBuffer)[len - 1] != '\0')
305 TRACE("unmarshaling clip format %s\n", debugstr_w((LPCWSTR)pBuffer));
307 pBuffer += len * sizeof(WCHAR);
308 if (!cf)
310 *pCF = cf;
311 }
312 else
313 /* code not really appropriate, but nearest I can find */
315 return pBuffer;
316}
long LONG
Definition: pedump.c:60
#define RPC_S_INVALID_BOUND
Definition: winerror.h:1400
#define RPC_S_INVALID_TAG
Definition: winerror.h:1399
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by test_marshal_CLIPFORMAT().

◆ debugstr_user_flags()

static const char * debugstr_user_flags ( ULONG pFlags)
static

Definition at line 34 of file usrmarshal.c.

35{
36 char buf[12];
37 const char* loword;
38 switch (LOWORD(*pFlags))
39 {
40 case MSHCTX_LOCAL:
41 loword = "MSHCTX_LOCAL";
42 break;
43 case MSHCTX_NOSHAREDMEM:
44 loword = "MSHCTX_NOSHAREDMEM";
45 break;
46 case MSHCTX_DIFFERENTMACHINE:
47 loword = "MSHCTX_DIFFERENTMACHINE";
48 break;
49 case MSHCTX_INPROC:
50 loword = "MSHCTX_INPROC";
51 break;
52 default:
53 sprintf(buf, "%d", LOWORD(*pFlags));
54 loword=buf;
55 }
56
58 return wine_dbg_sprintf("MAKELONG(%s, NDR_LOCAL_DATA_REPRESENTATION)", loword);
59 else
60 return wine_dbg_sprintf("MAKELONG(%s, 0x%04x)", loword, HIWORD(*pFlags));
61}
const char * wine_dbg_sprintf(const char *format,...)
Definition: compat.c:296
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define sprintf
Definition: sprintf.c:45
#define NDR_LOCAL_DATA_REPRESENTATION
Definition: rpcndr.h:68
#define HIWORD(l)
Definition: typedefs.h:247

Referenced by CLIPFORMAT_UserMarshal(), CLIPFORMAT_UserSize(), CLIPFORMAT_UserUnmarshal(), HBITMAP_UserFree(), HBITMAP_UserMarshal(), HBITMAP_UserSize(), HBITMAP_UserUnmarshal(), HENHMETAFILE_UserFree(), HENHMETAFILE_UserMarshal(), HENHMETAFILE_UserSize(), HENHMETAFILE_UserUnmarshal(), HGLOBAL_UserFree(), HGLOBAL_UserMarshal(), HGLOBAL_UserSize(), HGLOBAL_UserUnmarshal(), HMETAFILE_UserFree(), HMETAFILE_UserMarshal(), HMETAFILE_UserSize(), HMETAFILE_UserUnmarshal(), HMETAFILEPICT_UserFree(), HMETAFILEPICT_UserMarshal(), HMETAFILEPICT_UserSize(), HMETAFILEPICT_UserUnmarshal(), SNB_UserMarshal(), SNB_UserSize(), SNB_UserUnmarshal(), STGMEDIUM_UserFree(), STGMEDIUM_UserMarshal(), STGMEDIUM_UserSize(), STGMEDIUM_UserUnmarshal(), WdtpInterfacePointer_UserMarshal(), WdtpInterfacePointer_UserSize(), and WdtpInterfacePointer_UserUnmarshal().

◆ handle_UserFree()

static void handle_UserFree ( ULONG pFlags,
HANDLE handle 
)
static

Definition at line 105 of file usrmarshal.c.

106{
107 /* nothing to do */
108}

◆ handle_UserMarshal()

static unsigned char * handle_UserMarshal ( ULONG pFlags,
unsigned char pBuffer,
HANDLE handle 
)
static

Definition at line 76 of file usrmarshal.c.

77{
78 RemotableHandle *remhandle;
79 if (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE)
80 {
81 ERR("can't remote a local handle\n");
83 return pBuffer;
84 }
85
87 remhandle = (RemotableHandle *)pBuffer;
88 remhandle->fContext = WDT_INPROC_CALL;
89 remhandle->u.hInproc = (LONG_PTR)*handle;
90 return pBuffer + sizeof(RemotableHandle);
91}
#define ERR(fmt,...)
Definition: precomp.h:57
#define LONG_PTR
Definition: treelist.c:79

◆ handle_UserSize()

static ULONG handle_UserSize ( ULONG pFlags,
ULONG  StartingSize,
HANDLE handle 
)
static

Definition at line 63 of file usrmarshal.c.

64{
65 if (LOWORD(*pFlags) == MSHCTX_DIFFERENTMACHINE)
66 {
67 ERR("can't remote a local handle\n");
69 return StartingSize;
70 }
71
72 ALIGN_LENGTH(StartingSize, 3);
73 return StartingSize + sizeof(RemotableHandle);
74}

◆ handle_UserUnmarshal()

static unsigned char * handle_UserUnmarshal ( ULONG pFlags,
unsigned char pBuffer,
HANDLE handle 
)
static

Definition at line 93 of file usrmarshal.c.

94{
95 RemotableHandle *remhandle;
96
98 remhandle = (RemotableHandle *)pBuffer;
99 if (remhandle->fContext != WDT_INPROC_CALL)
101 *handle = (HANDLE)(LONG_PTR)remhandle->u.hInproc;
102 return pBuffer + sizeof(RemotableHandle);
103}
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
PVOID HANDLE
Definition: typedefs.h:73
#define RPC_X_BAD_STUB_DATA
Definition: winerror.h:1447

◆ HBITMAP_UserFree()

void __RPC_USER HBITMAP_UserFree ( ULONG flags,
HBITMAP bmp 
)

Definition at line 535 of file usrmarshal.c.

536{
537 TRACE("(%s, %p)\n", debugstr_user_flags(flags), *bmp);
538
539 if (LOWORD(*flags) != MSHCTX_INPROC)
541}
pKey DeleteObject()
GLbitfield flags
Definition: glext.h:7161
BITMAP bmp
Definition: alphablend.c:62

Referenced by test_marshal_HBITMAP().

◆ HBITMAP_UserMarshal()

unsigned char *__RPC_USER HBITMAP_UserMarshal ( ULONG flags,
unsigned char buffer,
HBITMAP bmp 
)

Definition at line 405 of file usrmarshal.c.

406{
407 TRACE("(%s, %p, %p)\n", debugstr_user_flags(flags), buffer, *bmp);
408
410
411 if (LOWORD(*flags) == MSHCTX_INPROC)
412 {
413 *(ULONG *)buffer = WDT_INPROC_CALL;
414 buffer += sizeof(ULONG);
415 *(ULONG *)buffer = (ULONG)(ULONG_PTR)*bmp;
416 buffer += sizeof(ULONG);
417 }
418 else
419 {
420 *(ULONG *)buffer = WDT_REMOTE_CALL;
421 buffer += sizeof(ULONG);
422 *(ULONG *)buffer = (ULONG)(ULONG_PTR)*bmp;
423 buffer += sizeof(ULONG);
424
425 if (*bmp)
426 {
427 static const ULONG header_size = FIELD_OFFSET(userBITMAP, cbSize);
429 ULONG bitmap_size;
430
431 bitmap_size = GetBitmapBits(*bmp, 0, NULL);
432 *(ULONG *)buffer = bitmap_size;
433 buffer += sizeof(ULONG);
434
435 GetObjectW(*bmp, sizeof(BITMAP), &bitmap);
436 memcpy(buffer, &bitmap, header_size);
437 buffer += header_size;
438
439 GetBitmapBits(*bmp, bitmap_size, buffer);
440 buffer += bitmap_size;
441 }
442 }
443 return buffer;
444}
#define ULONG_PTR
Definition: config.h:101
GLuint buffer
Definition: glext.h:5915
Definition: uimain.c:89
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
LONG WINAPI GetBitmapBits(_In_ HBITMAP hbit, _In_ LONG cb, _Out_writes_bytes_(cb) LPVOID lpvBits)

Referenced by STGMEDIUM_UserMarshal(), and test_marshal_HBITMAP().

◆ HBITMAP_UserSize()

ULONG __RPC_USER HBITMAP_UserSize ( ULONG flags,
ULONG  size,
HBITMAP bmp 
)

Definition at line 362 of file usrmarshal.c.

363{
364 TRACE("%s, %lu, %p.\n", debugstr_user_flags(flags), size, *bmp);
365
366 ALIGN_LENGTH(size, 3);
367
368 size += sizeof(ULONG);
369 if (LOWORD(*flags) == MSHCTX_INPROC)
370 size += sizeof(ULONG);
371 else
372 {
373 size += sizeof(ULONG);
374
375 if (*bmp)
376 {
377 size += sizeof(ULONG);
378 size += FIELD_OFFSET(userBITMAP, cbSize);
379 size += GetBitmapBits(*bmp, 0, NULL);
380 }
381 }
382
383 return size;
384}

Referenced by STGMEDIUM_UserSize(), and test_marshal_HBITMAP().

◆ HBITMAP_UserUnmarshal()

unsigned char *__RPC_USER HBITMAP_UserUnmarshal ( ULONG flags,
unsigned char buffer,
HBITMAP bmp 
)

Definition at line 465 of file usrmarshal.c.

466{
468
469 TRACE("(%s, %p, %p)\n", debugstr_user_flags(flags), buffer, bmp);
470
472
473 context = *(ULONG *)buffer;
474 buffer += sizeof(ULONG);
475
476 if (context == WDT_INPROC_CALL)
477 {
478 *bmp = *(HBITMAP *)buffer;
479 buffer += sizeof(*bmp);
480 }
481 else if (context == WDT_REMOTE_CALL)
482 {
483 ULONG handle = *(ULONG *)buffer;
484 buffer += sizeof(ULONG);
485
486 if (handle)
487 {
488 static const ULONG header_size = FIELD_OFFSET(userBITMAP, cbSize);
490 ULONG bitmap_size;
491 unsigned char *bits;
492
493 bitmap_size = *(ULONG *)buffer;
494 buffer += sizeof(ULONG);
495 bits = malloc(bitmap_size);
496
497 memcpy(&bitmap, buffer, header_size);
498 buffer += header_size;
499
500 memcpy(bits, buffer, bitmap_size);
501 buffer += bitmap_size;
502
503 bitmap.bmBits = bits;
505
506 free(bits);
507 }
508 else
509 *bmp = NULL;
510 }
511 else
513
514 return buffer;
515}
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:10929
#define bits
Definition: infblock.c:15
static HBITMAP
Definition: button.c:44
Definition: http.c:7252
HBITMAP WINAPI CreateBitmapIndirect(_In_ const BITMAP *pbm)

Referenced by STGMEDIUM_UserUnmarshal(), and test_marshal_HBITMAP().

◆ HGLOBAL_UserFree()

void __RPC_USER HGLOBAL_UserFree ( ULONG pFlags,
HGLOBAL phGlobal 
)

Definition at line 830 of file usrmarshal.c.

831{
832 TRACE("%s, &%p.\n", debugstr_user_flags(pFlags), *phGlobal);
833
834 if (LOWORD(*pFlags) != MSHCTX_INPROC && *phGlobal)
835 GlobalFree(*phGlobal);
836}
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611

Referenced by test_marshal_HGLOBAL().

◆ HGLOBAL_UserMarshal()

unsigned char *__RPC_USER HGLOBAL_UserMarshal ( ULONG pFlags,
unsigned char pBuffer,
HGLOBAL phGlobal 
)

Definition at line 685 of file usrmarshal.c.

686{
687 TRACE("%s, %p, &%p.\n", debugstr_user_flags(pFlags), pBuffer, *phGlobal);
688
690
691 if (LOWORD(*pFlags) == MSHCTX_INPROC)
692 {
693 if (sizeof(*phGlobal) == 8)
694 *(ULONG *)pBuffer = WDT_INPROC64_CALL;
695 else
696 *(ULONG *)pBuffer = WDT_INPROC_CALL;
697 pBuffer += sizeof(ULONG);
698 *(HGLOBAL *)pBuffer = *phGlobal;
699 pBuffer += sizeof(HGLOBAL);
700 }
701 else
702 {
703 *(ULONG *)pBuffer = WDT_REMOTE_CALL;
704 pBuffer += sizeof(ULONG);
705 *(ULONG *)pBuffer = HandleToULong(*phGlobal);
706 pBuffer += sizeof(ULONG);
707 if (*phGlobal)
708 {
709 const unsigned char *memory;
710 SIZE_T size = GlobalSize(*phGlobal);
711 *(ULONG *)pBuffer = (ULONG)size;
712 pBuffer += sizeof(ULONG);
713 *(ULONG *)pBuffer = HandleToULong(*phGlobal);
714 pBuffer += sizeof(ULONG);
715 *(ULONG *)pBuffer = (ULONG)size;
716 pBuffer += sizeof(ULONG);
717
718 memory = GlobalLock(*phGlobal);
720 pBuffer += size;
721 GlobalUnlock(*phGlobal);
722 }
723 }
724
725 return pBuffer;
726}
#define HandleToULong(h)
Definition: basetsd.h:89
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
static char memory[1024 *256]
Definition: process.c:122
#define HGLOBAL
Definition: ole.h:15
ULONG_PTR SIZE_T
Definition: typedefs.h:80

Referenced by STGMEDIUM_UserMarshal(), and test_marshal_HGLOBAL().

◆ HGLOBAL_UserSize()

ULONG __RPC_USER HGLOBAL_UserSize ( ULONG pFlags,
ULONG  StartingSize,
HGLOBAL phGlobal 
)

Definition at line 639 of file usrmarshal.c.

640{
641 ULONG size = StartingSize;
642
643 TRACE("%s, %lu, %p.\n", debugstr_user_flags(pFlags), StartingSize, phGlobal);
644
645 ALIGN_LENGTH(size, 3);
646
647 size += sizeof(ULONG);
648
649 if (LOWORD(*pFlags) == MSHCTX_INPROC)
650 size += sizeof(HGLOBAL);
651 else
652 {
653 size += sizeof(ULONG);
654 if (*phGlobal)
655 {
656 SIZE_T ret;
657 size += 3 * sizeof(ULONG);
658 ret = GlobalSize(*phGlobal);
659 size += (ULONG)ret;
660 }
661 }
662
663 return size;
664}

Referenced by STGMEDIUM_UserSize(), and test_marshal_HGLOBAL().

◆ HGLOBAL_UserUnmarshal()

unsigned char *__RPC_USER HGLOBAL_UserUnmarshal ( ULONG pFlags,
unsigned char pBuffer,
HGLOBAL phGlobal 
)

Definition at line 747 of file usrmarshal.c.

748{
749 ULONG fContext;
750
751 TRACE("%s, %p, &%p.\n", debugstr_user_flags(pFlags), pBuffer, *phGlobal);
752
754
755 fContext = *(ULONG *)pBuffer;
756 pBuffer += sizeof(ULONG);
757
758 if (((fContext == WDT_INPROC_CALL) && (sizeof(*phGlobal) < 8)) ||
759 ((fContext == WDT_INPROC64_CALL) && (sizeof(*phGlobal) == 8)))
760 {
761 *phGlobal = *(HGLOBAL *)pBuffer;
762 pBuffer += sizeof(*phGlobal);
763 }
764 else if (fContext == WDT_REMOTE_CALL)
765 {
767
768 handle = *(ULONG *)pBuffer;
769 pBuffer += sizeof(ULONG);
770
771 if (handle)
772 {
773 ULONG size;
774 void *memory;
775
776 size = *(ULONG *)pBuffer;
777 pBuffer += sizeof(ULONG);
778 /* redundancy is bad - it means you have to check consistency like
779 * this: */
780 if (*(ULONG *)pBuffer != handle)
781 {
783 return pBuffer;
784 }
785 pBuffer += sizeof(ULONG);
786 /* redundancy is bad - it means you have to check consistency like
787 * this: */
788 if (*(ULONG *)pBuffer != size)
789 {
791 return pBuffer;
792 }
793 pBuffer += sizeof(ULONG);
794
795 /* FIXME: check size is not too big */
796
797 *phGlobal = GlobalAlloc(GMEM_MOVEABLE, size);
798 memory = GlobalLock(*phGlobal);
800 pBuffer += size;
801 GlobalUnlock(*phGlobal);
802 }
803 else
804 *phGlobal = NULL;
805 }
806 else
808
809 return pBuffer;
810}
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
#define GMEM_MOVEABLE
Definition: winbase.h:318

Referenced by STGMEDIUM_UserUnmarshal(), and test_marshal_HGLOBAL().

◆ HPALETTE_UserFree()

void __RPC_USER HPALETTE_UserFree ( ULONG pFlags,
HPALETTE *  phPal 
)

Definition at line 856 of file usrmarshal.c.

857{
858 FIXME(":stub\n");
859}
#define FIXME(fmt,...)
Definition: precomp.h:53

◆ HPALETTE_UserMarshal()

unsigned char *__RPC_USER HPALETTE_UserMarshal ( ULONG pFlags,
unsigned char pBuffer,
HPALETTE *  phPal 
)

Definition at line 588 of file usrmarshal.c.

589{
590 FIXME(":stub\n");
591 return pBuffer;
592}

◆ HPALETTE_UserSize()

ULONG __RPC_USER HPALETTE_UserSize ( ULONG pFlags,
ULONG  StartingSize,
HPALETTE *  phPal 
)

Definition at line 563 of file usrmarshal.c.

564{
565 FIXME(":stub\n");
566 return StartingSize;
567}

◆ HPALETTE_UserUnmarshal()

unsigned char *__RPC_USER HPALETTE_UserUnmarshal ( ULONG pFlags,
unsigned char pBuffer,
HPALETTE *  phPal 
)

Definition at line 613 of file usrmarshal.c.

614{
615 FIXME(":stub\n");
616 return pBuffer;
617}

◆ WdtpInterfacePointer_UserFree()

void WINAPI WdtpInterfacePointer_UserFree ( IUnknown punk)

Definition at line 1023 of file usrmarshal.c.

1024{
1025 TRACE("%p.\n", punk);
1026 if (punk) IUnknown_Release(punk);
1027}
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158

◆ WdtpInterfacePointer_UserMarshal()

unsigned char *WINAPI WdtpInterfacePointer_UserMarshal ( ULONG pFlags,
ULONG  RealFlags,
unsigned char pBuffer,
IUnknown punk,
REFIID  riid 
)

Definition at line 917 of file usrmarshal.c.

918{
920 IStream *stm;
921 DWORD size;
922 void *ptr;
923
924 TRACE("%s, %#lx, %p, &%p, %s.\n", debugstr_user_flags(pFlags), RealFlags, pBuffer, punk, debugstr_guid(riid));
925
926 if (!h) return NULL;
927 if (CreateStreamOnHGlobal(h, TRUE, &stm) != S_OK)
928 {
929 GlobalFree(h);
930 return NULL;
931 }
932
933 if (CoMarshalInterface(stm, riid, punk, LOWORD(RealFlags), NULL, MSHLFLAGS_NORMAL) != S_OK)
934 {
935 IStream_Release(stm);
936 return pBuffer;
937 }
938
940 size = GlobalSize(h);
941
942 *(DWORD *)pBuffer = size;
943 pBuffer += sizeof(DWORD);
944 *(DWORD *)pBuffer = size;
945 pBuffer += sizeof(DWORD);
946
947 ptr = GlobalLock(h);
950
951 IStream_Release(stm);
952 return pBuffer + size;
953}
#define TRUE
Definition: types.h:120
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL delete_on_release, IStream **stream)
HRESULT WINAPI CoMarshalInterface(IStream *stream, REFIID riid, IUnknown *unk, DWORD dest_context, void *pvDestContext, DWORD mshlFlags)
Definition: marshal.c:483
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define debugstr_guid
Definition: kernel32.h:35
static PVOID ptr
Definition: dispmode.c:27
#define DWORD
Definition: nt_native.h:44

Referenced by interface_variant_marshal(), marshal_STGMEDIUM(), marshal_WdtpInterfacePointer(), and STGMEDIUM_UserMarshal().

◆ WdtpInterfacePointer_UserSize()

ULONG __RPC_USER WdtpInterfacePointer_UserSize ( ULONG pFlags,
ULONG  RealFlags,
ULONG  StartingSize,
IUnknown punk,
REFIID  riid 
)

Definition at line 882 of file usrmarshal.c.

883{
884 DWORD marshal_size = 0;
885 HRESULT hr;
886
887 TRACE("%s, %#lx, %lu, %p, %s.\n", debugstr_user_flags(pFlags), RealFlags, StartingSize, punk, debugstr_guid(riid));
888
889 hr = CoGetMarshalSizeMax(&marshal_size, riid, punk, LOWORD(RealFlags), NULL, MSHLFLAGS_NORMAL);
890 if (FAILED(hr)) return StartingSize;
891
892 ALIGN_LENGTH(StartingSize, 3);
893 StartingSize += 2 * sizeof(DWORD);
894 return StartingSize + marshal_size;
895}
HRESULT WINAPI CoGetMarshalSizeMax(ULONG *size, REFIID riid, IUnknown *unk, DWORD dest_context, void *pvDestContext, DWORD mshlFlags)
Definition: marshal.c:440
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT hr
Definition: shlfolder.c:183

Referenced by interface_variant_size(), marshal_STGMEDIUM(), marshal_WdtpInterfacePointer(), and STGMEDIUM_UserSize().

◆ WdtpInterfacePointer_UserUnmarshal()

unsigned char *WINAPI WdtpInterfacePointer_UserUnmarshal ( ULONG pFlags,
unsigned char pBuffer,
IUnknown **  ppunk,
REFIID  riid 
)

Definition at line 974 of file usrmarshal.c.

975{
976 HRESULT hr;
977 HGLOBAL h;
978 IStream *stm;
979 DWORD size;
980 void *ptr;
981 IUnknown *orig;
982
983 TRACE("%s, %p, %p, %s.\n", debugstr_user_flags(pFlags), pBuffer, ppunk, debugstr_guid(riid));
984
986
987 size = *(DWORD *)pBuffer;
988 pBuffer += sizeof(DWORD);
989 if (size != *(DWORD *)pBuffer)
991
992 pBuffer += sizeof(DWORD);
993
994 /* FIXME: sanity check on size */
995
997 if (!h) RaiseException(RPC_X_NO_MEMORY, 0, 0, NULL);
998
999 if (CreateStreamOnHGlobal(h, TRUE, &stm) != S_OK)
1000 {
1001 GlobalFree(h);
1003 }
1004
1005 ptr = GlobalLock(h);
1007 GlobalUnlock(h);
1008
1009 orig = *ppunk;
1010 hr = CoUnmarshalInterface(stm, riid, (void**)ppunk);
1011 IStream_Release(stm);
1012
1013 if (hr != S_OK) RaiseException(hr, 0, 0, NULL);
1014
1015 if (orig) IUnknown_Release(orig);
1016
1017 return pBuffer + size;
1018}
HRESULT WINAPI CoUnmarshalInterface(IStream *stream, REFIID riid, void **ppv)
Definition: marshal.c:793
#define RPC_X_NO_MEMORY
Definition: rpcnterr.h:35

Referenced by interface_variant_unmarshal(), marshal_WdtpInterfacePointer(), and STGMEDIUM_UserUnmarshal().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( ole  )