rpcrt4: Retrieve the stack argument pointer in a more portable way in NdrClientCall.

This commit is contained in:
Alexandre Julliard 2010-08-26 17:03:50 +02:00
parent e095467b3c
commit 9de9cbb324
1 changed files with 8 additions and 11 deletions

View File

@ -580,6 +580,7 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
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);
@ -618,11 +619,9 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
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 */ /* needed for conformance of top-level objects */
#ifdef __i386__ __ms_va_start( args, pFormat );
stubMsg.StackTop = *(unsigned char **)(&pFormat+1); stubMsg.StackTop = va_arg( args, unsigned char * );
#else __ms_va_end( args );
# warning Stack not retrieved for your CPU architecture
#endif
pHandleFormat = pFormat; pHandleFormat = pFormat;
@ -1654,6 +1653,7 @@ LONG_PTR WINAPIV NdrAsyncClientCall(PMIDL_STUB_DESC pStubDesc,
const NDR_PROC_HEADER * pProcHeader = (const NDR_PROC_HEADER *)&pFormat[0]; const NDR_PROC_HEADER * pProcHeader = (const NDR_PROC_HEADER *)&pFormat[0];
/* -Oif or -Oicf generated format */ /* -Oif or -Oicf generated format */
BOOL bV2Format = FALSE; BOOL bV2Format = FALSE;
__ms_va_list args;
TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat); TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat);
@ -1705,13 +1705,10 @@ LONG_PTR WINAPIV NdrAsyncClientCall(PMIDL_STUB_DESC pStubDesc,
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 */ /* needed for conformance of top-level objects */
#ifdef __i386__
pStubMsg->StackTop = I_RpcAllocate(async_call_data->stack_size); pStubMsg->StackTop = I_RpcAllocate(async_call_data->stack_size);
/* FIXME: this may read one more DWORD than is necessary, but it shouldn't hurt */ __ms_va_start( args, pFormat );
memcpy(pStubMsg->StackTop, *(unsigned char **)(&pFormat+1), async_call_data->stack_size); memcpy(pStubMsg->StackTop, va_arg( args, unsigned char * ), async_call_data->stack_size);
#else __ms_va_end( args );
# warning Stack not retrieved for your CPU architecture
#endif
pAsync = *(RPC_ASYNC_STATE **)pStubMsg->StackTop; pAsync = *(RPC_ASYNC_STATE **)pStubMsg->StackTop;
pAsync->StubInfo = async_call_data; pAsync->StubInfo = async_call_data;