rpcrt4: Add a wrapper for NdrClientCall2 to isolate calling convention differences.
This commit is contained in:
parent
fa847909f2
commit
379479a973
|
@ -37,6 +37,7 @@
|
||||||
|
|
||||||
#include "cpsf.h"
|
#include "cpsf.h"
|
||||||
#include "ndr_misc.h"
|
#include "ndr_misc.h"
|
||||||
|
#include "ndr_stubless.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||||
|
@ -95,19 +96,20 @@ __ASM_GLOBAL_FUNC(call_stubless_func,
|
||||||
"addl %edx,%esp\n\t"
|
"addl %edx,%esp\n\t"
|
||||||
"jmp *%ecx" );
|
"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];
|
void **iface = (void **)args[2];
|
||||||
const void **vtbl = (const void **)*iface;
|
const void **vtbl = (const void **)*iface;
|
||||||
const MIDL_STUBLESS_PROXY_INFO *stubless = *(const MIDL_STUBLESS_PROXY_INFO **)(vtbl - 2);
|
const MIDL_STUBLESS_PROXY_INFO *stubless = *(const MIDL_STUBLESS_PROXY_INFO **)(vtbl - 2);
|
||||||
const PFORMAT_STRING fs = stubless->ProcFormatString + stubless->FormatStringOffset[index];
|
const PFORMAT_STRING fs = stubless->ProcFormatString + stubless->FormatStringOffset[index];
|
||||||
|
DWORD arg_size = *(const WORD*)(fs + 8);
|
||||||
|
|
||||||
/* store bytes to remove from stack */
|
/* store bytes to remove from stack */
|
||||||
args[0] = *(const WORD*)(fs + 8);
|
args[0] = (void *)arg_size;
|
||||||
TRACE("(%p)->(%d)([%d bytes]) ret=%08x\n", iface, index, args[0], args[1]);
|
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
|
#define BLOCK_SIZE 1024
|
||||||
|
|
|
@ -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 */
|
/* pointer to start of stack where arguments start */
|
||||||
RPC_MESSAGE rpcMsg;
|
RPC_MESSAGE rpcMsg;
|
||||||
|
@ -594,7 +594,6 @@ CLIENT_CALL_RETURN WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STR
|
||||||
PFORMAT_STRING pHandleFormat;
|
PFORMAT_STRING pHandleFormat;
|
||||||
/* correlation cache */
|
/* correlation cache */
|
||||||
ULONG_PTR NdrCorrCache[256];
|
ULONG_PTR NdrCorrCache[256];
|
||||||
__ms_va_list args;
|
|
||||||
|
|
||||||
TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat);
|
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)
|
if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
|
||||||
{
|
{
|
||||||
/* object is always the first argument */
|
/* object is always the first argument */
|
||||||
This = **(void *const **)(&pFormat+1);
|
This = stack_top[0];
|
||||||
NdrProxyInitialize(This, &rpcMsg, &stubMsg, pStubDesc, procedure_number);
|
NdrProxyInitialize(This, &rpcMsg, &stubMsg, pStubDesc, procedure_number);
|
||||||
}
|
}
|
||||||
else
|
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("Oi_flags = 0x%02x\n", pProcHeader->Oi_flags);
|
||||||
TRACE("MIDL stub version = 0x%x\n", pStubDesc->MIDLVersion);
|
TRACE("MIDL stub version = 0x%x\n", pStubDesc->MIDLVersion);
|
||||||
|
|
||||||
/* needed for conformance of top-level objects */
|
stubMsg.StackTop = (unsigned char *)stack_top;
|
||||||
__ms_va_start( args, pFormat );
|
|
||||||
stubMsg.StackTop = va_arg( args, unsigned char * );
|
|
||||||
__ms_va_end( args );
|
|
||||||
|
|
||||||
pHandleFormat = pFormat;
|
pHandleFormat = pFormat;
|
||||||
|
|
||||||
/* we only need a handle if this isn't an object method */
|
/* 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:
|
done:
|
||||||
TRACE("RetVal = 0x%lx\n", RetVal);
|
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
|
/* Calls a function with the specified arguments, restoring the stack
|
||||||
* properly afterwards as we don't know the calling convention of the
|
* properly afterwards as we don't know the calling convention of the
|
||||||
* function */
|
* function */
|
||||||
|
@ -1650,20 +1660,6 @@ void WINAPI NdrServerCall2(PRPC_MESSAGE pRpcMsg)
|
||||||
NdrStubCall2(NULL, NULL, pRpcMsg, &dwPhase);
|
NdrStubCall2(NULL, NULL, pRpcMsg, &dwPhase);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* 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.@]
|
* NdrStubCall [RPCRT4.@]
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -236,6 +236,8 @@ typedef struct _NDR_EHD_CONTEXT
|
||||||
|
|
||||||
#include "poppack.h"
|
#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,
|
void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
PFORMAT_STRING pFormat, int phase, unsigned char *args,
|
PFORMAT_STRING pFormat, int phase, unsigned char *args,
|
||||||
unsigned short stack_size, unsigned char *pRetVal, BOOL object_proc,
|
unsigned short stack_size, unsigned char *pRetVal, BOOL object_proc,
|
||||||
|
|
|
@ -127,7 +127,7 @@
|
||||||
@ stdcall NdrCStdStubBuffer_Release(ptr ptr)
|
@ stdcall NdrCStdStubBuffer_Release(ptr ptr)
|
||||||
@ stdcall NdrClearOutParameters(ptr ptr ptr)
|
@ stdcall NdrClearOutParameters(ptr ptr ptr)
|
||||||
@ varargs NdrClientCall2(ptr ptr)
|
@ varargs NdrClientCall2(ptr ptr)
|
||||||
@ varargs NdrClientCall(ptr ptr)
|
@ varargs -arch=i386 NdrClientCall(ptr ptr) NdrClientCall2
|
||||||
@ stdcall NdrClientContextMarshall(ptr ptr long)
|
@ stdcall NdrClientContextMarshall(ptr ptr long)
|
||||||
@ stdcall NdrClientContextUnmarshall(ptr ptr ptr)
|
@ stdcall NdrClientContextUnmarshall(ptr ptr ptr)
|
||||||
@ stub NdrClientInitialize
|
@ stub NdrClientInitialize
|
||||||
|
|
Loading…
Reference in New Issue