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 {
28
37 public:
40 static constexpr uint32_t TYPE_MASK = 3;
41
42 enum class TYPE {
44 ARM64 = 0,
45
48
50 AMD64 = 2,
51 };
52
54 uint32_t start_offset = 0;
55
57 uint32_t length = 0;
58
60 uint32_t start() const {
61 return start_offset & ~TYPE_MASK;
62 }
63
65 TYPE type() const {
66 return TYPE(start_offset & TYPE_MASK);
67 }
68
70 uint32_t end() const {
71 return start() + length;
72 }
73 };
74
77 uint32_t src = 0;
78 uint32_t dst = 0;
79 };
80
85 uint32_t start_rva = 0;
86
88 uint32_t end_rva = 0;
89
91 uint32_t entrypoint = 0;
92 };
93
94 using range_entries_t = std::vector<range_entry_t>;
97
98 using redirection_entries_t = std::vector<redirection_entry_t>;
101
102 using code_range_entry_point_entries = std::vector<code_range_entry_point_t>;
105
109
112
115
116 std::unique_ptr<CHPEMetadata> clone() const override {
117 return std::unique_ptr<CHPEMetadataARM64>(new CHPEMetadataARM64(*this));
118 }
119
120 static std::unique_ptr<CHPEMetadataARM64> parse(
121 Parser& ctx, BinaryStream& stream, uint32_t version);
122
124
126
128 Parser& ctx, CHPEMetadataARM64& metadata);
129
131 uint32_t code_map() const {
132 return code_map_rva_;
133 }
134
136 uint32_t code_map_count() const {
137 return code_map_cnt_;
138 }
139
140 uint32_t code_ranges_to_entrypoints() const {
141 return code_ranges_to_ep_;
142 }
143
144 uint32_t redirection_metadata() const {
145 return redirection_metadata_;
146 }
147
149 return os_arm64x_dispatch_call_no_redirect_;
150 }
151
152 uint32_t os_arm64x_dispatch_ret() const {
153 return os_arm64x_dispatch_ret_;
154 }
155
156 uint32_t os_arm64x_dispatch_call() const {
157 return os_arm64x_dispatch_call_;
158 }
159
160 uint32_t os_arm64x_dispatch_icall() const {
161 return os_arm64x_dispatch_icall_;
162 }
163
165 return os_arm64x_dispatch_icall_cfg_;
166 }
167
168 uint32_t alternate_entry_point() const {
169 return alternate_ep_;
170 }
171
172 uint32_t auxiliary_iat() const {
173 return aux_iat_;
174 }
175
177 return code_ranges_to_ep_cnt_;
178 }
179
180 uint32_t redirection_metadata_count() const {
181 return redirection_metadata_cnt_;
182 }
183
185 return get_x64_information_function_pointer_;
186 }
187
189 return set_x64_information_function_pointer_;
190 }
191
193 uint32_t extra_rfe_table() const {
194 return extra_rfe_table_;
195 }
196
198 uint32_t extra_rfe_table_size() const {
199 return extra_rfe_table_size_;
200 }
201
202 uint32_t os_arm64x_dispatch_fptr() const {
203 return os_arm64x_dispatch_fptr_;
204 }
205
206 uint32_t auxiliary_iat_copy() const {
207 return aux_iat_copy_;
208 }
209
210 uint32_t auxiliary_delay_import() const {
211 return aux_delay_import_;
212 }
213
215 return aux_delay_import_copy_;
216 }
217
218 uint32_t bitfield_info() const {
219 return bitfield_info_;
220 }
221
223 return range_entries_;
224 }
225
227 return range_entries_;
228 }
229
231 return redirection_entries_;
232 }
233
235 return redirection_entries_;
236 }
237
239 return code_range_entry_point_entries_;
240 }
241
243 return code_range_entry_point_entries_;
244 }
245
246 CHPEMetadataARM64& code_map(uint32_t value) {
247 code_map_rva_ = value;
248 return *this;
249 }
250
252 code_map_cnt_ = value;
253 return *this;
254 }
255
257 code_ranges_to_ep_ = value;
258 return *this;
259 }
260
262 redirection_metadata_ = value;
263 return *this;
264 }
265
267 os_arm64x_dispatch_call_no_redirect_ = value;
268 return *this;
269 }
270
272 os_arm64x_dispatch_ret_ = value;
273 return *this;
274 }
275
277 os_arm64x_dispatch_call_ = value;
278 return *this;
279 }
280
282 os_arm64x_dispatch_icall_ = value;
283 return *this;
284 }
285
287 os_arm64x_dispatch_icall_cfg_ = value;
288 return *this;
289 }
290
292 alternate_ep_ = value;
293 return *this;
294 }
295
297 aux_iat_ = value;
298 return *this;
299 }
300
302 code_ranges_to_ep_cnt_ = value;
303 return *this;
304 }
305
307 redirection_metadata_cnt_ = value;
308 return *this;
309 }
310
312 get_x64_information_function_pointer_ = value;
313 return *this;
314 }
315
317 set_x64_information_function_pointer_ = value;
318 return *this;
319 }
320
322 extra_rfe_table_ = value;
323 return *this;
324 }
325
327 extra_rfe_table_size_ = value;
328 return *this;
329 }
330
332 os_arm64x_dispatch_fptr_ = value;
333 return *this;
334 }
335
337 aux_iat_copy_ = value;
338 return *this;
339 }
340
342 aux_delay_import_ = value;
343 return *this;
344 }
345
347 aux_delay_import_copy_ = value;
348 return *this;
349 }
350
352 bitfield_info_ = value;
353 return *this;
354 }
355
356 static bool classof(const CHPEMetadata* meta) {
357 return meta->kind() == KIND::ARM64;
358 }
359
360 std::string to_string() const override;
361
362 ~CHPEMetadataARM64() override = default;
363
364 private:
365 uint32_t code_map_rva_ = 0;
366 uint32_t code_map_cnt_ = 0;
367 uint32_t code_ranges_to_ep_ = 0;
368 uint32_t redirection_metadata_ = 0;
369 uint32_t os_arm64x_dispatch_call_no_redirect_ = 0;
370 uint32_t os_arm64x_dispatch_ret_ = 0;
371 uint32_t os_arm64x_dispatch_call_ = 0;
372 uint32_t os_arm64x_dispatch_icall_ = 0;
373 uint32_t os_arm64x_dispatch_icall_cfg_ = 0;
374 uint32_t alternate_ep_ = 0;
375 uint32_t aux_iat_ = 0;
376 uint32_t code_ranges_to_ep_cnt_ = 0;
377 uint32_t redirection_metadata_cnt_ = 0;
378 uint32_t get_x64_information_function_pointer_ = 0;
379 uint32_t set_x64_information_function_pointer_ = 0;
380 uint32_t extra_rfe_table_ = 0;
381 uint32_t extra_rfe_table_size_ = 0;
382 uint32_t os_arm64x_dispatch_fptr_ = 0;
383 uint32_t aux_iat_copy_ = 0;
384 uint32_t aux_delay_import_ = 0;
385 uint32_t aux_delay_import_copy_ = 0;
386 uint32_t bitfield_info_ = 0;
387
388 range_entries_t range_entries_;
389 redirection_entries_t redirection_entries_;
390 code_range_entry_point_entries code_range_entry_point_entries_;
391
392};
393
395}
396}
397
398#endif
Class that is used to a read stream of data from different sources.
Definition BinaryStream.hpp:33
~CHPEMetadataARM64() override=default
CHPEMetadataARM64 & auxiliary_delay_import(uint32_t value)
Definition MetadataARM64.hpp:341
uint32_t os_arm64x_dispatch_fptr() const
Definition MetadataARM64.hpp:202
CHPEMetadataARM64 & os_arm64x_dispatch_icall_cfg(uint32_t value)
Definition MetadataARM64.hpp:286
CHPEMetadataARM64 & code_ranges_to_entrypoints(uint32_t value)
Definition MetadataARM64.hpp:256
it_const_code_range_entry_point code_range_entry_point() const
Definition MetadataARM64.hpp:242
CHPEMetadataARM64(CHPEMetadataARM64 &&)=default
static ok_error_t parse_code_map(Parser &ctx, CHPEMetadataARM64 &metadata)
it_const_redirection_entries redirections() const
Definition MetadataARM64.hpp:234
uint32_t auxiliary_delay_import_copy() const
Definition MetadataARM64.hpp:214
uint32_t extra_rfe_table_size() const
architecture-specific exception table size
Definition MetadataARM64.hpp:198
CHPEMetadataARM64(const CHPEMetadataARM64 &)=default
ref_iterator< redirection_entries_t & > it_redirection_entries
Definition MetadataARM64.hpp:99
CHPEMetadataARM64 & redirection_metadata_count(uint32_t value)
Definition MetadataARM64.hpp:306
CHPEMetadataARM64 & code_map(uint32_t value)
Definition MetadataARM64.hpp:246
CHPEMetadataARM64 & redirection_metadata(uint32_t value)
Definition MetadataARM64.hpp:261
ref_iterator< code_range_entry_point_entries & > it_code_range_entry_point
Definition MetadataARM64.hpp:103
CHPEMetadataARM64 & alternate_entry_point(uint32_t value)
Definition MetadataARM64.hpp:291
CHPEMetadataARM64 & bitfield_info(uint32_t value)
Definition MetadataARM64.hpp:351
uint32_t code_map_count() const
Number of entries in the code map.
Definition MetadataARM64.hpp:136
CHPEMetadataARM64 & os_arm64x_dispatch_ret(uint32_t value)
Definition MetadataARM64.hpp:271
CHPEMetadataARM64 & os_arm64x_dispatch_icall(uint32_t value)
Definition MetadataARM64.hpp:281
CHPEMetadataARM64(uint32_t version)
Definition MetadataARM64.hpp:106
ref_iterator< range_entries_t & > it_range_entries
Definition MetadataARM64.hpp:95
CHPEMetadataARM64 & operator=(CHPEMetadataARM64 &&)=default
uint32_t extra_rfe_table() const
RVA to this architecture-specific exception table.
Definition MetadataARM64.hpp:193
uint32_t os_arm64x_dispatch_icall() const
Definition MetadataARM64.hpp:160
uint32_t os_arm64x_dispatch_call() const
Definition MetadataARM64.hpp:156
it_code_range_entry_point code_range_entry_point()
Definition MetadataARM64.hpp:238
uint32_t redirection_metadata() const
Definition MetadataARM64.hpp:144
std::unique_ptr< CHPEMetadata > clone() const override
Definition MetadataARM64.hpp:116
std::vector< redirection_entry_t > redirection_entries_t
Definition MetadataARM64.hpp:98
CHPEMetadataARM64 & operator=(const CHPEMetadataARM64 &)=default
uint32_t auxiliary_iat() const
Definition MetadataARM64.hpp:172
CHPEMetadataARM64 & extra_rfe_table_size(uint32_t value)
Definition MetadataARM64.hpp:326
uint32_t code_ranges_to_entry_points_count() const
Definition MetadataARM64.hpp:176
it_redirection_entries redirections()
Definition MetadataARM64.hpp:230
uint32_t alternate_entry_point() const
Definition MetadataARM64.hpp:168
uint32_t redirection_metadata_count() const
Definition MetadataARM64.hpp:180
uint32_t get_x64_information_function_pointer() const
Definition MetadataARM64.hpp:184
uint32_t set_x64_information_function_pointer() const
Definition MetadataARM64.hpp:188
it_range_entries code_ranges()
Definition MetadataARM64.hpp:222
CHPEMetadataARM64 & os_arm64x_dispatch_fptr(uint32_t value)
Definition MetadataARM64.hpp:331
CHPEMetadataARM64 & code_ranges_to_entry_points_count(uint32_t value)
Definition MetadataARM64.hpp:301
CHPEMetadataARM64 & set_x64_information_function_pointer(uint32_t value)
Definition MetadataARM64.hpp:316
static std::unique_ptr< CHPEMetadataARM64 > parse(Parser &ctx, BinaryStream &stream, uint32_t version)
CHPEMetadataARM64 & auxiliary_iat(uint32_t value)
Definition MetadataARM64.hpp:296
CHPEMetadataARM64 & code_map_count(uint32_t value)
Definition MetadataARM64.hpp:251
it_const_range_entries code_ranges() const
Definition MetadataARM64.hpp:226
const_ref_iterator< const redirection_entries_t & > it_const_redirection_entries
Definition MetadataARM64.hpp:100
std::vector< code_range_entry_point_t > code_range_entry_point_entries
Definition MetadataARM64.hpp:102
std::string to_string() const override
uint32_t code_map() const
RVA to the array that describes architecture-specific ranges.
Definition MetadataARM64.hpp:131
uint32_t os_arm64x_dispatch_call_no_redirect() const
Definition MetadataARM64.hpp:148
uint32_t bitfield_info() const
Definition MetadataARM64.hpp:218
uint32_t os_arm64x_dispatch_ret() const
Definition MetadataARM64.hpp:152
std::vector< range_entry_t > range_entries_t
Definition MetadataARM64.hpp:94
CHPEMetadataARM64 & os_arm64x_dispatch_call(uint32_t value)
Definition MetadataARM64.hpp:276
uint32_t code_ranges_to_entrypoints() const
Definition MetadataARM64.hpp:140
static ok_error_t parse_redirections(Parser &ctx, CHPEMetadataARM64 &metadata)
CHPEMetadataARM64 & auxiliary_delay_import_copy(uint32_t value)
Definition MetadataARM64.hpp:346
uint32_t os_arm64x_dispatch_icall_cfg() const
Definition MetadataARM64.hpp:164
CHPEMetadataARM64 & extra_rfe_table(uint32_t value)
Definition MetadataARM64.hpp:321
uint32_t auxiliary_delay_import() const
Definition MetadataARM64.hpp:210
CHPEMetadataARM64 & auxiliary_iat_copy(uint32_t value)
Definition MetadataARM64.hpp:336
static ok_error_t parse_code_ranges_to_entry_points(Parser &ctx, CHPEMetadataARM64 &metadata)
static bool classof(const CHPEMetadata *meta)
Definition MetadataARM64.hpp:356
const_ref_iterator< const code_range_entry_point_entries & > it_const_code_range_entry_point
Definition MetadataARM64.hpp:104
CHPEMetadataARM64 & os_arm64x_dispatch_call_no_redirect(uint32_t value)
Definition MetadataARM64.hpp:266
uint32_t auxiliary_iat_copy() const
Definition MetadataARM64.hpp:206
const_ref_iterator< const range_entries_t & > it_const_range_entries
Definition MetadataARM64.hpp:96
CHPEMetadataARM64 & get_x64_information_function_pointer(uint32_t value)
Definition MetadataARM64.hpp:311
uint32_t version() const
Version of the structure.
Definition PE/LoadConfigurations/CHPEMetadata/Metadata.hpp:64
KIND kind() const
Determine the type of the concrete implementation.
Definition PE/LoadConfigurations/CHPEMetadata/Metadata.hpp:59
KIND
Discriminator for the subclasses.
Definition PE/LoadConfigurations/CHPEMetadata/Metadata.hpp:36
@ ARM64
Definition PE/LoadConfigurations/CHPEMetadata/Metadata.hpp:38
Main interface to parse PE binaries. In particular the static functions: Parser::parse should be used...
Definition PE/Parser.hpp:52
Opaque structure that is used by LIEF to avoid writing result<void> f(...). Instead,...
Definition errors.hpp:112
Iterator which returns reference on container's values.
Definition iterators.hpp:46
Namespace related to the LIEF's PE module.
Definition Abstract/Header.hpp:32
const char * to_string(CODE_PAGES e)
LIEF namespace.
Definition Abstract/Binary.hpp:40
ref_iterator< CT, U, typename decay_t< CT >::const_iterator > const_ref_iterator
Iterator which return const ref on container's values.
Definition iterators.hpp:257
Mirror of IMAGE_ARM64EC_CODE_RANGE_ENTRY_POINT: Represents a mapping between code range and its entry...
Definition MetadataARM64.hpp:83
uint32_t end_rva
End of the code range (RVA).
Definition MetadataARM64.hpp:88
uint32_t entrypoint
RVA of the entry point for this range.
Definition MetadataARM64.hpp:91
uint32_t start_rva
Start of the code range.
Definition MetadataARM64.hpp:85
Structure that describes architecture-specific ranges.
Definition MetadataARM64.hpp:39
uint32_t length
Range's length.
Definition MetadataARM64.hpp:57
static constexpr uint32_t TYPE_MASK
Definition MetadataARM64.hpp:40
TYPE
Definition MetadataARM64.hpp:42
@ ARM64EC
ARM64EC hybrid code (compatible with x64).
Definition MetadataARM64.hpp:47
@ AMD64
x64 code.
Definition MetadataARM64.hpp:50
@ ARM64
Pure ARM64 code.
Definition MetadataARM64.hpp:44
TYPE type() const
Architecture for this range.
Definition MetadataARM64.hpp:65
uint32_t start_offset
Raw data (include start RVA and type).
Definition MetadataARM64.hpp:54
uint32_t end() const
End of the range (RVA).
Definition MetadataARM64.hpp:70
uint32_t start() const
Start of the range (RVA).
Definition MetadataARM64.hpp:60
Structure that describes a redirection.
Definition MetadataARM64.hpp:76
uint32_t dst
Definition MetadataARM64.hpp:78
uint32_t src
Definition MetadataARM64.hpp:77
#define LIEF_API
Definition visibility.h:41