Implement "portable" SList code for 64 bit
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Fri, 27 Nov 2009 17:37:07 +0000 (17:37 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Fri, 27 Nov 2009 17:37:07 +0000 (17:37 +0000)
svn path=/branches/ros-amd64-bringup/; revision=44296

reactos/lib/rtl/slist.c

index 1eef23d..4d291ab 100644 (file)
@@ -20,7 +20,10 @@ NTAPI
 RtlInitializeSListHead(IN PSLIST_HEADER ListHead)
 {
 #ifdef _WIN64
-    UNIMPLEMENTED;
+    ListHead->Alignment = 0;
+    ListHead->Region = 0;
+    ListHead->Header8.Init = 1;
+    // ListHead->Header8.HeaderType = 1; // FIXME: depending on cmpxchg16b support?
 #else
     ListHead->Alignment = 0;
 #endif
@@ -31,8 +34,25 @@ NTAPI
 RtlFirstEntrySList(IN const SLIST_HEADER *ListHead)
 {
 #ifdef _WIN64
-    UNIMPLEMENTED;
-    return NULL;
+    if (ListHead->Header8.HeaderType)
+    {
+        return (PVOID)(ListHead->Region & ~0xF);
+    }
+    else
+    {
+        union {
+            PVOID P;
+            struct {
+                ULONG64 Reserved:4;
+                ULONG64 NextEntry:39;
+                ULONG64 Reserved2:21;
+            } Bits;
+        } Pointer;
+
+        Pointer.P = (PVOID)ListHead;
+        Pointer.Bits.NextEntry = ListHead->Header8.NextEntry;
+        return Pointer.P;
+    }
 #else
     return ListHead->Next.Next;
 #endif
@@ -43,8 +63,8 @@ NTAPI
 RtlQueryDepthSList(IN PSLIST_HEADER ListHead)
 {
 #ifdef _WIN64
-    UNIMPLEMENTED;
-    return 0;
+    return ListHead->Header8.HeaderType ? 
+        ListHead->Header16.Sequence : ListHead->Header8.Sequence;
 #else
     return ListHead->Depth;
 #endif