#!/usr/bin/env python import sys, lz4, hashlib, os from struct import unpack as up, pack as pk def lz4_compress(data): try: import lz4.block as block except ImportError: block = lz4.LZ4_compress return block.compress(data, 'high_compression', store_size=False) def read_file(fn): with open(fn, 'rb') as f: return f.read() def pad(data, size): assert len(data) <= size return (data + '\x00' * size)[:size] def get_overlay(program, i): return program[0x2B000 + 0x14000 * i:0x2B000 + 0x14000 * (i+1)] KIP_NAMES = ['Loader', 'NCM', 'ProcessManager', 'sm', 'boot', 'spl', 'ams_mitm'] def get_kips(ams_dir): emummc = read_file(os.path.join(ams_dir, 'emummc/emummc_unpacked.kip')) loader = read_file(os.path.join(ams_dir, 'stratosphere/loader/loader.kip')) ncm = read_file(os.path.join(ams_dir, 'stratosphere/ncm/ncm.kip')) pm = read_file(os.path.join(ams_dir, 'stratosphere/pm/pm.kip')) sm = read_file(os.path.join(ams_dir, 'stratosphere/sm/sm.kip')) boot = read_file(os.path.join(ams_dir, 'stratosphere/boot/boot.kip')) spl = read_file(os.path.join(ams_dir, 'stratosphere/spl/spl.kip')) ams_mitm = read_file(os.path.join(ams_dir, 'stratosphere/ams_mitm/ams_mitm.kip')) return (emummc, { 'Loader' : loader, 'NCM' : ncm, 'ProcessManager' : pm, 'sm' : sm, 'boot' : boot, 'spl' : spl, 'ams_mitm' : ams_mitm, }) def write_kip_meta(f, kip, ofs): # Write program id f.write(kip[0x10:0x18]) # Write offset, size f.write(pk('