From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/ntdll/ntdll.spec | 2 +- dlls/ntdll/rtl.c | 27 +++++++++++++++++++++++++++ dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- include/ddk/ntddk.h | 1 + 4 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index f4e2ed36710..d207237141a 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -968,7 +968,7 @@ @ stdcall RtlReAllocateHeap(long long ptr long) @ stub RtlReadMemoryStream @ stub RtlReadOutOfProcessMemoryStream -@ stub RtlRealPredecessor +@ stdcall RtlRealPredecessor(ptr) @ stub RtlRealSuccessor @ stub RtlRegisterSecureMemoryCacheCallback @ stdcall RtlRegisterWait(ptr ptr ptr ptr long long) diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c index e277e56be1b..bc3ee359161 100644 --- a/dlls/ntdll/rtl.c +++ b/dlls/ntdll/rtl.c @@ -274,6 +274,33 @@ RTL_SPLAY_LINKS * WINAPI RtlSubtreeSuccessor(RTL_SPLAY_LINKS *links) return child; }
+/****************************************************************************** + * RtlRealPredecessor [NTDLL.@] + */ +RTL_SPLAY_LINKS * WINAPI RtlRealPredecessor(RTL_SPLAY_LINKS *links) +{ + PRTL_SPLAY_LINKS child; + + TRACE("(%p)\n", links); + + child = RtlLeftChild(links); + if (child) + { + while (RtlRightChild(child)) + child = RtlRightChild(child); + return child; + } + + child = links; + while (RtlIsLeftChild(child)) + child = RtlParent(child); + + if (RtlIsRightChild(child)) + return RtlParent(child); + + return NULL; +} + /****************************************************************************** * RtlInitializeGenericTable [NTDLL.@] */ diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 2ba1dc88eeb..2a908a35398 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -1240,7 +1240,7 @@ @ stdcall RtlRaiseStatus(long) @ stdcall RtlRandom(ptr) @ stdcall RtlRandomEx(ptr) -@ stub RtlRealPredecessor +@ stdcall RtlRealPredecessor(ptr) @ stub RtlRealSuccessor @ stub RtlRemoveUnicodePrefix @ stub RtlReserveChunk diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h index 334266d6e1d..110779f6169 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 RtlRealPredecessor(PRTL_SPLAY_LINKS); PRTL_SPLAY_LINKS WINAPI RtlSubtreePredecessor(PRTL_SPLAY_LINKS); PRTL_SPLAY_LINKS WINAPI RtlSubtreeSuccessor(PRTL_SPLAY_LINKS); NTSTATUS WINAPI RtlUpcaseUnicodeString(UNICODE_STRING*,const UNICODE_STRING*,BOOLEAN);