-
-
Notifications
You must be signed in to change notification settings - Fork 507
Closed
Labels
RzBinenhancementNew feature or requestNew feature or requestgood first issueGood for newcomersGood for newcomers
Description
Currently struct boot_img_hdr (a.k.a. BootImage) in librz/bin/p/bin_bootimg.c uses RZ_PACKED.
The idea is to rewrite the load_buffer function to not call rz_buf_read_at but instead use the rz_buf_offset_* APIs.
Also this plugins is probably missing tests, which should be added to the test suite.
how to use the RzBuffer api.
Define a structure in a normal way (so no RZ_PACKED, etc...):
typedef struct foo_s {
ut32 num32;
char name[10];
....
ut16 val16;
} foo_t;Then you use the offset API that i mention:
static bool parse_foo(RzBuffer *b, foo_t *foo, bool big_endian) {
ut64 offset = 0;
return rz_buf_read_ble32_offset(b, &offset, &foo->num32, big_endian) &&
rz_buf_read_offset(b, &offset, foo->name, sizepf(foo->name)) &&
...
rz_buf_read_ble16_offset(b, &offset, &foo->val16, big_endian) ;
}This parses the same structure as the packed one via memcpy(foo, buffer, sizeof(foo)); but is portable.
Real world example:
Lines 83 to 137 in 602781b
| static bool nds_read_header(RzBuffer *buf, NDSHeader *hdr) { | |
| ut64 offset = 0; | |
| return rz_buf_read_offset(buf, &offset, (ut8 *)hdr->title, sizeof(hdr->title)) && | |
| rz_buf_read_offset(buf, &offset, (ut8 *)hdr->gamecode, sizeof(hdr->gamecode)) && | |
| rz_buf_read_offset(buf, &offset, (ut8 *)hdr->makercode, sizeof(hdr->makercode)) && | |
| rz_buf_read8_offset(buf, &offset, &hdr->unitcode) && | |
| rz_buf_read8_offset(buf, &offset, &hdr->devicetype) && | |
| rz_buf_read8_offset(buf, &offset, &hdr->devicecap) && | |
| rz_buf_read_offset(buf, &offset, hdr->reserved1, sizeof(hdr->reserved1)) && | |
| rz_buf_read8_offset(buf, &offset, &hdr->romversion) && | |
| rz_buf_read8_offset(buf, &offset, &hdr->reserved2) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_rom_offset) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_entry_address) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_ram_address) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_size) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_rom_offset) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_entry_address) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_ram_address) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_size) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->fnt_offset) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->fnt_size) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->fat_offset) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->fat_size) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_overlay_offset) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_overlay_size) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_overlay_offset) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_overlay_size) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->rom_control_info1) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->rom_control_info2) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->banner_offset) && | |
| rz_buf_read_le16_offset(buf, &offset, &hdr->secure_area_crc) && | |
| rz_buf_read_le16_offset(buf, &offset, &hdr->secure_transfer_timeout) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm9_autoload) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->arm7_autoload) && | |
| rz_buf_read_le64_offset(buf, &offset, &hdr->secure_disable) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->ntr_region_rom_size) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->rom_header_size) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x88) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x8C) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x90) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x94) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x98) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0x9C) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xA0) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xA4) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xA8) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xAC) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xB0) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xB4) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xB8) && | |
| rz_buf_read_le32_offset(buf, &offset, &hdr->offset_0xBC) && | |
| rz_buf_read_offset(buf, &offset, hdr->logo, sizeof(hdr->logo)) && | |
| rz_buf_read_le16_offset(buf, &offset, &hdr->logo_crc) && | |
| rz_buf_read_le16_offset(buf, &offset, &hdr->header_crc); | |
| } |
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
RzBinenhancementNew feature or requestNew feature or requestgood first issueGood for newcomersGood for newcomers