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