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 ...
随机推荐
- LA 3135 (优先队列) Argus
将多个有序表合并成一个有序表就是多路归并问题,可用优先队列来解决. #include <cstdio> #include <queue> using namespace std ...
- 如何在Asp.Net WebApi接口中,验证请求参数中是否携带token标识!
[BasicAuthentication] public abstract class ApiControllerBase : ApiController { #region Gloal Proper ...
- Raphael绘制圆圈环绕方法
$scope.toRadians = function (degrees) { return degrees * (Math.PI / 180); } $scope.toDegrees = funct ...
- Java [Leetcode 169]Majority Element
题目描述: Given an array of size n, find the majority element. The majority element is the element that ...
- mkswap 把一个分区格式化成为swap交换区
mkswap /dev/sda* //创建此分区为swap 交换分区swapon /dev/sda* //加载交换分区swapoff /dev/sda* //关闭交换分区: 若想要开机自动挂载:vi ...
- yum install错误 系统环境:Oracle Linux5.4 在通过yum安装软件时出现以下错误:
1.yum配置文件 1 [root@rh168 yum.repos.d]# cat yum.repo 2 [base] 3 name=Oracle linux 4 baseurl=file:/// ...
- FFmpeg在Android使用3
android 移植ffmpeg后so库的使用 只需要将我们编译好的ffmpeg的so包(在/obj/local/armeabi/libffmpeg.so)copy到所在ndk下的\platfor ...
- 五分钟solr4.5教程(搭建、运行)
环境要求 jdk1.6及以上版本 solr发布版本 下载地址 http://lucene.apache.org/solr/mirrors-solr-latest-redir.html? 启动solr ...
- Druid连接池简单入门
偶尔的机会解释Druid连接池,后起之秀,但是评价不错,另外由于是阿里淘宝使用过的所以还是蛮看好的. 1.jar包依赖--Druid依赖代码 <dependency> <groupI ...
- Lighting System Design
题意:从小到大给出额定功率,给出该功率费用,和灯泡的数量和单价,现在灯泡能在比他额定功率大的功率运行,求让所有灯泡正常工作的最小费用 分析: 问题转化为求用哪几个功率运行灯泡最小费用,dp[i]前i个 ...