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 d207237141a..b4d9b6969f8 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -969,7 +969,7 @@ @ stub RtlReadMemoryStream @ stub RtlReadOutOfProcessMemoryStream @ stdcall RtlRealPredecessor(ptr) -@ stub RtlRealSuccessor +@ stdcall RtlRealSuccessor(ptr) @ stub RtlRegisterSecureMemoryCacheCallback @ stdcall RtlRegisterWait(ptr ptr ptr ptr long long) @ stdcall RtlReleaseActivationContext(ptr) diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c index bc3ee359161..575579a551e 100644 --- a/dlls/ntdll/rtl.c +++ b/dlls/ntdll/rtl.c @@ -301,6 +301,33 @@ RTL_SPLAY_LINKS * WINAPI RtlRealPredecessor(RTL_SPLAY_LINKS *links) return NULL; }
+/****************************************************************************** + * RtlRealSuccessor [NTDLL.@] + */ +RTL_SPLAY_LINKS * WINAPI RtlRealSuccessor(RTL_SPLAY_LINKS *links) +{ + PRTL_SPLAY_LINKS child; + + TRACE("(%p)\n", links); + + child = RtlRightChild(links); + if (child) + { + while (RtlLeftChild(child)) + child = RtlLeftChild(child); + return child; + } + + child = links; + while (RtlIsRightChild(child)) + child = RtlParent(child); + + if (RtlIsLeftChild(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 2a908a35398..46f11cc951b 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -1241,7 +1241,7 @@ @ stdcall RtlRandom(ptr) @ stdcall RtlRandomEx(ptr) @ stdcall RtlRealPredecessor(ptr) -@ stub RtlRealSuccessor +@ stdcall RtlRealSuccessor(ptr) @ stub RtlRemoveUnicodePrefix @ stub RtlReserveChunk @ cdecl -arch=!i386 RtlRestoreContext(ptr ptr) diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h index 110779f6169..a7c0b1e44b5 100644 --- a/include/ddk/ntddk.h +++ b/include/ddk/ntddk.h @@ -314,6 +314,7 @@ 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 RtlRealSuccessor(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);