[RTL] Fix RtlpCaptureNonVolatileContextPointers

This commit is contained in:
Timo Kreuzer 2022-08-08 09:31:08 +02:00
parent f4d4b31c61
commit 90d2e12dfa

View file

@ -1053,29 +1053,37 @@ RtlpCaptureNonVolatileContextPointers(
do do
{ {
/* Make sure nothing fishy is going on. Currently this is for kernel mode only. */
ASSERT((LONG64)Context.Rip < 0);
ASSERT((LONG64)Context.Rsp < 0);
/* Look up the function entry */ /* Look up the function entry */
FunctionEntry = RtlLookupFunctionEntry(Context.Rip, &ImageBase, NULL); FunctionEntry = RtlLookupFunctionEntry(Context.Rip, &ImageBase, NULL);
ASSERT(FunctionEntry != NULL); if (FunctionEntry != NULL)
{
/* Do a virtual unwind to the caller and capture saved non-volatiles */
RtlVirtualUnwind(UNW_FLAG_EHANDLER,
ImageBase,
Context.Rip,
FunctionEntry,
&Context,
&HandlerData,
&EstablisherFrame,
NonvolatileContextPointers);
/* Do a virtual unwind to the caller and capture saved non-volatiles */ ASSERT(EstablisherFrame != 0);
RtlVirtualUnwind(UNW_FLAG_EHANDLER, }
ImageBase, else
Context.Rip, {
FunctionEntry, Context.Rip = *(PULONG64)Context.Rsp;
&Context, Context.Rsp += 8;
&HandlerData, }
&EstablisherFrame,
NonvolatileContextPointers);
/* Make sure nothing fishy is going on. Currently this is for kernel mode only. */ /* Continue until we reach user mode */
ASSERT(EstablisherFrame != 0); } while ((LONG64)Context.Rip < 0);
ASSERT((LONG64)Context.Rip < 0);
/* Continue until we reached the target frame or user mode */ /* If the caller did the right thing, we should get past the target frame */
} while (EstablisherFrame < TargetFrame); ASSERT(EstablisherFrame >= TargetFrame);
/* If the caller did the right thing, we should get exactly the target frame */
ASSERT(EstablisherFrame == TargetFrame);
} }
VOID VOID