diff --git a/dlls/rpcrt4/Makefile.in b/dlls/rpcrt4/Makefile.in index a540b3571ef..6ea1808b634 100644 --- a/dlls/rpcrt4/Makefile.in +++ b/dlls/rpcrt4/Makefile.in @@ -13,6 +13,7 @@ SYMBOLFILE = $(MODULE).tmp.o C_SRCS = \ cproxy.c \ cstub.c \ + ndr_midl.c \ ndr_stubless.c \ rpc_binding.c \ rpc_message.c \ diff --git a/dlls/rpcrt4/ndr_midl.c b/dlls/rpcrt4/ndr_midl.c new file mode 100644 index 00000000000..aca9510fd69 --- /dev/null +++ b/dlls/rpcrt4/ndr_midl.c @@ -0,0 +1,169 @@ +/* + * MIDL proxy/stub stuff + * + * Copyright 2002 Ove Kåven, TransGaming Technologies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * TODO: + * - figure out whether we *really* got this right + * - check for errors and throw exceptions + */ + +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winreg.h" + +#include "wine/obj_base.h" +#include "wine/obj_channel.h" + +#include "rpcproxy.h" + +#include "wine/debug.h" + +#include "cpsf.h" +#include "ndr_misc.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +/*********************************************************************** + * NdrProxyInitialize [RPCRT4.@] + */ +void WINAPI NdrProxyInitialize(void *This, + PRPC_MESSAGE pRpcMsg, + PMIDL_STUB_MESSAGE pStubMsg, + PMIDL_STUB_DESC pStubDescriptor, + unsigned int ProcNum) +{ + HRESULT hr; + + TRACE("(%p,%p,%p,%p,%d)\n", This, pRpcMsg, pStubMsg, pStubDescriptor, ProcNum); + memset(pRpcMsg, 0, sizeof(RPC_MESSAGE)); + memset(pStubMsg, 0, sizeof(MIDL_STUB_MESSAGE)); + pRpcMsg->ProcNum = ProcNum; + pRpcMsg->RpcInterfaceInformation = pStubDescriptor->RpcInterfaceInformation; + pStubMsg->RpcMsg = pRpcMsg; + pStubMsg->IsClient = 1; + pStubMsg->ReuseBuffer = 1; + pStubMsg->pfnAllocate = pStubDescriptor->pfnAllocate; + pStubMsg->pfnFree = pStubDescriptor->pfnFree; + pStubMsg->StubDesc = pStubDescriptor; + if (This) StdProxy_GetChannel(This, &pStubMsg->pRpcChannelBuffer); + if (pStubMsg->pRpcChannelBuffer) { + hr = IRpcChannelBuffer_GetDestCtx(pStubMsg->pRpcChannelBuffer, + &pStubMsg->dwDestContext, + &pStubMsg->pvDestContext); + } + TRACE("channel=%p\n", pStubMsg->pRpcChannelBuffer); +} + +/*********************************************************************** + * NdrProxyGetBuffer [RPCRT4.@] + */ +void WINAPI NdrProxyGetBuffer(void *This, + PMIDL_STUB_MESSAGE pStubMsg) +{ + HRESULT hr; + const IID *riid = NULL; + + TRACE("(%p,%p)\n", This, pStubMsg); + pStubMsg->RpcMsg->BufferLength = pStubMsg->BufferLength; + pStubMsg->dwStubPhase = PROXY_GETBUFFER; + hr = StdProxy_GetIID(This, &riid); + hr = IRpcChannelBuffer_GetBuffer(pStubMsg->pRpcChannelBuffer, + (RPCOLEMESSAGE*)pStubMsg->RpcMsg, + riid); + pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; + pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; + pStubMsg->Buffer = pStubMsg->BufferStart; + pStubMsg->dwStubPhase = PROXY_MARSHAL; +} + +/*********************************************************************** + * NdrProxySendReceive [RPCRT4.@] + */ +void WINAPI NdrProxySendReceive(void *This, + PMIDL_STUB_MESSAGE pStubMsg) +{ + ULONG Status = 0; + HRESULT hr; + + TRACE("(%p,%p)\n", This, pStubMsg); + pStubMsg->dwStubPhase = PROXY_SENDRECEIVE; + hr = IRpcChannelBuffer_SendReceive(pStubMsg->pRpcChannelBuffer, + (RPCOLEMESSAGE*)pStubMsg->RpcMsg, + &Status); + pStubMsg->dwStubPhase = PROXY_UNMARSHAL; + pStubMsg->BufferLength = pStubMsg->RpcMsg->BufferLength; + pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; + pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; + pStubMsg->Buffer = pStubMsg->BufferStart; +} + +/*********************************************************************** + * NdrProxyFreeBuffer [RPCRT4.@] + */ +void WINAPI NdrProxyFreeBuffer(void *This, + PMIDL_STUB_MESSAGE pStubMsg) +{ + HRESULT hr; + + TRACE("(%p,%p)\n", This, pStubMsg); + hr = IRpcChannelBuffer_FreeBuffer(pStubMsg->pRpcChannelBuffer, + (RPCOLEMESSAGE*)pStubMsg->RpcMsg); +} + +/*********************************************************************** + * NdrStubInitialize [RPCRT4.@] + */ +void WINAPI NdrStubInitialize(PRPC_MESSAGE pRpcMsg, + PMIDL_STUB_MESSAGE pStubMsg, + PMIDL_STUB_DESC pStubDescriptor, + LPRPCCHANNELBUFFER pRpcChannelBuffer) +{ + TRACE("(%p,%p,%p,%p)\n", pRpcMsg, pStubMsg, pStubDescriptor, pRpcChannelBuffer); + memset(pStubMsg, 0, sizeof(MIDL_STUB_MESSAGE)); + pStubMsg->RpcMsg = pRpcMsg; + pStubMsg->IsClient = 0; + pStubMsg->ReuseBuffer = 1; + pStubMsg->pfnAllocate = pStubDescriptor->pfnAllocate; + pStubMsg->pfnFree = pStubDescriptor->pfnFree; + pStubMsg->StubDesc = pStubDescriptor; + pStubMsg->pRpcChannelBuffer = pRpcChannelBuffer; + pStubMsg->BufferLength = pStubMsg->RpcMsg->BufferLength; + pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; + pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; + pStubMsg->Buffer = pStubMsg->BufferStart; +} + +/*********************************************************************** + * NdrStubGetBuffer [RPCRT4.@] + */ +void WINAPI NdrStubGetBuffer(LPRPCSTUBBUFFER This, + LPRPCCHANNELBUFFER pRpcChannelBuffer, + PMIDL_STUB_MESSAGE pStubMsg) +{ + TRACE("(%p,%p)\n", This, pStubMsg); + pStubMsg->pRpcChannelBuffer = pRpcChannelBuffer; + pStubMsg->RpcMsg->BufferLength = pStubMsg->BufferLength; + I_RpcGetBuffer(pStubMsg->RpcMsg); /* ? */ + pStubMsg->BufferStart = pStubMsg->RpcMsg->Buffer; + pStubMsg->BufferEnd = pStubMsg->BufferStart + pStubMsg->BufferLength; + pStubMsg->Buffer = pStubMsg->BufferStart; +} diff --git a/dlls/rpcrt4/rpcrt4.spec b/dlls/rpcrt4/rpcrt4.spec index 88ad2f5effd..dad0d511817 100644 --- a/dlls/rpcrt4/rpcrt4.spec +++ b/dlls/rpcrt4/rpcrt4.spec @@ -253,10 +253,10 @@ init RPCRT4_LibMain @ stub NdrPipesDone @ stub NdrPipesInitialize @ stub NdrProxyErrorHandler -@ stub NdrProxyFreeBuffer -@ stub NdrProxyGetBuffer -@ stub NdrProxyInitialize -@ stub NdrProxySendReceive +@ stdcall NdrProxyFreeBuffer(ptr ptr) NdrProxyFreeBuffer +@ stdcall NdrProxyGetBuffer(ptr ptr) NdrProxyGetBuffer +@ stdcall NdrProxyInitialize(ptr ptr ptr ptr long) NdrProxyInitialize +@ stdcall NdrProxySendReceive(ptr ptr) NdrProxySendReceive @ stub NdrRangeUnmarshall @ stub NdrRpcSmClientAllocate @ stub NdrRpcSmClientFree @@ -271,7 +271,9 @@ init RPCRT4_LibMain @ stub NdrStubCall @ stub NdrStubCall2 @ stub NdrStubForwardingFunction -@ stub NdrStubGetBuffer +@ stdcall NdrStubGetBuffer(ptr ptr ptr) NdrStubGetBuffer +@ stdcall NdrStubInitialize(ptr ptr ptr ptr) NdrStubInitialize +@ stub NdrStubInitializeMarshall @ stub NdrpSetRpcSsDefaults @ stub NdrByteCountPointerBufferSize @@ -358,8 +360,6 @@ init RPCRT4_LibMain @ stub NdrSimpleStructUnmarshall @ stub NdrSimpleTypeMarshall @ stub NdrSimpleTypeUnmarshall -@ stub NdrStubInitialize -@ stub NdrStubInitializeMarshall @ stub NdrUserMarshalBufferSize @ stub NdrUserMarshalFree @ stub NdrUserMarshalMarshall diff --git a/include/rpcproxy.h b/include/rpcproxy.h index 70c4a002d82..c97283d0ec4 100644 --- a/include/rpcproxy.h +++ b/include/rpcproxy.h @@ -16,14 +16,14 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifndef __RPCPROXY_H_VERSION__ +/* FIXME: Find an appropriate version number. I guess something is better than nothing */ +#define __RPCPROXY_H_VERSION__ ( 399 ) +#endif + #ifndef __WINE_RPCPROXY_H #define __WINE_RPCPROXY_H -#ifndef __RPCPROXY_H_VERSION__ -/* FIXME: I'm not sure what version though */ -#define __RPCPROXY_H_VERSION__ -#endif - #include "basetsd.h" #include "guiddef.h" #include "winnt.h"