// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_ZUCCHINI_ABS32_UTILS_H_ #define COMPONENTS_ZUCCHINI_ABS32_UTILS_H_ #include <stddef.h> #include <stdint.h> #include <deque> #include <optional> #include "components/zucchini/address_translator.h" #include "components/zucchini/buffer_view.h" #include "components/zucchini/image_utils.h" namespace zucchini { // A class to represent an abs32 address (32-bit or 64-bit). Accessors are // provided to translate from / to RVA, and to read / write the represented // abs32 address from / to an image. class AbsoluteAddress { … }; // A class to extract Win32 abs32 references from |abs32_locations| within // |image_| bounded by |[lo, hi)|. GetNext() is used to successively return // data as Units, which are locations and (potentially out-of-bound) RVAs. // |addr| determines the bitness of abs32 values stored, and mediates all reads. class Abs32RvaExtractorWin32 { … }; // A reader for Win32 abs32 references that filters and translates results from // |abs32_rva_extractor_|. class Abs32ReaderWin32 : public ReferenceReader { … }; // A writer for Win32 abs32 references. |addr| determines the bitness of the // abs32 values stored, and mediates all writes. class Abs32WriterWin32 : public ReferenceWriter { … }; // Given a list of abs32 |locations|, removes all elements whose targets cannot // be translated. Returns the number of elements removed. size_t RemoveUntranslatableAbs32(ConstBufferView image, AbsoluteAddress&& addr, const AddressTranslator& translator, std::deque<offset_t>* locations); // Given a sorted list of abs32 |locations|, removes all elements whose body // (with |width| given) overlaps with the body of a previous element. size_t RemoveOverlappingAbs32Locations(uint32_t width, std::deque<offset_t>* locations); } // namespace zucchini #endif // COMPONENTS_ZUCCHINI_ABS32_UTILS_H_