#ifndef StackWalk_H #define StackWalk_H 1 #include #include class Symbol { friend class StackWalker; private: Symbol(const char* moduleName, const char* symbolName, DWORD_PTR displacement); void Append(Symbol*); public: ~Symbol(); const char* moduleName() const { return _moduleName; } const char* symbolName() const { return _symbolName; } DWORD_PTR displacement() const { return _displacement; } void AppendDisplacement(char * sz) { char szDisp[16]; wsprintfA(szDisp, " + 0x%X", _displacement); lstrcatA(sz, szDisp); } Symbol* next() const { return _next; } private: char* _moduleName; char* _symbolName; DWORD_PTR _displacement; Symbol* _next; }; class StackWalker { public: StackWalker(HANDLE hProcess); ~StackWalker(); Symbol* ResolveAddress(DWORD_PTR addr); Symbol* CreateStackTrace(CONTEXT*); BOOL GetCallStack(Symbol * symbol, SIZE_T nChars, WCHAR * sz, SIZE_T nMaxLines=999999999); SIZE_T GetCallStackSize(Symbol* symbol); private: static DWORD_PTR __stdcall GetModuleBase(HANDLE hProcess, DWORD_PTR address); static DWORD_PTR LoadModule(HANDLE hProcess, DWORD_PTR address); private: typedef BOOL (__stdcall *SymGetModuleInfoFunc)(HANDLE hProcess, DWORD_PTR dwAddr, PIMAGEHLP_MODULE ModuleInfo); typedef BOOL (__stdcall *SymGetSymFromAddrFunc)(HANDLE hProcess, DWORD_PTR dwAddr, PDWORD_PTR pdwDisplacement, PIMAGEHLP_SYMBOL Symbol); typedef DWORD (__stdcall *SymLoadModuleFunc)(HANDLE hProcess, HANDLE hFile, PSTR ImageName, PSTR ModuleName, DWORD_PTR BaseOfDll, DWORD SizeOfDll); typedef BOOL (__stdcall *StackWalkFunc)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, LPSTACKFRAME StackFrame, LPVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine, PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine, PTRANSLATE_ADDRESS_ROUTINE TranslateAddress); typedef BOOL (__stdcall *UndecorateSymbolNameFunc)(LPSTR DecName, LPSTR UnDecName, DWORD UnDecNameLength, DWORD Flags); private: HMODULE _imageHlpDLL; HANDLE _hProcess; EXCEPTION_POINTERS m_exceptionpts; static SymGetModuleInfoFunc _SymGetModuleInfo; static SymGetSymFromAddrFunc _SymGetSymFromAddr; static SymLoadModuleFunc _SymLoadModule; static StackWalkFunc _StackWalk; static UndecorateSymbolNameFunc _UndecorateSymbolName; static PFUNCTION_TABLE_ACCESS_ROUTINE _SymFunctionTableAccess; }; #endif