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
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
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