Zebediah Figura : rpcrt4: Factor out get_handle_desc_size().
Alexandre Julliard
julliard at winehq.org
Tue May 21 16:45:22 CDT 2019
Module: wine
Branch: master
Commit: 40b6adf8f08927d1ce77d87efc00e62a967ef961
URL: https://source.winehq.org/git/wine.git/?a=commit;h=40b6adf8f08927d1ce77d87efc00e62a967ef961
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Mon May 20 23:30:54 2019 -0500
rpcrt4: Factor out get_handle_desc_size().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/rpcrt4/ndr_stubless.c | 51 +++++++++++++++++++++++++++-------------------
1 file changed, 30 insertions(+), 21 deletions(-)
diff --git a/dlls/rpcrt4/ndr_stubless.c b/dlls/rpcrt4/ndr_stubless.c
index c912d93..816af4b 100644
--- a/dlls/rpcrt4/ndr_stubless.c
+++ b/dlls/rpcrt4/ndr_stubless.c
@@ -273,9 +273,22 @@ static const char *debugstr_INTERPRETER_OPT_FLAGS(INTERPRETER_OPT_FLAGS Oi2Flags
#define ARG_FROM_OFFSET(args, offset) ((args) + (offset))
-static PFORMAT_STRING client_get_handle(
- PMIDL_STUB_MESSAGE pStubMsg, const NDR_PROC_HEADER *pProcHeader,
- PFORMAT_STRING pFormat, handle_t *phBinding)
+static size_t get_handle_desc_size(const NDR_PROC_HEADER *proc_header, PFORMAT_STRING format)
+{
+ if (!proc_header->handle_type)
+ {
+ if (*format == FC_BIND_PRIMITIVE)
+ return sizeof(NDR_EHD_PRIMITIVE);
+ else if (*format == FC_BIND_GENERIC)
+ return sizeof(NDR_EHD_GENERIC);
+ else if (*format == FC_BIND_CONTEXT)
+ return sizeof(NDR_EHD_CONTEXT);
+ }
+ return 0;
+}
+
+static handle_t client_get_handle(const MIDL_STUB_MESSAGE *pStubMsg,
+ const NDR_PROC_HEADER *pProcHeader, const PFORMAT_STRING pFormat)
{
/* binding */
switch (pProcHeader->handle_type)
@@ -291,10 +304,9 @@ static PFORMAT_STRING client_get_handle(
TRACE("Explicit primitive handle @ %d\n", pDesc->offset);
if (pDesc->flag) /* pointer to binding */
- *phBinding = **(handle_t **)ARG_FROM_OFFSET(pStubMsg->StackTop, pDesc->offset);
+ return **(handle_t **)ARG_FROM_OFFSET(pStubMsg->StackTop, pDesc->offset);
else
- *phBinding = *(handle_t *)ARG_FROM_OFFSET(pStubMsg->StackTop, pDesc->offset);
- return pFormat + sizeof(NDR_EHD_PRIMITIVE);
+ return *(handle_t *)ARG_FROM_OFFSET(pStubMsg->StackTop, pDesc->offset);
}
case FC_BIND_GENERIC: /* explicit generic */
{
@@ -311,8 +323,7 @@ static PFORMAT_STRING client_get_handle(
pArg = ARG_FROM_OFFSET(pStubMsg->StackTop, pDesc->offset);
memcpy(&pObject, pArg, pDesc->flag_and_size & 0xf);
pGenPair = &pStubMsg->StubDesc->aGenericBindingRoutinePairs[pDesc->binding_routine_pair_index];
- *phBinding = pGenPair->pfnBind(pObject);
- return pFormat + sizeof(NDR_EHD_GENERIC);
+ return pGenPair->pfnBind(pObject);
}
case FC_BIND_CONTEXT: /* explicit context */
{
@@ -327,7 +338,7 @@ static PFORMAT_STRING client_get_handle(
else
context_handle = *(NDR_CCONTEXT *)ARG_FROM_OFFSET(pStubMsg->StackTop, pDesc->offset);
- if (context_handle) *phBinding = NDRCContextBinding(context_handle);
+ if (context_handle) return NDRCContextBinding(context_handle);
else if (pDesc->flags & NDR_CONTEXT_HANDLE_CANNOT_BE_NULL)
{
ERR("null context handle isn't allowed\n");
@@ -335,7 +346,6 @@ static PFORMAT_STRING client_get_handle(
return NULL;
}
/* FIXME: should we store this structure in stubMsg.pContext? */
- return pFormat + sizeof(NDR_EHD_CONTEXT);
}
default:
ERR("bad explicit binding handle type (0x%02x)\n", pProcHeader->handle_type);
@@ -348,28 +358,25 @@ static PFORMAT_STRING client_get_handle(
break;
case FC_BIND_PRIMITIVE: /* implicit primitive */
TRACE("Implicit primitive handle\n");
- *phBinding = *pStubMsg->StubDesc->IMPLICIT_HANDLE_INFO.pPrimitiveHandle;
- break;
+ return *pStubMsg->StubDesc->IMPLICIT_HANDLE_INFO.pPrimitiveHandle;
case FC_CALLBACK_HANDLE: /* implicit callback */
TRACE("FC_CALLBACK_HANDLE\n");
/* server calls callback procedures only in response to remote call, and most recent
binding handle is used. Calling back to a client can potentially result in another
callback with different current handle. */
- *phBinding = I_RpcGetCurrentCallHandle();
- break;
+ return I_RpcGetCurrentCallHandle();
case FC_AUTO_HANDLE: /* implicit auto handle */
/* strictly speaking, it isn't necessary to set hBinding here
* since it isn't actually used (hence the automatic in its name),
* but then why does MIDL generate a valid entry in the
* MIDL_STUB_DESC for it? */
TRACE("Implicit auto handle\n");
- *phBinding = *pStubMsg->StubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle;
- break;
+ return *pStubMsg->StubDesc->IMPLICIT_HANDLE_INFO.pAutoHandle;
default:
ERR("bad implicit binding handle type (0x%02x)\n", pProcHeader->handle_type);
RpcRaiseException(RPC_X_BAD_STUB_DATA);
}
- return pFormat;
+ return NULL;
}
static void client_free_handle(
@@ -719,8 +726,9 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_client_call( PMIDL_STUB_DESC pStubDesc, PFORM
/* we only need a handle if this isn't an object method */
if (!(pProcHeader->Oi_flags & Oi_OBJECT_PROC))
{
- pFormat = client_get_handle(&stubMsg, pProcHeader, pHandleFormat, &hBinding);
- if (!pFormat) goto done;
+ pFormat += get_handle_desc_size(pProcHeader, pFormat);
+ hBinding = client_get_handle(&stubMsg, pProcHeader, pHandleFormat);
+ if (!hBinding) goto done;
}
if (is_oicf_stubdesc(pStubDesc)) /* -Oicf format */
@@ -1655,8 +1663,9 @@ LONG_PTR CDECL DECLSPEC_HIDDEN ndr_async_client_call( PMIDL_STUB_DESC pStubDesc,
pAsync->StubInfo = async_call_data;
async_call_data->pHandleFormat = pFormat;
- pFormat = client_get_handle(pStubMsg, pProcHeader, async_call_data->pHandleFormat, &async_call_data->hBinding);
- if (!pFormat) goto done;
+ pFormat += get_handle_desc_size(pProcHeader, pFormat);
+ async_call_data->hBinding = client_get_handle(pStubMsg, pProcHeader, async_call_data->pHandleFormat);
+ if (!async_call_data->hBinding) goto done;
if (is_oicf_stubdesc(pStubDesc))
{
More information about the wine-cvs
mailing list