// 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_RELOC_WIN32_H_ #define COMPONENTS_ZUCCHINI_RELOC_WIN32_H_ #include <stddef.h> #include <stdint.h> #include <optional> #include <vector> #include "base/memory/raw_ref.h" #include "components/zucchini/address_translator.h" #include "components/zucchini/buffer_source.h" #include "components/zucchini/buffer_view.h" #include "components/zucchini/image_utils.h" namespace zucchini { // Win32 PE relocation table stores a list of (type, RVA) pairs. The table is // organized into "blocks" for RVAs with common high-order bits (12-31). Each // block consists of a list (even length) of 2-byte "units". Each unit stores // type (in bits 12-15) and low-order bits (0-11) of an RVA (in bits 0-11). In // pseudo-struct: // struct Block { // uint32_t rva_hi; // uint32_t block_size_in_bytes; // 8 + multiple of 4. // struct { // uint16_t rva_lo:12, type:4; // Little-endian. // } units[(block_size_in_bytes - 8) / 2]; // Size must be even. // } reloc_table[num_blocks]; // May have padding (type = 0). // Extracted Win32 reloc Unit data. struct RelocUnitWin32 { … }; // A reader that parses Win32 PE relocation data and emits RelocUnitWin32 for // each reloc unit that lies strictly inside |[lo, hi)|. class RelocRvaReaderWin32 { … }; // A reader for Win32 reloc References, implemented as a filtering and // translation adaptor of RelocRvaReaderWin32. class RelocReaderWin32 : public ReferenceReader { … }; // A writer for Win32 reloc References. This is simpler than the reader since: // - No iteration is required. // - High-order bits of reloc target RVAs are assumed to be handled elsewhere, // so only low-order bits need to be written. class RelocWriterWin32 : public ReferenceWriter { … }; } // namespace zucchini #endif // COMPONENTS_ZUCCHINI_RELOC_WIN32_H_