PDB符号文件信息

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的导出函数,没有相关函数,那就只能经过驱动方式得到了。学习

  而后经过dbghelp库枚举符号信息,这个库是winddk里面的库this

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

  经过下面几个函数就能够枚举pdb文件信息了spa

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)
{    //回调函数,我这里显示了全部的函数信息
}

  下面是代码code

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

相关文章
相关标签/搜索