Skip to content

Commit

Permalink
Now the loader also loads PsyQ data types archive automatically.
Browse files Browse the repository at this point in the history
  • Loading branch information
Vladimir Kononovich committed Jan 4, 2020
1 parent c30f2a4 commit c9c2c0b
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 37 deletions.
38 changes: 2 additions & 36 deletions src/main/java/psx/PsxAnalyzer.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,17 @@

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import ghidra.app.cmd.function.ApplyFunctionDataTypesCmd;
import ghidra.app.plugin.core.analysis.AutoAnalysisManager;
import ghidra.app.plugin.core.datamgr.archive.DuplicateIdException;
import ghidra.app.services.AbstractAnalyzer;
import ghidra.app.services.AnalyzerType;
import ghidra.app.services.DataTypeManagerService;
import ghidra.app.util.importer.MessageLog;
import ghidra.framework.Application;
import ghidra.program.model.address.AddressRange;
import ghidra.program.model.address.AddressRangeIterator;
import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.data.DataTypeManager;
import ghidra.program.model.listing.Program;
import ghidra.program.model.symbol.SourceType;
import ghidra.util.task.TaskMonitor;
import pat.PatParser;

Expand Down Expand Up @@ -80,41 +72,15 @@ public boolean added(Program program, AddressSetView set, TaskMonitor monitor, M

String gdtName = String.format("psyq%s", psyqVersion);

closePsyqDataTypeArchives(program, gdtName);

DataTypeManagerService srv = AutoAnalysisManager.getAnalysisManager(program).getDataTypeManagerService();
DataTypeManager mgrPsyq = srv.openDataTypeArchive(gdtName);

if (mgrPsyq != null) {
applyDataTypes(program, set, mgrPsyq, monitor);
}
PsxLoader.closePsyqDataTypeArchives(program, gdtName);
PsxLoader.loadPsyqArchive(program, gdtName, set, monitor, log);

monitor.setMessage("Applying PsyQ functions and data types done.");
} catch (IOException e) {
log.appendException(e);
return false;
} catch (DuplicateIdException e) {
return true;
}

return true;
}

public static void closePsyqDataTypeArchives(Program program, String currVer) {
DataTypeManagerService srv = AutoAnalysisManager.getAnalysisManager(program).getDataTypeManagerService();
DataTypeManager[] mgrs = srv.getDataTypeManagers();

for (DataTypeManager mgr : mgrs) {
if (!mgr.getName().contains(currVer)) {
srv.closeArchive(mgr);
}
}
}

private static void applyDataTypes(Program program, AddressSetView set, DataTypeManager mgr, TaskMonitor monitor) {
List<DataTypeManager> gdtList = new ArrayList<>();
gdtList.add(mgr);
ApplyFunctionDataTypesCmd cmd = new ApplyFunctionDataTypesCmd(gdtList, set, SourceType.ANALYSIS, true, false);
cmd.applyTo(program, monitor);
}
}
58 changes: 58 additions & 0 deletions src/main/java/psx/PsxLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@

import docking.widgets.OptionDialog;
import ghidra.app.cmd.disassemble.DisassembleCommand;
import ghidra.app.cmd.function.ApplyFunctionDataTypesCmd;
import ghidra.app.cmd.function.CreateFunctionCmd;
import ghidra.app.plugin.core.analysis.AutoAnalysisManager;
import ghidra.app.plugin.core.datamgr.archive.DuplicateIdException;
import ghidra.app.services.DataTypeManagerService;
import ghidra.app.util.Option;
import ghidra.app.util.bin.BinaryReader;
import ghidra.app.util.bin.ByteProvider;
Expand All @@ -42,7 +46,9 @@
import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressOutOfBoundsException;
import ghidra.program.model.address.AddressOverflowException;
import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.data.DataType;
import ghidra.program.model.data.DataTypeManager;
import ghidra.program.model.data.DataUtilities;
import ghidra.program.model.data.PointerDataType;
import ghidra.program.model.data.DataUtilities.ClearDataMode;
Expand Down Expand Up @@ -244,6 +250,10 @@ protected void load(ByteProvider provider, LoadSpec loadSpec, List<Option> optio
addPsyqVerOption(program, ramBase, log);
}

public static DataTypeManagerService getDataTypeManagerService(Program program) {
return AutoAnalysisManager.getAnalysisManager(program).getDataTypeManagerService();
}

private static void addPsyqVerOption(Program program, long searchBase, MessageLog log) {
Memory mem = program.getMemory();

Expand All @@ -262,6 +272,54 @@ private static void addPsyqVerOption(Program program, long searchBase, MessageLo
}
}

public static void closePsyqDataTypeArchives(Program program, String gdtName) {
DataTypeManagerService srv = PsxLoader.getDataTypeManagerService(program);
DataTypeManager[] mgrs = srv.getDataTypeManagers();

for (DataTypeManager mgr : mgrs) {
if (!mgr.getName().contains(gdtName)) {
srv.closeArchive(mgr);
}
}
}

public static void loadPsyqArchive(Program program, String gdtName, AddressSetView set, TaskMonitor monitor, MessageLog log) {
DataTypeManagerService srv = getDataTypeManagerService(program);

if (gdtName.isEmpty()) {
return;
}

try {
DataTypeManager[] mgrs = srv.getDataTypeManagers();

for (DataTypeManager mgr : mgrs) {
if (mgr.getName().equals(gdtName)) {
srv.closeArchive(mgr);
}
}

DataTypeManager mgr = srv.openDataTypeArchive(gdtName);

if (mgr == null) {
throw new IOException(String.format("Cannot find \"%s\" data type archive!", gdtName));
}

if (set != null) {
applyDataTypes(program, set, mgr, monitor);
}
} catch (IOException | DuplicateIdException e) {
log.appendException(e);
}
}

private static void applyDataTypes(Program program, AddressSetView set, DataTypeManager mgr, TaskMonitor monitor) {
List<DataTypeManager> gdtList = new ArrayList<>();
gdtList.add(mgr);
ApplyFunctionDataTypesCmd cmd = new ApplyFunctionDataTypesCmd(gdtList, set, SourceType.ANALYSIS, true, false);
cmd.applyTo(program, monitor);
}

public static String getProgramPsyqVersion(Program program) {
Options opts = program.getOptions(Program.PROGRAM_INFO);
return opts.getString(PsxLoader.PSYQ_VER_OPTION, "").replace(".", "");
Expand Down
6 changes: 5 additions & 1 deletion src/main/java/psx/PsxPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@
import ghidra.app.plugin.PluginCategoryNames;
import ghidra.app.plugin.ProgramPlugin;
import ghidra.app.services.GoToService;
import ghidra.app.util.importer.MessageLog;
import ghidra.framework.plugintool.*;
import ghidra.framework.plugintool.util.PluginStatus;
import ghidra.program.model.listing.Program;
import ghidra.util.task.TaskMonitor;
import psx.debug.DebuggerProvider;
import ghidra.MiscellaneousPluginPackage;

Expand Down Expand Up @@ -56,7 +58,9 @@ public void programActivated(Program program) {
createOmAction();
createDbgAction();

PsxAnalyzer.closePsyqDataTypeArchives(program, PsxLoader.getProgramPsyqVersion(program));
String gdtName = String.format("psyq%s", PsxLoader.getProgramPsyqVersion(program));
PsxLoader.closePsyqDataTypeArchives(program, gdtName);
PsxLoader.loadPsyqArchive(program, gdtName, null, TaskMonitor.DUMMY, new MessageLog());
}
}

Expand Down

0 comments on commit c9c2c0b

Please sign in to comment.