一、前言

  这个方法是通过网上的一些方式自己学习枚举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] = {};
//获得基地址
if( EnumDeviceDrivers(drivers, sizeof(drivers), &cbNeeded) && cbNeeded < sizeof(drivers))
{
TCHAR szDriver[ARRAY_SIZE];
cDrivers = cbNeeded / sizeof(drivers[]); for (i=; i < cDrivers; i++ )
{
//获得驱动名
if(GetDeviceDriverBaseName(drivers[i], szDriver, sizeof(szDriver)/sizeof(szDriver[])))
{
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,); //注意这里的i 就是Icon 在数组的位置
m_List.SetItemText(n,,StrAddress);
m_List.SetItemText(n,,szPath);
}
}
}
}

  本来想看能不能枚举其他信息,看psapi的导出函数,没有相关函数,那就只能通过驱动方式获得了。

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

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

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

VOID EnumFunc::EnumFuncInformation()
{
std::string strMod;
if(g_BaseAddress==)
{
MessageBox(L"Error",L"Error");
return;
}
SymSetOptions(SYMOPT_DEFERRED_LOADS);
HANDLE hProcess = GetCurrentProcess();
SymInitialize(hProcess, , 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, , NULL);
DWORD dwFileSize = GetFileSize(hSystemFile, NULL); //获得文件大小
//传入驱动文件路径,驱动基址,驱动大小,这里也不知道哪里用了pdb文件
DWORD64 dwBase = SymLoadModule64(hProcess, NULL,strSystemPath.c_str(), NULL,(DWORD64)g_BaseAddress , dwFileSize);
//枚举所有的函数信息,在回调中显示
SymEnumSymbols(hProcess, dwBase, , EnumSymCallBack, this);
SymUnloadModule64(hProcess, dwBase);
SymCleanup(hProcess); }
BOOL CALLBACK  EnumSymCallBack(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)
{ //回调函数,我这里显示了所有的函数信息
}

  下面是代码

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

PDB符号文件信息的更多相关文章

  1. PDB符号文件

    一.什么是PDB文件 PDB(Program DataBase),全称为“程序数据库”文件.存储程序的所有调试信息数据.在编译连接时,如果选择了/debug选项或/debug:full选项,则最新的M ...

  2. PDB符号文件浏览工具介绍

    一.SymView SymView工具用来显示符号文件中包含的符号表和符号数据.目前支持微软的Visual C/C++和C#编译器产生的DBG格式的符号文件和PDB格式的符号文件. SymView提供 ...

  3. 下载微软pdb符号文件

    使用symchk.exe  逐层下载c:\windows\system32下的pdb文件 symchk /r c:\windows\system32 /s SRV*D:\mypdb\*http://m ...

  4. 【旧文章搬运】关于windbg搜索符号文件的一点说明

    原文发表于百度空间,2010-09-07========================================================================== 本来只是打 ...

  5. 关于qtcreator+vs2008+CDB调试太卡的问题研究(载入符号表,以及VS调试器的注册表信息)

    在刚接触Qt时,对于较大的项目,用qtcreator + vs + cdb 调试时,启动很慢并且单步运行时也经常会出现卡住半分钟以上的情况,一直没有解决.在需要debug的时候大多会在vs2008上安 ...

  6. windbg是如何搜索符号文件的?

    来个样例 我的符号目录设置是: 用我们在windows下调试必须用到的ntdll.dll模块来讲下windbg加载符号文件的过程.windbg加载符号文件时,会首先根据配置的符号目录信息,在本地符号目 ...

  7. .pdb 文件的内部结构

    粗略察看一 下.pdb 文件,会发现在其起始位置存放的是这样一个字符串“Microsoft C/C++ program database 2.00”.可以看出 PDB 是 Program Databa ...

  8. Oracle12c CDB和PDB数据库的启动与关闭说明

    Oracle 12c中,增加了可插接数据库的概念,即PDB,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB). CDB全称为Container Database,中文翻译为数据库容器,PDB ...

  9. 数据库hang住如何收集信息

    数据库hang的时候,建议尽量收集以下信息: 1.hanganalyze和systemstate dumps 2.AWR报告 3.最近的RDA 如果是CDB环境,要确认是CDB级别的hang还是PDB ...

随机推荐

  1. 数据库锁机制(一)——概述

    注:内容为自己的推理认知+网络,如有错误和不合理之处,敬请指出. 在多线程环境中我用使用线程锁处理并发问题,而在数据库系统中,并发问题可以细化到事务级别,而DBMS对此的处理方案就是使用锁. 为了适应 ...

  2. LA 3295 (计数 容斥原理) Counting Triangles

    如果用容斥原理递推的办法,这道题确实和LA 3720 Highway很像. 看到大神们写的博客,什么乱搞啊,随便统计一下,这真的让小白很为难,于是我决定用比较严格的语言来写这篇题解. 整体思路很简单: ...

  3. UVa 11076 (有重元素的排列) Add Again

    n个可重复的元素的排列一共有 = All种,其中 假设这些数依次为ai,每种数字有mi个. 从右往左考虑第d位数(d≥0),第i个数字出现的次数为,那么这个数字对所求答案的贡献为 其实可以先一次求出个 ...

  4. BZOJ 1861 书架

    (╯-_-)╯╧╧ 此处为错误代码. #include<iostream> #include<cstdio> #include<cstring> #include& ...

  5. POJ 3084 Panic Room (最小割建模)

    [题意]理解了半天--大意就是,有一些房间,初始时某些房间之间有一些门,并且这些门是打开的,也就是可以来回走动的,但是这些门是确切属于某个房间的,也就是说如果要锁门,则只有在那个房间里才能锁. 现在一 ...

  6. HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)

    题意: 有两台不同机器A和B,他们分别拥有各种运行模式1~n和1~m.现有一些job,需要在某模式下才能完成,job1在A和B上需要的工作模式又可能会不一样.两台机器一开始处于0模式,可以切换模式,但 ...

  7. wav文件格式分析详解

    wav文件格式分析详解 文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395 一.综述    WAVE文件作为多媒体中使用的声波文件格式 ...

  8. hdu 4435 charge-station

    // 题意 从1出发逛完N个点回到出发点 要在这N个点选择性建设加油站 车每次加满油最多可以行使D米// 然后最少要花多少钱才能达到上述要求// 注意到 第i个城市的花费是 2^(i-1) 所以 我就 ...

  9. 【转】SDP file

    SDP file Introduction The Session Description Protocol (SDP) is a format for describing the initiali ...

  10. How to enable DateTimePicker to use both date and time z

    Recently in one of my project I needed to have an option to display the DateTimePicker allowing user ...