Add base_patch_generator.

This commit is contained in:
Lyle Mantooth 2022-05-30 01:04:39 -04:00
parent 7cd01df7d6
commit 4112573d85
Signed by: IslandUsurper
GPG key ID: 6DB52EAE123A5789
4 changed files with 79 additions and 0 deletions

10
Cargo.lock generated
View file

@ -8,6 +8,16 @@ version = "1.0.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc"
[[package]]
name = "base_patch_generator"
version = "0.1.0"
dependencies = [
"anyhow",
"enemize",
"md5",
"serde_json",
]
[[package]]
name = "bin_comp"
version = "0.1.0"

View file

@ -3,4 +3,5 @@
members = [
"enemize",
"bin_comp",
"base_patch_generator",
]

View file

@ -0,0 +1,12 @@
[package]
name = "base_patch_generator"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
anyhow = "1.0"
enemize = { path = "../enemize" }
md5 = "0.7.0"
serde_json = "1.0"

View file

@ -0,0 +1,56 @@
use std::env;
use std::fs::File;
use std::io::Read;
use std::path::Path;
use enemize::PatchSet;
use enemize::asar;
use enemize::rom::RomData;
fn main() -> Result<(), anyhow::Error> {
let mut args = env::args();
let output_path = args.next_back().expect("No output file");
let symbols_path = args.next_back().expect("No symbols file");
let patch_path = args.next_back().expect("No patch file");
let rom_path = args.next_back().expect("No ROM file");
let mut rom_bytes = vec![];
let mut rom_file = File::open(&rom_path)?;
rom_file.read_to_end(&mut rom_bytes)?;
rom_bytes = if rom_bytes.len() % 1024 == 512 {
rom_bytes.into_iter().skip(512).collect()
} else {
rom_bytes
};
let expected = [
0x03, 0xa6, 0x39, 0x45, 0x39, 0x81, 0x91, 0x33, 0x7e, 0x89, 0x6e, 0x57, 0x71, 0xf7, 0x71,
0x73,
];
let actual: [u8; 16] = md5::compute(&rom_bytes).into();
assert_eq!(expected, actual, "Invalid rom file");
println!("Applying Patch to rom");
rom_bytes.resize(4 * 1024 * 1024, 0);
let symbols = asar::load_symbols(Path::new(&symbols_path))?;
let mut rom = RomData::new(symbols, rom_bytes);
let mut patches = PatchSet::load(Path::new(&patch_path))?;
patches.patch_rom(&mut rom);
rom.move_room_headers();
let rom_patches = rom.generate_patch();
patches.add_patches(rom_patches);
println!("Writing output file {}", output_path);
let out_file = File::create(&output_path)?;
serde_json::to_writer(out_file, &patches)?;
Ok(())
}