shell32/tests: Fix remaining failures on WinMe.
[wine] / dlls / rpcrt4 / ndr_contexthandle.c
index 7334bf6..cab0fc5 100644 (file)
@@ -59,7 +59,7 @@ static CRITICAL_SECTION ndr_context_cs = { &ndr_context_debug, -1, 0, 0, 0, 0 };
 
 static struct context_handle_entry *get_context_entry(NDR_CCONTEXT CContext)
 {
-    struct context_handle_entry *che = (struct context_handle_entry*) CContext;
+    struct context_handle_entry *che = CContext;
 
     if (che->magic != NDR_CONTEXT_HANDLE_MAGIC)
         return NULL;
@@ -89,7 +89,10 @@ RPC_BINDING_HANDLE WINAPI NDRCContextBinding(NDR_CCONTEXT CContext)
     LeaveCriticalSection(&ndr_context_cs);
 
     if (!handle)
+    {
+        ERR("invalid handle %p\n", CContext);
         RpcRaiseException(ERROR_INVALID_HANDLE);
+    }
     return handle;
 }
 
@@ -108,7 +111,7 @@ void WINAPI NDRCContextMarshall(NDR_CCONTEXT CContext, void *pBuff)
     }
     else
     {
-        ndr_context_handle *wire_data = (ndr_context_handle *)pBuff;
+        ndr_context_handle *wire_data = pBuff;
         wire_data->attributes = 0;
         wire_data->uuid = GUID_NULL;
     }
@@ -183,7 +186,7 @@ static UINT ndr_update_context_handle(NDR_CCONTEXT *CContext,
         che->magic = NDR_CONTEXT_HANDLE_MAGIC;
         RpcBindingCopy(hBinding, &che->handle);
         list_add_tail(&context_handle_list, &che->entry);
-        memcpy(&che->wire_data, chi, sizeof *chi);
+        che->wire_data = *chi;
     }
 
     *CContext = che;
@@ -320,6 +323,7 @@ NDR_SCONTEXT WINAPI NDRSContextUnmarshall2(RPC_BINDING_HANDLE hBinding,
     RpcBinding *binding = hBinding;
     NDR_SCONTEXT SContext;
     RPC_STATUS status;
+    const ndr_context_handle *context_ndr = pBuff;
 
     TRACE("(%p %p %08x %p %u)\n",
           hBinding, pBuff, DataRepresentation, CtxGuard, Flags);
@@ -330,12 +334,12 @@ NDR_SCONTEXT WINAPI NDRSContextUnmarshall2(RPC_BINDING_HANDLE hBinding,
     if (Flags & RPC_CONTEXT_HANDLE_FLAGS)
         FIXME("unimplemented flags: 0x%x\n", Flags & RPC_CONTEXT_HANDLE_FLAGS);
 
-    if (!pBuff)
+    if (!pBuff || (!context_ndr->attributes &&
+                   UuidIsNil((UUID *)&context_ndr->uuid, &status)))
         status = RpcServerAssoc_AllocateContextHandle(binding->Assoc, CtxGuard,
                                                       &SContext);
     else
     {
-        const ndr_context_handle *context_ndr = pBuff;
         if (context_ndr->attributes)
         {
             ERR("non-null attributes 0x%x\n", context_ndr->attributes);