ReactOS 0.4.15-dev-7928-g68a8619
ftmarshal.c File Reference
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "windef.h"
#include "winbase.h"
#include "objbase.h"
#include "wine/debug.h"
#include "compobj_private.h"
Include dependency graph for ftmarshal.c:

Go to the source code of this file.

Classes

struct  _FTMarshalImpl
 

Macros

#define COBJMACROS
 

Typedefs

typedef struct _FTMarshalImpl FTMarshalImpl
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (ole)
 
static FTMarshalImplimpl_from_IUnknown (IUnknown *iface)
 
static FTMarshalImplimpl_from_IMarshal (IMarshal *iface)
 
static HRESULT WINAPI IiFTMUnknown_fnQueryInterface (IUnknown *iface, REFIID riid, LPVOID *ppv)
 
static ULONG WINAPI IiFTMUnknown_fnAddRef (IUnknown *iface)
 
static ULONG WINAPI IiFTMUnknown_fnRelease (IUnknown *iface)
 
static HRESULT WINAPI FTMarshalImpl_QueryInterface (LPMARSHAL iface, REFIID riid, LPVOID *ppv)
 
static ULONG WINAPI FTMarshalImpl_AddRef (LPMARSHAL iface)
 
static ULONG WINAPI FTMarshalImpl_Release (LPMARSHAL iface)
 
static HRESULT WINAPI FTMarshalImpl_GetUnmarshalClass (LPMARSHAL iface, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, CLSID *pCid)
 
static HRESULT WINAPI FTMarshalImpl_GetMarshalSizeMax (LPMARSHAL iface, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, DWORD *pSize)
 
static HRESULT WINAPI FTMarshalImpl_MarshalInterface (LPMARSHAL iface, IStream *pStm, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags)
 
static HRESULT WINAPI FTMarshalImpl_UnmarshalInterface (LPMARSHAL iface, IStream *pStm, REFIID riid, void **ppv)
 
static HRESULT WINAPI FTMarshalImpl_ReleaseMarshalData (LPMARSHAL iface, IStream *pStm)
 
static HRESULT WINAPI FTMarshalImpl_DisconnectObject (LPMARSHAL iface, DWORD dwReserved)
 
HRESULT WINAPI CoCreateFreeThreadedMarshaler (LPUNKNOWN punkOuter, LPUNKNOWN *ppunkMarshal)
 
static HRESULT WINAPI FTMarshalCF_QueryInterface (LPCLASSFACTORY iface, REFIID riid, LPVOID *ppv)
 
static ULONG WINAPI FTMarshalCF_AddRef (LPCLASSFACTORY iface)
 
static ULONG WINAPI FTMarshalCF_Release (LPCLASSFACTORY iface)
 
static HRESULT WINAPI FTMarshalCF_CreateInstance (LPCLASSFACTORY iface, LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv)
 
static HRESULT WINAPI FTMarshalCF_LockServer (LPCLASSFACTORY iface, BOOL fLock)
 
HRESULT FTMarshalCF_Create (REFIID riid, LPVOID *ppv)
 

Variables

static const IUnknownVtbl iunkvt
 
static const IMarshalVtbl ftmvtbl
 
static const IClassFactoryVtbl FTMarshalCFVtbl
 
static const IClassFactoryVtbl * FTMarshalCF = &FTMarshalCFVtbl
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 27 of file ftmarshal.c.

Typedef Documentation

◆ FTMarshalImpl

Function Documentation

◆ CoCreateFreeThreadedMarshaler()

HRESULT WINAPI CoCreateFreeThreadedMarshaler ( LPUNKNOWN  punkOuter,
LPUNKNOWN ppunkMarshal 
)

Definition at line 331 of file ftmarshal.c.

