| Index: courgette/program_detector.cc
|
| diff --git a/courgette/program_detector.cc b/courgette/program_detector.cc
|
| index 60b295fef7a82825c7e2f097c22c9fd55b87446c..71021cc3f7a397a78457609c223d7cd3e32cf88a 100644
|
| --- a/courgette/program_detector.cc
|
| +++ b/courgette/program_detector.cc
|
| @@ -19,32 +19,36 @@ namespace {
|
|
|
| // Returns a new instance of Disassembler subclass if binary data given in
|
| // |buffer| and |length| matches a known binary format, otherwise null.
|
| -std::unique_ptr<Disassembler> DetectDisassembler(const void* buffer,
|
| +std::unique_ptr<Disassembler> DetectDisassembler(const uint8_t* buffer,
|
| size_t length) {
|
| std::unique_ptr<Disassembler> disassembler;
|
|
|
| - disassembler.reset(new DisassemblerWin32X86(buffer, length));
|
| - if (disassembler->ParseHeader())
|
| - return disassembler;
|
| -
|
| - disassembler.reset(new DisassemblerWin32X64(buffer, length));
|
| - if (disassembler->ParseHeader())
|
| - return disassembler;
|
| -
|
| - disassembler.reset(new DisassemblerElf32X86(buffer, length));
|
| - if (disassembler->ParseHeader())
|
| - return disassembler;
|
| -
|
| - disassembler.reset(new DisassemblerElf32ARM(buffer, length));
|
| - if (disassembler->ParseHeader())
|
| - return disassembler;
|
| -
|
| + if (DisassemblerWin32X86::QuickDetect(buffer, length)) {
|
| + disassembler.reset(new DisassemblerWin32X86(buffer, length));
|
| + if (disassembler->ParseHeader())
|
| + return disassembler;
|
| + }
|
| + if (DisassemblerWin32X64::QuickDetect(buffer, length)) {
|
| + disassembler.reset(new DisassemblerWin32X64(buffer, length));
|
| + if (disassembler->ParseHeader())
|
| + return disassembler;
|
| + }
|
| + if (DisassemblerElf32X86::QuickDetect(buffer, length)) {
|
| + disassembler.reset(new DisassemblerElf32X86(buffer, length));
|
| + if (disassembler->ParseHeader())
|
| + return disassembler;
|
| + }
|
| + if (DisassemblerElf32ARM::QuickDetect(buffer, length)) {
|
| + disassembler.reset(new DisassemblerElf32ARM(buffer, length));
|
| + if (disassembler->ParseHeader())
|
| + return disassembler;
|
| + }
|
| return nullptr;
|
| }
|
|
|
| } // namespace
|
|
|
| -Status DetectExecutableType(const void* buffer,
|
| +Status DetectExecutableType(const uint8_t* buffer,
|
| size_t length,
|
| ExecutableType* type,
|
| size_t* detected_length) {
|
| @@ -62,7 +66,7 @@ Status DetectExecutableType(const void* buffer,
|
| return C_OK;
|
| }
|
|
|
| -Status ParseDetectedExecutable(const void* buffer,
|
| +Status ParseDetectedExecutable(const uint8_t* buffer,
|
| size_t length,
|
| std::unique_ptr<AssemblyProgram>* output) {
|
| output->reset();
|
|
|