75 lines
2.3 KiB
Java
75 lines
2.3 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 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 {
|
|
|
|
List<Function> matchingFunctions = BulkUtils.getFunctions(this);
|
|
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);
|
|
|
|
}
|
|
|
|
}
|