332{
333
334 FTMarshalImpl *ftm;
335
336 TRACE ("(%p %p)\n", punkOuter, ppunkMarshal);
337
338 ftm = HeapAlloc (GetProcessHeap (), 0, sizeof (FTMarshalImpl));
339 if (!ftm)
340 return E_OUTOFMEMORY;
341
342 ftm->IUnknown_inner.lpVtbl = &iunkvt;
343 ftm->IMarshal_iface.lpVtbl = &ftmvtbl;
344 ftm->ref = 1;
345 ftm->outer_unk = punkOuter ? punkOuter : &ftm->IUnknown_inner;
346
347 *ppunkMarshal = &ftm->IUnknown_inner;
348 return S_OK;
349}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
static const IUnknownVtbl iunkvt
Definition: ftmarshal.c:99
static const IMarshalVtbl ftmvtbl
Definition: ftmarshal.c:297
#define S_OK
Definition: intsafe.h:52
#define TRACE(s)
Definition: solgame.cpp:4
IUnknown * outer_unk
Definition: ftmarshal.c:42
IUnknown IUnknown_inner
Definition: ftmarshal.c:40
IMarshal IMarshal_iface
Definition: ftmarshal.c:41

Referenced by FTMarshalCF_CreateInstance(), and test_freethreadedmarshaler().

◆ FTMarshalCF_AddRef()

static ULONG WINAPI FTMarshalCF_AddRef ( LPCLASSFACTORY  iface)
static

Definition at line 364 of file ftmarshal.c.

365{
366 return 2; /* non-heap based object */
367}

◆ FTMarshalCF_Create()

HRESULT FTMarshalCF_Create ( REFIID  riid,
LPVOID ppv 
)

Definition at line 411 of file ftmarshal.c.

412{
413 return IClassFactory_QueryInterface((IClassFactory *)&FTMarshalCF, riid, ppv);
414}
static const IClassFactoryVtbl * FTMarshalCF
Definition: ftmarshal.c:409
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39

Referenced by CoGetClassObject().

◆ FTMarshalCF_CreateInstance()

static HRESULT WINAPI FTMarshalCF_CreateInstance ( LPCLASSFACTORY  iface,
LPUNKNOWN  pUnk,
REFIID  riid,
LPVOID ppv 
)
static

Definition at line 374 of file ftmarshal.c.

376{
378 HRESULT hr;
379
380 TRACE("(%p, %s, %p)\n", pUnk, debugstr_guid(riid), ppv);
381
382 *ppv = NULL;
383
385
386 if (SUCCEEDED(hr))
387 {
388 hr = IUnknown_QueryInterface(pUnknown, riid, ppv);
389 IUnknown_Release(pUnknown);
390 }
391
392 return hr;
393}
#define NULL
Definition: types.h:112
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
_In_ PUNKNOWN pUnknown
Definition: drmk.h:76
HRESULT WINAPI CoCreateFreeThreadedMarshaler(LPUNKNOWN punkOuter, LPUNKNOWN *ppunkMarshal)
Definition: ftmarshal.c:331
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_guid
Definition: kernel32.h:35
HRESULT hr
Definition: shlfolder.c:183

◆ FTMarshalCF_LockServer()

static HRESULT WINAPI FTMarshalCF_LockServer ( LPCLASSFACTORY  iface,
BOOL  fLock 
)
static

Definition at line 395 of file ftmarshal.c.

396{
397 FIXME("(%d), stub!\n",fLock);
398 return S_OK;
399}
#define FIXME(fmt,...)
Definition: debug.h:111

◆ FTMarshalCF_QueryInterface()

static HRESULT WINAPI FTMarshalCF_QueryInterface ( LPCLASSFACTORY  iface,
REFIID  riid,
LPVOID ppv 
)
static

Definition at line 351 of file ftmarshal.c.

353{
354 *ppv = NULL;
356 {
357 *ppv = iface;
358 IClassFactory_AddRef(iface);
359 return S_OK;
360 }
361 return E_NOINTERFACE;
362}
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ FTMarshalCF_Release()

