diff --git a/shell/a.cpp b/shell/a.cpp index e744428..0ba334a 100644 --- a/shell/a.cpp +++ b/shell/a.cpp @@ -2,6 +2,7 @@ #include "parser.h" #include "commands.h" #include "errors.h" +#include "util.h" #include #include @@ -228,51 +229,58 @@ static void ad_disassemble_all(VirtualSpace &space, std::vector const &addresses, bool force) { std::vector passes = { "cfg", "pcrel", "syscall" }; + int successes=0, errors=0; for(auto pass: passes) { Timer timer; timer.start(); - bool ok = true; - uint32_t error_addr = -1; - if(pass == "cfg") { CfgPass p(space.disasm); for(uint32_t addr: addresses) { - ok &= p.run(addr); - if(!ok) { error_addr = addr; break; } + printr("[cfg] Disassembling %08x...", addr); + if(!p.run(addr)) { + FxOS_log(ERR, "while processing %08x", addr); + errors++; + if(!force) break; + } + else successes++; } } else if(pass == "pcrel") { + printr("[pcrel] Resolving PC-relative addressing modes..."); PcrelPass p(space.disasm); - ok = p.run(); - if(!ok) break; + if(!p.run()) { + errors++; + if(!force) break; + } } else if(pass == "syscall") { + printr("[syscall] Finding syscall references..."); OS *os = space.os_analysis(); if(os) { SyscallPass p(space.disasm, os); - ok = p.run(); - if(!ok) break; + if(!p.run()) { + errors++; + if(!force) break; + } } } else { FxOS_log(ERR, "unknown pass <%s>", pass); - ok = false; + break; } + printf("\n"); timer.stop(); FxOS_log(LOG, "Finished pass <%s> in %s", pass, timer.format_time()); - if(!ok) { - if(error_addr != (uint32_t)-1) - FxOS_log(ERR, "entry %08x: pass <%s> failed", error_addr,pass); - else - FxOS_log(ERR, "pass <%s> failed", pass); - if(!force) - break; - } + if(errors && !force) + break; } + + printf("Successfully analyzed %d functions (%d errors)\n", + successes, errors); } static std::vector parse_ad(Session &session, Parser &parser) diff --git a/shell/util.h b/shell/util.h new file mode 100644 index 0000000..b940998 --- /dev/null +++ b/shell/util.h @@ -0,0 +1,15 @@ +//--- +// fxos-shell.util: General application-independent utilities +//--- + +#ifndef FXOS_UTIL_H +#define FXOS_UTIL_H + +#include + +#define printr(fmt, ...) do { \ + printf("\x1b[K" fmt "\r", ##__VA_ARGS__); \ + fflush(stdout); \ +} while(0) + +#endif /* FXOS_UTIL_H */