From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/ntdll/ntdll.spec | 2 +- dlls/ntdll/rtl.c | 19 +++++++++++++++++++ dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- include/ddk/ntddk.h | 1 + 4 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 620d96a5992..97adfeb853a 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1048,7 +1048,7 @@ @ stdcall RtlStringFromGUID(ptr ptr) @ stdcall RtlSubAuthorityCountSid(ptr) @ stdcall RtlSubAuthoritySid(ptr long) -@ stub RtlSubtreePredecessor +@ stdcall RtlSubtreePredecessor(ptr) @ stub RtlSubtreeSuccessor @ stdcall RtlSystemTimeToLocalTime(ptr ptr) @ stdcall RtlTimeFieldsToTime(ptr ptr) diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c index 643d6f3ce49..d98edb8745e 100644 --- a/dlls/ntdll/rtl.c +++ b/dlls/ntdll/rtl.c @@ -7,6 +7,7 @@ * Copyright 1999 Alex Korobka * Copyright 2003 Thomas Mertes * Crc32 code Copyright 1986 Gary S. Brown (Public domain) + * Copyright 2025 Zhiyi Zhang for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -235,6 +236,24 @@ NTSTATUS WINAPI RtlResetNtUserPfn(void) return STATUS_SUCCESS; }
+/****************************************************************************** + * RtlSubtreePredecessor [NTDLL.@] + */ +RTL_SPLAY_LINKS * WINAPI RtlSubtreePredecessor(RTL_SPLAY_LINKS *links) +{ + RTL_SPLAY_LINKS *child; + + TRACE("(%p)\n", links); + + child = RtlLeftChild(links); + if (!child) + return NULL; + + while (RtlRightChild(child)) + child = RtlRightChild(child); + + return child; +}
/****************************************************************************** * RtlInitializeGenericTable [NTDLL.@] diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 276e166c4a9..2a86e4d100b 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -1269,7 +1269,7 @@ @ stdcall RtlStringFromGUID(ptr ptr) @ stdcall RtlSubAuthorityCountSid(ptr) @ stdcall RtlSubAuthoritySid(ptr long) -@ stub RtlSubtreePredecessor +@ stdcall RtlSubtreePredecessor(ptr) @ stub RtlSubtreeSuccessor @ stdcall RtlSystemTimeToLocalTime(ptr ptr) @ stub RtlTestBit diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h index e6c9ca8d97f..cc642fa6c0f 100644 --- a/include/ddk/ntddk.h +++ b/include/ddk/ntddk.h @@ -313,6 +313,7 @@ void WINAPI RtlMapGenericMask(ACCESS_MASK*,const GENERIC_MAPPING*); ULONG WINAPI RtlNumberGenericTableElements(PRTL_GENERIC_TABLE); ULONG WINAPI RtlNumberGenericTableElementsAvl(PRTL_AVL_TABLE); BOOLEAN WINAPI RtlPrefixUnicodeString(const UNICODE_STRING*,const UNICODE_STRING*,BOOLEAN); +PRTL_SPLAY_LINKS WINAPI RtlSubtreePredecessor(PRTL_SPLAY_LINKS); NTSTATUS WINAPI RtlUpcaseUnicodeString(UNICODE_STRING*,const UNICODE_STRING*,BOOLEAN); char WINAPI RtlUpperChar(char); void WINAPI RtlUpperString(STRING*,const STRING*);