Alexandre Julliard : rpcrt4: Add a wrapper for NdrClientCall2 to isolate calling convention differences .
Alexandre Julliard
julliard at winehq.org
Tue Jun 14 11:57:49 CDT 2011
Module: wine
Branch: master
Commit: 379479a973a49dcdb07eb806a2b8c0ad08fde403
URL: http://source.winehq.org/git/wine.git/?a=commit;h=379479a973a49dcdb07eb806a2b8c0ad08fde403
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Jun 13 12:39:47 2011 +0200
rpcrt4: Add a wrapper for NdrClientCall2 to isolate calling convention differences.
---
dlls/rpcrt4/cproxy.c | 12 +++++++-----
dlls/rpcrt4/ndr_stubless.c | 42 +++++++++++++++++++-----------------------
dlls/rpcrt4/ndr_stubless.h | 2 ++
dlls/rpcrt4/rpcrt4.spec | 2 +-
4 files changed, 29 insertions(+), 29 deletions(-)
diff --git a/dlls/rpcrt4/cproxy.c b/dlls/rpcrt4/cproxy.c
index 8352ba3..6a73953 100644
--- a/dlls/rpcrt4/cproxy.c
+++ b/dlls/rpcrt4/cproxy.c
@@ -37,6 +37,7 @@
#include "cpsf.h"
#include "ndr_misc.h"
+#include "ndr_stubless.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole);
@@ -95,19 +96,20 @@ __ASM_GLOBAL_FUNC(call_stubless_func,
"addl %edx,%esp\n\t"
"jmp *%ecx" );
-CLIENT_CALL_RETURN WINAPI ObjectStubless(DWORD *args)
+LONG_PTR WINAPI ObjectStubless(void **args)
{
- DWORD index = args[0];
+ DWORD index = (DWORD)args[0];
void **iface = (void **)args[2];
const void **vtbl = (const void **)*iface;
const MIDL_STUBLESS_PROXY_INFO *stubless = *(const MIDL_STUBLESS_PROXY_INFO **)(vtbl - 2);
const PFORMAT_STRING fs = stubless->ProcFormatString + stubless->FormatStringOffset[index];
+ DWORD arg_size = *(const WORD*)(fs + 8);
/* store bytes to remove from stack */
- args[0] = *(const WORD*)(fs + 8);
- TRACE("(%p)->(%d)([%d bytes]) ret=%08x\n", iface, index, args[0], args[1]);
+ args[0] = (void *)arg_size;
+ TRACE("(%p)->(%d)([%d bytes]) ret=%p\n", iface, index, arg_size, args[1]);
- return NdrClientCall2(stubless->pStubDesc, fs, args + 2);
+ return ndr_client_call(stubless->pStubDesc, fs, args + 2);
}
#define BLOCK_SIZE 1024
diff --git a/dlls/rpcrt4/ndr_stubless.c b/dlls/rpcrt4/ndr_stubless.c
index f019776..9591f2d 100644
--- a/dlls/rpcrt4/ndr_stubless.c
+++ b/dlls/rpcrt4/ndr_stubless.c
@@ -565,7 +565,7 @@ void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg,
}
}
-CLIENT_CALL_RETURN WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, ...)
+LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, void **stack_top )
{
/* pointer to start of stack where arguments start */
RPC_MESSAGE rpcMsg;
@@ -594,7 +594,6 @@ CLIENT_CALL_RETURN WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STR
PFORMAT_STRING pHandleFormat;
/* correlation cache */
ULONG_PTR NdrCorrCache[256];
- __ms_va_list args;
TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat);
@@ -623,7 +622,7 @@ CLIENT_CALL_RETURN WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STR
if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
{
/* object is always the first argument */
- This = **(void *const **)(&pFormat+1);
+ This = stack_top[0];
NdrProxyInitialize(This, &rpcMsg, &stubMsg, pStubDesc, procedure_number);
}
else
@@ -632,11 +631,7 @@ CLIENT_CALL_RETURN WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STR
TRACE("Oi_flags = 0x%02x\n", pProcHeader->Oi_flags);
TRACE("MIDL stub version = 0x%x\n", pStubDesc->MIDLVersion);
- /* needed for conformance of top-level objects */
- __ms_va_start( args, pFormat );
- stubMsg.StackTop = va_arg( args, unsigned char * );
- __ms_va_end( args );
-
+ stubMsg.StackTop = (unsigned char *)stack_top;
pHandleFormat = pFormat;
/* we only need a handle if this isn't an object method */
@@ -915,9 +910,24 @@ CLIENT_CALL_RETURN WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STR
done:
TRACE("RetVal = 0x%lx\n", RetVal);
- return *(CLIENT_CALL_RETURN *)&RetVal;
+ return RetVal;
}
+/***********************************************************************
+ * NdrClientCall2 [RPCRT4.@]
+ */
+CLIENT_CALL_RETURN WINAPIV NdrClientCall2( PMIDL_STUB_DESC desc, PFORMAT_STRING format, ... )
+{
+ __ms_va_list args;
+ LONG_PTR ret;
+
+ __ms_va_start( args, format );
+ ret = ndr_client_call( desc, format, va_arg( args, void ** ));
+ __ms_va_end( args );
+ return *(CLIENT_CALL_RETURN *)&ret;
+}
+
+
/* Calls a function with the specified arguments, restoring the stack
* properly afterwards as we don't know the calling convention of the
* function */
@@ -1651,20 +1661,6 @@ void WINAPI NdrServerCall2(PRPC_MESSAGE pRpcMsg)
}
/***********************************************************************
- * NdrClientCall [RPCRT4.@]
- */
-CLIENT_CALL_RETURN WINAPIV NdrClientCall( PMIDL_STUB_DESC desc, PFORMAT_STRING format, ... )
-{
- __ms_va_list args;
- CLIENT_CALL_RETURN ret;
-
- __ms_va_start( args, format );
- ret = NdrClientCall2( desc, format, va_arg( args, unsigned char * ));
- __ms_va_end( args );
- return ret;
-}
-
-/***********************************************************************
* NdrStubCall [RPCRT4.@]
*/
LONG WINAPI NdrStubCall( struct IRpcStubBuffer *This, struct IRpcChannelBuffer *channel,
diff --git a/dlls/rpcrt4/ndr_stubless.h b/dlls/rpcrt4/ndr_stubless.h
index b672554..baa1f3e 100644
--- a/dlls/rpcrt4/ndr_stubless.h
+++ b/dlls/rpcrt4/ndr_stubless.h
@@ -236,6 +236,8 @@ typedef struct _NDR_EHD_CONTEXT
#include "poppack.h"
+LONG_PTR CDECL ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat,
+ void **stack_top ) DECLSPEC_HIDDEN;
void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg,
PFORMAT_STRING pFormat, int phase, unsigned char *args,
unsigned short stack_size, unsigned char *pRetVal, BOOL object_proc,
diff --git a/dlls/rpcrt4/rpcrt4.spec b/dlls/rpcrt4/rpcrt4.spec
index bacef8c..b88c16d 100644
--- a/dlls/rpcrt4/rpcrt4.spec
+++ b/dlls/rpcrt4/rpcrt4.spec
@@ -127,7 +127,7 @@
@ stdcall NdrCStdStubBuffer_Release(ptr ptr)
@ stdcall NdrClearOutParameters(ptr ptr ptr)
@ varargs NdrClientCall2(ptr ptr)
-@ varargs NdrClientCall(ptr ptr)
+@ varargs -arch=i386 NdrClientCall(ptr ptr) NdrClientCall2
@ stdcall NdrClientContextMarshall(ptr ptr long)
@ stdcall NdrClientContextUnmarshall(ptr ptr ptr)
@ stub NdrClientInitialize
More information about the wine-cvs
mailing list