// Copyright 2017 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 COMPONENTS_ZUCCHINI_REL32_UTILS_H_ #define COMPONENTS_ZUCCHINI_REL32_UTILS_H_ #include #include "base/macros.h" #include "base/optional.h" #include "components/zucchini/address_translator.h" #include "components/zucchini/buffer_view.h" #include "components/zucchini/image_utils.h" namespace zucchini { // A visitor that emits References (locations and target) from a specified // portion of an x86 / x64 image, given a list of valid locations. class Rel32ReaderX86 : public ReferenceReader { public: // |image| is an image containing x86 / x64 code in [|lo|, |hi|). // |locations| is a sorted list of offsets of rel32 reference locations. // |translator| (for |image|) is embedded into |target_rva_to_offset_| and // |location_offset_to_rva_| for address translation, and therefore must // outlive |*this|. Rel32ReaderX86(ConstBufferView image, offset_t lo, offset_t hi, const std::vector* locations, const AddressTranslator& translator); ~Rel32ReaderX86() override; // Returns the next reference, or base::nullopt if exhausted. base::Optional GetNext() override; private: ConstBufferView image_; AddressTranslator::RvaToOffsetCache target_rva_to_offset_; AddressTranslator::OffsetToRvaCache location_offset_to_rva_; const offset_t hi_; const std::vector::const_iterator last_; std::vector::const_iterator current_; DISALLOW_COPY_AND_ASSIGN(Rel32ReaderX86); }; // Writer for x86 / x64 rel32 references. class Rel32WriterX86 : public ReferenceWriter { public: // |image| wraps the raw bytes of a binary in which rel32 references will be // written. |translator| (for |image|) is embedded into // |target_offset_to_rva_| and |location_offset_to_rva_| for address // translation, and therefore must outlive |*this|. Rel32WriterX86(MutableBufferView image, const AddressTranslator& translator); ~Rel32WriterX86() override; void PutNext(Reference ref) override; private: MutableBufferView image_; AddressTranslator::OffsetToRvaCache target_offset_to_rva_; AddressTranslator::OffsetToRvaCache location_offset_to_rva_; DISALLOW_COPY_AND_ASSIGN(Rel32WriterX86); }; } // namespace zucchini #endif // COMPONENTS_ZUCCHINI_REL32_UTILS_H_