static void * load_bytes(RBinFile *arch, const ut8 *buf, ut64 sz, ut64 la, Sdb *sdb){ ArtObj *ao = R_NEW0 (ArtObj); ao->kv = sdb_new0 (); art_header_load (&ao->art, arch->buf, ao->kv); sdb_ns_set (sdb, "info", ao->kv); return ao; }
static Sdb *get_sdb(RBinFile *bf) { Sdb *kv = sdb_new0 (); sdb_num_set (kv, "nro_start.offset", 0, 0); sdb_num_set (kv, "nro_start.size", 16, 0); sdb_set (kv, "nro_start.format", "xxq unused mod_memoffset padding", 0); sdb_num_set (kv, "nro_header.offset", 16, 0); sdb_num_set (kv, "nro_header.size", 0x70, 0); sdb_set (kv, "nro_header.format", "xxxxxxxxxxxx magic unk size unk2 text_offset text_size ro_offset ro_size data_offset data_size bss_size unk3", 0); sdb_ns_set (bf->sdb, "info", kv); return kv; }
static void * load_bytes(RBinFile *arch, const ut8 *buf, ut64 sz, ut64 la, Sdb *sdb) { BootImageObj *bio = R_NEW0 (BootImageObj); if (!bio) return NULL; bio->kv = sdb_new0 (); if (!bio->kv) { free (bio); return NULL; } bootimg_header_load (&bio->bi, arch->buf, bio->kv); sdb_ns_set (sdb, "info", bio->kv); return bio; }
static void * load_bytes(RBinFile *arch, const ut8 *buf, ut64 sz, ut64 loadaddr, Sdb *sdb) { const struct r_bin_mz_obj_t *res = NULL; RBuffer *tbuf = NULL; if (!buf || sz == 0 || sz == UT64_MAX) return NULL; tbuf = r_buf_new (); r_buf_set_bytes (tbuf, buf, sz); res = r_bin_mz_new_buf (tbuf); if (res) sdb_ns_set (sdb, "info", res->kv); r_buf_free (tbuf); return (void *)res; }
static void *load_bytes(RBinFile *bf, const ut8 *buf, ut64 sz, ut64 la, Sdb *sdb){ ArtObj *ao = R_NEW0 (ArtObj); if (!ao) { return NULL; } ao->kv = sdb_new0 (); if (!ao->kv) { free (ao); return NULL; } art_header_load (&ao->art, bf->buf, ao->kv); sdb_ns_set (sdb, "info", ao->kv); return ao; }
static void *load_buffer(RBinFile *bf, RBuffer *buf, ut64 loadaddr, Sdb *sdb) { QnxObj *qo = R_NEW0 (QnxObj); lmf_record lrec; lmf_resource lres; lmf_data ldata; ut64 offset = QNX_RECORD_SIZE; RList *sections = NULL; RList *fixups = NULL; if (!qo) { goto beach; } if (!(sections = r_list_newf ((RListFree)r_bin_section_free)) || !(fixups = r_list_new ())) { goto beach; } qo->kv = sdb_new0 (); if (!qo->kv) { free (qo); goto beach; } // Read the first record if (r_buf_fread_at (bf->buf, 0, (ut8 *)&lrec, "ccss", 1) < QNX_RECORD_SIZE) { goto beach; } // Load the header lmf_header_load (&qo->lmfh, bf->buf, qo->kv); offset += lrec.data_nbytes; for (;;) { if (r_buf_fread_at (bf->buf, offset, (ut8 *)&lrec, "ccss", 1) < QNX_RECORD_SIZE) { goto beach; } offset += sizeof (lmf_record); if (lrec.rec_type == LMF_IMAGE_END_REC) { break; } else if (lrec.rec_type == LMF_RESOURCE_REC) { RBinSection *ptr = R_NEW0 (RBinSection); if (r_buf_fread_at (bf->buf, offset, (ut8 *)&lres, "ssss", 1) < sizeof (lmf_resource)) { goto beach; } if (!ptr) { goto beach; } ptr->name = strdup ("LMF_RESOURCE"); ptr->paddr = offset; ptr->vsize = lrec.data_nbytes - sizeof (lmf_resource); ptr->size = ptr->vsize; ptr->add = true; r_list_append (sections, ptr); } else if (lrec.rec_type == LMF_LOAD_REC) { RBinSection *ptr = R_NEW0 (RBinSection); if (r_buf_fread_at (bf->buf, offset, (ut8 *)&ldata, "si", 1) < sizeof (lmf_data)) { goto beach; } if (!ptr) { goto beach; } ptr->name = strdup ("LMF_LOAD"); ptr->paddr = offset; ptr->vaddr = ldata.offset; ptr->vsize = lrec.data_nbytes - sizeof (lmf_data); ptr->size = ptr->vsize; ptr->add = true; r_list_append (sections, ptr); } else if (lrec.rec_type == LMF_FIXUP_REC) { RBinReloc *ptr = R_NEW0 (RBinReloc); if (!ptr || r_buf_fread_at (bf->buf, offset, (ut8 *)&ldata, "si", 1) < sizeof (lmf_data)) { goto beach; } ptr->vaddr = ptr->paddr = ldata.offset; ptr->type = 'f'; // "LMF_FIXUP"; r_list_append (fixups, ptr); } else if (lrec.rec_type == LMF_8087_FIXUP_REC) { RBinReloc *ptr = R_NEW0 (RBinReloc); if (!ptr || r_buf_fread_at (bf->buf, offset, (ut8 *)&ldata, "si", 1) < sizeof (lmf_data)) { goto beach; } ptr->vaddr = ptr->paddr = ldata.offset; ptr->type = 'F'; // "LMF_8087_FIXUP"; r_list_append (fixups, ptr); } else if (lrec.rec_type == LMF_RW_END_REC) { r_buf_fread_at (bf->buf, offset, (ut8 *)&qo->rwend, "si", 1); } offset += lrec.data_nbytes; } sdb_ns_set (sdb, "info", qo->kv); qo->sections = sections; qo->fixups = fixups; return qo; beach: return NULL; }