Fixed CoMarshalInterThreadInterfaceInStream and
CoGetInterfaceAndReleaseStream.

diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c
index 6baa5de..ff84034 100644
--- a/dlls/ole32/marshal.c
+++ b/dlls/ole32/marshal.c
@@ -596,45 +596,68 @@
 /***********************************************************************
  *		CoMarshalInterThreadInterfaceInStream	[OLE32.@]
  *
- * Marshal interfaces across threads. We don't have a thread distinction,
- * meaning most interfaces just work across different threads, the RPC
- * handles it.
+ * Marshal an interface across threads in the same process.
+ *
+ * PARAMS
+ *  riid  [I] Identifier of the interface to be marshalled.
+ *  pUnk  [I] Pointer to IUnknown-derived interface that will be marshalled.
+ *  ppStm [O] Pointer to IStream object that is created and then used to store the marshalled inteface.
+ *
+ * RETURNS
+ *  Success: S_OK
+ *  Failure: E_OUTOFMEMORY and other COM error codes
+ *
+ * SEE
+ *   CoMarshalInterface(), CoUnmarshalInterface() and CoGetInterfaceAndReleaseStream()
  */
 HRESULT WINAPI
 CoMarshalInterThreadInterfaceInStream(
-  REFIID riid, LPUNKNOWN pUnk, LPSTREAM * ppStm
-) {
-  ULONG res;
-  ULARGE_INTEGER	xpos;
-  LARGE_INTEGER		seekto;
-  HRESULT		hres;
+  REFIID riid, LPUNKNOWN pUnk, LPSTREAM * ppStm)
+{
+    ULARGE_INTEGER	xpos;
+    LARGE_INTEGER		seekto;
+    HRESULT		hres;
 
-  TRACE("(%s, %p, %p)\n",debugstr_guid(riid), pUnk, ppStm);
-  hres = CreateStreamOnHGlobal(0, TRUE, ppStm);
-  if (hres) return hres;
-  /* CoMarshalInterface(...); */
-  hres = IStream_Write(*ppStm,&pUnk,sizeof(LPUNKNOWN),&res);
-  if (hres) return hres;
-  memset(&seekto,0,sizeof(seekto));
-  IStream_Seek(*ppStm,seekto,SEEK_SET,&xpos);
-  return S_OK;
+    TRACE("(%s, %p, %p)\n",debugstr_guid(riid), pUnk, ppStm);
+
+    hres = CreateStreamOnHGlobal(0, TRUE, ppStm);
+    if (FAILED(hres)) return hres;
+    hres = CoMarshalInterface(*ppStm, riid, pUnk, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
+
+    /* FIXME: is this needed? */
+    memset(&seekto,0,sizeof(seekto));
+    IStream_Seek(*ppStm,seekto,SEEK_SET,&xpos);
+
+    return hres;
 }
 
 /***********************************************************************
  *		CoGetInterfaceAndReleaseStream	[OLE32.@]
+ *
+ * Unmarshalls an inteface from a stream and then releases the stream.
+ *
+ * PARAMS
+ *  pStm [I] Stream that contains the marshalled inteface.
+ *  riid [I] Interface identifier of the object to unmarshall.
+ *  ppv  [O] Address of pointer where the requested interface object will be stored.
+ *
+ * RETURNS
+ *  Success: S_OK
+ *  Failure: A COM error code
+ *
+ * SEE
+ *  CoMarshalInterThreadInterfaceInStream() and CoUnmarshalInteface()
  */
 HRESULT WINAPI
-CoGetInterfaceAndReleaseStream(LPSTREAM pStm,REFIID riid, LPVOID *ppv) {
-  ULONG res;
-  HRESULT		hres;
-  LPUNKNOWN		pUnk;
+CoGetInterfaceAndReleaseStream(LPSTREAM pStm,REFIID riid, LPVOID *ppv)
+{
+    HRESULT hres;
 
-  TRACE("(,%s,)\n",debugstr_guid(riid));
-  /* CoUnmarshalInterface(...); */
-  hres = IStream_Read(pStm,&pUnk,sizeof(LPUNKNOWN),&res);
-  if (hres) return hres;
-  IStream_Release(pStm);
-  return IUnknown_QueryInterface(pUnk,riid,ppv);
+    TRACE("(%p, %s, %p)\n", pStm, debugstr_guid(riid), ppv);
+
+    hres = CoUnmarshalInterface(pStm, riid, ppv);
+    IStream_Release(pStm);
+    return hres;
 }
 
 static HRESULT WINAPI