Implement RtlGetCallersAddress

svn path=/branches/ros-amd64-bringup/; revision=37425
This commit is contained in:
Timo Kreuzer
2008-11-17 23:24:59 +00:00
parent ec5a72dda9
commit 83991b3750
+28 -2
View File
@@ -332,7 +332,7 @@ RtlWalkFrameChain(OUT PVOID *Callers,
{
CONTEXT Context;
ULONG64 ControlPc, ImageBase, EstablisherFrame;
ULONG64 StackBegin, StackEnd;
ULONG64 StackLow, StackHigh;
PVOID HandlerData;
INT i;
PRUNTIME_FUNCTION FunctionEntry;
@@ -341,7 +341,7 @@ DPRINT1("RtlWalkFrameChain called\n");
ControlPc = Context.Rip;
RtlpGetStackLimits(&StackBegin, &StackEnd);
RtlpGetStackLimits(&StackLow, &StackHigh);
/* Check if we want the user-mode stack frame */
if (Flags == 1)
@@ -384,3 +384,29 @@ DPRINT1("RtlWalkFrameChain called\n");
return i;
}
// CHEKCME: return PVOID?
// http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Debug/RtlGetCallersAddress.html
VOID
NTAPI
RtlGetCallersAddress(
OUT PVOID *CallersAddress,
OUT PVOID *CallersCaller )
{
PVOID Callers[4];
ULONG Number;
/* Get callers:
* RtlWalkFrameChain -> RtlGetCallersAddress -> x -> y */
Number = RtlWalkFrameChain(Callers, 4, 0);
if (CallersAddress)
{
*CallersAddress = (Number >= 3) ? Callers[2] : NULL;
}
if (CallersCaller)
{
*CallersCaller = (Number == 4) ? Callers[3] : NULL;
}
return;
}