這是一個導出函數,使用時必須試探頁面產生異常的能力(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()完成,下次再接着弄:)。