獲取調用棧信息的函數RtlCaptureStackBackTrace()

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

發佈了55 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章