| 15 | |
| 16 | |
| 17 | Md1romView::Md1romView(BinaryNinja::BinaryView* data, bool parseOnly): BinaryView("MD1Rom", data->GetFile(), data), |
| 18 | m_parseOnly(parseOnly) |
| 19 | { |
| 20 | (void)m_parseOnly; |
| 21 | |
| 22 | CreateLogger("BinaryView"); |
| 23 | m_logger = CreateLogger("BinaryView.MD1RomView"); |
| 24 | |
| 25 | BinaryReader reader(data); |
| 26 | uint64_t offset = 0; |
| 27 | try |
| 28 | { |
| 29 | while (true) |
| 30 | { |
| 31 | Md1romSegment seg; |
| 32 | reader.Seek(offset); |
| 33 | seg.magic = reader.Read32(); |
| 34 | seg.length = reader.Read32(); |
| 35 | DataBuffer name = reader.Read(0x20); |
| 36 | size_t nameLen = name.GetData() ? strlen((char*)name.GetData()) : 0; |
| 37 | if (nameLen) |
| 38 | seg.name = std::string((char*)name.GetData(), nameLen); |
| 39 | |
| 40 | seg.addr = reader.Read32(); |
| 41 | seg.mode = reader.Read32(); |
| 42 | seg.magic2 = reader.Read32(); |
| 43 | seg.offset = reader.Read32(); |
| 44 | seg.headerStart = offset; |
| 45 | seg.dataStart = offset + seg.offset; |
| 46 | |
| 47 | if ((seg.magic != MAGIC_1) || (seg.magic2 != MAGIC_2)) |
| 48 | break; |
| 49 | |
| 50 | m_segments.emplace_back(seg); |
| 51 | m_logger->LogDebug("segment: %s, offset: 0x%x, length: 0x%x, addr: 0x%x, file offset: 0x%llx", |
| 52 | seg.name.c_str(), seg.offset, seg.length, seg.addr, offset); |
| 53 | |
| 54 | if (seg.name == "md1rom") |
| 55 | { |
| 56 | m_mainRomFound = true; |
| 57 | m_mainRom = seg; |
| 58 | } |
| 59 | else if (seg.name == "md1_dbginfo") |
| 60 | { |
| 61 | m_dbgInfoFound = true; |
| 62 | m_dbgInfoSeg = seg; |
| 63 | } |
| 64 | else if (seg.name == "md1_mddb") |
| 65 | { |
| 66 | m_dbgDbFound = true; |
| 67 | m_dbgDatabaseSeg = seg; |
| 68 | } |
| 69 | |
| 70 | offset += (seg.length + seg.offset); |
| 71 | if (offset % 0x10 != 0) |
| 72 | offset = offset - offset % 0x10 + 0x10; |
| 73 | |
| 74 | if (offset >= data->GetLength()) |