static ULONG WINAPI FTMarshalCF_Release ( LPCLASSFACTORY  iface)
static

Definition at line 369 of file ftmarshal.c.

370{
371 return 1; /* non-heap based object */
372}

◆ FTMarshalImpl_AddRef()

static ULONG WINAPI FTMarshalImpl_AddRef ( LPMARSHAL  iface)
static

Definition at line 117 of file ftmarshal.c.

118{
119
121
122 TRACE ("\n");
123 return IUnknown_AddRef(This->outer_unk);
124}
static FTMarshalImpl * impl_from_IMarshal(IMarshal *iface)
Definition: ftmarshal.c:51

◆ FTMarshalImpl_DisconnectObject()

static HRESULT WINAPI FTMarshalImpl_DisconnectObject ( LPMARSHAL  iface,
DWORD  dwReserved 
)
static

Definition at line 290 of file ftmarshal.c.

291{
292 TRACE ("()\n");
293 /* nothing to do */
294 return S_OK;
295}

◆ FTMarshalImpl_GetMarshalSizeMax()

static HRESULT WINAPI FTMarshalImpl_GetMarshalSizeMax ( LPMARSHAL  iface,
REFIID  riid,
void pv,
DWORD  dwDestContext,
void pvDestContext,
DWORD  mshlflags,
DWORD pSize 
)
static

Definition at line 150 of file ftmarshal.c.

152{
153
154 IMarshal *pMarshal = NULL;
156
157 TRACE("(%s, %p, 0x%x, %p, 0x%x, %p)\n", debugstr_guid(riid), pv,
158 dwDestContext, pvDestContext, mshlflags, pSize);
159
160 /* if the marshalling happens inside the same process the interface pointer is
161 copied between the apartments */
162 if (dwDestContext == MSHCTX_INPROC || dwDestContext == MSHCTX_CROSSCTX) {
163 *pSize = sizeof (mshlflags) + sizeof (pv) + sizeof (DWORD) + sizeof (GUID);
164 return S_OK;
165 }
166
167 /* use the standard marshaller to handle all other cases */
168 CoGetStandardMarshal (riid, pv, dwDestContext, pvDestContext, mshlflags, &pMarshal);
169 hres = IMarshal_GetMarshalSizeMax (pMarshal, riid, pv, dwDestContext, pvDestContext, mshlflags, pSize);
170 IMarshal_Release (pMarshal);
171 return hres;
172}
HRESULT WINAPI CoGetStandardMarshal(REFIID riid, IUnknown *pUnk, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, LPMARSHAL *ppMarshal)
Definition: marshal.c:1676
HRESULT hres
Definition: protocol.c:465
#define DWORD
Definition: nt_native.h:44

◆ FTMarshalImpl_GetUnmarshalClass()

static HRESULT WINAPI FTMarshalImpl_GetUnmarshalClass ( LPMARSHAL  iface,
REFIID  riid,
void pv,
DWORD  dwDestContext,
void pvDestContext,
DWORD  mshlflags,
CLSID pCid 
)
static

Definition at line 137 of file ftmarshal.c.

139{
140 TRACE("(%s, %p, 0x%x, %p, 0x%x, %p)\n", debugstr_guid(riid), pv,
141 dwDestContext, pvDestContext, mshlflags, pCid);
142 if (dwDestContext == MSHCTX_INPROC || dwDestContext == MSHCTX_CROSSCTX)
144 else
145 *pCid = CLSID_StdMarshal;
146 return S_OK;
147}
const CLSID CLSID_StdMarshal
const CLSID CLSID_InProcFreeMarshaler

◆ FTMarshalImpl_MarshalInterface()

static HRESULT WINAPI FTMarshalImpl_MarshalInterface ( LPMARSHAL  iface,
IStream pStm,
REFIID  riid,
void pv,
DWORD  dwDestContext,
void pvDestContext,
DWORD  mshlflags 
)
static

Definition at line 175 of file ftmarshal.c.

