// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COURGETTE_DISASSEMBLER_WIN32_X64_H_ #define COURGETTE_DISASSEMBLER_WIN32_X64_H_ #include #include #include "courgette/disassembler_win32.h" #include "courgette/image_utils.h" #include "courgette/types_win_pe.h" namespace courgette { class InstructionReceptor; class DisassemblerWin32X64 : public DisassemblerWin32 { public: // Returns true if a valid executable is detected using only quick checks. static bool QuickDetect(const uint8_t* start, size_t length) { return DisassemblerWin32::QuickDetect(start, length, kImageNtOptionalHdr64Magic); } DisassemblerWin32X64(const uint8_t* start, size_t length); DisassemblerWin32X64(const DisassemblerWin32X64&) = delete; DisassemblerWin32X64& operator=(const DisassemblerWin32X64&) = delete; ~DisassemblerWin32X64() override = default; // Disassembler interfaces. RVA PointerToTargetRVA(const uint8_t* p) const override; ExecutableType kind() const override { return EXE_WIN_32_X64; } // (4) -> (5) (see AddressTranslator comment): Returns the RVA of the VA // specified by |address|, or kNoRVA if |address| lies outside of the image. RVA Address64ToRVA(uint64_t address) const; protected: // DisassemblerWin32 interfaces. void ParseRel32RelocsFromSection(const Section* section) override; int AbsVAWidth() const override { return 8; } CheckBool EmitAbs(Label* label, InstructionReceptor* receptor) const override; bool SupportsRelTableType(int type) const override { return type == 10; // IMAGE_REL_BASED_DIR64 } uint16_t RelativeOffsetOfDataDirectories() const override { return kOffsetOfDataDirectoryFromImageOptionalHeader64; } }; } // namespace courgette #endif // COURGETTE_DISASSEMBLER_WIN32_X64_H_