mirror of
https://github.com/grumpycoders/pcsx-redux.git
synced 2025-04-02 10:41:54 -04:00
79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
"""
|
|
# Improved version of "export_to_redux.py" script by Nicolas
|
|
# that supports overlays filtering with GUI component
|
|
# Usage:
|
|
# 1. Run the script.
|
|
# 2. Paste the main function address.
|
|
# 3. Select PCSX-Redux Folder.
|
|
# 4. Select the overlays you need, the only selected overlays symbols will be exported.
|
|
"""
|
|
#@author Nicolas "Pixel" Noble
|
|
#@author acemon33
|
|
|
|
import os
|
|
from ghidra.program.model.data import DataType, Pointer, Structure
|
|
|
|
|
|
selected_overlays = []
|
|
memory_block_list = []
|
|
filter_list = []
|
|
|
|
|
|
def find_overlays():
|
|
for mem in currentProgram.getMemory().getBlocks():
|
|
if mem.isOverlay():
|
|
memory_block_list.append(mem.getName())
|
|
|
|
|
|
def filter_memory_block():
|
|
for memory_block_name in selected_overlays:
|
|
filter_list.append(memory_block_name + '::')
|
|
|
|
|
|
def print_overlays():
|
|
for i in range(0, len(memory_block_list)):
|
|
print(i + 1, memory_block_list[i])
|
|
|
|
|
|
main_address = int(str(askAddress("Enter the main Address", "Address")), 16)
|
|
root_dir = askDirectory("Select PCSX-Redux Directory", "Select")
|
|
fm = currentProgram.getFunctionManager()
|
|
dtm = currentProgram.getDataTypeManager()
|
|
|
|
find_overlays()
|
|
selected_overlays = askChoices("Title", "Message", memory_block_list);
|
|
|
|
filter_memory_block()
|
|
print('main: ', hex(main_address))
|
|
print('Selected Modules : ', selected_overlays)
|
|
|
|
filename = os.path.join(str(root_dir), 'redux_data_types.txt')
|
|
with open(filename, 'w') as f:
|
|
# @todo: enums, typedefs, etc.
|
|
for data_type in dtm.getAllStructures():
|
|
dt_info = data_type.getName() + ';'
|
|
for component in data_type.getComponents():
|
|
type_name = component.getDataType().getName()
|
|
field_name = component.getFieldName()
|
|
if field_name == None:
|
|
field_name = 'None'
|
|
field_length = str(component.getLength())
|
|
dt_info += type_name + ',' + field_name + ',' + field_length + ';'
|
|
f.write(dt_info + '\n')
|
|
|
|
filename = os.path.join(str(root_dir), 'redux_funcs.txt')
|
|
with open(filename, 'w') as f:
|
|
for func in fm.getFunctions(toAddr(main_address), True):
|
|
entry_point = func.getEntryPoint().toString()
|
|
in_overlay = entry_point.find('::')
|
|
if (in_overlay == -1) or (entry_point[:in_overlay+2] in filter_list):
|
|
num_addr = int(entry_point.split(':')[-1], 16)
|
|
func_info = entry_point.split(':')[-1] + ';' + func.getName() + ';'
|
|
for param in func.getParameters():
|
|
data_type_name = param.getDataType().getName()
|
|
if data_type_name.__contains__('undefined'):
|
|
data_type_name = 'int'
|
|
func_info += data_type_name + ',' + param.getName() + ',' + str(param.getLength()) + ';'
|
|
f.write(func_info + '\n')
|
|
|
|
popup('Finish')
|