177{
178
179 IMarshal *pMarshal = NULL;
181
182 TRACE("(%p, %s, %p, 0x%x, %p, 0x%x)\n", pStm, debugstr_guid(riid), pv,
183 dwDestContext, pvDestContext, mshlflags);
184
185 /* if the marshalling happens inside the same process the interface pointer is
186 copied between the apartments */
187 if (dwDestContext == MSHCTX_INPROC || dwDestContext == MSHCTX_CROSSCTX) {
188 void *object;
189 DWORD constant = 0;
190 GUID unknown_guid = { 0 };
191
192 hres = IUnknown_QueryInterface((IUnknown *)pv, riid, &object);
193 if (FAILED(hres))
194 return hres;
195
196 /* don't hold a reference to table-weak marshaled interfaces */
197 if (mshlflags & MSHLFLAGS_TABLEWEAK)
198 IUnknown_Release((IUnknown *)object);
199
200 hres = IStream_Write (pStm, &mshlflags, sizeof (mshlflags), NULL);
201 if (hres != S_OK) return STG_E_MEDIUMFULL;
202
203 hres = IStream_Write (pStm, &object, sizeof (object), NULL);
204 if (hres != S_OK) return STG_E_MEDIUMFULL;
205
206 if (sizeof(object) == sizeof(DWORD))
207 {
208 hres = IStream_Write (pStm, &constant, sizeof (constant), NULL);
209 if (hres != S_OK) return STG_E_MEDIUMFULL;
210 }
211
212 hres = IStream_Write (pStm, &unknown_guid, sizeof (unknown_guid), NULL);
213 if (hres != S_OK) return STG_E_MEDIUMFULL;
214
215 return S_OK;
216 }
217
218 /* use the standard marshaler to handle all other cases */
219 CoGetStandardMarshal (riid, pv, dwDestContext, pvDestContext, mshlflags, &pMarshal);
220 hres = IMarshal_MarshalInterface (pMarshal, pStm, riid, pv, dwDestContext, pvDestContext, mshlflags);
221 IMarshal_Release (pMarshal);
222 return hres;
223}
unsigned long DWORD
Definition: ntddk_ex.h:95
#define FAILED(hr)
Definition: intsafe.h:51
#define STG_E_MEDIUMFULL
Definition: winerror.h:2581

◆ FTMarshalImpl_QueryInterface()

static HRESULT WINAPI FTMarshalImpl_QueryInterface ( LPMARSHAL  iface,
REFIID  riid,
LPVOID ppv 
)
static

Definition at line 107 of file ftmarshal.c.

108{
109
111
112 TRACE ("(%p)->(%s,%p)\n", This, debugstr_guid (riid), ppv);
113 return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
114}

◆ FTMarshalImpl_Release()

static ULONG WINAPI FTMarshalImpl_Release ( LPMARSHAL  iface)
static

Definition at line 127 of file ftmarshal.c.

128{
129
131
132 TRACE ("\n");
133 return IUnknown_Release(This->outer_unk);
134}

◆ FTMarshalImpl_ReleaseMarshalData()

static HRESULT WINAPI FTMarshalImpl_ReleaseMarshalData ( LPMARSHAL  iface,
IStream pStm 
)
static

Definition at line 259 of file ftmarshal.c.

260{
261 DWORD mshlflags;
264 GUID unknown_guid;
266
267 TRACE ("(%p)\n", pStm);
268
269 hres = IStream_Read (pStm, &mshlflags, sizeof (mshlflags), NULL);
270 if (hres != S_OK) return STG_E_READFAULT;
271
272 hres = IStream_Read (pStm, &object, sizeof (object), NULL);
273 if (hres != S_OK) return STG_E_READFAULT;
274
275 if (sizeof(object) == sizeof(DWORD))
276 {
277 hres = IStream_Read (pStm, &constant, sizeof (constant), NULL);
278 if (hres != S_OK) return STG_E_READFAULT;
279 if (constant != 0)
280 FIXME("constant is 0x%x instead of 0\n", constant);
281 }
282
283 hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL);
284 if (hres != S_OK) return STG_E_READFAULT;
285
286 IUnknown_Release(object);
287 return S_OK;
288}
#define STG_E_READFAULT
Definition: winerror.h:2576

