rz_buf_{read,write}_XX_offset() API to track the offset (#2604)
This commit is contained in:
parent
fb665274f4
commit
a1c2ed18d7
6 changed files with 144 additions and 159 deletions
|
|
@ -4,46 +4,6 @@
|
|||
|
||||
#include "elf.h"
|
||||
|
||||
static bool buffer_read_8(ELFOBJ *bin, ut64 *offset, ut8 *result) {
|
||||
if (!rz_buf_read8_at(bin->b, *offset, result)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*offset += 1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool buffer_read_16(ELFOBJ *bin, ut64 *offset, ut16 *result) {
|
||||
if (!rz_buf_read_ble16_at(bin->b, *offset, result, bin->big_endian)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*offset += 2;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool buffer_read_32(ELFOBJ *bin, ut64 *offset, ut32 *result) {
|
||||
if (!rz_buf_read_ble32_at(bin->b, *offset, result, bin->big_endian)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*offset += 4;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool buffer_read_64(ELFOBJ *bin, ut64 *offset, ut64 *result) {
|
||||
if (!rz_buf_read_ble64_at(bin->b, *offset, result, bin->big_endian)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*offset += 8;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool buffer_read_32_signed(ELFOBJ *bin, ut64 *offset, st32 *result) {
|
||||
ut32 tmp;
|
||||
if (!rz_buf_read_ble32_at(bin->b, *offset, &tmp, bin->big_endian)) {
|
||||
|
|
@ -91,17 +51,17 @@ bool Elf_(rz_bin_elf_check_array)(RZ_NONNULL ELFOBJ *bin, Elf_(Off) offset, Elf_
|
|||
|
||||
bool Elf_(rz_bin_elf_read_char)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT ut8 *result) {
|
||||
rz_return_val_if_fail(bin && offset && result, false);
|
||||
return buffer_read_8(bin, offset, result);
|
||||
return rz_buf_read8_offset(bin->b, offset, result);
|
||||
}
|
||||
|
||||
bool Elf_(rz_bin_elf_read_half)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT Elf_(Half) * result) {
|
||||
rz_return_val_if_fail(bin && offset && result, false);
|
||||
return buffer_read_16(bin, offset, result);
|
||||
return rz_buf_read_ble16_offset(bin->b, offset, result, bin->big_endian);
|
||||
}
|
||||
|
||||
bool Elf_(rz_bin_elf_read_word)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT Elf_(Word) * result) {
|
||||
rz_return_val_if_fail(bin && offset && result, false);
|
||||
return buffer_read_32(bin, offset, result);
|
||||
return rz_buf_read_ble32_offset(bin->b, offset, result, bin->big_endian);
|
||||
}
|
||||
|
||||
bool Elf_(rz_bin_elf_read_sword)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT Elf_(Sword) * result) {
|
||||
|
|
@ -111,7 +71,7 @@ bool Elf_(rz_bin_elf_read_sword)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut6
|
|||
|
||||
bool Elf_(rz_bin_elf_read_xword)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT Elf_(Xword) * result) {
|
||||
rz_return_val_if_fail(bin && offset && result, false);
|
||||
return buffer_read_64(bin, offset, (ut64 *)result);
|
||||
return rz_buf_read_ble64_offset(bin->b, offset, (ut64 *)result, bin->big_endian);
|
||||
}
|
||||
|
||||
bool Elf_(rz_bin_elf_read_sxword)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT Elf_(Sxword) * result) {
|
||||
|
|
@ -122,24 +82,24 @@ bool Elf_(rz_bin_elf_read_sxword)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut
|
|||
bool Elf_(rz_bin_elf_read_addr)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT Elf_(Addr) * result) {
|
||||
rz_return_val_if_fail(bin && offset && result, false);
|
||||
#if RZ_BIN_ELF64
|
||||
return buffer_read_64(bin, offset, (ut64 *)result);
|
||||
return rz_buf_read_ble64_offset(bin->b, offset, (ut64 *)result, bin->big_endian);
|
||||
#else
|
||||
return buffer_read_32(bin, offset, (ut32 *)result);
|
||||
return rz_buf_read_ble32_offset(bin->b, offset, (ut32 *)result, bin->big_endian);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool Elf_(rz_bin_elf_read_off)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT Elf_(Off) * result) {
|
||||
rz_return_val_if_fail(bin && offset && result, false);
|
||||
#if RZ_BIN_ELF64
|
||||
return buffer_read_64(bin, offset, (ut64 *)result);
|
||||
return rz_buf_read_ble64_offset(bin->b, offset, (ut64 *)result, bin->big_endian);
|
||||
#else
|
||||
return buffer_read_32(bin, offset, (ut32 *)result);
|
||||
return rz_buf_read_ble32_offset(bin->b, offset, (ut32 *)result, bin->big_endian);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool Elf_(rz_bin_elf_read_section)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT Elf_(Section) * result) {
|
||||
rz_return_val_if_fail(bin && offset && result, false);
|
||||
return buffer_read_16(bin, offset, result);
|
||||
return rz_buf_read_ble16_offset(bin->b, offset, (ut16 *)result, bin->big_endian);
|
||||
}
|
||||
|
||||
bool Elf_(rz_bin_elf_read_versym)(RZ_NONNULL ELFOBJ *bin, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT Elf_(Versym) * result) {
|
||||
|
|
|
|||
|
|
@ -580,20 +580,20 @@ error:
|
|||
}
|
||||
|
||||
static bool read_dos_header_aux(RzBuffer *buf, ut64 *offset, PE_(image_dos_header) * header) {
|
||||
return rz_bin_pe_buffer_read_le16(buf, offset, &header->e_magic) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_cblp) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_cp) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_crlc) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_cparhdr) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_minalloc) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_maxalloc) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_ss) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_sp) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_csum) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_ip) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_cs) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_lfarlc) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &header->e_ovno);
|
||||
return rz_buf_read_le16_offset(buf, offset, &header->e_magic) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_cblp) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_cp) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_crlc) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_cparhdr) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_minalloc) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_maxalloc) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_ss) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_sp) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_csum) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_ip) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_cs) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_lfarlc) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &header->e_ovno);
|
||||
}
|
||||
|
||||
bool PE_(read_dos_header)(RzBuffer *buf, PE_(image_dos_header) * header) {
|
||||
|
|
@ -603,81 +603,81 @@ bool PE_(read_dos_header)(RzBuffer *buf, PE_(image_dos_header) * header) {
|
|||
}
|
||||
|
||||
for (size_t i = 0; i < 4; i++) {
|
||||
if (!rz_bin_pe_buffer_read_le16(buf, &offset, &header->e_res[i])) {
|
||||
if (!rz_buf_read_le16_offset(buf, &offset, &header->e_res[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!rz_bin_pe_buffer_read_le16(buf, &offset, &header->e_oemid)) {
|
||||
if (!rz_buf_read_le16_offset(buf, &offset, &header->e_oemid)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!rz_bin_pe_buffer_read_le16(buf, &offset, &header->e_oeminfo)) {
|
||||
if (!rz_buf_read_le16_offset(buf, &offset, &header->e_oeminfo)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < 10; i++) {
|
||||
if (!rz_bin_pe_buffer_read_le16(buf, &offset, &header->e_res2[i])) {
|
||||
if (!rz_buf_read_le16_offset(buf, &offset, &header->e_res2[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!rz_bin_pe_buffer_read_le32(buf, &offset, &header->e_lfanew)) {
|
||||
if (!rz_buf_read_le32_offset(buf, &offset, &header->e_lfanew)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool read_nt_headers_aux(RzBuffer *buf, ut64 *offset, PE_(image_nt_headers) * headers) {
|
||||
return rz_bin_pe_buffer_read_le32(buf, offset, &headers->Signature) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->file_header.Machine) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->file_header.NumberOfSections) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->file_header.TimeDateStamp) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->file_header.PointerToSymbolTable) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->file_header.NumberOfSymbols) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->file_header.SizeOfOptionalHeader) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->file_header.Characteristics) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->optional_header.Magic) &&
|
||||
rz_bin_pe_buffer_read_le8(buf, offset, &headers->optional_header.MajorLinkerVersion) &&
|
||||
rz_bin_pe_buffer_read_le8(buf, offset, &headers->optional_header.MinorLinkerVersion) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SizeOfCode) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SizeOfInitializedData) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SizeOfUninitializedData) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.AddressOfEntryPoint) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.BaseOfCode) &&
|
||||
return rz_buf_read_le32_offset(buf, offset, &headers->Signature) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->file_header.Machine) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->file_header.NumberOfSections) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->file_header.TimeDateStamp) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->file_header.PointerToSymbolTable) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->file_header.NumberOfSymbols) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->file_header.SizeOfOptionalHeader) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->file_header.Characteristics) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->optional_header.Magic) &&
|
||||
rz_buf_read8_offset(buf, offset, &headers->optional_header.MajorLinkerVersion) &&
|
||||
rz_buf_read8_offset(buf, offset, &headers->optional_header.MinorLinkerVersion) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SizeOfCode) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SizeOfInitializedData) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SizeOfUninitializedData) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.AddressOfEntryPoint) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.BaseOfCode) &&
|
||||
#ifdef RZ_BIN_PE64
|
||||
rz_bin_pe_buffer_read_le64(buf, offset, &headers->optional_header.ImageBase) &&
|
||||
rz_buf_read_le64_offset(buf, offset, &headers->optional_header.ImageBase) &&
|
||||
#else
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.BaseOfData) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.ImageBase) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.BaseOfData) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.ImageBase) &&
|
||||
#endif
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SectionAlignment) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.FileAlignment) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->optional_header.MajorOperatingSystemVersion) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->optional_header.MinorOperatingSystemVersion) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->optional_header.MajorImageVersion) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->optional_header.MinorImageVersion) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->optional_header.MajorSubsystemVersion) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->optional_header.MinorSubsystemVersion) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.Win32VersionValue) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SizeOfImage) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SizeOfHeaders) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.CheckSum) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->optional_header.Subsystem) &&
|
||||
rz_bin_pe_buffer_read_le16(buf, offset, &headers->optional_header.DllCharacteristics) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SectionAlignment) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.FileAlignment) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->optional_header.MajorOperatingSystemVersion) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->optional_header.MinorOperatingSystemVersion) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->optional_header.MajorImageVersion) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->optional_header.MinorImageVersion) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->optional_header.MajorSubsystemVersion) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->optional_header.MinorSubsystemVersion) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.Win32VersionValue) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SizeOfImage) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SizeOfHeaders) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.CheckSum) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->optional_header.Subsystem) &&
|
||||
rz_buf_read_le16_offset(buf, offset, &headers->optional_header.DllCharacteristics) &&
|
||||
#ifdef RZ_BIN_PE64
|
||||
rz_bin_pe_buffer_read_le64(buf, offset, &headers->optional_header.SizeOfStackReserve) &&
|
||||
rz_bin_pe_buffer_read_le64(buf, offset, &headers->optional_header.SizeOfStackCommit) &&
|
||||
rz_bin_pe_buffer_read_le64(buf, offset, &headers->optional_header.SizeOfHeapReserve) &&
|
||||
rz_bin_pe_buffer_read_le64(buf, offset, &headers->optional_header.SizeOfHeapCommit) &&
|
||||
rz_buf_read_le64_offset(buf, offset, &headers->optional_header.SizeOfStackReserve) &&
|
||||
rz_buf_read_le64_offset(buf, offset, &headers->optional_header.SizeOfStackCommit) &&
|
||||
rz_buf_read_le64_offset(buf, offset, &headers->optional_header.SizeOfHeapReserve) &&
|
||||
rz_buf_read_le64_offset(buf, offset, &headers->optional_header.SizeOfHeapCommit) &&
|
||||
#else
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SizeOfStackReserve) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SizeOfStackCommit) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SizeOfHeapReserve) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.SizeOfHeapCommit) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SizeOfStackReserve) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SizeOfStackCommit) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SizeOfHeapReserve) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.SizeOfHeapCommit) &&
|
||||
#endif
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.LoaderFlags) &&
|
||||
rz_bin_pe_buffer_read_le32(buf, offset, &headers->optional_header.NumberOfRvaAndSizes);
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.LoaderFlags) &&
|
||||
rz_buf_read_le32_offset(buf, offset, &headers->optional_header.NumberOfRvaAndSizes);
|
||||
}
|
||||
|
||||
bool PE_(read_nt_headers)(RzBuffer *buf, ut64 addr, PE_(image_nt_headers) * headers) {
|
||||
|
|
@ -687,7 +687,7 @@ bool PE_(read_nt_headers)(RzBuffer *buf, ut64 addr, PE_(image_nt_headers) * head
|
|||
}
|
||||
|
||||
for (size_t i = 0; i < PE_IMAGE_DIRECTORY_ENTRIES; i++) {
|
||||
if (!rz_bin_pe_buffer_read_le32(buf, &offset, &headers->optional_header.DataDirectory[i].VirtualAddress) || !rz_bin_pe_buffer_read_le32(buf, &offset, &headers->optional_header.DataDirectory[i].Size)) {
|
||||
if (!rz_buf_read_le32_offset(buf, &offset, &headers->optional_header.DataDirectory[i].VirtualAddress) || !rz_buf_read_le32_offset(buf, &offset, &headers->optional_header.DataDirectory[i].Size)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,40 +0,0 @@
|
|||
// SPDX-FileCopyrightText: 2021 08A <08A@riseup.net>
|
||||
// SPDX-License-Identifier: LGPL-3.0-only
|
||||
|
||||
#include "pe.h"
|
||||
|
||||
bool rz_bin_pe_buffer_read_le8(RzBuffer *buf, ut64 *offset, ut8 *result) {
|
||||
rz_return_val_if_fail(buf && offset && result, false);
|
||||
if (!rz_buf_read8_at(buf, *offset, result)) {
|
||||
return false;
|
||||
}
|
||||
*offset += 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool rz_bin_pe_buffer_read_le16(RzBuffer *buf, ut64 *offset, ut16 *result) {
|
||||
rz_return_val_if_fail(buf && offset && result, false);
|
||||
if (!rz_buf_read_le16_at(buf, *offset, result)) {
|
||||
return false;
|
||||
}
|
||||
*offset += 2;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool rz_bin_pe_buffer_read_le32(RzBuffer *buf, ut64 *offset, ut32 *result) {
|
||||
rz_return_val_if_fail(buf && offset && result, false);
|
||||
if (!rz_buf_read_le32_at(buf, *offset, result)) {
|
||||
return false;
|
||||
}
|
||||
*offset += 4;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool rz_bin_pe_buffer_read_le64(RzBuffer *buf, ut64 *offset, ut64 *result) {
|
||||
rz_return_val_if_fail(buf && offset && result, false);
|
||||
if (!rz_buf_read_le64_at(buf, *offset, result)) {
|
||||
return false;
|
||||
}
|
||||
*offset += 8;
|
||||
return true;
|
||||
}
|
||||
|
|
@ -788,11 +788,6 @@ typedef struct {
|
|||
PE64_SCOPE_RECORD ScopeRecord[];
|
||||
} PE64_SCOPE_TABLE;
|
||||
|
||||
bool rz_bin_pe_buffer_read_le8(RzBuffer *buf, ut64 *offset, ut8 *result);
|
||||
bool rz_bin_pe_buffer_read_le16(RzBuffer *buf, ut64 *offset, ut16 *result);
|
||||
bool rz_bin_pe_buffer_read_le32(RzBuffer *buf, ut64 *offset, ut32 *result);
|
||||
bool rz_bin_pe_buffer_read_le64(RzBuffer *buf, ut64 *offset, ut64 *result);
|
||||
|
||||
bool Pe32_read_dos_header(RzBuffer *buf, Pe32_image_dos_header *header);
|
||||
bool Pe32_read_nt_headers(RzBuffer *buf, ut64 addr, Pe32_image_nt_headers *headers);
|
||||
bool Pe32_read_image_section_header(RzBuffer *b, ut64 addr, Pe32_image_section_header *section_header);
|
||||
|
|
|
|||
|
|
@ -205,7 +205,6 @@ rz_bin_sources = [
|
|||
'format/pe/pe.c',
|
||||
'format/pe/pe64.c',
|
||||
'format/pe/pemixed.c',
|
||||
'format/pe/pe_misc.c',
|
||||
'format/pyc/marshal.c',
|
||||
'format/pyc/pyc.c',
|
||||
'format/pyc/pyc_magic.c',
|
||||
|
|
|
|||
|
|
@ -200,7 +200,7 @@ DEFINE_RZ_BUF_READ_BLE(32)
|
|||
DEFINE_RZ_BUF_READ_BLE(64)
|
||||
|
||||
/**
|
||||
* \brief Read a big endian or little endian ut16 at the specified address or cursor in the buffer.
|
||||
* \brief Write a big endian or little endian ut16 at the specified address or cursor in the buffer.
|
||||
* \param b ...
|
||||
* \param addr (optional)
|
||||
* \param result ...
|
||||
|
|
@ -211,6 +211,55 @@ DEFINE_RZ_BUF_WRITE_BLE(16)
|
|||
DEFINE_RZ_BUF_WRITE_BLE(32)
|
||||
DEFINE_RZ_BUF_WRITE_BLE(64)
|
||||
|
||||
#define DEFINE_RZ_BUF_READ_OFFSET_BLE(size) \
|
||||
static inline bool rz_buf_read_ble##size##_offset(RZ_NONNULL RzBuffer *b, RZ_NONNULL RZ_INOUT ut64 *offset, RZ_NONNULL RZ_OUT ut##size *result, bool big_endian) { \
|
||||
rz_return_val_if_fail(b &&offset &&result, false); \
|
||||
if (!rz_buf_read_ble##size##_at(b, *offset, result, big_endian)) { \
|
||||
return false; \
|
||||
} \
|
||||
*offset += sizeof(*result); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
#define DEFINE_RZ_BUF_WRITE_OFFSET_BLE(size) \
|
||||
static inline bool rz_buf_write_ble##size##_offset(RZ_NONNULL RzBuffer *b, RZ_NONNULL RZ_INOUT ut64 *offset, ut##size value, bool big_endian) { \
|
||||
rz_return_val_if_fail(b &&offset, false); \
|
||||
if (!rz_buf_write_ble##size##_at(b, *offset, value, big_endian)) { \
|
||||
return false; \
|
||||
} \
|
||||
*offset += sizeof(value); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
#define rz_buf_read_ble8_at(b, addr, result, endian) rz_buf_read8_at(b, addr, result)
|
||||
#define rz_buf_write_ble8_at(b, addr, value, endian) rz_buf_write8_at(b, addr, value)
|
||||
|
||||
/**
|
||||
* \brief Read a big endian or little endian (ut16, ut32, ut64) at the specified offset in the buffer and shifts the offset.
|
||||
* \param b ...
|
||||
* \param offset ...
|
||||
* \param result ...
|
||||
* \param big_endian ...
|
||||
* \return Return the status of the operation.
|
||||
*/
|
||||
DEFINE_RZ_BUF_READ_OFFSET_BLE(8)
|
||||
DEFINE_RZ_BUF_READ_OFFSET_BLE(16)
|
||||
DEFINE_RZ_BUF_READ_OFFSET_BLE(32)
|
||||
DEFINE_RZ_BUF_READ_OFFSET_BLE(64)
|
||||
|
||||
/**
|
||||
* \brief Write a big endian or little endian ut16 at the specified address or cursor in the buffer and shifts the offset.
|
||||
* \param b ...
|
||||
* \param addr (optional)
|
||||
* \param result ...
|
||||
* \param big_endian ...
|
||||
* \return Return the status of the operation.
|
||||
*/
|
||||
DEFINE_RZ_BUF_WRITE_OFFSET_BLE(8)
|
||||
DEFINE_RZ_BUF_WRITE_OFFSET_BLE(16)
|
||||
DEFINE_RZ_BUF_WRITE_OFFSET_BLE(32)
|
||||
DEFINE_RZ_BUF_WRITE_OFFSET_BLE(64)
|
||||
|
||||
#define rz_buf_read_le16(b, result) rz_buf_read_ble16(b, result, false)
|
||||
#define rz_buf_read_le32(b, result) rz_buf_read_ble32(b, result, false)
|
||||
#define rz_buf_read_le64(b, result) rz_buf_read_ble64(b, result, false)
|
||||
|
|
@ -219,6 +268,12 @@ DEFINE_RZ_BUF_WRITE_BLE(64)
|
|||
#define rz_buf_read_le32_at(b, addr, result) rz_buf_read_ble32_at(b, addr, result, false)
|
||||
#define rz_buf_read_le64_at(b, addr, result) rz_buf_read_ble64_at(b, addr, result, false)
|
||||
|
||||
#define rz_buf_read8_offset(b, offset, result) rz_buf_read_ble8_offset(b, offset, result, false)
|
||||
|
||||
#define rz_buf_read_le16_offset(b, offset, result) rz_buf_read_ble16_offset(b, offset, result, false)
|
||||
#define rz_buf_read_le32_offset(b, offset, result) rz_buf_read_ble32_offset(b, offset, result, false)
|
||||
#define rz_buf_read_le64_offset(b, offset, result) rz_buf_read_ble64_offset(b, offset, result, false)
|
||||
|
||||
#define rz_buf_read_be16(b, result) rz_buf_read_ble16(b, result, true)
|
||||
#define rz_buf_read_be32(b, result) rz_buf_read_ble32(b, result, true)
|
||||
#define rz_buf_read_be64(b, result) rz_buf_read_ble64(b, result, true)
|
||||
|
|
@ -227,6 +282,10 @@ DEFINE_RZ_BUF_WRITE_BLE(64)
|
|||
#define rz_buf_read_be32_at(b, addr, result) rz_buf_read_ble32_at(b, addr, result, true)
|
||||
#define rz_buf_read_be64_at(b, addr, result) rz_buf_read_ble64_at(b, addr, result, true)
|
||||
|
||||
#define rz_buf_read_be16_offset(b, offset, result) rz_buf_read_ble16_offset(b, offset, result, true)
|
||||
#define rz_buf_read_be32_offset(b, offset, result) rz_buf_read_ble32_offset(b, offset, result, true)
|
||||
#define rz_buf_read_be64_offset(b, offset, result) rz_buf_read_ble64_offset(b, offset, result, true)
|
||||
|
||||
#define rz_buf_write_le16(b, value) rz_buf_write_ble16(b, value, false)
|
||||
#define rz_buf_write_le32(b, value) rz_buf_write_ble32(b, value, false)
|
||||
#define rz_buf_write_le64(b, value) rz_buf_write_ble64(b, value, false)
|
||||
|
|
@ -235,6 +294,12 @@ DEFINE_RZ_BUF_WRITE_BLE(64)
|
|||
#define rz_buf_write_le32_at(b, addr, value) rz_buf_write_ble32_at(b, addr, value, false)
|
||||
#define rz_buf_write_le64_at(b, addr, value) rz_buf_write_ble64_at(b, addr, value, false)
|
||||
|
||||
#define rz_buf_write8_offset(b, offset, value) rz_buf_write_ble8_offset(b, offset, value, false)
|
||||
|
||||
#define rz_buf_write_le16_offset(b, offset, value) rz_buf_write_ble16_offset(b, offset, value, false)
|
||||
#define rz_buf_write_le32_offset(b, offset, value) rz_buf_write_ble32_offset(b, offset, value, false)
|
||||
#define rz_buf_write_le64_offset(b, offset, value) rz_buf_write_ble64_offset(b, offset, value, false)
|
||||
|
||||
#define rz_buf_write_be16(b, value) rz_buf_write_ble16(b, value, true)
|
||||
#define rz_buf_write_be32(b, value) rz_buf_write_ble32(b, value, true)
|
||||
#define rz_buf_write_be64(b, value) rz_buf_write_ble64(b, value, true)
|
||||
|
|
@ -243,8 +308,14 @@ DEFINE_RZ_BUF_WRITE_BLE(64)
|
|||
#define rz_buf_write_be32_at(b, addr, value) rz_buf_write_ble32_at(b, addr, value, true)
|
||||
#define rz_buf_write_be64_at(b, addr, value) rz_buf_write_ble64_at(b, addr, value, true)
|
||||
|
||||
#define rz_buf_write_be16_offset(b, offset, value) rz_buf_write_ble16_offset(b, offset, value, true)
|
||||
#define rz_buf_write_be32_offset(b, offset, value) rz_buf_write_ble32_offset(b, offset, value, true)
|
||||
#define rz_buf_write_be64_offset(b, offset, value) rz_buf_write_ble64_offset(b, offset, value, true)
|
||||
|
||||
#undef DEFINE_RZ_BUF_READ_BLE
|
||||
#undef DEFINE_RZ_BUF_WRITE_BLE
|
||||
#undef DEFINE_RZ_BUF_READ_OFFSET_BLE
|
||||
#undef DEFINE_RZ_BUF_WRITE_OFFSET_BLE
|
||||
|
||||
// sparse-specific
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue