void KImageModule::ShowFPO(ULONG SymbolAddress) { if ( m_bShowFPO ) { const FPO_DATA * pFPO = (const FPO_DATA *) SymFunctionTableAccess(m_hProcess, SymbolAddress); if ( pFPO ) { Output(" "); Output("s=%4d l=%2d, p=%2d, e=%2d, r=%2d, s=%d, b=%d, f=%d\n", pFPO->cbProcSize, pFPO->cdwLocals, pFPO->cdwParams, pFPO->cbProlog, pFPO->cbRegs, pFPO->fHasSEH, pFPO->fUseBP, pFPO->cbFrame); } } }
LPVOID SwFunctionTableAccess( HANDLE hProcess, DWORD AddrBase ) { #if defined(TARGET_i386) || defined(CHICAGO) return (LPVOID)FindFpoDataForModule( AddrBase ); #else static IMAGE_RUNTIME_FUNCTION_ENTRY irfe; PIMAGE_FUNCTION_ENTRY pife = SymFunctionTableAccess( hProcess, AddrBase ); if (pife) { irfe.BeginAddress = pife->StartingAddress; irfe.EndAddress = pife->EndingAddress; irfe.ExceptionHandler = 0; irfe.HandlerData = 0; irfe.PrologEndAddress = pife->EndOfPrologue; return &irfe; } else { return NULL; } #endif }
static void* CALLBACK FunctionTableAccess(HANDLE hProcess, ULONG_ADDR dwAddrBase) { return SymFunctionTableAccess(hProcess, dwAddrBase); }
static LPVOID __stdcall FunctionTableAccess(HANDLE hProcess, DWORD dwPCAddress) { return SymFunctionTableAccess(hProcess, dwPCAddress); }