BOOL ProcessModuleLoad ( PDEBUGPACKET dp, LPDEBUG_EVENT de ) /*++ Routine Description: Process all module load debug events, create process & dll load. The purpose is to allocate a MODULEINFO structure, fill in the necessary values, and load the symbol table. Arguments: dp - pointer to a debug packet de - pointer to a debug event structure Return Value: TRUE - everything worked FALSE - we're hosed --*/ { HANDLE hFile; DWORD dwBaseOfImage; LPSTR SymbolPath; if (de->dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) { hFile = de->u.CreateProcessInfo.hFile; dwBaseOfImage = (DWORD)de->u.CreateProcessInfo.lpBaseOfImage; dp->hProcess = de->u.CreateProcessInfo.hProcess; dp->dwProcessId = de->dwProcessId; SymInitialize( dp->hProcess, NULL, FALSE ); SymbolPath = GetSymbolSearchPath(); SymSetSearchPath( dp->hProcess, SymbolPath ); free( SymbolPath ); } else if (de->dwDebugEventCode == LOAD_DLL_DEBUG_EVENT) { hFile = de->u.LoadDll.hFile; dwBaseOfImage = (DWORD)de->u.LoadDll.lpBaseOfDll; } if ((hFile == NULL) || (hFile == INVALID_HANDLE_VALUE)) { return FALSE; } if (!SymLoadModule( dp->hProcess, hFile, NULL, NULL, dwBaseOfImage, 0 )) { return FALSE; } else { if (de->dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) { IMAGEHLP_MODULE mi; if (SymGetModuleInfo( dp->hProcess, dwBaseOfImage, &mi )) { strcpy( szApp, mi.ImageName ); } } } return TRUE; }
void EnumCallStack(HANDLE hThread, CONTEXT* context, PRINTSTACKFRAMECALLBACK pfn, LPVOID lpData) { if(!IsStackTraceEnabled()) return; DebugHelper dbghelp; DWORD dwSymOptions = dbghelp.SymGetOptions(); dwSymOptions |= SYMOPT_DEFERRED_LOADS; dwSymOptions |= SYMOPT_FAIL_CRITICAL_ERRORS; dwSymOptions |= SYMOPT_LOAD_LINES; dwSymOptions |= SYMOPT_UNDNAME; if(!dbghelp.SymSetOptions(dwSymOptions)) return; if(!dbghelp.SymInitialize(0)) return; DWORD dwBufferSize = 1024*2; LPTSTR lpszSearchPath = (LPTSTR)::LocalAlloc(LPTR, dwBufferSize); if((lpszSearchPath != 0) && dbghelp.SymGetSearchPath(lpszSearchPath, dwBufferSize)) { GetSymbolSearchPath(lpszSearchPath, dwBufferSize); dbghelp.SymSetSearchPath(lpszSearchPath); } if(lpszSearchPath) ::LocalFree(lpszSearchPath); STACKFRAME64 stackFrame; ZeroMemory(&stackFrame, sizeof(stackFrame)); stackFrame.AddrPC.Offset = context->Eip; stackFrame.AddrPC.Mode = AddrModeFlat; stackFrame.AddrFrame.Offset = context->Ebp; stackFrame.AddrFrame.Mode = AddrModeFlat; for (int frameNum = 0; dbghelp.StackWalk64(hThread, &stackFrame, context) || frameNum < 50; frameNum++) { PrintStackFrame(dbghelp, stackFrame, frameNum, pfn, lpData); } dbghelp.SymCleanup(); }