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