Rob Shearman : rpcrt4: Implement NdrConformantArrayMemorySize.

Alexandre Julliard julliard at winehq.org
Mon Dec 10 08:54:18 CST 2007


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Sun Dec  9 18:22:24 2007 +0000

rpcrt4: Implement NdrConformantArrayMemorySize.

---

 dlls/rpcrt4/ndr_marshall.c |   29 +++++++++++++++++++++++++++--
 1 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/dlls/rpcrt4/ndr_marshall.c b/dlls/rpcrt4/ndr_marshall.c
index 7578221..4e1d80b 100644
--- a/dlls/rpcrt4/ndr_marshall.c
+++ b/dlls/rpcrt4/ndr_marshall.c
@@ -2859,8 +2859,33 @@ void WINAPI NdrConformantVaryingArrayBufferSize( PMIDL_STUB_MESSAGE pStubMsg,
 ULONG WINAPI NdrConformantVaryingArrayMemorySize( PMIDL_STUB_MESSAGE pStubMsg,
                                                   PFORMAT_STRING pFormat )
 {
-    FIXME( "stub\n" );
-    return 0;
+    ULONG bufsize, memsize;
+    unsigned char alignment = pFormat[1] + 1;
+    DWORD esize = *(const WORD*)(pFormat+2);
+
+    TRACE("(%p, %p)\n", pStubMsg, pFormat);
+
+    if (pFormat[0] != RPC_FC_CVARRAY)
+    {
+        ERR("invalid format type %x\n", pFormat[0]);
+        RpcRaiseException(RPC_S_INTERNAL_ERROR);
+        return pStubMsg->MemorySize;
+    }
+
+    pFormat = ReadConformance(pStubMsg, pFormat+4);
+    pFormat = ReadVariance(pStubMsg, pFormat, pStubMsg->MaxCount);
+
+    ALIGN_POINTER(pStubMsg->Buffer, alignment);
+
+    bufsize = safe_multiply(esize, pStubMsg->ActualCount);
+    memsize = safe_multiply(esize, pStubMsg->MaxCount);
+
+    safe_buffer_increment(pStubMsg, bufsize);
+    pStubMsg->MemorySize += memsize;
+
+    EmbeddedPointerMemorySize(pStubMsg, pFormat);
+
+    return pStubMsg->MemorySize;
 }
 
 




More information about the wine-cvs mailing list