Robert Shearman : rpcrt4: Store the QueryType in the state table in NdrFullPointerQueryRefId.

Alexandre Julliard julliard at wine.codeweavers.com
Sat May 27 06:34:05 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 63307241dd1e9fdf486e89201f00658c34f6bef3
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=63307241dd1e9fdf486e89201f00658c34f6bef3

Author: Robert Shearman <rob at codeweavers.com>
Date:   Fri May 26 19:56:35 2006 +0100

rpcrt4: Store the QueryType in the state table in NdrFullPointerQueryRefId.

Implement NdrFullPointerFree.

---

 dlls/rpcrt4/ndr_fullpointer.c    |   40 +++++++++++++++++++++++++++++++++++---
 dlls/rpcrt4/tests/ndr_marshall.c |    4 ----
 2 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/dlls/rpcrt4/ndr_fullpointer.c b/dlls/rpcrt4/ndr_fullpointer.c
index 983bd51..bd2f5a3 100644
--- a/dlls/rpcrt4/ndr_fullpointer.c
+++ b/dlls/rpcrt4/ndr_fullpointer.c
@@ -151,7 +151,11 @@ int WINAPI NdrFullPointerQueryRefId(PFUL
     {
         *ppPointer = pXlatTables->RefIdToPointer.XlatTable[RefId];
         if (QueryType)
-            return pXlatTables->RefIdToPointer.StateTable[RefId];
+        {
+            int ret = pXlatTables->RefIdToPointer.StateTable[RefId];
+            pXlatTables->RefIdToPointer.StateTable[RefId] = QueryType;
+            return ret;
+        }
         else
             return 0;
     }
@@ -187,7 +191,37 @@ void WINAPI NdrFullPointerInsertRefId(PF
 
 int WINAPI NdrFullPointerFree(PFULL_PTR_XLAT_TABLES pXlatTables, void *Pointer)
 {
-    FIXME("(%p, %p)\n", pXlatTables, Pointer);
+    unsigned long Hash = 0;
+    int i;
+    PFULL_PTR_TO_REFID_ELEMENT XlatTableEntry;
+    unsigned long RefId = 0;
+
+    TRACE("(%p, %p)\n", pXlatTables, Pointer);
+
+    if (!Pointer)
+        return 1;
+
+    /* simple hashing algorithm, don't know whether it matches native */
+    for (i = 0; i < sizeof(Pointer); i++)
+        Hash = (Hash * 3) ^ ((unsigned char *)&Pointer)[i];
+
+    XlatTableEntry = pXlatTables->PointerToRefId.XlatTable[Hash & pXlatTables->PointerToRefId.HashMask];
+    for (; XlatTableEntry; XlatTableEntry = XlatTableEntry->Next)
+        if (Pointer == XlatTableEntry->Pointer)
+        {
+            XlatTableEntry->State = 0x20;
+            RefId = XlatTableEntry->RefId;
+            break;
+        }
+
+    if (!XlatTableEntry)
+        return 0;
 
-    return 10;
+    if (pXlatTables->RefIdToPointer.NumberOfEntries > RefId)
+    {
+        pXlatTables->RefIdToPointer.StateTable[RefId] = 0x20;
+        return 1;
+    }
+
+    return 0;
 }
diff --git a/dlls/rpcrt4/tests/ndr_marshall.c b/dlls/rpcrt4/tests/ndr_marshall.c
index f9cf602..22dee82 100644
--- a/dlls/rpcrt4/tests/ndr_marshall.c
+++ b/dlls/rpcrt4/tests/ndr_marshall.c
@@ -753,9 +753,7 @@ static void test_fullpointer_xlat(void)
     ok(Pointer == (void *)0xcafebabe, "Pointer should be (void *)0xcafebabe instead of %p\n", Pointer);
 
     ret = NdrFullPointerQueryRefId(pXlatTables, 0x2, 1, &Pointer);
-    todo_wine {
     ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
-    }
     ok(Pointer == (void *)0xcafebabe, "Pointer should be (void *)0xcafebabe instead of %p\n", Pointer);
 
     /* "marshaling" phase */
@@ -784,7 +782,6 @@ static void test_fullpointer_xlat(void)
 
     /* "freeing" phase */
 
-    todo_wine {
     ret = NdrFullPointerFree(pXlatTables, (void *)0xcafebeef);
     ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
 
@@ -793,7 +790,6 @@ static void test_fullpointer_xlat(void)
 
     ret = NdrFullPointerFree(pXlatTables, (void *)0xdeadbeef);
     ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
-    }
 
     NdrFullPointerXlatFree(pXlatTables);
 }




More information about the wine-cvs mailing list