16#ifndef LIEF_BINARY_STREAM_H
17#define LIEF_BINARY_STREAM_H
53 virtual uint64_t
size()
const = 0;
89 size_t maxsize = ~
size_t{0})
const;
102 uint64_t
size, uint64_t virtual_address = 0) {
108 const bool read_ok = offset <= this->size() &&
109 (offset +
size) <= this->size()
111 && (int64_t(offset) >= 0 && int64_t(
size) >= 0) &&
112 (int64_t(offset +
size) >= 0);
117 if (container.size() <
size) {
118 std::vector<uint8_t> buffer(
size);
120 container = std::move(buffer);
124 return peek_in(container.data(), offset,
size, virtual_address);
137 const size_t size = this->size() - this->
pos();
146 const size_t size = count *
sizeof(T);
166 const auto current_p =
pos();
169 const size_t size = count *
sizeof(T);
178 if (container.size() < count) {
179 std::vector<T> buffer(count);
181 container = std::move(buffer);
212 return pos_ <
size();
215 operator bool()
const {
220 const T* read_array(
size_t size)
const;
222 template<
class T,
size_t N>
229 const uint64_t offset = pos_;
230 const bool read_ok = offset <=
size() &&
231 (offset + N) <=
size()
233 && (int64_t(offset) >= 0 && int64_t(N) >= 0) &&
234 (int64_t(offset + N) >= 0);
239 if (
peek_in(dst.data(), pos_, N)) {
245 template<
class T,
size_t N>
262 const T* peek_array(
size_t size)
const;
265 const T* peek_array(
size_t offset,
size_t size)
const;
277 bool can_read()
const;
280 bool can_read(
size_t offset)
const;
283 return offset < (int64_t)this->size() &&
284 size < ((int64_t)this->size() - offset);
287 size_t align(
size_t align_on)
const;
295 const auto* ptr =
reinterpret_cast<const uint8_t* const
>(&buffer);
296 return std::all_of(ptr, ptr +
sizeof(T), [](uint8_t x) {
return x == 0; });
303 virtual const uint8_t*
p()
const {
308 return const_cast<uint8_t*
>(
static_cast<const BinaryStream*
>(
this)->start());
311 virtual uint8_t*
p() {
312 return const_cast<uint8_t*
>(
static_cast<const BinaryStream*
>(
this)->p());
316 return const_cast<uint8_t*
>(
static_cast<const BinaryStream*
>(
this)->end());
319 virtual const uint8_t*
start()
const {
323 virtual const uint8_t*
end()
const {
328 uint64_t virtual_address = 0)
const = 0;
330 uint64_t virtual_address = 0)
const {
331 if (dst ==
nullptr) {
334 if (
auto raw =
read_at(offset,
size, virtual_address)) {
335 const void* ptr = *raw;
337 if (ptr ==
nullptr) {
341 memcpy(dst, ptr,
size);
349 static_assert(std::is_base_of_v<BinaryStream, T>,
350 "Require BinaryStream inheritance");
351 if (T::classof(*
this)) {
352 return static_cast<const T*
>(
this);
359 return const_cast<T*
>(
static_cast<const BinaryStream*
>(
this)->cast<T>());
369 mutable size_t pos_ = 0;
370 bool endian_swap_ =
false;
371 STREAM_TYPE stype_ = STREAM_TYPE::UNKNOWN;
393 stream_.setpos(pos_);
422 endian_swap_(stream.should_swap()),
428 endian_swap_(stream.should_swap()),
434 stream_.set_endian_swap(endian_swap_);
450 bool endian_swap_ =
false;
467 const auto current_p =
pos();
469 if (
auto res =
peek_in(&ret,
pos(),
sizeof(T))) {
483 const size_t saved_offset = this->
pos();
486 this->
setpos(saved_offset);
497 return reinterpret_cast<const T*
>(raw.value());
502 const size_t saved_offset = this->
pos();
505 this->
setpos(saved_offset);
514 return pos_ <
size() && (pos_ +
sizeof(T)) <
size();
522 return offset <
size() && (offset +
sizeof(T)) <
size();
Definition ASN1Reader.hpp:32
Class that is used to a read stream of data from different sources.
Definition BinaryStream.hpp:35
size_t align(size_t align_on) const
ok_error_t peek_array(std::array< T, N > &dst) const
Definition BinaryStream.hpp:223
STREAM_TYPE
Definition BinaryStream.hpp:39
@ MEMORY
Definition BinaryStream.hpp:42
@ DUMP
Definition BinaryStream.hpp:45
const BinaryStream & skip_uleb128() const
Definition BinaryStream.hpp:71
result< T > peek() const
Definition BinaryStream.hpp:466
result< int64_t > read_dwarf_encoded(uint8_t encoding) const
virtual uint8_t * p()
Definition BinaryStream.hpp:311
virtual bool bind_binary(Binary &)
Definition BinaryStream.hpp:362
virtual const uint8_t * p() const
Definition BinaryStream.hpp:303
result< std::string > read_string(size_t maxsize=~size_t{0}) const
const T * read_array(size_t size) const
Definition BinaryStream.hpp:527
virtual uint64_t size() const =0
friend class ASN1Reader
Definition BinaryStream.hpp:37
result< std::u16string > peek_u16string_at(size_t offset, size_t length) const
bool can_read() const
Definition BinaryStream.hpp:511
ok_error_t read_objects(std::vector< T > &container, uint64_t count)
Definition BinaryStream.hpp:142
bool is_dump_stream() const
Definition BinaryStream.hpp:63
ok_error_t peek_objects_at(uint64_t offset, std::vector< T > &container, uint64_t count)
Definition BinaryStream.hpp:161
result< std::u16string > peek_u16string(size_t length) const
const T * cast() const
Definition BinaryStream.hpp:348
result< std::string > peek_string_at(size_t offset, size_t maxsize=~size_t{0}) const
result< std::u16string > read_u16string() const
bool is_memory_view() const
Definition BinaryStream.hpp:67
void set_endian_swap(bool swap)
Definition BinaryStream.hpp:289
bool is_memory_stream() const
Definition BinaryStream.hpp:59
const BinaryStream & increment_pos(size_t value) const
Definition BinaryStream.hpp:194
result< std::u16string > peek_u16string() const
bool should_swap() const
Definition BinaryStream.hpp:299
ok_error_t peek_objects(std::vector< T > &container, uint64_t count)
Definition BinaryStream.hpp:156
size_t pos() const
Definition BinaryStream.hpp:207
virtual uint8_t * start()
Definition BinaryStream.hpp:307
result< uint64_t > read_uleb128(size_t *size=nullptr) const
virtual result< const void * > read_at(uint64_t offset, uint64_t size, uint64_t virtual_address=0) const =0
void setpos(size_t pos) const
Definition BinaryStream.hpp:190
bool is_valid() const
Definition BinaryStream.hpp:211
result< std::string > peek_string(size_t maxsize=~size_t{0}) const
virtual const uint8_t * end() const
Definition BinaryStream.hpp:323
static bool is_all_zero(const T &buffer)
Definition BinaryStream.hpp:294
T * cast()
Definition BinaryStream.hpp:358
virtual ok_error_t peek_in(void *dst, uint64_t offset, uint64_t size, uint64_t virtual_address=0) const
Definition BinaryStream.hpp:329
const BinaryStream & skip_sleb128() const
Definition BinaryStream.hpp:76
result< std::u16string > read_u16string(size_t length) const
virtual ok_error_t peek_data(std::vector< uint8_t > &container, uint64_t offset, uint64_t size, uint64_t virtual_address=0)
Definition BinaryStream.hpp:101
void decrement_pos(size_t value) const
Definition BinaryStream.hpp:199
result< T > read() const
Definition BinaryStream.hpp:456
BinaryStream(STREAM_TYPE type)
Definition BinaryStream.hpp:50
const BinaryStream & skip() const
Definition BinaryStream.hpp:271
virtual const uint8_t * start() const
Definition BinaryStream.hpp:319
result< uint64_t > read_sleb128(size_t *size=nullptr) const
ok_error_t read_array(std::array< T, N > &dst) const
Definition BinaryStream.hpp:246
bool can_read(int64_t offset, int64_t size) const
Definition BinaryStream.hpp:282
result< std::string > read_mutf8(size_t maxsize=~size_t{0}) const
ok_error_t read_data(std::vector< uint8_t > &container)
Definition BinaryStream.hpp:136
virtual ~BinaryStream()=default
STREAM_TYPE type() const
Definition BinaryStream.hpp:55
virtual ok_error_t read_data(std::vector< uint8_t > &container, uint64_t size)
Definition BinaryStream.hpp:127
virtual uint8_t * end()
Definition BinaryStream.hpp:315
Generic interface representing a binary executable.
Definition Abstract/Binary.hpp:61
const BinaryStream & operator*() const
Definition BinaryStream.hpp:404
ScopedStream(BinaryStream &stream, uint64_t pos)
Definition BinaryStream.hpp:382
ScopedStream(BinaryStream &stream)
Definition BinaryStream.hpp:388
ScopedStream(const ScopedStream &)=delete
ScopedStream & operator=(const ScopedStream &)=delete
ScopedStream & operator=(ScopedStream &&)=delete
~ScopedStream()
Definition BinaryStream.hpp:392
BinaryStream & operator*()
Definition BinaryStream.hpp:400
ScopedStream(ScopedStream &&)=delete
BinaryStream * operator->()
Definition BinaryStream.hpp:396
ToggleEndianness(BinaryStream &stream, bool value)
Definition BinaryStream.hpp:421
ToggleEndianness(ToggleEndianness &&)=delete
ToggleEndianness & operator=(const ToggleEndianness &)=delete
ToggleEndianness & operator=(ToggleEndianness &&)=delete
BinaryStream & operator*()
Definition BinaryStream.hpp:441
BinaryStream * operator->()
Definition BinaryStream.hpp:437
ToggleEndianness(BinaryStream &stream)
Definition BinaryStream.hpp:427
~ToggleEndianness()
Definition BinaryStream.hpp:433
const BinaryStream & operator*() const
Definition BinaryStream.hpp:445
ToggleEndianness(const ToggleEndianness &)=delete
Opaque structure that is used by LIEF to avoid writing result<void> f(...). Instead,...
Definition errors.hpp:119
Wrapper that contains an Object (T) or an error.
Definition errors.hpp:79
#define LIEF_LIFETIMEBOUND
Definition compiler_attributes.hpp:72
@ read_error
Definition errors.hpp:25
@ inconsistent
Definition errors.hpp:43
tl::unexpected< lief_errors > make_error_code(lief_errors e)
Create a standard error code from lief_errors.
Definition errors.hpp:55
LIEF namespace.
Definition Abstract/Binary.hpp:42
ok_t ok()
Return success for function with return type ok_error_t.
Definition errors.hpp:103
void swap_endian(T *)
Definition endianness_support.hpp:117
#define LIEF_API
Definition visibility.h:45