◆ FTMarshalImpl_UnmarshalInterface()

static HRESULT WINAPI FTMarshalImpl_UnmarshalInterface ( LPMARSHAL  iface,
IStream pStm,
REFIID  riid,
void **  ppv 
)
static

Definition at line 226 of file ftmarshal.c.

227{
228 DWORD mshlflags;
231 GUID unknown_guid;
233
234 TRACE ("(%p, %s, %p)\n", pStm, debugstr_guid(riid), ppv);
235
236 hres = IStream_Read (pStm, &mshlflags, sizeof (mshlflags), NULL);
237 if (hres != S_OK) return STG_E_READFAULT;
238
239 hres = IStream_Read (pStm, &object, sizeof (object), NULL);
240 if (hres != S_OK) return STG_E_READFAULT;
241
242 if (sizeof(object) == sizeof(DWORD))
243 {
244 hres = IStream_Read (pStm, &constant, sizeof (constant), NULL);
245 if (hres != S_OK) return STG_E_READFAULT;
246 if (constant != 0)
247 FIXME("constant is 0x%x instead of 0\n", constant);
248 }
249
250 hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL);
251 if (hres != S_OK) return STG_E_READFAULT;
252
253 hres = IUnknown_QueryInterface(object, riid, ppv);
254 if (!(mshlflags & (MSHLFLAGS_TABLEWEAK|MSHLFLAGS_TABLESTRONG)))
255 IUnknown_Release(object);
256 return hres;
257}

◆ IiFTMUnknown_fnAddRef()

static ULONG WINAPI IiFTMUnknown_fnAddRef ( IUnknown iface)
static

Definition at line 78 of file ftmarshal.c.

79{
80
82
83 TRACE ("\n");
84 return InterlockedIncrement (&This->ref);
85}
#define InterlockedIncrement
Definition: armddk.h:53
static FTMarshalImpl * impl_from_IUnknown(IUnknown *iface)
Definition: ftmarshal.c:46

◆ IiFTMUnknown_fnQueryInterface()

static HRESULT WINAPI IiFTMUnknown_fnQueryInterface ( IUnknown iface,
REFIID  riid,
LPVOID ppv 
)
static

Definition at line 58 of file ftmarshal.c.

59{
60
62
63 TRACE ("\n");
64 *ppv = NULL;
65
67 *ppv = &This->IUnknown_inner;
68 else if (IsEqualIID (&IID_IMarshal, riid))
69 *ppv = &This->IMarshal_iface;
70 else {
71 FIXME ("No interface for %s.\n", debugstr_guid (riid));
72 return E_NOINTERFACE;
73 }
74 IUnknown_AddRef ((IUnknown *) * ppv);
75 return S_OK;
76}

◆ IiFTMUnknown_fnRelease()

static ULONG WINAPI IiFTMUnknown_fnRelease ( IUnknown iface)
static

Definition at line 87 of file ftmarshal.c.

88{
89
91
92 TRACE ("\n");
93 if (InterlockedDecrement (&This->ref))
94 return This->ref;
96 return 0;
97}
#define InterlockedDecrement
Definition: armddk.h:52
#define HeapFree(x, y, z)
Definition: compat.h:735

◆ impl_from_IMarshal()

static FTMarshalImpl * impl_from_IMarshal ( IMarshal iface)
inlinestatic

Definition at line 51 of file ftmarshal.c.

52{
53 return CONTAINING_RECORD(iface, FTMarshalImpl, IMarshal_iface);
54}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by FTMarshalImpl_AddRef(), FTMarshalImpl_QueryInterface(), and FTMarshalImpl_Release().

