//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 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); } }