2024-01-22 05:51:31 +01:00
//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 {
2024-02-11 20:20:19 +01:00
List < Function > matchingFunctions = BulkUtils . getFunctions ( this ) ;
2024-01-22 05:51:31 +01:00
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 ) ;
}
}