Rob Shearman : rpcrt4: Implement NdrGetUserMarshalInfo.

Alexandre Julliard julliard at winehq.org
Wed Jan 28 08:03:18 CST 2009


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

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Wed Jan 28 12:58:37 2009 +0000

rpcrt4: Implement NdrGetUserMarshalInfo.

---

 dlls/rpcrt4/ndr_marshall.c |   47 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/dlls/rpcrt4/ndr_marshall.c b/dlls/rpcrt4/ndr_marshall.c
index d1f231d..e0ff73d 100644
--- a/dlls/rpcrt4/ndr_marshall.c
+++ b/dlls/rpcrt4/ndr_marshall.c
@@ -4338,10 +4338,51 @@ void WINAPI NdrUserMarshalFree(PMIDL_STUB_MESSAGE pStubMsg,
 /***********************************************************************
  *           NdrGetUserMarshalInfo [RPCRT4.@]
  */
-RPC_STATUS RPC_ENTRY NdrGetUserMarshalInfo(ULONG *flags, ULONG level, NDR_USER_MARSHAL_INFO *mi)
+RPC_STATUS RPC_ENTRY NdrGetUserMarshalInfo(ULONG *flags, ULONG level, NDR_USER_MARSHAL_INFO *umi)
 {
-  FIXME("(%p,%u,%p)\n", flags, level, mi);
-  return RPC_X_INVALID_BUFFER;
+    USER_MARSHAL_CB *umcb = CONTAINING_RECORD(flags, USER_MARSHAL_CB, Flags);
+
+    TRACE("(%p,%u,%p)\n", flags, level, umi);
+
+    if (level != 1)
+        return RPC_S_INVALID_ARG;
+
+    memset(&umi->Level1, 0, sizeof(umi->Level1));
+    umi->InformationLevel = level;
+
+    if (umcb->Signature != USER_MARSHAL_CB_SIGNATURE)
+        return RPC_S_INVALID_ARG;
+
+    umi->Level1.pfnAllocate = umcb->pStubMsg->pfnAllocate;
+    umi->Level1.pfnFree = umcb->pStubMsg->pfnFree;
+    umi->Level1.pRpcChannelBuffer = umcb->pStubMsg->pRpcChannelBuffer;
+
+    switch (umcb->CBType)
+    {
+    case USER_MARSHAL_CB_MARSHALL:
+    case USER_MARSHAL_CB_UNMARSHALL:
+    {
+        RPC_MESSAGE *msg = umcb->pStubMsg->RpcMsg;
+        unsigned char *buffer_start = msg->Buffer;
+        unsigned char *buffer_end =
+            (unsigned char *)msg->Buffer + msg->BufferLength;
+
+        if (umcb->pStubMsg->Buffer < buffer_start ||
+            umcb->pStubMsg->Buffer > buffer_end)
+            return ERROR_INVALID_USER_BUFFER;
+
+        umi->Level1.Buffer = umcb->pStubMsg->Buffer;
+        umi->Level1.BufferSize = buffer_end - umcb->pStubMsg->Buffer;
+        break;
+    }
+    case USER_MARSHAL_CB_BUFFER_SIZE:
+    case USER_MARSHAL_CB_FREE:
+        break;
+    default:
+        WARN("unrecognised CBType %d\n", umcb->CBType);
+    }
+
+    return RPC_S_OK;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list