#include "stdafx.h" #include <windows.h> typedef unsigned long ULONG_PTR,*PULONG_PTR; #define __out_ecount_opt(x) #include <dbghelp.h> #include <stdio.h> #include "stdlib.h" #pragma comment(lib,"dbghelp.lib") static LPSTR GetSymbolSearchpath () { char directory [MAX_PATH]; char drive [MAX_PATH]; HMODULE module; LPSTR path = new char [MAX_PATH]; memset(path,0,MAX_PATH * sizeof(path[0])); path[0] = '/0'; module = GetModuleHandle(NULL); GetModuleFileNameA(module, path, MAX_PATH); _splitpath(path, drive, directory, NULL, 0); strcpy(path, drive); strcat(path, directory); strcat(path, ";.//"); return path; } class mydbg { public: mydbg(DWORD dwAddr) { memset(szFuctionName,0,sizeof(szFuctionName)); BYTE symbolBuffer [sizeof(SYMBOL_INFO) + 256 * sizeof(CHAR)] = { 0 }; PSYMBOL_INFO pSymbol = (PSYMBOL_INFO) &symbolBuffer; pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO); pSymbol->MaxNameLen = 256; if( SymFromAddr( GetCurrentProcess(),dwAddr, 0, pSymbol ) ) { strcpy(szFuctionName, pSymbol->Name); } else { printf("SymFromAddr Failed! %d/n",GetLastError()); } } CHAR szFuctionName[32]; }; #define INIT_SYM(fInvadeProcess) / { / LPSTR symbolpath = GetSymbolSearchpath(); / SymInitialize( GetCurrentProcess(), symbolpath, fInvadeProcess); / delete[] symbolpath;/ } #define UNINIT_SYM() / { / SymCleanup( HANDLE(GetCurrentProcess()) );/ } static DWORD GetEIP() { DWORD dwCallerAddr; __asm { push DWORD ptr[ebp+4] pop DWORD ptr[dwCallerAddr] sub DWORD ptr[dwCallerAddr],5 } return dwCallerAddr; } #define __func_for_vc2003__ ( mydbg(GetEIP()).szFuctionName ) #pragma comment(lib,"dbghelp.lib") int main(int argc, char* argv[]) { INIT_SYM(TRUE) printf("this is <%s> fuction/n",__func_for_vc2003__); UNINIT_SYM() printf("this is <%s> fuction/n",__FUNCTION__); system("pause"); return 0; }