include: Make CLIENT_CALL_RETURN definition platform-specific to handle the return type incompatibility in NdrClientCall.
This commit is contained in:
parent
9128dea410
commit
f061917296
|
@ -95,7 +95,7 @@ __ASM_GLOBAL_FUNC(call_stubless_func,
|
||||||
"addl %edx,%esp\n\t"
|
"addl %edx,%esp\n\t"
|
||||||
"jmp *%ecx" );
|
"jmp *%ecx" );
|
||||||
|
|
||||||
HRESULT WINAPI ObjectStubless(DWORD *args)
|
CLIENT_CALL_RETURN WINAPI ObjectStubless(DWORD *args)
|
||||||
{
|
{
|
||||||
DWORD index = args[0];
|
DWORD index = args[0];
|
||||||
void **iface = (void **)args[2];
|
void **iface = (void **)args[2];
|
||||||
|
|
|
@ -548,10 +548,7 @@ void client_do_args_old_format(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the return type should be CLIENT_CALL_RETURN, but this is incompatible
|
CLIENT_CALL_RETURN WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, ...)
|
||||||
* with the way gcc returns structures. "void *" should be the largest type
|
|
||||||
* that MIDL should allow you to return anyway */
|
|
||||||
LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, ...)
|
|
||||||
{
|
{
|
||||||
/* pointer to start of stack where arguments start */
|
/* pointer to start of stack where arguments start */
|
||||||
RPC_MESSAGE rpcMsg;
|
RPC_MESSAGE rpcMsg;
|
||||||
|
@ -629,7 +626,7 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
|
||||||
if (!(pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT))
|
if (!(pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT))
|
||||||
{
|
{
|
||||||
pFormat = client_get_handle(&stubMsg, pProcHeader, pHandleFormat, &hBinding);
|
pFormat = client_get_handle(&stubMsg, pProcHeader, pHandleFormat, &hBinding);
|
||||||
if (!pFormat) return 0;
|
if (!pFormat) goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
bV2Format = (pStubDesc->Version >= 0x20000);
|
bV2Format = (pStubDesc->Version >= 0x20000);
|
||||||
|
@ -899,9 +896,9 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
|
||||||
client_free_handle(&stubMsg, pProcHeader, pHandleFormat, hBinding);
|
client_free_handle(&stubMsg, pProcHeader, pHandleFormat, hBinding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
TRACE("RetVal = 0x%lx\n", RetVal);
|
TRACE("RetVal = 0x%lx\n", RetVal);
|
||||||
|
return *(CLIENT_CALL_RETURN *)&RetVal;
|
||||||
return RetVal;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Calls a function with the specified arguments, restoring the stack
|
/* Calls a function with the specified arguments, restoring the stack
|
||||||
|
@ -1638,7 +1635,7 @@ struct async_call_data
|
||||||
ULONG_PTR NdrCorrCache[256];
|
ULONG_PTR NdrCorrCache[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
LONG_PTR WINAPIV NdrAsyncClientCall(PMIDL_STUB_DESC pStubDesc,
|
CLIENT_CALL_RETURN WINAPIV NdrAsyncClientCall(PMIDL_STUB_DESC pStubDesc,
|
||||||
PFORMAT_STRING pFormat, ...)
|
PFORMAT_STRING pFormat, ...)
|
||||||
{
|
{
|
||||||
/* pointer to start of stack where arguments start */
|
/* pointer to start of stack where arguments start */
|
||||||
|
@ -1658,6 +1655,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;
|
||||||
|
LONG_PTR RetVal;
|
||||||
__ms_va_list args;
|
__ms_va_list args;
|
||||||
|
|
||||||
TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat);
|
TRACE("pStubDesc %p, pFormat %p, ...\n", pStubDesc, pFormat);
|
||||||
|
@ -1720,7 +1718,7 @@ LONG_PTR WINAPIV NdrAsyncClientCall(PMIDL_STUB_DESC pStubDesc,
|
||||||
async_call_data->pHandleFormat = pFormat;
|
async_call_data->pHandleFormat = pFormat;
|
||||||
|
|
||||||
pFormat = client_get_handle(pStubMsg, pProcHeader, async_call_data->pHandleFormat, &async_call_data->hBinding);
|
pFormat = client_get_handle(pStubMsg, pProcHeader, async_call_data->pHandleFormat, &async_call_data->hBinding);
|
||||||
if (!pFormat) return 0;
|
if (!pFormat) goto done;
|
||||||
|
|
||||||
bV2Format = (pStubDesc->Version >= 0x20000);
|
bV2Format = (pStubDesc->Version >= 0x20000);
|
||||||
|
|
||||||
|
@ -1846,8 +1844,10 @@ LONG_PTR WINAPIV NdrAsyncClientCall(PMIDL_STUB_DESC pStubDesc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
TRACE("returning 0\n");
|
TRACE("returning 0\n");
|
||||||
return 0;
|
RetVal = 0;
|
||||||
|
return *(CLIENT_CALL_RETURN *)&RetVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
RPC_STATUS NdrpCompleteAsyncClientCall(RPC_ASYNC_STATE *pAsync, void *Reply)
|
RPC_STATUS NdrpCompleteAsyncClientCall(RPC_ASYNC_STATE *pAsync, void *Reply)
|
||||||
|
|
|
@ -414,11 +414,17 @@ typedef struct _MIDL_STUBLESS_PROXY_INFO
|
||||||
PMIDL_SYNTAX_INFO pSyntaxInfo;
|
PMIDL_SYNTAX_INFO pSyntaxInfo;
|
||||||
} MIDL_STUBLESS_PROXY_INFO, *PMIDL_STUBLESS_PROXY_INFO;
|
} MIDL_STUBLESS_PROXY_INFO, *PMIDL_STUBLESS_PROXY_INFO;
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__i386__) && !defined(__MSC_VER) && !defined(__MINGW32__) && !defined(__CYGWIN__)
|
||||||
|
/* Calling convention for returning structures/unions is different between Windows and gcc on i386 */
|
||||||
|
typedef LONG_PTR CLIENT_CALL_RETURN;
|
||||||
|
#else
|
||||||
typedef union _CLIENT_CALL_RETURN
|
typedef union _CLIENT_CALL_RETURN
|
||||||
{
|
{
|
||||||
void *Pointer;
|
void *Pointer;
|
||||||
LONG_PTR Simple;
|
LONG_PTR Simple;
|
||||||
} CLIENT_CALL_RETURN;
|
} CLIENT_CALL_RETURN;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
STUB_UNMARSHAL,
|
STUB_UNMARSHAL,
|
||||||
|
@ -645,15 +651,13 @@ RPCRTAPI void RPC_ENTRY
|
||||||
RPCRTAPI unsigned char* RPC_ENTRY
|
RPCRTAPI unsigned char* RPC_ENTRY
|
||||||
NdrUserMarshalSimpleTypeConvert( ULONG *pFlags, unsigned char *pBuffer, unsigned char FormatChar );
|
NdrUserMarshalSimpleTypeConvert( ULONG *pFlags, unsigned char *pBuffer, unsigned char FormatChar );
|
||||||
|
|
||||||
/* Note: this should return a CLIENT_CALL_RETURN, but calling convention for
|
CLIENT_CALL_RETURN RPC_VAR_ENTRY
|
||||||
* returning structures/unions is different between Windows and gcc on i386. */
|
|
||||||
LONG_PTR RPC_VAR_ENTRY
|
|
||||||
NdrClientCall2( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... );
|
NdrClientCall2( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... );
|
||||||
LONG_PTR RPC_VAR_ENTRY
|
CLIENT_CALL_RETURN RPC_VAR_ENTRY
|
||||||
NdrClientCall( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... );
|
NdrClientCall( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... );
|
||||||
LONG_PTR RPC_VAR_ENTRY
|
CLIENT_CALL_RETURN RPC_VAR_ENTRY
|
||||||
NdrAsyncClientCall( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... );
|
NdrAsyncClientCall( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... );
|
||||||
LONG_PTR RPC_VAR_ENTRY
|
CLIENT_CALL_RETURN RPC_VAR_ENTRY
|
||||||
NdrDcomAsyncClientCall( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... );
|
NdrDcomAsyncClientCall( PMIDL_STUB_DESC pStubDescriptor, PFORMAT_STRING pFormat, ... );
|
||||||
|
|
||||||
RPCRTAPI void RPC_ENTRY
|
RPCRTAPI void RPC_ENTRY
|
||||||
|
|
Loading…
Reference in New Issue