mirror of
https://github.com/isledecomp/isle-portable.git
synced 2025-03-24 13:39:41 -04:00
BETA10 import: Fix FUN_...
collisions (#1105)
* Improve BETA10 name import, refactor * Run formatter --------- Co-authored-by: jonschz <jonschz@users.noreply.github.com>
This commit is contained in:
parent
7a6935a165
commit
f89ee5c13d
3 changed files with 60 additions and 48 deletions
tools/ghidra_scripts
|
@ -21,9 +21,7 @@
|
|||
# Disable spurious warnings in vscode / pylance
|
||||
# pyright: reportMissingModuleSource=false
|
||||
|
||||
from enum import Enum
|
||||
import importlib
|
||||
from dataclasses import dataclass, field
|
||||
import logging.handlers
|
||||
import sys
|
||||
import logging
|
||||
|
@ -53,43 +51,8 @@ def reload_module(module: str):
|
|||
|
||||
|
||||
reload_module("lego_util.statistics")
|
||||
from lego_util.statistics import Statistics
|
||||
|
||||
|
||||
@dataclass
|
||||
class Globals:
|
||||
verbose: bool
|
||||
loglevel: int
|
||||
running_from_ghidra: bool = False
|
||||
# statistics
|
||||
statistics: Statistics = field(default_factory=Statistics)
|
||||
|
||||
|
||||
class SupportedModules(Enum):
|
||||
LEGO1 = 1
|
||||
BETA10 = 2
|
||||
|
||||
def orig_filename(self):
|
||||
if self == self.LEGO1:
|
||||
return "LEGO1.DLL"
|
||||
return "BETA10.DLL"
|
||||
|
||||
def recomp_filename_without_extension(self):
|
||||
# in case we want to support more functions
|
||||
return "LEGO1"
|
||||
|
||||
def build_dir_name(self):
|
||||
if self == self.BETA10:
|
||||
return "build_debug"
|
||||
return "build"
|
||||
|
||||
|
||||
# hard-coded settings that we don't want to prompt in Ghidra every time
|
||||
GLOBALS = Globals(
|
||||
verbose=False,
|
||||
# loglevel=logging.INFO,
|
||||
loglevel=logging.DEBUG,
|
||||
)
|
||||
reload_module("lego_util.globals")
|
||||
from lego_util.globals import GLOBALS, SupportedModules
|
||||
|
||||
|
||||
def setup_logging():
|
||||
|
@ -232,24 +195,24 @@ def main():
|
|||
origfile_name = getProgramFile().getName()
|
||||
|
||||
if origfile_name == "LEGO1.DLL":
|
||||
module = SupportedModules.LEGO1
|
||||
GLOBALS.module = SupportedModules.LEGO1
|
||||
elif origfile_name in ["LEGO1D.DLL", "BETA10.DLL"]:
|
||||
module = SupportedModules.BETA10
|
||||
GLOBALS.module = SupportedModules.BETA10
|
||||
else:
|
||||
raise Lego1Exception(
|
||||
f"Unsupported file name in import script: {origfile_name}"
|
||||
)
|
||||
else:
|
||||
module = SupportedModules.LEGO1
|
||||
|
||||
logger.info("Importing file: %s", module.orig_filename())
|
||||
logger.info("Importing file: %s", GLOBALS.module.orig_filename())
|
||||
|
||||
repo_root = get_repository_root()
|
||||
origfile_path = repo_root.joinpath("legobin").joinpath(module.orig_filename())
|
||||
build_directory = repo_root.joinpath(module.build_dir_name())
|
||||
recompiledfile_name = f"{module.recomp_filename_without_extension()}.DLL"
|
||||
origfile_path = repo_root.joinpath("legobin").joinpath(
|
||||
GLOBALS.module.orig_filename()
|
||||
)
|
||||
build_directory = repo_root.joinpath(GLOBALS.module.build_dir_name())
|
||||
recompiledfile_name = f"{GLOBALS.module.recomp_filename_without_extension()}.DLL"
|
||||
recompiledfile_path = build_directory.joinpath(recompiledfile_name)
|
||||
pdbfile_name = f"{module.recomp_filename_without_extension()}.PDB"
|
||||
pdbfile_name = f"{GLOBALS.module.recomp_filename_without_extension()}.PDB"
|
||||
pdbfile_path = build_directory.joinpath(pdbfile_name)
|
||||
|
||||
if not GLOBALS.verbose:
|
||||
|
|
|
@ -8,6 +8,7 @@ from lego_util.exceptions import (
|
|||
TypeNotFoundInGhidraError,
|
||||
MultipleTypesFoundInGhidraError,
|
||||
)
|
||||
from lego_util.globals import GLOBALS, SupportedModules
|
||||
|
||||
# Disable spurious warnings in vscode / pylance
|
||||
# pyright: reportMissingModuleSource=false
|
||||
|
@ -105,6 +106,12 @@ def sanitize_name(name: str) -> str:
|
|||
.replace("`", "'")
|
||||
)
|
||||
|
||||
# Importing function names like `FUN_10001234` into BETA10 can be confusing
|
||||
# because Ghidra's auto-generated functions look exactly the same.
|
||||
# Therefore, such function names are replaced by `LEGO_10001234` in the BETA10 import.
|
||||
if GLOBALS.module == SupportedModules.BETA10:
|
||||
new_name = re.sub(r"FUN_([0-9a-f]{8})", r"LEGO1_\1", new_name)
|
||||
|
||||
if "<" in name:
|
||||
new_name = "_template_" + new_name
|
||||
|
||||
|
|
42
tools/ghidra_scripts/lego_util/globals.py
Normal file
42
tools/ghidra_scripts/lego_util/globals.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
import logging
|
||||
from enum import Enum
|
||||
from dataclasses import dataclass, field
|
||||
from lego_util.statistics import Statistics
|
||||
|
||||
|
||||
class SupportedModules(Enum):
|
||||
LEGO1 = 1
|
||||
BETA10 = 2
|
||||
|
||||
def orig_filename(self):
|
||||
if self == self.LEGO1:
|
||||
return "LEGO1.DLL"
|
||||
return "BETA10.DLL"
|
||||
|
||||
def recomp_filename_without_extension(self):
|
||||
# in case we want to support more functions
|
||||
return "LEGO1"
|
||||
|
||||
def build_dir_name(self):
|
||||
if self == self.BETA10:
|
||||
return "build_debug"
|
||||
return "build"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Globals:
|
||||
verbose: bool
|
||||
loglevel: int
|
||||
module: SupportedModules
|
||||
running_from_ghidra: bool = False
|
||||
# statistics
|
||||
statistics: Statistics = field(default_factory=Statistics)
|
||||
|
||||
|
||||
# hard-coded settings that we don't want to prompt in Ghidra every time
|
||||
GLOBALS = Globals(
|
||||
verbose=False,
|
||||
# loglevel=logging.INFO,
|
||||
loglevel=logging.DEBUG,
|
||||
module=SupportedModules.LEGO1, # this default value will be used when run outside of Ghidra
|
||||
)
|
Loading…
Add table
Reference in a new issue