ghidra/Ghidra/Features/Base/ghidra_scripts/AskValuesExampleScript.java
2025-01-20 23:12:12 +08:00

92 lines
3.8 KiB
Java

/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Example script for showing how to use the "AskValues" script method for inputting multiple values
// @category Examples
import ghidra.app.script.GhidraScript;
import ghidra.features.base.values.GhidraValuesMap;
import ghidra.program.model.listing.Program;
import ghidra.util.MessageType;
public class AskValuesExampleScript extends GhidraScript {
@Override
public void run() throws Exception {
GhidraValuesMap values = new GhidraValuesMap();
values.defineString("Name");
values.defineInt("Count");
values.defineInt("Max Results", 100);
values.defineChoice("Priority", "Low", "Low", "Medium", "High");
values.defineProgram("Other Program");
values.defineProjectFile("Project File");
values.defineProjectFolder("Project Folder");
// Optional validator that can be set to validate values before the dialog returns. It
// is called when the "Ok" button is pushed and must return true before the dialog exits.
// It also includes a statusListener where messages can be set on the dialog. In this
// example, we are requiring that the name and program fields be populated
values.setValidator((valueMap, status) -> {
if (!valueMap.hasValue("Name")) {
status.setStatusText("Name must be filled in!", MessageType.ERROR);
return false;
}
if (!valueMap.hasValue("Other Program")) {
status.setStatusText("Other Program must be filled it!", MessageType.ERROR);
return false;
}
return true;
});
// asks the script to show a dialog where the user can give values for all the items
// in the ValuesMap.
values = askValues("Enter Example Script Values", null, values);
// if the user cancels the ask dialog, the script will exit as cancelled. Otherwise
// the returned ValuesMap will contain the results of the user filling in values from the
//dialog. The values map returned may or may not be the same instance as the one passed in.
String name = values.getString("Name");
int age = values.getInt("Count");
int max = values.getInt("Max Results");
String priority = values.getChoice("Priority");
// When asking for a program, you must supply a consumer that you will use
// to release the program. Since programs share open instances, Ghidra uses
// consumers to keep track of these uses. Scripts can just add themselves
// as the consumer (The askProgram() method does this for you). It is
// important to release it when you are done with it. Optionally, you can also
// provide a tool in which case the program will also be opened in the tool (and the
// tool would then also add itself as a consumer). Otherwise, the program will not
// show up in the tool and when you release the consumer, it will be closed.
// NOTE: if you call getProgram() more than once, the consumer will be added multiple times
// and you must release it multiple times
Program program = values.getProgram("Other Program", this, state.getTool(), true);
println("Name = " + name);
println("Count = " + age);
println("Max Results = " + max);
println("Priority = " + priority);
println("Program = " + program);
// VERY IMPORTANT!!! you must release any programs when you are done with them!
// If you also opened in the tool, you can immediately release it because the tool will
// then keep it open.
program.release(this);
}
}