PDB符号文件信息
一、前言
这个方法是通过网上的一些方式自己学习枚举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符号文件信息的更多相关文章
- PDB符号文件
一.什么是PDB文件 PDB(Program DataBase),全称为“程序数据库”文件.存储程序的所有调试信息数据.在编译连接时,如果选择了/debug选项或/debug:full选项,则最新的M ...
- PDB符号文件浏览工具介绍
一.SymView SymView工具用来显示符号文件中包含的符号表和符号数据.目前支持微软的Visual C/C++和C#编译器产生的DBG格式的符号文件和PDB格式的符号文件. SymView提供 ...
- 下载微软pdb符号文件
使用symchk.exe 逐层下载c:\windows\system32下的pdb文件 symchk /r c:\windows\system32 /s SRV*D:\mypdb\*http://m ...
- 【旧文章搬运】关于windbg搜索符号文件的一点说明
原文发表于百度空间,2010-09-07========================================================================== 本来只是打 ...
- 关于qtcreator+vs2008+CDB调试太卡的问题研究(载入符号表,以及VS调试器的注册表信息)
在刚接触Qt时,对于较大的项目,用qtcreator + vs + cdb 调试时,启动很慢并且单步运行时也经常会出现卡住半分钟以上的情况,一直没有解决.在需要debug的时候大多会在vs2008上安 ...
- windbg是如何搜索符号文件的?
来个样例 我的符号目录设置是: 用我们在windows下调试必须用到的ntdll.dll模块来讲下windbg加载符号文件的过程.windbg加载符号文件时,会首先根据配置的符号目录信息,在本地符号目 ...
- .pdb 文件的内部结构
粗略察看一 下.pdb 文件,会发现在其起始位置存放的是这样一个字符串“Microsoft C/C++ program database 2.00”.可以看出 PDB 是 Program Databa ...
- Oracle12c CDB和PDB数据库的启动与关闭说明
Oracle 12c中,增加了可插接数据库的概念,即PDB,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB). CDB全称为Container Database,中文翻译为数据库容器,PDB ...
- 数据库hang住如何收集信息
数据库hang的时候,建议尽量收集以下信息: 1.hanganalyze和systemstate dumps 2.AWR报告 3.最近的RDA 如果是CDB环境,要确认是CDB级别的hang还是PDB ...
随机推荐
- HDU 3746 (KMP求最小循环节) Cyclic Nacklace
题意: 给出一个字符串,要求在后面添加最少的字符是的新串是循环的,且至少有两个循环节.输出最少需要添加字符的个数. 分析: 假设所给字符串为p[0...l-1],其长度为l 有这样一个结论: 这个串的 ...
- jquery datepicker-强大的日期控件
在web开发中,总会遇到需要用户输入日期的情况.一般都是提供一个text类型的input供用户输入日期.然而,这种方式,开发人员必须对用户输入的日期进行验证,判断其合法性.除此之外,让用户输入日期也是 ...
- HelloX操作系统网络功能简介及使用和开发指南
HelloX网络功能简介及使用和开发指南 HelloX网络功能简介 作为物联网操作系统,网络功能是必备的核心功能之一.按照规划,HelloX实现了两个不同类型的TCP/IP协议栈,一个面向资源受限的嵌 ...
- 【JS】<a>标签调用js中函数的几种方法
我们常用的在a标签中有点击事件: a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而 ...
- 【MySQL】Java对SQL时间类型的操作(获得当前、昨天、前年。。时间)
Java获得当前时间 java.util.Date date = new java.util.Date(); Timestamp time = new Timestamp(date.getTime() ...
- JavaScript的事件代理(转)
如果你想给网页添加点JavaScript的交互性,也许你已经听过JavaScript的事件代理(event delegation),并且觉得这是那些发烧友级别的JavaScript程序员才会关心的什么 ...
- 【转】移动web资源整理
目录(更新于20150311) meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 忽略将页面中的数字识别为电话号码 忽略Android平台中对邮箱地址的识别 当网站添加到主屏幕快速 ...
- Domain Name System (DNS)
1.DNS和WINS的作用 DNS:(Domain Name Server,域名服务)用于实现域名和IP地址的相互转换. WINS:(Windows Internet Name Service) 用来 ...
- 【c++内存分布系列】单独一个类
首先要明确类型本身是没有具体地址的,它是为了给编译器生成相应对象提供依据.只有编译器生成的对象才有明确的地址. 一.空类 形如下面的类A,类里没有任何成员变量,类的sizeof值为1. #includ ...
- hdu 1078(dfs记忆化搜索)
题意:容易理解... 思路:我开始是用dfs剪枝做的,968ms险过的,后来在网上学习了记忆化搜索=深搜形式+dp思想,时间复杂度大大降低,我个人理解,就是从某一个点出发,前面的点是由后面的点求出的, ...