FunctionNavigator.java•4.22 kB
package com.ghidramcp.services;
import ghidra.app.services.CodeViewerService;
import ghidra.app.services.ProgramManager;
import ghidra.framework.plugintool.PluginTool;
import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.Program;
import ghidra.program.util.ProgramLocation;
/**
* Service for navigating and querying function information in Ghidra programs
*/
public class FunctionNavigator {
private final PluginTool tool;
public FunctionNavigator(PluginTool tool) {
this.tool = tool;
}
/**
* Get function information by address
* @param addressStr Address as string
* @return Function information or error message
*/
public String getFunctionByAddress(String addressStr) {
Program program = getCurrentProgram();
if (program == null) return "No program loaded";
if (addressStr == null || addressStr.isEmpty()) return "Address is required";
try {
Address addr = program.getAddressFactory().getAddress(addressStr);
Function func = program.getFunctionManager().getFunctionAt(addr);
if (func == null) return "No function found at address " + addressStr;
return String.format("Function: %s at %s\nSignature: %s\nEntry: %s\nBody: %s - %s",
func.getName(),
func.getEntryPoint(),
func.getSignature(),
func.getEntryPoint(),
func.getBody().getMinAddress(),
func.getBody().getMaxAddress());
} catch (Exception e) {
return "Error getting function: " + e.getMessage();
}
}
/**
* Get the current address from the code viewer
* @return Current address as string
*/
public String getCurrentAddress() {
CodeViewerService service = tool.getService(CodeViewerService.class);
if (service == null) return "Code viewer service not available";
ProgramLocation location = service.getCurrentLocation();
return (location != null) ? location.getAddress().toString() : "No current location";
}
/**
* Get the current function from the code viewer
* @return Current function information or error message
*/
public String getCurrentFunction() {
CodeViewerService service = tool.getService(CodeViewerService.class);
if (service == null) return "Code viewer service not available";
ProgramLocation location = service.getCurrentLocation();
if (location == null) return "No current location";
Program program = getCurrentProgram();
if (program == null) return "No program loaded";
Function func = program.getFunctionManager().getFunctionContaining(location.getAddress());
if (func == null) return "No function at current location: " + location.getAddress();
return String.format("Function: %s at %s\nSignature: %s",
func.getName(),
func.getEntryPoint(),
func.getSignature());
}
/**
* Get function at or containing an address
* @param program The program to search in
* @param addr The address to search
* @return Function at or containing the address, or null
*/
public Function getFunctionForAddress(Program program, Address addr) {
Function func = program.getFunctionManager().getFunctionAt(addr);
if (func == null) {
func = program.getFunctionManager().getFunctionContaining(addr);
}
return func;
}
/**
* Convert a long address to an Address object
* @param address Address as long
* @return Address object
*/
public Address getAddressFromLong(long address) {
Program program = getCurrentProgram();
String hexAddr = Long.toHexString(address);
return program.getAddressFactory().getAddress(hexAddr);
}
/**
* Get the currently active program
* @return Current program or null
*/
public Program getCurrentProgram() {
ProgramManager pm = tool.getService(ProgramManager.class);
return pm != null ? pm.getCurrentProgram() : null;
}
}