GhidraScripts/SetFuncParamByIndexBulk.java

77 lines
2.5 KiB
Java

//Sets function parameters matching a provided regex at a provided index.
//@author DrFrugal
//@category Functions
//@keybinding
//@menupath
//@toolbar bomb
import java.util.List;
import java.util.regex.Pattern;
import ghidra.app.script.GhidraScript;
import ghidra.program.model.data.DataType;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.Parameter;
import ghidra.program.model.symbol.SourceType;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.exception.InvalidInputException;
public class SetFuncParamByIndexBulk extends GhidraScript {
public void run() throws Exception {
Pattern pattern = BulkUtils.askForRegex(this, "entire function name");
List<Function> matchingFunctions = BulkUtils.getFunctionsByRegex(this, pattern);
boolean confirmed = BulkUtils.showFunctionConfirmationDialog(matchingFunctions, "Confirm " + matchingFunctions.size() + " matches", -1, "Please confirm these matches before we proceed.");
if (!confirmed) {
println("Abort: negative confirmation");
return;
}
Integer paramIndex = BulkUtils.askForInteger(this, "Parameter index:");
if(paramIndex == null) {
println("Abort: index couldn't be parsed");
return;
}
DataType paramType = BulkUtils.askForDataType(this, "Parameter type");
if (paramType == null) {
println("Abort: no type selected");
return;
}
String paramName = askString(null, "Parameter name:");
if(!BulkUtils.isValidCParameterName(paramName)) {
println("Abort: invalid C parameter name");
return;
}
int success = 0;
int fail = 0;
for(Function function : matchingFunctions) {
Parameter param = function.getParameter(paramIndex);
if(param == null) {
println("Unable to retrieve parameter in " + function.getName());
fail++;
continue;
}
if(param.isAutoParameter()) {
println("Skipping auto parameter in " + function.getName());
fail++;
continue;
}
try {
param.setName(paramName, SourceType.USER_DEFINED);
success++;
} catch (DuplicateNameException | InvalidInputException e) {
printerr("Failed setting parameter name in " + function.getName());
fail++;
}
}
BulkUtils.printDoneMessage(this, success, fail);
}
}