static DWORD ConvertAddress ( DWORD dwAddr , LPTSTR szOutBuff ) { char szTemp [ MAX_PATH + sizeof ( IMAGEHLP_SYMBOL ) ] ; PIMAGEHLP_SYMBOL pIHS = (PIMAGEHLP_SYMBOL)&szTemp ; IMAGEHLP_MODULE stIHM ; LPTSTR pCurrPos = szOutBuff ; ZeroMemory ( pIHS , MAX_PATH + sizeof ( IMAGEHLP_SYMBOL ) ) ; ZeroMemory ( &stIHM , sizeof ( IMAGEHLP_MODULE ) ) ; pIHS->SizeOfStruct = sizeof ( IMAGEHLP_SYMBOL ) ; pIHS->Address = dwAddr ; pIHS->MaxNameLength = MAX_PATH ; stIHM.SizeOfStruct = sizeof ( IMAGEHLP_MODULE ) ; // Always stick the address in first. pCurrPos += wsprintf ( pCurrPos , _T ( "0x%08X " ) , dwAddr ) ; // Get the module name. if ( 0 != g_cSym.SymGetModuleInfo ( dwAddr , &stIHM ) ) { // Strip off the path. LPTSTR szName = _tcsrchr ( stIHM.ImageName , _T ( '\\' ) ) ; if ( NULL != szName ) { szName++ ; } else { szName = stIHM.ImageName ; } pCurrPos += wsprintf ( pCurrPos , _T ( "%s: " ) , szName ) ; } else { pCurrPos += wsprintf ( pCurrPos , _T ( "<unknown module>: " ) ); } // Get the function. DWORD dwDisp ; if ( 0 != g_cSym.SymGetSymFromAddr ( dwAddr , &dwDisp , pIHS ) ) { if ( 0 == dwDisp ) { pCurrPos += wsprintf ( pCurrPos , _T ( "%s" ) , pIHS->Name); } else { pCurrPos += wsprintf ( pCurrPos , _T ( "%s + %d bytes" ) , pIHS->Name , dwDisp ) ; } // If I got a symbol, give the source and line a whirl. IMAGEHLP_LINE stIHL ; ZeroMemory ( &stIHL , sizeof ( IMAGEHLP_LINE ) ) ; stIHL.SizeOfStruct = sizeof ( IMAGEHLP_LINE ) ; if ( 0 != g_cSym.SymGetLineFromAddr ( dwAddr , &dwDisp , &stIHL ) ) { // Put this on the next line and indented a bit. pCurrPos += wsprintf ( pCurrPos , _T ( "\n\t\t%s, Line %d" ) , stIHL.FileName , stIHL.LineNumber ) ; if ( 0 != dwDisp ) { pCurrPos += wsprintf ( pCurrPos , _T ( " + %d bytes" ) , dwDisp ) ; } } } else { pCurrPos += wsprintf ( pCurrPos , _T ( "<unknown symbol>" ) ) ; } // Tack on a CRLF. pCurrPos += wsprintf ( pCurrPos , _T ( "\n" ) ) ; return ( pCurrPos - szOutBuff ) ; }