/*********************************************************************** * NdrInterfacePointerMarshall [RPCRT4.@] */ unsigned char * WINAPI NdrInterfacePointerMarshall(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory, PFORMAT_STRING pFormat) { const IID *riid = get_ip_iid(pStubMsg, pMemory, pFormat); LPSTREAM stream; HRESULT hr; TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); pStubMsg->MaxCount = 0; if (!LoadCOM()) return NULL; if (pStubMsg->Buffer + sizeof(DWORD) <= (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength) { stream = RpcStream_Create(pStubMsg, TRUE); if (stream) { if (pMemory) hr = COM_MarshalInterface(stream, riid, (LPUNKNOWN)pMemory, pStubMsg->dwDestContext, pStubMsg->pvDestContext, MSHLFLAGS_NORMAL); else hr = S_OK; IStream_Release(stream); if (FAILED(hr)) RpcRaiseException(hr); } } return NULL; }
/*********************************************************************** * NdrInterfacePointerBufferSize [RPCRT4.@] */ void WINAPI NdrInterfacePointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg, unsigned char *pMemory, PFORMAT_STRING pFormat) { const IID *riid = get_ip_iid(pStubMsg, pMemory, pFormat); ULONG size = 0; TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat); if (!LoadCOM()) return; COM_GetMarshalSizeMax(&size, riid, (LPUNKNOWN)pMemory, pStubMsg->dwDestContext, pStubMsg->pvDestContext, MSHLFLAGS_NORMAL); TRACE("size=%d\n", size); pStubMsg->BufferLength += sizeof(DWORD) + size; }
/*********************************************************************** * Helper function to create a stub. * This probably looks very much like NdrpCreateStub. */ HRESULT create_stub(REFIID iid, IUnknown *pUnk, IRpcStubBuffer **ppstub) { CLSID clsid; IPSFactoryBuffer *psfac; HRESULT r; if(!LoadCOM()) return E_FAIL; r = COM_GetPSClsid( iid, &clsid ); if(FAILED(r)) return r; r = COM_GetClassObject( &clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IPSFactoryBuffer, (void**)&psfac ); if(FAILED(r)) return r; r = IPSFactoryBuffer_CreateStub(psfac, iid, pUnk, ppstub); IPSFactoryBuffer_Release(psfac); return r; }
/*********************************************************************** * NdrInterfacePointerUnmarshall [RPCRT4.@] */ unsigned char * WINAPI NdrInterfacePointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg, unsigned char **ppMemory, PFORMAT_STRING pFormat, unsigned char fMustAlloc) { LPSTREAM stream; HRESULT hr; TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc); if (!LoadCOM()) return NULL; *(LPVOID*)ppMemory = NULL; if (pStubMsg->Buffer + sizeof(DWORD) < (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength) { stream = RpcStream_Create(pStubMsg, FALSE); if (!stream) RpcRaiseException(E_OUTOFMEMORY); if (*((RpcStreamImpl *)stream)->size != 0) hr = COM_UnmarshalInterface(stream, &IID_NULL, (LPVOID*)ppMemory); else hr = S_OK; IStream_Release(stream); if (FAILED(hr)) RpcRaiseException(hr); } return NULL; }
/*********************************************************************** * NdrOleFree [RPCRT4.@] */ void WINAPI NdrOleFree(void *NodeToFree) { if (!LoadCOM()) return; COM_MemFree(NodeToFree); }
/*********************************************************************** * NdrOleAllocate [RPCRT4.@] */ void * WINAPI NdrOleAllocate(size_t Size) { if (!LoadCOM()) return NULL; return COM_MemAlloc(Size); }