00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
#include "ntrtlp.h"
00027 
00028 
00029 
00030 
00031 
00032 
#undef RtlGetCallersAddress
00033 
00034 
VOID
00035 RtlGetCallersAddress (
00036     OUT PVOID *CallersPc,
00037     OUT PVOID *CallersCallersPc
00038     )
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 {
00070 
00071     CONTEXT ContextRecord;
00072     ULONG EstablisherFrame;
00073     PRUNTIME_FUNCTION FunctionEntry;
00074     BOOLEAN InFunction;
00075     ULONG NextPc;
00076     ULONG HighLimit, LowLimit;
00077 
00078     
00079     
00080     
00081     
00082 
00083     *CallersPc = 
NULL;
00084     *CallersCallersPc = 
NULL;
00085 
00086     
00087     
00088     
00089 
00090     RtlCaptureContext(&ContextRecord);
00091     NextPc = (ULONG)ContextRecord.XIntRa;
00092 
00093     
00094     
00095     
00096 
00097     
RtlpGetStackLimits(&LowLimit, &HighLimit);
00098 
00099     
00100     
00101     
00102 
00103     FunctionEntry = 
RtlLookupFunctionEntry(NextPc);
00104     
if (FunctionEntry != 
NULL) {
00105 
00106         
00107         
00108         
00109         
00110 
00111         NextPc = 
RtlVirtualUnwind(NextPc | 1,
00112                                   FunctionEntry,
00113                                   &ContextRecord,
00114                                   &InFunction,
00115                                   &EstablisherFrame,
00116                                   
NULL);
00117 
00118         
00119         
00120         
00121 
00122         FunctionEntry = 
RtlLookupFunctionEntry(NextPc);
00123         
if ((FunctionEntry != 
NULL) && ((ULONG)ContextRecord.XIntSp < HighLimit)) {
00124 
00125             
00126             
00127             
00128             
00129             
00130 
00131             NextPc = 
RtlVirtualUnwind(NextPc | 1,
00132                                       FunctionEntry,
00133                                       &ContextRecord,
00134                                       &InFunction,
00135                                       &EstablisherFrame,
00136                                       
NULL);
00137 
00138             *CallersPc = (PVOID)NextPc;
00139 
00140             
00141             
00142             
00143             
00144 
00145             FunctionEntry = 
RtlLookupFunctionEntry(NextPc);
00146             
if ((FunctionEntry != 
NULL) && ((ULONG)ContextRecord.XIntSp < HighLimit)) {
00147 
00148                 
00149                 
00150                 
00151                 
00152                 
00153                 
00154 
00155                 NextPc = 
RtlVirtualUnwind(NextPc | 1,
00156                                           FunctionEntry,
00157                                           &ContextRecord,
00158                                           &InFunction,
00159                                           &EstablisherFrame,
00160                                           
NULL);
00161 
00162                 *CallersCallersPc = (PVOID)NextPc;
00163             }
00164         }
00165     }
00166 
00167     
return;
00168 }
00169 
00170 
USHORT
00171 RtlCaptureStackBackTrace(
00172    IN ULONG FramesToSkip,
00173    IN ULONG FramesToCapture,
00174    OUT PVOID *BackTrace,
00175    OUT PULONG BackTraceHash
00176    )
00177 {
00178     
return 0;
00179 }