📄 htle.cc
字号:
createHostStruct(&le_shared->objmap.header[i], LE_OBJECT_HEADER_struct, le_shared->byteorder); /* sum up page sizes to find object's physical size */ uint psize = 0; for (uint j=0; j<le_shared->objmap.header[i].page_map_count; j++) { psize += le_shared->pagemap.psize[j+le_shared->objmap.header[i].page_map_index-1]; /* FIXME: security hole: array-index uncontrolled */ if (j == le_shared->objmap.header[i].page_map_count-1) le_shared->pagemap.vsize[j+le_shared->objmap.header[i].page_map_index-1]=le_shared->objmap.header[i].vsize % le_shared->hdr.pagesize; else le_shared->pagemap.vsize[j+le_shared->objmap.header[i].page_map_index-1]=le_shared->hdr.pagesize; }// FIXME: alternative which one is right ???#if 1 le_shared->objmap.psize[i] = MIN(psize, le_shared->objmap.header[i].vsize); le_shared->objmap.vsize[i] = MIN(psize, le_shared->objmap.header[i].vsize);#else le_shared->objmap.psize[i] = le_shared->objmap.header[i].vsize; le_shared->objmap.vsize[i] = le_shared->objmap.header[i].vsize;#endif }/* create temporary address space for LEAddress's *//* le_shared->le_addr = ht_malloc(sizeof *le_shared->le_addr * le_shared->objmap.count); uint a = 0; for (uint i = 0; i<le_shared->objmap.count; i++) { le_shared->le_addr[i] = a; a += le_shared->objmap.header[i].page_map_count * le_shared->hdr.pagesize; }*/}void ht_le::loc_enum_start(){// loc_enum=true;}bool ht_le::loc_enum_next(ht_format_loc *loc){#if 0 ht_le_shared_data *sh=(ht_le_shared_data*)shared_data; if (loc_enum) { loc->name="le"; loc->start=sh->hdr_ofs; loc->length=file->get_size()-loc->start; /* FIXME: ENOTOK */ loc_enum=false; return true; }#endif return false;}/* * CLASS ht_le_page_file */ht_le_page_file::ht_le_page_file(File *file, bool own_file, ht_le_pagemap *pm, uint32 pms, uint32 ps) : FileLayer(file, own_file){ pagemap = pm; pagemapsize = pms; page_size = ps; ofs = 0;}bool ht_le_page_file::isdirty(FileOfs offset, FileOfs range){ FileOfs mofs; FileOfs msize; while (range) { FileOfs s = range; if (!map_ofs(offset, &mofs, &msize)) break; if (s > msize) s = msize; bool isdirty; mFile->cntl(FCNTL_MODS_IS_DIRTY, mofs, s, &isdirty); if (isdirty) return true; range -= s; ofs += s; } return false;}/** * Map a paged and linearized LE offset to its corresponding * physical file offset */bool ht_le_page_file::map_ofs(uint32 lofs, FileOfs *pofs, FileOfs *maxsize){ uint i = lofs / page_size, j = lofs % page_size; if (i < pagemapsize) { if (j < pagemap->vsize[i]) { *pofs = pagemap->offset[i]+j; *maxsize = pagemap->vsize[i]-j; return true; } } return false;}bool ht_le_page_file::unmap_ofs(FileOfs pofs, uint32 *lofs){ for (uint i=0; i<pagemapsize; i++) { if ((pofs >= pagemap->offset[i]) && (pofs < pagemap->offset[i]+pagemap->vsize[i])) { *lofs = pofs - pagemap->offset[i] + i*page_size; return true; } } return false;}uint ht_le_page_file::read(void *aBuf, uint size){ FileOfs mofs; FileOfs msize; int c = 0; byte *buf = (byte *)aBuf; while (size) { uint s = size; if (!map_ofs(ofs, &mofs, &msize)) break; if (s > msize) s = msize; mFile->seek(mofs); s = mFile->read(buf, s); if (!s) break; buf += s; size -= s; c += s; ofs += s; } return c;}void ht_le_page_file::seek(FileOfs offset){ ofs = offset;}FileOfs ht_le_page_file::tell() const{ return ofs;}int ht_le_page_file::vcntl(uint cmd, va_list vargs){ switch (cmd) { case FCNTL_MODS_CLEAR_DIRTY_RANGE: { FileOfs o = va_arg(vargs, FileOfs); FileOfs s = va_arg(vargs, FileOfs); FileOfs ts, ms; int e; do { if (!map_ofs(o, &o, &ms)) return EINVAL; ts = (s < ms) ? s : ms; e = FileLayer::cntl(cmd, o, ts); if (e) return e; s -= ts; } while (s); return 0; } case FCNTL_MODS_IS_DIRTY: { FileOfs o = va_arg(vargs, FileOfs); FileOfs s = va_arg(vargs, FileOfs); bool *b = va_arg(vargs, bool*); FileOfs ts, ms; int e; *b = false; do { if (!map_ofs(o, &o, &ms)) return EINVAL; ts = (s < ms) ? s : ms; e = mFile->cntl(cmd, o, ts, b); if (e) return e; if (*b) break; s -= ts; } while (s); return 0; } } return FileLayer::vcntl(cmd, vargs);}uint ht_le_page_file::write(const void *aBuf, uint size){ FileOfs mofs; FileOfs msize; int c = 0; const byte *buf = (const byte *)aBuf; while (size) { uint s = size; if (!map_ofs(ofs, &mofs, &msize)) break; if (s>msize) s = msize; mFile->seek(mofs); buf += mFile->write(buf, s); size -= s; c += s; ofs += s; } return c;}/* * CLASS ht_le_reloc_entry */ht_le_reloc_entry::ht_le_reloc_entry(uint o, uint s, LEAddress a, uint8 at, uint8 rt){ ofs = o; seg = s; addr = a; address_type = at; reloc_type = rt;}/* * CLASS ht_le_reloc_file */ht_le_reloc_file::ht_le_reloc_file(File *s, bool os, ht_le_shared_data *d) : ht_reloc_file(s, os){ data = d;}void ht_le_reloc_file::reloc_apply(Object *reloc, byte *data){ ht_le_reloc_entry *e = (ht_le_reloc_entry*)reloc; switch (e->address_type & LE_FIXUP_ADDR_TYPE_MASK) { case LE_FIXUP_ADDR_TYPE_0_8: createForeignInt(data, e->addr, 1, little_endian); break; case LE_FIXUP_ADDR_TYPE_16_0: createForeignInt(data, e->seg, 2, little_endian); break; case LE_FIXUP_ADDR_TYPE_16_16: createForeignInt(data, e->addr, 2, little_endian); createForeignInt(data, e->seg, 2, little_endian); break; case LE_FIXUP_ADDR_TYPE_0_16: createForeignInt(data, e->addr, 2, little_endian); break; case LE_FIXUP_ADDR_TYPE_16_32: createForeignInt(data, e->addr, 4, little_endian); createForeignInt(data, e->seg, 2, little_endian); break; case LE_FIXUP_ADDR_TYPE_0_32: createForeignInt(data, e->addr, 4, little_endian); break; case LE_FIXUP_ADDR_TYPE_REL32: createForeignInt(data, e->addr - LE_BASE_ADDR - e->ofs - 4, 4, little_endian); break; }}bool ht_le_reloc_file::reloc_unapply(Object *reloc, byte *data){ return false;}/* * */FileOfs LE_get_seg_ofs(ht_le_shared_data *LE_shared, uint i){ assert(i<LE_shared->objmap.count); return LE_SEG_ADDR(i) - LE_BASE_ADDR;}LEAddress LE_get_seg_addr(ht_le_shared_data *LE_shared, uint i){ assert(i<LE_shared->objmap.count); return LE_SEG_ADDR(i);}uint LE_get_seg_psize(ht_le_shared_data *LE_shared, uint i){ assert(i<LE_shared->objmap.count); return LE_shared->objmap.psize[i];}uint LE_get_seg_vsize(ht_le_shared_data *LE_shared, uint i){ assert(i<LE_shared->objmap.count); return LE_shared->objmap.vsize[i];}bool LE_addr_to_segment(ht_le_shared_data *LE_shared, LEAddress Addr, int *segment){ for (uint i = 0; i < LE_shared->objmap.count; i++) { LEAddress base = LE_get_seg_addr(LE_shared, i); uint evsize = MAX(LE_get_seg_vsize(LE_shared, i), LE_get_seg_psize(LE_shared, i)); if ((Addr >= base) && (Addr < base + evsize)) { *segment = i; return true; } } return false;}bool LE_addr_is_physical(ht_le_shared_data *LE_shared, LEAddress Addr){ for (uint i = 0; i < LE_shared->objmap.count; i++) { LEAddress base = LE_get_seg_addr(LE_shared, i); uint psize = LE_get_seg_psize(LE_shared, i); if ((Addr >= base) && (Addr < base + psize)) return true; } return false;}bool LE_addr_to_ofs(ht_le_shared_data *LE_shared, LEAddress Addr, FileOfs *ofs){ for (uint i = 0; i < LE_shared->objmap.count; i++) { LEAddress base = LE_get_seg_addr(LE_shared, i); uint psize = LE_get_seg_psize(LE_shared, i); if ((Addr >= base) && (Addr < base + psize)) { *ofs = Addr - LE_BASE_ADDR; return true; } } return false;}bool LE_ofs_to_addr(ht_le_shared_data *LE_shared, FileOfs ofs, LEAddress *Addr){ for (uint i = 0; i < LE_shared->objmap.count; i++) { FileOfs sofs = LE_get_seg_ofs(LE_shared, i); if ((ofs >= sofs) && (ofs < sofs + LE_get_seg_psize(LE_shared, i))) { *Addr = LE_BASE_ADDR + ofs; return true; } } return false;}LEAddress LE_MAKE_ADDR(ht_le_shared_data *LE_shared, uint16 seg, uint32 ofs){ return LE_SEG_ADDR(seg) + ofs;}uint16 LE_ADDR_SEG(ht_le_shared_data *LE_shared, LEAddress a){ for (uint i = 0; i<LE_shared->objmap.count; i++) { LEAddress addr = LE_SEG_ADDR(i); if ((a >= addr) && (a < addr + LE_shared->objmap.vsize[i])) { return i; } } return 0xffff;}uint32 LE_ADDR_OFS(ht_le_shared_data *LE_shared, LEAddress a){ for (uint i = 0; i<LE_shared->objmap.count; i++) { LEAddress addr = LE_SEG_ADDR(i); if ((a >= addr) && (a < addr + LE_shared->objmap.vsize[i])) { return a-addr; } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -