轉載:http://www.javashuo.com/article/p-kjkykukb-p.htmlhtml
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的導出函數,沒有相關函數,那就只能經過驅動方式得到了。post
而後經過dbghelp庫枚舉符號信息,這個庫是winddk裏面的庫學習
#include <Dbghelp.h>
#pragma comment(lib,"dbghelp.lib")
經過下面幾個函數就能夠枚舉pdb文件信息了this
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) { //回調函數,我這裏顯示了全部的函數信息 }
下面是代碼spa