PDB符號文件信息

轉載:http://www.javashuo.com/article/p-kjkykukb-p.htmlhtml

1、前言api

  這個方法是經過網上的一些方式本身學習枚舉PDB文件信息。數組

 

2、代碼實現網絡

  首先枚舉驅動文件,這裏用psapi庫函數

#include "psapi.h"
#pragma comment(lib,"psapi.lib")

 

複製代碼
VOID CEnumPdbDlg::EnumModule()
{
    LPVOID drivers[ARRAY_SIZE];
    DWORD cbNeeded;
    int cDrivers, i;
    TCHAR szPath[ARRAY_SIZE] = {0};
    //得到基地址
    if( EnumDeviceDrivers(drivers, sizeof(drivers), &cbNeeded) && cbNeeded < sizeof(drivers))
    {
        TCHAR szDriver[ARRAY_SIZE];
        cDrivers = cbNeeded / sizeof(drivers[0]);

        for (i=0; i < cDrivers; i++ )
        {
              //得到驅動名
            if(GetDeviceDriverBaseName(drivers[i], szDriver, sizeof(szDriver)/sizeof(szDriver[0])))
            {
                CString StrAddress;
                StrAddress.Format(L"0x%p",drivers[i]);
                CString FullModPath;
                //驅動完整路徑
                GetDeviceDriverFileName(drivers[i], szPath, sizeof(szPath));
            
                int n = m_List.InsertItem(m_List.GetItemCount(),szDriver,0);   //注意這裏的i 就是Icon 在數組的位置
                m_List.SetItemText(n,1,StrAddress);
                m_List.SetItemText(n,2,szPath);
            }
        }
    }
}
複製代碼

 

  原本想看能不能枚舉其餘信息,看psapi的導出函數,沒有相關函數,那就只能經過驅動方式得到了。post

  而後經過dbghelp庫枚舉符號信息,這個庫是winddk裏面的庫學習

#include <Dbghelp.h>
#pragma comment(lib,"dbghelp.lib")

  經過下面幾個函數就能夠枚舉pdb文件信息了this

複製代碼
VOID EnumFunc::EnumFuncInformation()
{
    std::string strMod;
    if(g_BaseAddress==0)
    {
        MessageBox(L"Error",L"Error");
        return;
    }
    SymSetOptions(SYMOPT_DEFERRED_LOADS);
    HANDLE hProcess = GetCurrentProcess();
    SymInitialize(hProcess, 0, FALSE);
    std::string strSymbolPath;
    //枚舉的下載地址                  這裏是本身的保存路徑
#if _WIN64
    strSymbolPath = "srv*D:\\Study\\Symbols_Win7_X64*http://msdl.microsoft.com/download/symbols";
#else
    strSymbolPath = "srv*D:\\Study\\Symbols_WinXP_X86*http://msdl.microsoft.com/download/symbols";
#endif
    
    SymSetSearchPath(hProcess, strSymbolPath.c_str());  //在網絡上下載符號信息,中間指定了下載目錄
    
    std::string strSystemPath = "C:\\Windows\\System32\\";   //這是驅動文件路徑
    strSystemPath += g_strPath;
    HANDLE hSystemFile = CreateFileA(strSystemPath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL, OPEN_EXISTING, 0, NULL);
    DWORD dwFileSize = GetFileSize(hSystemFile, NULL);      //得到文件大小
                                              //傳入驅動文件路徑,驅動基址,驅動大小,這裏也不知道哪裏用了pdb文件
    DWORD64  dwBase = SymLoadModule64(hProcess, NULL,strSystemPath.c_str(), NULL,(DWORD64)g_BaseAddress , dwFileSize);
    //枚舉全部的函數信息,在回調中顯示
    SymEnumSymbols(hProcess, dwBase, 0, EnumSymCallBack, this);
    SymUnloadModule64(hProcess, dwBase);
    SymCleanup(hProcess);

}
複製代碼
BOOL CALLBACK  EnumSymCallBack(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)
{    //回調函數,我這裏顯示了全部的函數信息
}

  下面是代碼spa

    http://pan.baidu.com/s/1o86Cm3Scode

相關文章
相關標籤/搜索