From 60bf8d9cd4e4e1b1e63e159daa7c2940adfe2e82 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 27 Nov 2009 17:37:07 +0000 Subject: [PATCH] Implement "portable" SList code for 64 bit svn path=/branches/ros-amd64-bringup/; revision=44296 --- reactos/lib/rtl/slist.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/reactos/lib/rtl/slist.c b/reactos/lib/rtl/slist.c index 1eef23d9bdf..4d291abe70e 100644 --- a/reactos/lib/rtl/slist.c +++ b/reactos/lib/rtl/slist.c @@ -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