From: Nikolay Sivov Subject: [PATCH 2/2] rpcrt4: Implement MesEncodeDynBufferHandleCreate() Message-Id: <54F6B7D4.2030907@codeweavers.com> Date: Wed, 04 Mar 2015 10:44:20 +0300 --- From d8568d21ee30e9f63e38003c1c6449134a4aa361 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Tue, 3 Mar 2015 23:07:26 +0300 Subject: [PATCH 2/2] rpcrt4: Implement MesEncodeDynBufferHandleCreate() --- dlls/rpcrt4/ndr_es.c | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/dlls/rpcrt4/ndr_es.c b/dlls/rpcrt4/ndr_es.c index e3cd48a..59ea816 100644 --- a/dlls/rpcrt4/ndr_es.c +++ b/dlls/rpcrt4/ndr_es.c @@ -167,6 +167,17 @@ RPC_STATUS WINAPI MesHandleFree(handle_t Handle) return RPC_S_OK; } +static RPC_STATUS validate_mes_buffer_pointer(const char *Buffer) +{ + if (!Buffer) + return RPC_S_INVALID_ARG; + + if (((ULONG_PTR)Buffer & 7) != 0) + return RPC_X_INVALID_BUFFER; + + return RPC_S_OK; +} + /*********************************************************************** * MesEncodeFixedBufferHandleCreate [RPCRT4.@] */ @@ -174,14 +185,12 @@ RPC_STATUS RPC_ENTRY MesEncodeFixedBufferHandleCreate( char *Buffer, ULONG BufferSize, ULONG *pEncodedSize, handle_t *pHandle) { MIDL_ES_MESSAGE *pEsMsg; + RPC_STATUS status; TRACE("(%p, %d, %p, %p)\n", Buffer, BufferSize, pEncodedSize, pHandle); - if (!Buffer) - return RPC_S_INVALID_ARG; - - if (((ULONG_PTR)Buffer % 8) != 0) - return RPC_X_INVALID_BUFFER; + if ((status = validate_mes_buffer_pointer(Buffer))) + return status; if (!pEncodedSize) return RPC_S_INVALID_ARG; @@ -208,10 +217,29 @@ RPC_STATUS RPC_ENTRY MesEncodeFixedBufferHandleCreate( /*********************************************************************** * MesEncodeDynBufferHandleCreate [RPCRT4.@] */ -RPC_STATUS RPC_ENTRY MesEncodeDynBufferHandleCreate(char **ppBuffer, +RPC_STATUS RPC_ENTRY MesEncodeDynBufferHandleCreate(char **Buffer, ULONG *pEncodedSize, handle_t *pHandle) { - FIXME("%p %p %p stub\n", ppBuffer, pEncodedSize, pHandle); + MIDL_ES_MESSAGE *pEsMsg; + + TRACE("(%p, %p, %p)\n", Buffer, pEncodedSize, pHandle); + + if (!pEncodedSize) + return RPC_S_INVALID_ARG; + + pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg)); + if (!pEsMsg) + return RPC_S_OUT_OF_MEMORY; + + init_MIDL_ES_MESSAGE(pEsMsg); + + pEsMsg->Operation = MES_ENCODE; + pEsMsg->HandleStyle = MES_DYNAMIC_BUFFER_HANDLE; + pEsMsg->pDynBuffer = (unsigned char **)Buffer; + pEsMsg->pEncodedSize = pEncodedSize; + + *pHandle = (handle_t)pEsMsg; + return RPC_S_OK; } @@ -222,9 +250,13 @@ RPC_STATUS RPC_ENTRY MesDecodeBufferHandleCreate( char *Buffer, ULONG BufferSize, handle_t *pHandle) { MIDL_ES_MESSAGE *pEsMsg; + RPC_STATUS status; TRACE("(%p, %d, %p)\n", Buffer, BufferSize, pHandle); + if ((status = validate_mes_buffer_pointer(Buffer))) + return status; + pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg)); if (!pEsMsg) return RPC_S_OUT_OF_MEMORY; -- 2.1.4