disassembler_win32_x86.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef COURGETTE_DISASSEMBLER_WIN32_X86_H_
  5. #define COURGETTE_DISASSEMBLER_WIN32_X86_H_
  6. #include <stddef.h>
  7. #include <stdint.h>
  8. #include "courgette/disassembler_win32.h"
  9. #include "courgette/image_utils.h"
  10. #include "courgette/types_win_pe.h"
  11. namespace courgette {
  12. class InstructionReceptor;
  13. class DisassemblerWin32X86 : public DisassemblerWin32 {
  14. public:
  15. // Returns true if a valid executable is detected using only quick checks.
  16. static bool QuickDetect(const uint8_t* start, size_t length) {
  17. return DisassemblerWin32::QuickDetect(start, length,
  18. kImageNtOptionalHdr32Magic);
  19. }
  20. DisassemblerWin32X86(const uint8_t* start, size_t length);
  21. DisassemblerWin32X86(const DisassemblerWin32X86&) = delete;
  22. DisassemblerWin32X86& operator=(const DisassemblerWin32X86&) = delete;
  23. ~DisassemblerWin32X86() override = default;
  24. // Disassembler interfaces.
  25. RVA PointerToTargetRVA(const uint8_t* p) const override;
  26. ExecutableType kind() const override { return EXE_WIN_32_X86; }
  27. // (4) -> (5) (see AddressTranslator comment): Returns the RVA of the VA
  28. // specified by |address|, or kNoRVA if |address| lies outside of the image.
  29. RVA Address32ToRVA(uint32_t address) const;
  30. protected:
  31. // DisassemblerWin32 interfaces.
  32. void ParseRel32RelocsFromSection(const Section* section) override;
  33. int AbsVAWidth() const override { return 4; }
  34. CheckBool EmitAbs(Label* label, InstructionReceptor* receptor) const override;
  35. bool SupportsRelTableType(int type) const override {
  36. return type == 3; // IMAGE_REL_BASED_HIGHLOW
  37. }
  38. uint16_t RelativeOffsetOfDataDirectories() const override {
  39. return kOffsetOfDataDirectoryFromImageOptionalHeader32;
  40. }
  41. };
  42. } // namespace courgette
  43. #endif // COURGETTE_DISASSEMBLER_WIN32_X86_H_