这是一个导出函数,使用时必须试探页面产生异常的能力(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()完成,下次再接着弄:)。