#include "windows.h"
#include "tchar.h"
#include "stdio.h"
#define DBGHELP_TRANSLATE_TCHAR
#include "dbghelp.h"
#pragma comment(lib, "dbghelp.lib")
extern "C"
PLOADED_IMAGE
IMAGEAPI
ImageLoad(
__in PCSTR DllName,
__in_opt PCSTR DllPath
);
extern "C"
BOOL
IMAGEAPI
ImageUnload(
__inout PLOADED_IMAGE LoadedImage
);
#pragma comment(lib, "imagehlp.lib")
BOOL EnumerateSymbols(PCSTR);
BOOL CALLBACK EnumerateSymbolsProc(PSYMBOL_INFO, ULONG, PVOID);
int _tmain(int argc, _TCHAR* argv[], _TCHAR* env[])
{
if (argc != 2)
{
return 0;
}
#if defined(UNICODE) && defined(_UNICODE)
size_t i;
char pbuffer[MAX_PATH];
wcstombs_s(&i, pbuffer, MAX_PATH, argv[1], MAX_PATH);
EnumerateSymbols(pbuffer);
#else
EnumerateSymbols(argv[1]);
#endif
return 0;
}
BOOL EnumerateSymbols(PCSTR DllName)
{
HANDLE hProcess;
SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);
hProcess = GetCurrentProcess();
if (!SymInitialize(hProcess,
_T("symsrv*symsrv.dll*C:\\sc\\ms*http://msdl.microsoft.com/download/symbols"),
FALSE))
{
_tprintf(_T("SymInitialize. Error: 0x%x.\n"), GetLastError());
return FALSE;
}
PLOADED_IMAGE pli = ImageLoad(DllName, NULL);
if (pli == NULL)
{
_tprintf(_T("ImageLoad. Error: 0x%x.\n"), GetLastError());
return FALSE;
}
DWORD64 dw64Ret = SymLoadModule64(hProcess,
pli->hFile, NULL,
pli->ModuleName,
(DWORD64)pli->MappedAddress,
pli->SizeOfImage);
if (dw64Ret == 0 || ERROR_SUCCESS != GetLastError())
{
_tprintf(_T("SymLoadModule64. Error: 0x%x.\n"), GetLastError());
return FALSE;
}
dw64Ret = (DWORD64)pli->MappedAddress;
if (!SymEnumSymbols(hProcess,
(ULONG64)dw64Ret,
NULL,
(PSYM_ENUMERATESYMBOLS_CALLBACK)EnumerateSymbolsProc,
NULL))
{
_tprintf(_T("SymEnumSymbols. Error: 0x%x.\n"), GetLastError());
return FALSE;
}
if (!SymUnloadModule64(hProcess, (DWORD64)pli->MappedAddress))
{
_tprintf(_T("SymUnloadModule64. Error: 0x%x.\n"), GetLastError());
return FALSE;
}
if (!ImageUnload(pli))
{
_tprintf(_T("ImageUnload. Error: 0x%x.\n"), GetLastError());
return FALSE;
}
if (!SymCleanup(hProcess))
{
_tprintf(_T("SymCleanup. Error: 0x%x.\n"), GetLastError());
return FALSE;
}
return TRUE;
}
BOOL CALLBACK EnumerateSymbolsProc(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)
{
_tprintf(_T("SymName: %s\n"), pSymInfo->Name);
_tprintf(_T("SymType: 0x%08x\tSymAddr: 0x%08x\tSymSize: %d\n"),
pSymInfo->Flags, pSymInfo->Address, SymbolSize);
return TRUE;
}