zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Spring框架基本应用
    hibernate 多表查询
    myeclipse 中解决Hibernate 和Struts 2的冲突
    新建一个Tomcat服务器
    hibernate连接数据库
    MyEclipse从数据库逆向生成Hibernate实体类
    Struts 2 标签
    struts 2 框架的应用
    AutoIt: WinGetClassList可以把当前窗口所有的handle全部列出来
    自动化测试建议【转载,与我的想法完全雷同】
  • 原文地址:https://www.cnblogs.com/kuangke/p/11133927.html
Copyright © 2011-2022 走看看