Rob Shearman : rpcrt4: Implement MesDecodeBufferHandleCreate and MesEncodeFixedBufferHandleCreate .

Alexandre Julliard julliard at winehq.org
Mon Jul 14 05:56:51 CDT 2008


Module: wine
Branch: master
Commit: 2b0ad6e6e7a32a1a0f35a85edde4f695154df27b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2b0ad6e6e7a32a1a0f35a85edde4f695154df27b

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Mon Nov  5 11:21:09 2007 +0000

rpcrt4: Implement MesDecodeBufferHandleCreate and MesEncodeFixedBufferHandleCreate.

---

 dlls/rpcrt4/ndr_es.c    |   70 +++++++++++++++++++++++++++++++++++++++++++++++
 dlls/rpcrt4/rpcrt4.spec |    4 +-
 2 files changed, 72 insertions(+), 2 deletions(-)

diff --git a/dlls/rpcrt4/ndr_es.c b/dlls/rpcrt4/ndr_es.c
index 097d8a9..4f70dd1 100644
--- a/dlls/rpcrt4/ndr_es.c
+++ b/dlls/rpcrt4/ndr_es.c
@@ -132,6 +132,58 @@ RPC_STATUS WINAPI MesHandleFree(handle_t Handle)
     return RPC_S_OK;
 }
 
+/***********************************************************************
+ *            MesEncodeFixedBufferHandleCreate [RPCRT4.@]
+ */
+RPC_STATUS RPC_ENTRY MesEncodeFixedBufferHandleCreate(
+    char *Buffer, ULONG BufferSize, ULONG *pEncodedSize, handle_t *pHandle)
+{
+    MIDL_ES_MESSAGE *pEsMsg;
+
+    TRACE("(%p, %d, %p, %p)\n", Buffer, BufferSize, pEncodedSize, pHandle);
+
+    pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
+    if (!pEsMsg)
+        return ERROR_OUTOFMEMORY;
+
+    init_MIDL_ES_MESSAGE(pEsMsg);
+
+    pEsMsg->Operation = MES_ENCODE;
+    pEsMsg->HandleStyle = MES_FIXED_BUFFER_HANDLE;
+    pEsMsg->Buffer = (unsigned char *)Buffer;
+    pEsMsg->BufferSize = BufferSize;
+    pEsMsg->pEncodedSize = pEncodedSize;
+
+    *pHandle = (handle_t)pEsMsg;
+
+    return RPC_S_OK;}
+
+/***********************************************************************
+ *            MesDecodeBufferHandleCreate [RPCRT4.@]
+ */
+RPC_STATUS RPC_ENTRY MesDecodeBufferHandleCreate(
+    char *Buffer, ULONG BufferSize, handle_t *pHandle)
+{
+    MIDL_ES_MESSAGE *pEsMsg;
+
+    TRACE("(%p, %d, %p)\n", Buffer, BufferSize, pHandle);
+
+    pEsMsg = HeapAlloc(GetProcessHeap(), 0, sizeof(*pEsMsg));
+    if (!pEsMsg)
+        return ERROR_OUTOFMEMORY;
+
+    init_MIDL_ES_MESSAGE(pEsMsg);
+
+    pEsMsg->Operation = MES_DECODE;
+    pEsMsg->HandleStyle = MES_FIXED_BUFFER_HANDLE;
+    pEsMsg->Buffer = (unsigned char *)Buffer;
+    pEsMsg->BufferSize = BufferSize;
+
+    *pHandle = (handle_t)pEsMsg;
+
+    return RPC_S_OK;
+}
+
 static void es_data_alloc(MIDL_ES_MESSAGE *pEsMsg, ULONG size)
 {
     if (pEsMsg->HandleStyle == MES_INCREMENTAL_HANDLE)
@@ -145,6 +197,11 @@ static void es_data_alloc(MIDL_ES_MESSAGE *pEsMsg, ULONG size)
             RpcRaiseException(ERROR_OUTOFMEMORY);
         }
     }
+    else if (pEsMsg->HandleStyle == MES_FIXED_BUFFER_HANDLE)
+    {
+        TRACE("%d with fixed buffer handle\n", size);
+        pEsMsg->StubMsg.Buffer = pEsMsg->Buffer;
+    }
     pEsMsg->StubMsg.RpcMsg->Buffer = pEsMsg->StubMsg.BufferStart = pEsMsg->StubMsg.Buffer;
 }
 
@@ -161,6 +218,14 @@ static void es_data_read(MIDL_ES_MESSAGE *pEsMsg, ULONG size)
             RpcRaiseException(ERROR_OUTOFMEMORY);
         }
     }
+    else
+    {
+        TRACE("%d from fixed or dynamic buffer handle\n", size);
+        /* FIXME: validate BufferSize? */
+        pEsMsg->StubMsg.Buffer = pEsMsg->Buffer;
+        pEsMsg->Buffer += size;
+        pEsMsg->BufferSize -= size;
+    }
     pEsMsg->StubMsg.BufferLength = size;
     pEsMsg->StubMsg.RpcMsg->Buffer = pEsMsg->StubMsg.BufferStart = pEsMsg->StubMsg.Buffer;
     pEsMsg->StubMsg.BufferEnd = pEsMsg->StubMsg.Buffer + size;
@@ -173,6 +238,11 @@ static void es_data_write(MIDL_ES_MESSAGE *pEsMsg, ULONG size)
         TRACE("%d to incremental handle\n", size);
         pEsMsg->Write(pEsMsg->UserState, (char *)pEsMsg->StubMsg.BufferStart, size);
     }
+    else
+    {
+        TRACE("%d to dynamic or fixed buffer handle\n", size);
+        *pEsMsg->pEncodedSize += size;
+    }
 }
 
 static inline ULONG mes_proc_header_buffer_size(void)
diff --git a/dlls/rpcrt4/rpcrt4.spec b/dlls/rpcrt4/rpcrt4.spec
index f2fa80a..1d33c64 100644
--- a/dlls/rpcrt4/rpcrt4.spec
+++ b/dlls/rpcrt4/rpcrt4.spec
@@ -97,10 +97,10 @@
 @ stub MIDL_wchar_strcpy
 @ stub MIDL_wchar_strlen
 @ stub MesBufferHandleReset
-@ stub MesDecodeBufferHandleCreate
+@ stdcall MesDecodeBufferHandleCreate(ptr long ptr)
 @ stdcall MesDecodeIncrementalHandleCreate(ptr ptr ptr)
 @ stub MesEncodeDynBufferHandleCreate
-@ stub MesEncodeFixedBufferHandleCreate
+@ stdcall MesEncodeFixedBufferHandleCreate(ptr long ptr ptr)
 @ stdcall MesEncodeIncrementalHandleCreate(ptr ptr ptr ptr)
 @ stdcall MesHandleFree(ptr)
 @ stdcall MesIncrementalHandleReset(ptr ptr ptr ptr ptr long)




More information about the wine-cvs mailing list