text: // Copyright (c) 2011 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_X86_H_
  #define COURGETTE_DISASSEMBLER_WIN32_X86_H_
  
  #include <stddef.h>
  #include <stdint.h>
  
  #include "courgette/disassembler_win32.h"
  #include "courgette/image_utils.h"
  #include "courgette/types_win_pe.h"
  
  namespace courgette {
  
  class InstructionReceptor;
  
  class DisassemblerWin32X86 : 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,
                                            kImageNtOptionalHdr32Magic);
    }
  
    DisassemblerWin32X86(const uint8_t* start, size_t length);
  
    DisassemblerWin32X86(const DisassemblerWin32X86&) = delete;
    DisassemblerWin32X86& operator=(const DisassemblerWin32X86&) = delete;
  
    ~DisassemblerWin32X86() override = default;
  
    // Disassembler interfaces.
    RVA PointerToTargetRVA(const uint8_t* p) const override;
    ExecutableType kind() const override { return EXE_WIN_32_X86; }
  
    // (4) -> (5) (see AddressTranslator comment): Returns the RVA of the VA
    // specified by |address|, or kNoRVA if |address| lies outside of the image.
    RVA Address32ToRVA(uint32_t address) const;
  
   protected:
    // DisassemblerWin32 interfaces.
    void ParseRel32RelocsFromSection(const Section* section) override;
    int AbsVAWidth() const override { return 4; }
    CheckBool EmitAbs(Label* label, InstructionReceptor* receptor) const override;
    bool SupportsRelTableType(int type) const override {
      return type == 3;  // IMAGE_REL_BASED_HIGHLOW
    }
    uint16_t RelativeOffsetOfDataDirectories() const override {
      return kOffsetOfDataDirectoryFromImageOptionalHeader32;
    }
  };
  
  }  // namespace courgette
  
  #endif  // COURGETTE_DISASSEMBLER_WIN32_X86_H_
  