diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51Library.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51Library.java index a55addbc34..c1cf7643a2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51Library.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51Library.java @@ -19,92 +19,54 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import ghidra.app.util.bin.BinaryReader; -import ghidra.app.util.bin.format.omf.*; -import ghidra.app.util.bin.format.omf.omf.OmfLibraryRecord.MemberHeader; -import ghidra.program.model.data.*; -import ghidra.util.Msg; -import ghidra.util.exception.DuplicateNameException; +import ghidra.app.util.bin.format.omf.OmfException; +import ghidra.app.util.bin.format.omf.OmfString; public class Omf51Library { - private Omf51RecordFactory factory; - private ArrayList members = new ArrayList<>(); + private List members = new ArrayList<>(); + + public record MemberHeader(long offset, long size, String name) {} - public static class MemberHeader { - public long offset; - public long size; - public String name; - } - /** * Creates a new {@link Omf51Library} * - * @param reader A {@link BinaryReader} positioned at the start of the record - */ - public Omf51Library(Omf51RecordFactory factory) { - this.factory = factory; - } - - /** - * Attempts to parse OMF-51 library members - * + * @param factory A {@link Omf51RecordFactory} * @throws IOException if an IO-related error occurred * @throws OmfException if the required OMF-51 records could not be read */ - public void parseMembers() throws IOException, OmfException { - OmfRecord record = factory.readNextRecord(); - - if (record == null || !(record instanceof Omf51LibraryHeaderRecord)) { + public Omf51Library(Omf51RecordFactory factory) throws OmfException, IOException { + if (!(factory.readNextRecord() instanceof Omf51LibraryHeaderRecord libraryHeader)) { throw new OmfException("Unable to read library header record"); } - Omf51LibraryHeaderRecord libraryHeader = (Omf51LibraryHeaderRecord)record; - factory.getReader().setPointerIndex(libraryHeader.getModNamesOffset()); - record = factory.readNextRecord(); - - if (record == null || !(record instanceof Omf51LibraryModuleNamesRecord)) { + if (!(factory.readNextRecord() instanceof Omf51LibraryModuleNamesRecord modNamesRecord)) { throw new OmfException("Unable to read library module names record"); } - Omf51LibraryModuleNamesRecord modNamesRecord = (Omf51LibraryModuleNamesRecord)record; - - record = factory.readNextRecord(); - - if (record == null || !(record instanceof Omf51LibraryModuleLocationsRecord)) { + if (!(factory.readNextRecord() instanceof Omf51LibraryModuleLocationsRecord modLocations)) { throw new OmfException("Unable to read library module locations record"); } - Omf51LibraryModuleLocationsRecord modLocations = (Omf51LibraryModuleLocationsRecord)record; List locations = modLocations.getLocations(); int index = 0; - Msg.info(this, "Iterating mod names"); for (OmfString moduleName : modNamesRecord.getNames()) { - int size = 0; - if (index + 1 < locations.size()) { - size = locations.get(index + 1).getOffset() - locations.get(index).getOffset(); - } else { - size = libraryHeader.getModNamesOffset() - locations.get(index).getOffset(); - } - - MemberHeader header = new MemberHeader(); - header.name = moduleName.str(); - header.size = size; - header.offset = locations.get(index).getOffset(); - - members.add(header); - + int currentOffset = locations.get(index).getOffset(); + int nextOffset = index + 1 < locations.size() ? locations.get(index + 1).getOffset() + : libraryHeader.getModNamesOffset(); + int size = nextOffset - currentOffset; + members.add(new MemberHeader(currentOffset, size, moduleName.str())); index++; } } - + /** * {@return the list of members} */ - public ArrayList getMembers() { + public List getMembers() { return members; } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryDictionaryRecord.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryDictionaryRecord.java index 32de250a3f..48a2f67cd6 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryDictionaryRecord.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryDictionaryRecord.java @@ -16,8 +16,8 @@ package ghidra.app.util.bin.format.omf.omf51; import java.io.IOException; -import java.util.List; import java.util.ArrayList; +import java.util.List; import ghidra.app.util.bin.BinaryReader; import ghidra.app.util.bin.format.omf.*; @@ -27,9 +27,9 @@ import ghidra.util.exception.DuplicateNameException; public class Omf51LibraryDictionaryRecord extends OmfRecord { private List> moduleSymbolMap = new ArrayList<>(); - + /** - * Creates a new {@link Omf51LibraryDictionaryRecord} record + * Creates a new {@link Omf51LibraryDictionaryRecord} * * @param reader A {@link BinaryReader} positioned at the start of the record * @throws IOException if an IO-related error occurred @@ -48,10 +48,10 @@ public class Omf51LibraryDictionaryRecord extends OmfRecord { dataReader.readNextByte(); moduleSymbolMap.add(symbols); symbols = new ArrayList<>(); - continue; } - - symbols.add(OmfUtils.readString(dataReader)); + else { + symbols.add(OmfUtils.readString(dataReader)); + } } } @@ -63,7 +63,8 @@ public class Omf51LibraryDictionaryRecord extends OmfRecord { Integer moduleIndex = 0; for (List symbols : moduleSymbolMap) { for (OmfString symbol : symbols) { - struct.add(symbol.toDataType(), symbol.getDataTypeSize(), "symbol%d".formatted(moduleIndex), null); + struct.add(symbol.toDataType(), symbol.getDataTypeSize(), + "symbol%d".formatted(moduleIndex), null); } struct.add(BYTE, "terminator%d".formatted(moduleIndex), null); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryHeaderRecord.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryHeaderRecord.java index 6cbe0f22ae..cef6fc758a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryHeaderRecord.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryHeaderRecord.java @@ -16,11 +16,9 @@ package ghidra.app.util.bin.format.omf.omf51; import java.io.IOException; -import java.util.ArrayList; import ghidra.app.util.bin.BinaryReader; import ghidra.app.util.bin.format.omf.*; -import ghidra.app.util.bin.format.omf.omf.OmfLibraryRecord.MemberHeader; import ghidra.program.model.data.*; import ghidra.util.exception.DuplicateNameException; @@ -31,7 +29,7 @@ public class Omf51LibraryHeaderRecord extends OmfRecord { private short moduleCount; private short blockNumber; private short byteNumber; - + /** * Creates a new {@link Omf51LibraryHeaderRecord} record * diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleLocation.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleLocation.java index c4a47f6d47..13e1a81fcf 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleLocation.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleLocation.java @@ -19,9 +19,8 @@ import java.io.IOException; import ghidra.app.util.bin.BinaryReader; import ghidra.app.util.bin.StructConverter; -import ghidra.app.util.bin.format.omf.*; +import ghidra.app.util.bin.format.omf.OmfUtils; import ghidra.program.model.data.*; -import ghidra.util.exception.DuplicateNameException; public class Omf51LibraryModuleLocation { @@ -62,7 +61,7 @@ public class Omf51LibraryModuleLocation { return (blockNumber * BLOCK_SIZE) + byteNumber; } - public static DataType toDataType() throws DuplicateNameException, IOException { + public static DataType toDataType() { StructureDataType struct = new StructureDataType("Omf51LibraryModuleLocation", 0); struct.add(StructConverter.WORD, "blockNumber", null); struct.add(StructConverter.WORD, "byteNumber", null); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleLocationsRecord.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleLocationsRecord.java index 6542d44e08..9632f4eafd 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleLocationsRecord.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleLocationsRecord.java @@ -27,7 +27,7 @@ import ghidra.util.exception.DuplicateNameException; public class Omf51LibraryModuleLocationsRecord extends OmfRecord { private List locations = new ArrayList<>(); - + /** * Creates a new {@link Omf51LibraryModuleLocationsRecord} record * @@ -50,8 +50,7 @@ public class Omf51LibraryModuleLocationsRecord extends OmfRecord { StructureDataType struct = new StructureDataType(Omf51RecordTypes.getName(recordType), 0); struct.add(BYTE, "type", null); struct.add(WORD, "length", null); - - struct.add(new ArrayDataType(Omf51LibraryModuleLocation.toDataType(), locations.size()), + struct.add(new ArrayDataType(Omf51LibraryModuleLocation.toDataType(), locations.size()), "locations", null); struct.add(BYTE, "checksum", null); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleNamesRecord.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleNamesRecord.java index 71f26d314c..f42e2d3492 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleNamesRecord.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/omf/omf51/Omf51LibraryModuleNamesRecord.java @@ -27,7 +27,7 @@ import ghidra.util.exception.DuplicateNameException; public class Omf51LibraryModuleNamesRecord extends OmfRecord { private List names = new ArrayList<>(); - + /** * Creates a new {@link Omf51LibraryModuleNamesRecord} record * diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/Omf51Loader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/Omf51Loader.java index e33732b2ff..66edcdb1d2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/Omf51Loader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/Omf51Loader.java @@ -338,7 +338,6 @@ public class Omf51Loader extends AbstractProgramWrapperLoader { if (record instanceof Omf51PublicDefsRecord publicDefRec) { for (Omf51PublicDef def : publicDefRec.getDefinitions()) { if (def.getUsageType() == Omf51PublicDef.NUMBER) { - log.appendMsg("Skipping NUMBER public def"); continue; } Address segmentAddr = segmentToAddr.get(def.getSegId()); diff --git a/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/omf51/Omf51ArchiveFileSystem.java b/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/omf51/Omf51ArchiveFileSystem.java index ae35d7f381..09d1ca92b4 100644 --- a/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/omf51/Omf51ArchiveFileSystem.java +++ b/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/omf51/Omf51ArchiveFileSystem.java @@ -18,19 +18,24 @@ package ghidra.file.formats.omf51; import static ghidra.formats.gfilesystem.fileinfo.FileAttributeType.*; import java.io.IOException; -import java.util.ArrayList; +import java.util.List; import ghidra.app.util.bin.ByteProvider; import ghidra.app.util.bin.ByteProviderWrapper; import ghidra.app.util.bin.format.omf.OmfException; -import ghidra.app.util.bin.format.omf.omf51.*; +import ghidra.app.util.bin.format.omf.omf51.Omf51Library; +import ghidra.app.util.bin.format.omf.omf51.Omf51RecordFactory; import ghidra.formats.gfilesystem.*; import ghidra.formats.gfilesystem.annotations.FileSystemInfo; import ghidra.formats.gfilesystem.fileinfo.FileAttributes; -import ghidra.util.Msg; +import ghidra.util.exception.CancelledException; import ghidra.util.task.TaskMonitor; -@FileSystemInfo(type = "omf51", description = "OMF51 Library", factory = Omf51ArchiveFileSystemFactory.class) +@FileSystemInfo( + type = "omf51", + description = "OMF51 Library", + factory = Omf51ArchiveFileSystemFactory.class +) public class Omf51ArchiveFileSystem extends AbstractFileSystem { private ByteProvider provider; @@ -40,18 +45,15 @@ public class Omf51ArchiveFileSystem extends AbstractFileSystem members = library.getMembers(); - - Msg.debug(this, "Found %d members".formatted(members.size())); + List members = new Omf51Library(factory).getMembers(); + monitor.initialize(members.size(), "Opening OMF51 library..."); for (Omf51Library.MemberHeader member : members) { - Msg.debug(this, member.name); - fsIndex.storeFile(member.name, fsIndex.getFileCount(), false, member.size, member); + monitor.increment(); + fsIndex.storeFile(member.name(), fsIndex.getFileCount(), false, member.size(), member); } } @@ -74,7 +76,7 @@ public class Omf51ArchiveFileSystem extends AbstractFileSystem