mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00
GT-3341_emteere_RTTIPerformance code review changes, refactored progress
monitor
This commit is contained in:
parent
b426f065f5
commit
b51a9d7ff4
17 changed files with 357 additions and 231 deletions
|
@ -38,7 +38,7 @@ public abstract class AbstractCreateDataBackgroundCmd<T extends AbstractCreateDa
|
|||
extends BackgroundCommand {
|
||||
|
||||
protected final String name;
|
||||
protected final Address address;
|
||||
private Address address;
|
||||
protected final int count;
|
||||
protected final DataValidationOptions validationOptions;
|
||||
protected final DataApplyOptions applyOptions;
|
||||
|
@ -178,7 +178,7 @@ public abstract class AbstractCreateDataBackgroundCmd<T extends AbstractCreateDa
|
|||
catch (InvalidInputException e) {
|
||||
// Catch the exception and output the error, but still should create
|
||||
// associated data if possible, even though markup failed.
|
||||
handleErrorMessage(program, name, getDataAddress(), getDataAddress(), e);
|
||||
handleErrorMessage(program, name, address, address, e);
|
||||
success = false;
|
||||
}
|
||||
|
||||
|
@ -191,7 +191,7 @@ public abstract class AbstractCreateDataBackgroundCmd<T extends AbstractCreateDa
|
|||
}
|
||||
catch (AddressOutOfBoundsException | CodeUnitInsertionException | DataTypeConflictException
|
||||
| InvalidDataTypeException e) {
|
||||
handleErrorMessage(program, name, getDataAddress(), getDataAddress(), e);
|
||||
handleErrorMessage(program, name, address, address, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -212,8 +212,8 @@ public abstract class AbstractCreateDataBackgroundCmd<T extends AbstractCreateDa
|
|||
throw new CodeUnitInsertionException(
|
||||
"Unable to get data type from model, " + model.getName() + ".");
|
||||
}
|
||||
if (!memory.getLoadedAndInitializedAddressSet().contains(getDataAddress())) {
|
||||
String message = "Can't create an " + dt.getName() + " @ " + getDataAddress() +
|
||||
if (!memory.getLoadedAndInitializedAddressSet().contains(address)) {
|
||||
String message = "Can't create an " + dt.getName() + " @ " + address +
|
||||
" which isn't in loaded and initialized memory for " + program.getName();
|
||||
throw new CodeUnitInsertionException(message);
|
||||
}
|
||||
|
@ -229,15 +229,14 @@ public abstract class AbstractCreateDataBackgroundCmd<T extends AbstractCreateDa
|
|||
monitor.checkCanceled();
|
||||
|
||||
// Is the data type already applied at the address?
|
||||
if (matchingDataExists(dt, program, getDataAddress())) {
|
||||
if (matchingDataExists(dt, program, address)) {
|
||||
return;
|
||||
}
|
||||
|
||||
monitor.checkCanceled();
|
||||
|
||||
// Create data at the address using the datatype.
|
||||
DataUtilities.createData(program, getDataAddress(), dt, dt.getLength(), false,
|
||||
getClearDataMode());
|
||||
DataUtilities.createData(program, address, dt, dt.getLength(), false, getClearDataMode());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -362,7 +361,17 @@ public abstract class AbstractCreateDataBackgroundCmd<T extends AbstractCreateDa
|
|||
*
|
||||
* @return the address of the data item being created.
|
||||
*/
|
||||
protected Address getDataAddress() {
|
||||
final protected Address getDataAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the address of the data item to be applied.
|
||||
* Can be used for sub classes that need to apply multiple data items.
|
||||
*
|
||||
* @param addr set the current data address
|
||||
*/
|
||||
final protected void setDataAddress(Address addr) {
|
||||
address = addr;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,8 +42,6 @@ public class CreateRtti4BackgroundCmd extends AbstractCreateDataBackgroundCmd<Rt
|
|||
private List<MemoryBlock> vfTableBlocks;
|
||||
private List<Address> rtti4Locations;
|
||||
|
||||
private Address currentProcessingAddress;
|
||||
|
||||
/**
|
||||
* Constructs a command for applying an RTTI4 dataType at an address.
|
||||
* @param address the address where the data should be created using the data type.
|
||||
|
@ -79,14 +77,14 @@ public class CreateRtti4BackgroundCmd extends AbstractCreateDataBackgroundCmd<Rt
|
|||
List<Address> goodRtti4Locations = new ArrayList<Address>();
|
||||
boolean succeeded = false;
|
||||
for (Address addr : rtti4Locations) {
|
||||
currentProcessingAddress = addr;
|
||||
setDataAddress(addr);
|
||||
succeeded |= super.doApplyTo(program, taskMonitor);
|
||||
goodRtti4Locations.add(addr);
|
||||
}
|
||||
|
||||
// if any succeeded and should create associated data, make the vftables all at one time
|
||||
if (succeeded && applyOptions.shouldFollowData()) {
|
||||
createaAssociatedVfTables(program, goodRtti4Locations, taskMonitor);
|
||||
createAssociatedVfTables(program, goodRtti4Locations, taskMonitor);
|
||||
}
|
||||
|
||||
return succeeded;
|
||||
|
@ -147,7 +145,7 @@ public class CreateRtti4BackgroundCmd extends AbstractCreateDataBackgroundCmd<Rt
|
|||
return cmd.applyTo(model.getProgram(), monitor);
|
||||
}
|
||||
|
||||
private boolean createaAssociatedVfTables(Program program, List<Address> goodRtti4Locations,
|
||||
private boolean createAssociatedVfTables(Program program, List<Address> goodRtti4Locations,
|
||||
TaskMonitor taskMonitor) throws CancelledException {
|
||||
|
||||
MemoryBytePatternSearcher searcher = new MemoryBytePatternSearcher("RTTI4 Vftables");
|
||||
|
@ -159,10 +157,6 @@ public class CreateRtti4BackgroundCmd extends AbstractCreateDataBackgroundCmd<Rt
|
|||
byte[] bytes = ProgramMemoryUtil.getDirectAddressBytes(program, rtti4Address);
|
||||
|
||||
addByteSearchPattern(searcher, foundVFtables, rtti4Address, bytes);
|
||||
|
||||
bytes = ProgramMemoryUtil.getShiftedDirectAddressBytes(program, rtti4Address);
|
||||
|
||||
addByteSearchPattern(searcher, foundVFtables, rtti4Address, bytes);
|
||||
}
|
||||
|
||||
AddressSet searchSet = new AddressSet();
|
||||
|
@ -256,10 +250,9 @@ public class CreateRtti4BackgroundCmd extends AbstractCreateDataBackgroundCmd<Rt
|
|||
|
||||
// Plate Comment
|
||||
// Plate Comment
|
||||
EHDataTypeUtilities.createPlateCommentIfNeeded(program,
|
||||
RttiUtil.CONST_PREFIX + RttiUtil.getDescriptorTypeNamespace(rtti0Model) +
|
||||
Namespace.DELIMITER,
|
||||
RTTI_4_NAME, null, getDataAddress(), applyOptions);
|
||||
EHDataTypeUtilities.createPlateCommentIfNeeded(program, RttiUtil.CONST_PREFIX +
|
||||
RttiUtil.getDescriptorTypeNamespace(rtti0Model) + Namespace.DELIMITER, RTTI_4_NAME,
|
||||
null, getDataAddress(), applyOptions);
|
||||
monitor.checkCanceled();
|
||||
|
||||
// Label
|
||||
|
@ -271,15 +264,4 @@ public class CreateRtti4BackgroundCmd extends AbstractCreateDataBackgroundCmd<Rt
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creating RTTI4 tables handles creating multiple tables at once.
|
||||
* The generic base class that handles getting the address will get the RTTI4 tabl address.
|
||||
*
|
||||
* @return the current address to process
|
||||
*/
|
||||
@Override
|
||||
protected Address getDataAddress() {
|
||||
return currentProcessingAddress;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -240,12 +240,6 @@ public class RttiAnalyzer extends AbstractAnalyzer {
|
|||
// 32-bit could have direct address in memory
|
||||
bytes = ProgramMemoryUtil.getDirectAddressBytes(program, rtti0Address);
|
||||
|
||||
addByteSearchPattern(searcher, validationOptions, addresses, rtti0PointerOffset,
|
||||
rtti0Address, bytes);
|
||||
|
||||
// or referenced by a shifted pointer based on program data organization shift amount
|
||||
bytes = ProgramMemoryUtil.getShiftedDirectAddressBytes(program, rtti0Address);
|
||||
|
||||
addByteSearchPattern(searcher, validationOptions, addresses, rtti0PointerOffset,
|
||||
rtti0Address, bytes);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue