166 lines
4.7 KiB
C++
166 lines
4.7 KiB
C++
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <windows.h>
|
|
#include <imagehlp.h>
|
|
|
|
#ifndef _CRTAPI1
|
|
#define _CRTAPI1
|
|
#endif
|
|
|
|
#define IS_ARG(c) (((c) == '-') || ((c) == '/'))
|
|
|
|
typedef BOOL (* SYMINITIALIZE)(HANDLE, LPSTR, BOOL);
|
|
typedef BOOL (* SYMLOADMODULE)(HANDLE, HANDLE, PSTR, PSTR, DWORD, DWORD);
|
|
typedef BOOL (* SYMGETSYMFROMADDR)(HANDLE, DWORD, PDWORD, PIMAGEHLP_SYMBOL);
|
|
typedef BOOL (* SYMCLEANUP)(HANDLE);
|
|
|
|
void _CRTAPI1 main(int, char**);
|
|
void usage(void);
|
|
VOID InitSymLib(VOID);
|
|
VOID TermSymLib(VOID);
|
|
LPSTR GetDebugSymbol(DWORD Address, LPDWORD Offset);
|
|
|
|
void _CRTAPI1 main(int argc, char** argv) {
|
|
|
|
char * fni = NULL;
|
|
char * fno = NULL;
|
|
|
|
for (--argc, ++argv; argc; --argc, ++argv) {
|
|
if (IS_ARG(**argv)) {
|
|
switch (*++*argv) {
|
|
default:
|
|
printf("error: unrecognized command line flag: '%c'\n", **argv);
|
|
usage();
|
|
break;
|
|
}
|
|
} else if (fno) {
|
|
printf("error: unrecognized command line argument: \"%s\"\n", *argv);
|
|
usage();
|
|
} else if (fni) {
|
|
fno = *argv;
|
|
} else {
|
|
fni = *argv;
|
|
}
|
|
}
|
|
|
|
if (!fni || !fno) {
|
|
usage();
|
|
}
|
|
|
|
FILE * fpi = fopen(fni, "rt");
|
|
|
|
if (!fpi) {
|
|
printf("error: cannot open file \"%s\" for read\n", fni);
|
|
exit(1);
|
|
}
|
|
|
|
FILE * fpo = fopen(fno, "wt");
|
|
|
|
if (!fpo) {
|
|
printf("error: cannot open file \"%s\" for write\n", fno);
|
|
exit(1);
|
|
}
|
|
|
|
InitSymLib();
|
|
|
|
while (!feof(fpi)) {
|
|
|
|
char buf[1024];
|
|
|
|
if (!fgets(buf, sizeof(buf), fpi)) {
|
|
break;
|
|
}
|
|
|
|
char * p = strstr(buf, "+0x");
|
|
|
|
if (p) {
|
|
|
|
DWORD val = (DWORD)strtoul(p, NULL, 0);
|
|
DWORD offset;
|
|
char * str = GetDebugSymbol(val, &offset);
|
|
|
|
if (str) {
|
|
sprintf(p, "%s+%#x\n", str, offset);
|
|
}
|
|
}
|
|
fwrite(buf, strlen(buf), 1, fpo);
|
|
}
|
|
fclose(fpi);
|
|
fclose(fpo);
|
|
TermSymLib();
|
|
}
|
|
|
|
void usage() {
|
|
printf("usage: convsym <input_file> <output_file>\n"
|
|
);
|
|
exit(1);
|
|
}
|
|
|
|
HMODULE hSymLib = NULL;
|
|
SYMINITIALIZE pSymInitialize = NULL;
|
|
SYMLOADMODULE pSymLoadModule = NULL;
|
|
SYMGETSYMFROMADDR pSymGetSymFromAddr = NULL;
|
|
SYMCLEANUP pSymCleanup = NULL;
|
|
|
|
VOID InitSymLib(VOID) {
|
|
if (hSymLib == NULL) {
|
|
hSymLib = LoadLibrary("IMAGEHLP.DLL");
|
|
if (hSymLib != NULL) {
|
|
pSymInitialize = (SYMINITIALIZE)GetProcAddress(hSymLib,
|
|
"SymInitialize"
|
|
);
|
|
pSymLoadModule = (SYMLOADMODULE)GetProcAddress(hSymLib,
|
|
"SymLoadModule"
|
|
);
|
|
pSymGetSymFromAddr = (SYMGETSYMFROMADDR)GetProcAddress(hSymLib,
|
|
"SymGetSymFromAddr"
|
|
);
|
|
pSymCleanup = (SYMCLEANUP)GetProcAddress(hSymLib,
|
|
"SymCleanup"
|
|
);
|
|
if (!pSymInitialize
|
|
|| !pSymLoadModule
|
|
|| !pSymGetSymFromAddr
|
|
|| !pSymCleanup) {
|
|
FreeLibrary(hSymLib);
|
|
hSymLib = NULL;
|
|
pSymInitialize = NULL;
|
|
pSymLoadModule = NULL;
|
|
pSymGetSymFromAddr = NULL;
|
|
pSymCleanup = NULL;
|
|
return;
|
|
}
|
|
}
|
|
pSymInitialize(GetCurrentProcess(), NULL, FALSE);
|
|
//SymInitialize(GetCurrentProcess(), NULL, TRUE);
|
|
pSymLoadModule(GetCurrentProcess(), NULL, "WININET.DLL", "WININET", 0, 0);
|
|
}
|
|
}
|
|
|
|
VOID TermSymLib(VOID) {
|
|
if (pSymCleanup) {
|
|
pSymCleanup(GetCurrentProcess());
|
|
FreeLibrary(hSymLib);
|
|
}
|
|
}
|
|
|
|
LPSTR GetDebugSymbol(DWORD Address, LPDWORD Offset) {
|
|
*Offset = Address;
|
|
if (!pSymGetSymFromAddr) {
|
|
return "";
|
|
}
|
|
|
|
static char symBuf[512];
|
|
|
|
//((PIMAGEHLP_SYMBOL)symBuf)->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL);
|
|
((PIMAGEHLP_SYMBOL)symBuf)->SizeOfStruct = sizeof(symBuf);
|
|
((PIMAGEHLP_SYMBOL)symBuf)->MaxNameLength = sizeof(symBuf) - sizeof(IMAGEHLP_SYMBOL);
|
|
if (!pSymGetSymFromAddr(GetCurrentProcess(),
|
|
Address,
|
|
Offset,
|
|
(PIMAGEHLP_SYMBOL)symBuf)) {
|
|
((PIMAGEHLP_SYMBOL)symBuf)->Name[0] = '\0';
|
|
}
|
|
return ((PIMAGEHLP_SYMBOL)symBuf)->Name;
|
|
}
|