Listing 2: Stack walking pseudocode

BOOL EBP_OK = TRUE ;
do
  {
  if( (DWORD)EBP & 3 )
    EBP_OK = FALSE ;
  if( EBP_OK && IsBadReadPtr( (void*)EBP, 8 ) )
    EBP_OK = FALSE ;
  if( EBP_OK )
    {
    BYTE* caller = *((BYTE**)EBP + 1) ;
    EBP = *(DWORD*)EBP ;
    MEMORY_BASIC_INFORMATION mbi ;
    VirtualQuery( caller, &mbi, sizeof( mbi ) ) ;
    HINSTANCE hInstance = mbi.AllocationBase ;
    if( hInstance == 0 )
      EBP_OK = FALSE ;
    else
      DumpDebugInfo( caller, hInstance ) ;
    }
  else
    break ;
  }
while( TRUE ) ;
//End of File