您的位置:首页 > 其它

获取调用栈信息的函数RtlCaptureStackBackTrace()

2018-01-08 20:32 609 查看
这是一个导出函数,使用时必须试探页面产生异常的能力(probe the ability to take page fault)—(翻译 ddk文档)。

USHORT //返回捕捉到的结构数
RtlCaptureStackBackTrace(
__in ULONG  FramesToSkip,
__in ULONG  FramesToCapture,
__out_ecount(FramesToCapture) PVOID  *BackTrace,
__out_opt PULONG  BackTraceHash
)
{
int i=numOfTheLaskCapturedFrame=0;//额外的开销,程序编译过程中通过寄存器的合理搭配使用,这两个量就不用了;但是为了可读性加进来
if(FramesToCapture>0ffffh) //0xf  jbe 0x15 超过最大捕捉量时,取设定的最大值
{
FramesToCapture=0ffffh;//0x13
}
if(FramesToSkip>0feh)  //0x15  jbe 0x24
{
return 0;  //0x20  跳过的栈结构太多,直接返回0
}
else
{
numOfTheLastCapturedFrame=RtlWalkFrameChain(
BackTrace,//保存栈结构信息
FramesToSkip+FramesToCapture+1,//结束的下标
(FramesToSkip+1)<<8)) // 开始的下标 //0x24  jbe 0x69
if((FramesToSkip+1)>numOfTheLastCapturedFrame)
{
return 0;
}
else
{
if(BackTraceHash) //0x3f   je 0x65
{
if(FramesToCapture<=0) //0x46 jbe  0x5e
{
*BackTraceHash=0;  //0x5e
return 0;
}
else
{
for(i;FramesToSkip+i<numOfTheLastCapturedFrame,i<FramesToCapture;i++) //0x4b
{
*BackTraceHash+=BackTrace[i];  //0x52
//0x5e  将栈结构地址加在一起作为hash值
return i+1;
}
}
}
else
{
return numOfTheLastCaputredFrame-FramesToSkip-1;
}
}
}
}


这个函数只是进行了参数的检查和信息的保存,实际工作有RtlWalkFrameChain()完成,下次再接着弄:)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  调用栈 windows