PDB符号文件信息

转载:https://www.cnblogs.com/aliflycoris/p/5320649.html

一、前言

  这个方法是通过网上的一些方式自己学习枚举PDB文件信息。

二、代码实现

  首先枚举驱动文件,这里用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的导出函数,没有相关函数,那就只能通过驱动方式获得了。

  然后通过dbghelp库枚举符号信息,这个库是winddk里面的库

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

  通过下面几个函数就可以枚举pdb文件信息了

复制代码
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)
{    //回调函数,我这里显示了所有的函数信息
}

  下面是代码

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

原文地址:https://www.cnblogs.com/kuangke/p/11133927.html