LIEF: Library to Instrument Executable Formats Version 0.17.0
Loading...
Searching...
No Matches
MetadataARM64.hpp
Go to the documentation of this file.
1/* Copyright 2017 - 2025 R. Thomas
2 * Copyright 2017 - 2025 Quarkslab
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#ifndef LIEF_PE_LOAD_CONFIGURATION_CHPE_METADATA_ARM64_H
17#define LIEF_PE_LOAD_CONFIGURATION_CHPE_METADATA_ARM64_H
18#include <memory>
19#include <cstdint>
20
21#include "LIEF/errors.hpp"
22#include "LIEF/visibility.h"
23#include "LIEF/iterators.hpp"
25
26namespace LIEF {
27namespace PE {
31 public: struct range_entry_t {
34 static constexpr uint32_t TYPE_MASK = 3;
35
36 enum class TYPE {
37 ARM64 = 0,
38 ARM64EC = 1,
39 AMD64 = 2,
40 };
41 uint32_t start_offset = 0;
44 uint32_t length = 0;
47 uint32_t start() const {
50 return start_offset & ~TYPE_MASK;
51 }
52 TYPE type() const {
55 return TYPE(start_offset & TYPE_MASK);
56 }
57 uint32_t end() const {
60 return start() + length;
61 }
62 };
63 struct redirection_entry_t {
66 uint32_t src = 0;
67 uint32_t dst = 0;
68 };
69
70 using range_entries_t = std::vector<range_entry_t>;
71 using it_range_entries = ref_iterator<range_entries_t&>;
72 using it_const_range_entries = const_ref_iterator<const range_entries_t&>;
73
74 using redirection_entries_t = std::vector<redirection_entry_t>;
75 using it_redirection_entries = ref_iterator<redirection_entries_t&>;
76 using it_const_redirection_entries = const_ref_iterator<const redirection_entries_t&>;
77
78 CHPEMetadataARM64(uint32_t version) :
79 CHPEMetadata(KIND::ARM64, version)
80 {}
81
82 CHPEMetadataARM64(const CHPEMetadataARM64&) = default;
83 CHPEMetadataARM64& operator=(const CHPEMetadataARM64&) = default;
84
85 CHPEMetadataARM64(CHPEMetadataARM64&&) = default;
86 CHPEMetadataARM64& operator=(CHPEMetadataARM64&&) = default;
87
88 std::unique_ptr<CHPEMetadata> clone() const override {
89 return std::unique_ptr<CHPEMetadataARM64>(new CHPEMetadataARM64(*this));
90 }
91
92 static std::unique_ptr<CHPEMetadataARM64> parse(
93 Parser& ctx, BinaryStream& stream, uint32_t version);
94
95 static ok_error_t parse_code_map(Parser& ctx, CHPEMetadataARM64& metadata);
96
97 static ok_error_t parse_redirections(Parser& ctx, CHPEMetadataARM64& metadata);
98 uint32_t code_map() const {
101 return code_map_rva_;
102 }
103 uint32_t code_map_count() const {
106 return code_map_cnt_;
107 }
108
109 uint32_t code_ranges_to_entrypoints() const {
110 return code_ranges_to_ep_;
111 }
112
113 uint32_t redirection_metadata() const {
114 return redirection_metadata_;
115 }
116
117 uint32_t os_arm64x_dispatch_call_no_redirect() const {
118 return os_arm64x_dispatch_call_no_redirect_;
119 }
120
121 uint32_t os_arm64x_dispatch_ret() const {
122 return os_arm64x_dispatch_ret_;
123 }
124
125 uint32_t os_arm64x_dispatch_call() const {
126 return os_arm64x_dispatch_call_;
127 }
128
129 uint32_t os_arm64x_dispatch_icall() const {
130 return os_arm64x_dispatch_icall_;
131 }
132
133 uint32_t os_arm64x_dispatch_icall_cfg() const {
134 return os_arm64x_dispatch_icall_cfg_;
135 }
136
137 uint32_t alternate_entry_point() const {
138 return alternate_ep_;
139 }
140
141 uint32_t auxiliary_iat() const {
142 return aux_iat_;
143 }
144
145 uint32_t code_ranges_to_entry_points_count() const {
146 return code_ranges_to_ep_cnt_;
147 }
148
149 uint32_t redirection_metadata_count() const {
150 return redirection_metadata_cnt_;
151 }
152
153 uint32_t get_x64_information_function_pointer() const {
154 return get_x64_information_function_pointer_;
155 }
156
157 uint32_t set_x64_information_function_pointer() const {
158 return set_x64_information_function_pointer_;
159 }
160 uint32_t extra_rfe_table() const {
163 return extra_rfe_table_;
164 }
165 uint32_t extra_rfe_table_size() const {
168 return extra_rfe_table_size_;
169 }
170
171 uint32_t os_arm64x_dispatch_fptr() const {
172 return os_arm64x_dispatch_fptr_;
173 }
174
175 uint32_t auxiliary_iat_copy() const {
176 return aux_iat_copy_;
177 }
178
179 uint32_t auxiliary_delay_import() const {
180 return aux_delay_import_;
181 }
182
183 uint32_t auxiliary_delay_import_copy() const {
184 return aux_delay_import_copy_;
185 }
186
187 uint32_t bitfield_info() const {
188 return bitfield_info_;
189 }
190
191 it_range_entries code_ranges() {
192 return range_entries_;
193 }
194
195 it_const_range_entries code_ranges() const {
196 return range_entries_;
197 }
198
199 it_redirection_entries redirections() {
200 return redirection_entries_;
201 }
202
203 it_const_redirection_entries redirections() const {
204 return redirection_entries_;
205 }
206
207 CHPEMetadataARM64& code_map(uint32_t value) {
208 code_map_rva_ = value;
209 return *this;
210 }
211
212 CHPEMetadataARM64& code_map_count(uint32_t value) {
213 code_map_cnt_ = value;
214 return *this;
215 }
216
217 CHPEMetadataARM64& code_ranges_to_entrypoints(uint32_t value) {
218 code_ranges_to_ep_ = value;
219 return *this;
220 }
221
222 CHPEMetadataARM64& redirection_metadata(uint32_t value) {
223 redirection_metadata_ = value;
224 return *this;
225 }
226
227 CHPEMetadataARM64& os_arm64x_dispatch_call_no_redirect(uint32_t value) {
228 os_arm64x_dispatch_call_no_redirect_ = value;
229 return *this;
230 }
231
232 CHPEMetadataARM64& os_arm64x_dispatch_ret(uint32_t value) {
233 os_arm64x_dispatch_ret_ = value;
234 return *this;
235 }
236
237 CHPEMetadataARM64& os_arm64x_dispatch_call(uint32_t value) {
238 os_arm64x_dispatch_call_ = value;
239 return *this;
240 }
241
242 CHPEMetadataARM64& os_arm64x_dispatch_icall(uint32_t value) {
243 os_arm64x_dispatch_icall_ = value;
244 return *this;
245 }
246
247 CHPEMetadataARM64& os_arm64x_dispatch_icall_cfg(uint32_t value) {
248 os_arm64x_dispatch_icall_cfg_ = value;
249 return *this;
250 }
251
252 CHPEMetadataARM64& alternate_entry_point(uint32_t value) {
253 alternate_ep_ = value;
254 return *this;
255 }
256
257 CHPEMetadataARM64& auxiliary_iat(uint32_t value) {
258 aux_iat_ = value;
259 return *this;
260 }
261
262 CHPEMetadataARM64& code_ranges_to_entry_points_count(uint32_t value) {
263 code_ranges_to_ep_cnt_ = value;
264 return *this;
265 }
266
267 CHPEMetadataARM64& redirection_metadata_count(uint32_t value) {
268 redirection_metadata_cnt_ = value;
269 return *this;
270 }
271
272 CHPEMetadataARM64& get_x64_information_function_pointer(uint32_t value) {
273 get_x64_information_function_pointer_ = value;
274 return *this;
275 }
276
277 CHPEMetadataARM64& set_x64_information_function_pointer(uint32_t value) {
278 set_x64_information_function_pointer_ = value;
279 return *this;
280 }
281
282 CHPEMetadataARM64& extra_rfe_table(uint32_t value) {
283 extra_rfe_table_ = value;
284 return *this;
285 }
286
287 CHPEMetadataARM64& extra_rfe_table_size(uint32_t value) {
288 extra_rfe_table_size_ = value;
289 return *this;
290 }
291
292 CHPEMetadataARM64& os_arm64x_dispatch_fptr(uint32_t value) {
293 os_arm64x_dispatch_fptr_ = value;
294 return *this;
295 }
296
297 CHPEMetadataARM64& auxiliary_iat_copy(uint32_t value) {
298 aux_iat_copy_ = value;
299 return *this;
300 }
301
302 CHPEMetadataARM64& auxiliary_delay_import(uint32_t value) {
303 aux_delay_import_ = value;
304 return *this;
305 }
306
307 CHPEMetadataARM64& auxiliary_delay_import_copy(uint32_t value) {
308 aux_delay_import_copy_ = value;
309 return *this;
310 }
311
312 CHPEMetadataARM64& bitfield_info(uint32_t value) {
313 bitfield_info_ = value;
314 return *this;
315 }
316
317 static bool classof(const CHPEMetadata* meta) {
318 return meta->kind() == KIND::ARM64;
319 }
320
321 std::string to_string() const override;
322
323 ~CHPEMetadataARM64() override = default;
324
325 private:
326 uint32_t code_map_rva_ = 0;
327 uint32_t code_map_cnt_ = 0;
328 uint32_t code_ranges_to_ep_ = 0;
329 uint32_t redirection_metadata_ = 0;
330 uint32_t os_arm64x_dispatch_call_no_redirect_ = 0;
331 uint32_t os_arm64x_dispatch_ret_ = 0;
332 uint32_t os_arm64x_dispatch_call_ = 0;
333 uint32_t os_arm64x_dispatch_icall_ = 0;
334 uint32_t os_arm64x_dispatch_icall_cfg_ = 0;
335 uint32_t alternate_ep_ = 0;
336 uint32_t aux_iat_ = 0;
337 uint32_t code_ranges_to_ep_cnt_ = 0;
338 uint32_t redirection_metadata_cnt_ = 0;
339 uint32_t get_x64_information_function_pointer_ = 0;
340 uint32_t set_x64_information_function_pointer_ = 0;
341 uint32_t extra_rfe_table_ = 0;
342 uint32_t extra_rfe_table_size_ = 0;
343 uint32_t os_arm64x_dispatch_fptr_ = 0;
344 uint32_t aux_iat_copy_ = 0;
345 uint32_t aux_delay_import_ = 0;
346 uint32_t aux_delay_import_copy_ = 0;
347 uint32_t bitfield_info_ = 0;
348
349 range_entries_t range_entries_;
350 redirection_entries_t redirection_entries_;
351
352};
353
354LIEF_API const char* to_string(CHPEMetadataARM64::range_entry_t::TYPE e);
355}
356}
357
358#endif
Metadata.hpp
LIEF::PE::CHPEMetadataARM64
This class represents hybrid metadata for ARM64EC or ARM64X.
Definition MetadataARM64.hpp:30
LIEF::PE::CHPEMetadataARM64::~CHPEMetadataARM64
~CHPEMetadataARM64() override=default
LIEF::PE::CHPEMetadataARM64::auxiliary_delay_import
CHPEMetadataARM64 & auxiliary_delay_import(uint32_t value)
Definition MetadataARM64.hpp:302
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_fptr
uint32_t os_arm64x_dispatch_fptr() const
Definition MetadataARM64.hpp:171
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_icall_cfg
CHPEMetadataARM64 & os_arm64x_dispatch_icall_cfg(uint32_t value)
Definition MetadataARM64.hpp:247
LIEF::PE::CHPEMetadataARM64::code_ranges_to_entrypoints
CHPEMetadataARM64 & code_ranges_to_entrypoints(uint32_t value)
Definition MetadataARM64.hpp:217
LIEF::PE::CHPEMetadataARM64::CHPEMetadataARM64
CHPEMetadataARM64(CHPEMetadataARM64 &&)=default
LIEF::PE::CHPEMetadataARM64::parse_code_map
static ok_error_t parse_code_map(Parser &ctx, CHPEMetadataARM64 &metadata)
LIEF::PE::CHPEMetadataARM64::redirections
it_const_redirection_entries redirections() const
Definition MetadataARM64.hpp:203
LIEF::PE::CHPEMetadataARM64::auxiliary_delay_import_copy
uint32_t auxiliary_delay_import_copy() const
Definition MetadataARM64.hpp:183
LIEF::PE::CHPEMetadataARM64::extra_rfe_table_size
uint32_t extra_rfe_table_size() const
architecture-specific exception table size
Definition MetadataARM64.hpp:167
LIEF::PE::CHPEMetadataARM64::CHPEMetadataARM64
CHPEMetadataARM64(const CHPEMetadataARM64 &)=default
LIEF::PE::CHPEMetadataARM64::redirection_metadata_count
CHPEMetadataARM64 & redirection_metadata_count(uint32_t value)
Definition MetadataARM64.hpp:267
LIEF::PE::CHPEMetadataARM64::code_map
CHPEMetadataARM64 & code_map(uint32_t value)
Definition MetadataARM64.hpp:207
LIEF::PE::CHPEMetadataARM64::redirection_metadata
CHPEMetadataARM64 & redirection_metadata(uint32_t value)
Definition MetadataARM64.hpp:222
LIEF::PE::CHPEMetadataARM64::alternate_entry_point
CHPEMetadataARM64 & alternate_entry_point(uint32_t value)
Definition MetadataARM64.hpp:252
LIEF::PE::CHPEMetadataARM64::bitfield_info
CHPEMetadataARM64 & bitfield_info(uint32_t value)
Definition MetadataARM64.hpp:312
LIEF::PE::CHPEMetadataARM64::code_map_count
uint32_t code_map_count() const
Number of entries in the code map.
Definition MetadataARM64.hpp:105
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_ret
CHPEMetadataARM64 & os_arm64x_dispatch_ret(uint32_t value)
Definition MetadataARM64.hpp:232
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_icall
CHPEMetadataARM64 & os_arm64x_dispatch_icall(uint32_t value)
Definition MetadataARM64.hpp:242
LIEF::PE::CHPEMetadataARM64::CHPEMetadataARM64
CHPEMetadataARM64(uint32_t version)
Definition MetadataARM64.hpp:78
LIEF::PE::CHPEMetadataARM64::operator=
CHPEMetadataARM64 & operator=(CHPEMetadataARM64 &&)=default
LIEF::PE::CHPEMetadataARM64::extra_rfe_table
uint32_t extra_rfe_table() const
RVA to this architecture-specific exception table.
Definition MetadataARM64.hpp:162
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_icall
uint32_t os_arm64x_dispatch_icall() const
Definition MetadataARM64.hpp:129
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_call
uint32_t os_arm64x_dispatch_call() const
Definition MetadataARM64.hpp:125
LIEF::PE::CHPEMetadataARM64::redirection_metadata
uint32_t redirection_metadata() const
Definition MetadataARM64.hpp:113
LIEF::PE::CHPEMetadataARM64::clone
std::unique_ptr< CHPEMetadata > clone() const override
Definition MetadataARM64.hpp:88
LIEF::PE::CHPEMetadataARM64::operator=
CHPEMetadataARM64 & operator=(const CHPEMetadataARM64 &)=default
LIEF::PE::CHPEMetadataARM64::auxiliary_iat
uint32_t auxiliary_iat() const
Definition MetadataARM64.hpp:141
LIEF::PE::CHPEMetadataARM64::extra_rfe_table_size
CHPEMetadataARM64 & extra_rfe_table_size(uint32_t value)
Definition MetadataARM64.hpp:287
LIEF::PE::CHPEMetadataARM64::code_ranges_to_entry_points_count
uint32_t code_ranges_to_entry_points_count() const
Definition MetadataARM64.hpp:145
LIEF::PE::CHPEMetadataARM64::redirections
it_redirection_entries redirections()
Definition MetadataARM64.hpp:199
LIEF::PE::CHPEMetadataARM64::alternate_entry_point
uint32_t alternate_entry_point() const
Definition MetadataARM64.hpp:137
LIEF::PE::CHPEMetadataARM64::redirection_metadata_count
uint32_t redirection_metadata_count() const
Definition MetadataARM64.hpp:149
LIEF::PE::CHPEMetadataARM64::get_x64_information_function_pointer
uint32_t get_x64_information_function_pointer() const
Definition MetadataARM64.hpp:153
LIEF::PE::CHPEMetadataARM64::set_x64_information_function_pointer
uint32_t set_x64_information_function_pointer() const
Definition MetadataARM64.hpp:157
LIEF::PE::CHPEMetadataARM64::code_ranges
it_range_entries code_ranges()
Definition MetadataARM64.hpp:191
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_fptr
CHPEMetadataARM64 & os_arm64x_dispatch_fptr(uint32_t value)
Definition MetadataARM64.hpp:292
LIEF::PE::CHPEMetadataARM64::code_ranges_to_entry_points_count
CHPEMetadataARM64 & code_ranges_to_entry_points_count(uint32_t value)
Definition MetadataARM64.hpp:262
LIEF::PE::CHPEMetadataARM64::set_x64_information_function_pointer
CHPEMetadataARM64 & set_x64_information_function_pointer(uint32_t value)
Definition MetadataARM64.hpp:277
LIEF::PE::CHPEMetadataARM64::parse
static std::unique_ptr< CHPEMetadataARM64 > parse(Parser &ctx, BinaryStream &stream, uint32_t version)
LIEF::PE::CHPEMetadataARM64::auxiliary_iat
CHPEMetadataARM64 & auxiliary_iat(uint32_t value)
Definition MetadataARM64.hpp:257
LIEF::PE::CHPEMetadataARM64::code_map_count
CHPEMetadataARM64 & code_map_count(uint32_t value)
Definition MetadataARM64.hpp:212
LIEF::PE::CHPEMetadataARM64::code_ranges
it_const_range_entries code_ranges() const
Definition MetadataARM64.hpp:195
LIEF::PE::CHPEMetadataARM64::to_string
std::string to_string() const override
LIEF::PE::CHPEMetadataARM64::code_map
uint32_t code_map() const
RVA to the array that describes architecture-specific ranges.
Definition MetadataARM64.hpp:100
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_call_no_redirect
uint32_t os_arm64x_dispatch_call_no_redirect() const
Definition MetadataARM64.hpp:117
LIEF::PE::CHPEMetadataARM64::bitfield_info
uint32_t bitfield_info() const
Definition MetadataARM64.hpp:187
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_ret
uint32_t os_arm64x_dispatch_ret() const
Definition MetadataARM64.hpp:121
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_call
CHPEMetadataARM64 & os_arm64x_dispatch_call(uint32_t value)
Definition MetadataARM64.hpp:237
LIEF::PE::CHPEMetadataARM64::code_ranges_to_entrypoints
uint32_t code_ranges_to_entrypoints() const
Definition MetadataARM64.hpp:109
LIEF::PE::CHPEMetadataARM64::parse_redirections
static ok_error_t parse_redirections(Parser &ctx, CHPEMetadataARM64 &metadata)
LIEF::PE::CHPEMetadataARM64::auxiliary_delay_import_copy
CHPEMetadataARM64 & auxiliary_delay_import_copy(uint32_t value)
Definition MetadataARM64.hpp:307
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_icall_cfg
uint32_t os_arm64x_dispatch_icall_cfg() const
Definition MetadataARM64.hpp:133
LIEF::PE::CHPEMetadataARM64::extra_rfe_table
CHPEMetadataARM64 & extra_rfe_table(uint32_t value)
Definition MetadataARM64.hpp:282
LIEF::PE::CHPEMetadataARM64::auxiliary_delay_import
uint32_t auxiliary_delay_import() const
Definition MetadataARM64.hpp:179
LIEF::PE::CHPEMetadataARM64::auxiliary_iat_copy
CHPEMetadataARM64 & auxiliary_iat_copy(uint32_t value)
Definition MetadataARM64.hpp:297
LIEF::PE::CHPEMetadataARM64::classof
static bool classof(const CHPEMetadata *meta)
Definition MetadataARM64.hpp:317
LIEF::PE::CHPEMetadataARM64::os_arm64x_dispatch_call_no_redirect
CHPEMetadataARM64 & os_arm64x_dispatch_call_no_redirect(uint32_t value)
Definition MetadataARM64.hpp:227
LIEF::PE::CHPEMetadataARM64::auxiliary_iat_copy
uint32_t auxiliary_iat_copy() const
Definition MetadataARM64.hpp:175
LIEF::PE::CHPEMetadataARM64::get_x64_information_function_pointer
CHPEMetadataARM64 & get_x64_information_function_pointer(uint32_t value)
Definition MetadataARM64.hpp:272
LIEF::PE::CHPEMetadata
Base class for any Compiled Hybrid Portable Executable (CHPE) metadata.
Definition PE/LoadConfigurations/CHPEMetadata/Metadata.hpp:32
LIEF::PE::CHPEMetadata::kind
KIND kind() const
Determine the type of the concrete implementation.
Definition PE/LoadConfigurations/CHPEMetadata/Metadata.hpp:59
errors.hpp
iterators.hpp
LIEF::PE
Namespace related to the LIEF's PE module.
Definition Abstract/Header.hpp:32
LIEF::PE::to_string
const char * to_string(AuxiliaryWeakExternal::CHARACTERISTICS e)
LIEF
LIEF namespace.
Definition Abstract/Binary.hpp:36
LIEF::ok_error_t
result< ok_t > ok_error_t
Opaque structure that is used by LIEF to avoid writing result<void> f(...). Instead,...
Definition errors.hpp:109
LIEF::PE::CHPEMetadataARM64::range_entry_t::TYPE
TYPE
Definition MetadataARM64.hpp:36
LIEF::PE::CHPEMetadataARM64::range_entry_t::type
TYPE type() const
Architecture for this range.
Definition MetadataARM64.hpp:54
LIEF::PE::CHPEMetadataARM64::range_entry_t::end
uint32_t end() const
End of the range (RVA)
Definition MetadataARM64.hpp:59
LIEF::PE::CHPEMetadataARM64::range_entry_t::start
uint32_t start() const
Start of the range (RVA)
Definition MetadataARM64.hpp:49
visibility.h
LIEF_API
#define LIEF_API
Definition visibility.h:41