1 // Copyright 2016 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "courgette/program_detector.h"
9 #include "courgette/disassembler.h"
10 #include "courgette/disassembler_elf_32_x86.h"
11 #include "courgette/disassembler_win32_x64.h"
12 #include "courgette/disassembler_win32_x86.h"
16 std::unique_ptr<Disassembler> DetectDisassembler(const uint8_t* buffer,
18 std::unique_ptr<Disassembler> disassembler;
20 if (DisassemblerWin32X86::QuickDetect(buffer, length)) {
21 disassembler = std::make_unique<DisassemblerWin32X86>(buffer, length);
22 if (disassembler->ParseHeader())
25 if (DisassemblerWin32X64::QuickDetect(buffer, length)) {
26 disassembler = std::make_unique<DisassemblerWin32X64>(buffer, length);
27 if (disassembler->ParseHeader())
30 if (DisassemblerElf32X86::QuickDetect(buffer, length)) {
31 disassembler = std::make_unique<DisassemblerElf32X86>(buffer, length);
32 if (disassembler->ParseHeader())
38 Status DetectExecutableType(const uint8_t* buffer,
41 size_t* detected_length) {
42 std::unique_ptr<Disassembler> disassembler(
43 DetectDisassembler(buffer, length));
45 if (!disassembler) { // We failed to detect anything.
48 return C_INPUT_NOT_RECOGNIZED;
51 *type = disassembler->kind();
52 *detected_length = disassembler->length();
56 } // namespace courgette