From b026a5f53ac8642a84b82a5675420be22fe70536 Mon Sep 17 00:00:00 2001 From: ghidra007 Date: Thu, 14 Apr 2022 21:35:13 +0000 Subject: [PATCH 1/2] GP-1660 updated ApplyFunctionDef script to get selected func defs from dtman. --- ...yClassFunctionDefinitionUpdatesScript.java | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/ApplyClassFunctionDefinitionUpdatesScript.java b/Ghidra/Features/Decompiler/ghidra_scripts/ApplyClassFunctionDefinitionUpdatesScript.java index 3c3da03bb0..b00a5c35f9 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/ApplyClassFunctionDefinitionUpdatesScript.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/ApplyClassFunctionDefinitionUpdatesScript.java @@ -33,11 +33,9 @@ import java.util.List; import classrecovery.RecoveredClassHelper; import ghidra.app.script.GhidraScript; -import ghidra.program.model.data.FunctionDefinition; -import ghidra.program.model.data.Structure; +import ghidra.app.services.DataTypeManagerService; +import ghidra.program.model.data.*; import ghidra.program.model.listing.Function; -import ghidra.program.model.symbol.Namespace; -import ghidra.program.model.symbol.Symbol; public class ApplyClassFunctionDefinitionUpdatesScript extends GhidraScript { @Override @@ -51,28 +49,35 @@ public class ApplyClassFunctionDefinitionUpdatesScript extends GhidraScript { RecoveredClassHelper classHelper = new RecoveredClassHelper(currentProgram, currentLocation, state.getTool(), this, false, false, false, false, monitor); - Namespace classNamespace = classHelper.getClassNamespace(currentAddress); - if (classNamespace == null) { - println( - "Either cannot retrieve class namespace or cursor is not in a member of a class namepace"); + DataTypeManagerService dtms = state.getTool().getService(DataTypeManagerService.class); + List selectedDatatypes = dtms.getSelectedDatatypes(); + if (selectedDatatypes.size() == 0) { + println("Please select the class function definition(s) you wish to apply."); return; } - List classVftableSymbols = classHelper.getClassVftableSymbols(classNamespace); - if (classVftableSymbols.isEmpty()) { - println("There are no vftables in this class"); - return; + List classFunctionDefinitions = new ArrayList(); + for (DataType selectedDataType : selectedDatatypes) { + monitor.checkCanceled(); + + if (!(selectedDataType instanceof FunctionDefinition)) { + continue; + } + + FunctionDefinition functionDefinition = (FunctionDefinition) selectedDataType; + String pathName = functionDefinition.getPathName(); + if (!pathName.contains("ClassDataTypes")) { + continue; + } + classFunctionDefinitions.add(functionDefinition); } - println( - "Applying differing function definitions for class " + classNamespace.getName(true)); - - List classFunctionDefinitions = - classHelper.getClassFunctionDefinitions(classNamespace); if (classFunctionDefinitions.isEmpty()) { - println("Class " + classNamespace.getName() + " has no function definitions to apply."); + println( + "Selected function definition(s) must be in a subfolder of the ClassDataTypes folder in the DataTypeManager."); return; } + List changedItems = new ArrayList(); for (FunctionDefinition functionDef : classFunctionDefinitions) { @@ -84,14 +89,9 @@ public class ApplyClassFunctionDefinitionUpdatesScript extends GhidraScript { } - if (changedItems == null) { - println("Class " + classNamespace.getName() + " has no function definitions to apply."); - return; - } - - if (changedItems.isEmpty()) { - println("No differences found for class " + classNamespace.getName(true) + - " between its function definition data types and the associated function signatures in the listing."); + if (changedItems == null || changedItems.isEmpty()) { + println( + "There were no differences between the selected function definitions and the items that could be updated."); return; } From 40248f7157b1b217c4cbaebc0d3aece34f9840b5 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:03:36 -0400 Subject: [PATCH 2/2] GP-1660 - fixed Swing thread access issue; fixed improper test names --- .../plugin/core/datamgr/DataTypeManagerPlugin.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeManagerPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeManagerPlugin.java index 797304dd7b..438a68c18b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeManagerPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeManagerPlugin.java @@ -60,8 +60,7 @@ import ghidra.program.model.address.AddressSetView; import ghidra.program.model.data.*; import ghidra.program.model.listing.DataTypeArchive; import ghidra.program.model.listing.Program; -import ghidra.util.HelpLocation; -import ghidra.util.Msg; +import ghidra.util.*; import ghidra.util.datastruct.LRUMap; import ghidra.util.task.TaskLauncher; @@ -612,9 +611,11 @@ public class DataTypeManagerPlugin extends ProgramPlugin @Override public void setDataTypeSelected(DataType dataType) { - if (provider.isVisible()) { - provider.setDataTypeSelected(dataType); - } + Swing.runIfSwingOrRunLater(() -> { + if (provider.isVisible()) { + provider.setDataTypeSelected(dataType); + } + }); } @Override