◆ impl_from_IUnknown()

static FTMarshalImpl * impl_from_IUnknown ( IUnknown iface)
inlinestatic

Definition at line 46 of file ftmarshal.c.

47{
48 return CONTAINING_RECORD(iface, FTMarshalImpl, IUnknown_inner);
49}

Referenced by IiFTMUnknown_fnAddRef(), IiFTMUnknown_fnQueryInterface(), and IiFTMUnknown_fnRelease().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( ole  )

Variable Documentation

◆ FTMarshalCF

const IClassFactoryVtbl* FTMarshalCF = &FTMarshalCFVtbl
static

Definition at line 409 of file ftmarshal.c.

Referenced by FTMarshalCF_Create().

◆ FTMarshalCFVtbl

const IClassFactoryVtbl FTMarshalCFVtbl
static
Initial value:
=
{
}
static ULONG WINAPI FTMarshalCF_AddRef(LPCLASSFACTORY iface)
Definition: ftmarshal.c:364
static HRESULT WINAPI FTMarshalCF_LockServer(LPCLASSFACTORY iface, BOOL fLock)
Definition: ftmarshal.c:395
static HRESULT WINAPI FTMarshalCF_QueryInterface(LPCLASSFACTORY iface, REFIID riid, LPVOID *ppv)
Definition: ftmarshal.c:351
static HRESULT WINAPI FTMarshalCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv)
Definition: ftmarshal.c:374
static ULONG WINAPI FTMarshalCF_Release(LPCLASSFACTORY iface)
Definition: ftmarshal.c:369

Definition at line 401 of file ftmarshal.c.

◆ ftmvtbl

const IMarshalVtbl ftmvtbl
static
Initial value:
=
{
}
static ULONG WINAPI FTMarshalImpl_AddRef(LPMARSHAL iface)
Definition: ftmarshal.c:117
static HRESULT WINAPI FTMarshalImpl_ReleaseMarshalData(LPMARSHAL iface, IStream *pStm)
Definition: ftmarshal.c:259
static HRESULT WINAPI FTMarshalImpl_UnmarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, void **ppv)
Definition: ftmarshal.c:226
static HRESULT WINAPI FTMarshalImpl_GetMarshalSizeMax(LPMARSHAL iface, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, DWORD *pSize)
Definition: ftmarshal.c:150
static HRESULT WINAPI FTMarshalImpl_MarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags)
Definition: ftmarshal.c:175
static HRESULT WINAPI FTMarshalImpl_GetUnmarshalClass(LPMARSHAL iface, REFIID riid, void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags, CLSID *pCid)
Definition: ftmarshal.c:137
static HRESULT WINAPI FTMarshalImpl_QueryInterface(LPMARSHAL iface, REFIID riid, LPVOID *ppv)
Definition: ftmarshal.c:107
static HRESULT WINAPI FTMarshalImpl_DisconnectObject(LPMARSHAL iface, DWORD dwReserved)
Definition: ftmarshal.c:290
static ULONG WINAPI FTMarshalImpl_Release(LPMARSHAL iface)
Definition: ftmarshal.c:127

Definition at line 297 of file ftmarshal.c.

Referenced by CoCreateFreeThreadedMarshaler().

◆ iunkvt

const IUnknownVtbl iunkvt
static
Initial value:
=
{
}
static ULONG WINAPI IiFTMUnknown_fnAddRef(IUnknown *iface)
Definition: ftmarshal.c:78
static ULONG WINAPI IiFTMUnknown_fnRelease(IUnknown *iface)
Definition: ftmarshal.c:87
static HRESULT WINAPI IiFTMUnknown_fnQueryInterface(IUnknown *iface, REFIID riid, LPVOID *ppv)
Definition: ftmarshal.c:58

Definition at line 99 of file ftmarshal.c.

Referenced by CoCreateFreeThreadedMarshaler().