https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ca0fa4af1e1a0d43d99d6…
commit ca0fa4af1e1a0d43d99d653e7031c1edfacac019
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Sat Jul 13 07:59:44 2024 +0300
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Thu Jan 16 13:40:23 2025 +0200
[RTL/x64] Improve RtlWalkFrameChain to handle user mode
---
sdk/lib/rtl/amd64/unwind.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/sdk/lib/rtl/amd64/unwind.c b/sdk/lib/rtl/amd64/unwind.c
index ee7313bc62f..910d9cdeac3 100644
--- a/sdk/lib/rtl/amd64/unwind.c
+++ b/sdk/lib/rtl/amd64/unwind.c
@@ -943,6 +943,7 @@ RtlWalkFrameChain(OUT PVOID *Callers,
PVOID HandlerData;
ULONG i, FramesToSkip;
PRUNTIME_FUNCTION FunctionEntry;
+ MODE CurrentMode = RtlpGetMode();
DPRINT("Enter RtlWalkFrameChain\n");
@@ -956,11 +957,6 @@ RtlWalkFrameChain(OUT PVOID *Callers,
/* Get the stack limits */
RtlpGetStackLimits(&StackLow, &StackHigh);
- /* Check if we want the user-mode stack frame */
- if (Flags & 1)
- {
- }
-
_SEH2_TRY
{
/* Loop the frames */
@@ -990,15 +986,26 @@ RtlWalkFrameChain(OUT PVOID *Callers,
}
/* Check if we are in kernel mode */
- if (RtlpGetMode() == KernelMode)
+ if (CurrentMode == KernelMode)
{
/* Check if we left the kernel range */
- if (!(Flags & 1) && (Context.Rip <
0xFFFF800000000000ULL))
+ if (Context.Rip < 0xFFFF800000000000ULL)
{
- break;
+ /* Bail out, unless user mode was requested */
+ if ((Flags & 1) == 0)
+ {
+ break;
+ }
+
+ /* We are in user mode now, get UM stack bounds */
+ CurrentMode = UserMode;
+ StackLow = (ULONG64)NtCurrentTeb()->NtTib.StackLimit;
+ StackHigh = (ULONG64)NtCurrentTeb()->NtTib.StackBase;
}
}
- else
+
+ /* Check (again) if we are in user mode now */
+ if (CurrentMode == UserMode)
{
/* Check if we left the user range */
if ((Context.Rip < 0x10000) ||