diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java index f24230306d..b2f8764c48 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java @@ -25,8 +25,7 @@ import ghidra.app.cmd.label.DemanglerCmd; import ghidra.app.plugin.core.analysis.ReferenceAddressPair; import ghidra.app.util.NamespaceUtils; import ghidra.app.util.PseudoDisassembler; -import ghidra.app.util.demangler.DemangledObject; -import ghidra.app.util.demangler.DemanglerUtil; +import ghidra.app.util.demangler.*; import ghidra.framework.plugintool.ServiceProvider; import ghidra.program.flatapi.FlatProgramAPI; import ghidra.program.model.address.*; @@ -2859,7 +2858,7 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { } mangledLabel = "_ZTS" + mangledLabel; - if (!isTypeinfoNameString(mangledLabel)) { + if (!isTypeinfoNameString(mangledLabel, typeinfoNameAddress)) { return null; } @@ -3029,15 +3028,27 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { return true; } - private boolean isTypeinfoNameString(String string) { + private boolean isTypeinfoNameString(String string, Address address) { - DemangledObject demangledObject = DemanglerUtil.demangle(string); - if (demangledObject == null) { + List demangledObjects = DemanglerUtil.demangle(program, string, address); + if (demangledObjects == null || demangledObjects.isEmpty()) { return false; } - if (demangledObject.getName().equals("typeinfo-name")) { - return true; + for (DemangledObject demangledObject : demangledObjects) { + + DemanglerOptions options = demangledObject.getMangledContext().getOptions(); + + // Currently no good way to do this since this is in Decompiler package and GnuDemangler + // is in its own package. Once no longer a script but an analyzer in Base, update to + // do !(options instanceof GnuDemanglerOptions) + if (!options.toString().contains("gnu")) { + continue; + } + + if (demangledObject.getName().equals("typeinfo-name")) { + return true; + } } return false; } diff --git a/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/RttiUtil.java b/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/RttiUtil.java index cbfb24b266..34add83b2d 100644 --- a/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/RttiUtil.java +++ b/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/rtti/RttiUtil.java @@ -23,8 +23,10 @@ import ghidra.app.cmd.data.TypeDescriptorModel; import ghidra.app.util.NamespaceUtils; import ghidra.app.util.PseudoDisassembler; import ghidra.app.util.datatype.microsoft.MSDataTypeUtils; +import ghidra.app.util.demangler.DemangledException; import ghidra.app.util.demangler.DemangledObject; -import ghidra.app.util.demangler.DemanglerUtil; +import ghidra.app.util.demangler.microsoft.MicrosoftDemangler; +import ghidra.app.util.demangler.microsoft.MicrosoftMangledContext; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressSetView; import ghidra.program.model.listing.*; @@ -82,16 +84,22 @@ public class RttiUtil { } // check for similar symbol + MicrosoftDemangler demangler = new MicrosoftDemangler(); DemangledObject matchingDemangledObject = null; SymbolIterator symbols = symbolTable.getSymbolsAsIterator(rttiAddress); for (Symbol symbol : symbols) { String name = symbol.getName(); - - // if mangled get the matching demangled object if there is one and save for after loop - // in case symbols are not demangled yet - DemangledObject demangledObject = DemanglerUtil.demangle(name); - if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) { - matchingDemangledObject = demangledObject; + try { + MicrosoftMangledContext mangledContext = + demangler.createMangledContext(name, null, program, symbol.getAddress()); + DemangledObject demangledObject = demangler.demangle(mangledContext); + if (demangledObject != null && demangledObject.getName().contains(rttiSuffix)) { + matchingDemangledObject = demangledObject; + continue; + } + } + catch (DemangledException e) { + // Couldn't demangle. continue; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/action/KeyBindingsManager.java b/Ghidra/Framework/Docking/src/main/java/docking/action/KeyBindingsManager.java index 06a1626658..4b7b7e00bb 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/action/KeyBindingsManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/action/KeyBindingsManager.java @@ -15,6 +15,7 @@ */ package docking.action; +import java.awt.event.InputEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.*; @@ -102,6 +103,9 @@ public class KeyBindingsManager implements PropertyChangeListener { // map standard keystroke to action doAddKeyBinding(provider, action, keyStroke); + + // map workaround keystroke to action + fixupAltGraphKeyStrokeMapping(provider, action, keyStroke); } public String validateActionKeyBinding(DockingActionIf dockingAction, KeyStroke ks) { @@ -146,6 +150,24 @@ public class KeyBindingsManager implements PropertyChangeListener { doAddKeyBinding(provider, action, keyStroke, keyStroke); } + private void fixupAltGraphKeyStrokeMapping(ComponentProvider provider, DockingActionIf action, + KeyStroke keyStroke) { + + // special case + int modifiers = keyStroke.getModifiers(); + if ((modifiers & InputEvent.ALT_DOWN_MASK) == InputEvent.ALT_DOWN_MASK) { + // + // Also register the 'Alt' binding with the 'Alt Graph' mask. This fixes the but + // on Windows (https://bugs.openjdk.java.net/browse/JDK-8194873) + // that have different key codes for the left and right Alt keys. + // + modifiers |= InputEvent.ALT_GRAPH_DOWN_MASK; + KeyStroke updateKeyStroke = + KeyStroke.getKeyStroke(keyStroke.getKeyCode(), modifiers, false); + doAddKeyBinding(provider, action, updateKeyStroke, keyStroke); + } + } + private void doAddKeyBinding(ComponentProvider provider, DockingActionIf action, KeyStroke mappingKeyStroke, KeyStroke actionKeyStroke) {