rpcrt4: Add an exception handler for stubless object proxies.
This commit is contained in:
parent
c975876cb9
commit
6ec9e0c77a
|
@ -38,6 +38,7 @@
|
||||||
#include "rpc.h"
|
#include "rpc.h"
|
||||||
#include "rpcproxy.h"
|
#include "rpcproxy.h"
|
||||||
|
|
||||||
|
#include "wine/exception.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
#include "wine/rpcfc.h"
|
#include "wine/rpcfc.h"
|
||||||
|
|
||||||
|
@ -676,6 +677,10 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
|
||||||
* 4. PROXY_SENDRECEIVE - send/receive buffer
|
* 4. PROXY_SENDRECEIVE - send/receive buffer
|
||||||
* 5. PROXY_UNMARHSAL - unmarshal [out] params from buffer
|
* 5. PROXY_UNMARHSAL - unmarshal [out] params from buffer
|
||||||
*/
|
*/
|
||||||
|
if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
|
||||||
|
{
|
||||||
|
__TRY
|
||||||
|
{
|
||||||
for (phase = PROXY_CALCSIZE; phase <= PROXY_UNMARSHAL; phase++)
|
for (phase = PROXY_CALCSIZE; phase <= PROXY_UNMARSHAL; phase++)
|
||||||
{
|
{
|
||||||
TRACE("phase = %d\n", phase);
|
TRACE("phase = %d\n", phase);
|
||||||
|
@ -683,9 +688,59 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
|
||||||
{
|
{
|
||||||
case PROXY_GETBUFFER:
|
case PROXY_GETBUFFER:
|
||||||
/* allocate the buffer */
|
/* allocate the buffer */
|
||||||
if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
|
|
||||||
NdrProxyGetBuffer(This, &stubMsg);
|
NdrProxyGetBuffer(This, &stubMsg);
|
||||||
else if (Oif_flags.HasPipes)
|
break;
|
||||||
|
case PROXY_SENDRECEIVE:
|
||||||
|
/* send the [in] params and receive the [out] and [retval]
|
||||||
|
* params */
|
||||||
|
NdrProxySendReceive(This, &stubMsg);
|
||||||
|
|
||||||
|
/* convert strings, floating point values and endianess into our
|
||||||
|
* preferred format */
|
||||||
|
if ((rpcMsg.DataRepresentation & 0x0000FFFFUL) != NDR_LOCAL_DATA_REPRESENTATION)
|
||||||
|
NdrConvert(&stubMsg, pFormat);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case PROXY_CALCSIZE:
|
||||||
|
case PROXY_MARSHAL:
|
||||||
|
case PROXY_UNMARSHAL:
|
||||||
|
if (bV2Format)
|
||||||
|
client_do_args(&stubMsg, pFormat, phase, number_of_params,
|
||||||
|
(unsigned char *)&RetVal);
|
||||||
|
else
|
||||||
|
client_do_args_old_format(&stubMsg, pFormat, phase, stack_size,
|
||||||
|
(unsigned char *)&RetVal,
|
||||||
|
(pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERR("shouldn't reach here. phase %d\n", phase);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__EXCEPT(NULL)
|
||||||
|
{
|
||||||
|
RetVal = NdrProxyErrorHandler(GetExceptionCode());
|
||||||
|
}
|
||||||
|
__ENDTRY
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* order of phases:
|
||||||
|
* 1. PROXY_CALCSIZE - calculate the buffer size
|
||||||
|
* 2. PROXY_GETBUFFER - allocate the buffer
|
||||||
|
* 3. PROXY_MARHSAL - marshal [in] params into the buffer
|
||||||
|
* 4. PROXY_SENDRECEIVE - send/receive buffer
|
||||||
|
* 5. PROXY_UNMARHSAL - unmarshal [out] params from buffer
|
||||||
|
*/
|
||||||
|
for (phase = PROXY_CALCSIZE; phase <= PROXY_UNMARSHAL; phase++)
|
||||||
|
{
|
||||||
|
TRACE("phase = %d\n", phase);
|
||||||
|
switch (phase)
|
||||||
|
{
|
||||||
|
case PROXY_GETBUFFER:
|
||||||
|
/* allocate the buffer */
|
||||||
|
if (Oif_flags.HasPipes)
|
||||||
/* NdrGetPipeBuffer(...) */
|
/* NdrGetPipeBuffer(...) */
|
||||||
FIXME("pipes not supported yet\n");
|
FIXME("pipes not supported yet\n");
|
||||||
else
|
else
|
||||||
|
@ -703,9 +758,7 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
|
||||||
case PROXY_SENDRECEIVE:
|
case PROXY_SENDRECEIVE:
|
||||||
/* send the [in] params and receive the [out] and [retval]
|
/* send the [in] params and receive the [out] and [retval]
|
||||||
* params */
|
* params */
|
||||||
if (pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT)
|
if (Oif_flags.HasPipes)
|
||||||
NdrProxySendReceive(This, &stubMsg);
|
|
||||||
else if (Oif_flags.HasPipes)
|
|
||||||
/* NdrPipesSendReceive(...) */
|
/* NdrPipesSendReceive(...) */
|
||||||
FIXME("pipes not supported yet\n");
|
FIXME("pipes not supported yet\n");
|
||||||
else
|
else
|
||||||
|
@ -742,6 +795,7 @@ LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pForma
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ext_flags.HasNewCorrDesc)
|
if (ext_flags.HasNewCorrDesc)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue