From 0cb37487b6b696ce51c720d7ee548dde23eabf83 Mon Sep 17 00:00:00 2001 From: NinjaCheetah <58050615+NinjaCheetah@users.noreply.github.com> Date: Sun, 17 Mar 2024 23:28:02 -0400 Subject: [PATCH] WAD extraction now works for all non-vWii WADs! --- src/libWiiPy/shared.py | 22 ++++++++++++++++++++++ src/libWiiPy/wad.py | 15 ++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/libWiiPy/shared.py b/src/libWiiPy/shared.py index e69de29..21fcad1 100644 --- a/src/libWiiPy/shared.py +++ b/src/libWiiPy/shared.py @@ -0,0 +1,22 @@ +# "shared.py" from libWiiPy by NinjaCheetah & Contributors +# https://github.com/NinjaCheetah/libWiiPy + +def align_value(value, alignment=64): + """Aligns the provided value to the set alignment (defaults to 64). + + Parameters + ---------- + value : int + The value to align. + alignment : int + The number to align to. Defaults to 64. + + Returns + ------- + int + The aligned value. + """ + if (value % alignment) != 0: + aligned_value = value + (alignment - (value % alignment)) + return aligned_value + return value diff --git a/src/libWiiPy/wad.py b/src/libWiiPy/wad.py index 2fe3de3..9ed2337 100644 --- a/src/libWiiPy/wad.py +++ b/src/libWiiPy/wad.py @@ -5,6 +5,7 @@ import io import binascii +from .shared import align_value class WAD: @@ -64,7 +65,7 @@ class WAD: # WAD content size. wad_data.seek(0x18) self.wad_content_size = int(binascii.hexlify(wad_data.read(4)), 16) - # Publisher of the title contained in the WAD. + # Time/build stamp for the title contained in the WAD. wad_data.seek(0x1c) self.wad_meta_size = int(binascii.hexlify(wad_data.read(4)), 16) # ==================================================================================== @@ -72,12 +73,12 @@ class WAD: # ==================================================================================== self.wad_cert_offset = self.wad_hdr_size # crl isn't ever used, however an entry for its size exists in the header, so its calculated just in case. - self.wad_crl_offset = int(64 * round((self.wad_cert_offset + self.wad_cert_size) / 64)) - self.wad_tik_offset = int(64 * round((self.wad_crl_offset + self.wad_crl_size) / 64)) - self.wad_tmd_offset = int(64 * round((self.wad_tik_offset + self.wad_tik_size) / 64)) - self.wad_content_offset = int(64 * round((self.wad_tmd_offset + self.wad_tmd_size) / 64)) - # meta is also never used, but Nintendo's tools calculate it, so we should too. - self.wad_meta_offset = int(64 * round((self.wad_content_offset + self.wad_content_size) / 64)) + self.wad_crl_offset = align_value(self.wad_cert_offset + self.wad_cert_size) + self.wad_tik_offset = align_value(self.wad_crl_offset + self.wad_crl_size) + self.wad_tmd_offset = align_value(self.wad_tik_offset + self.wad_tik_size) + # meta isn't guaranteed to be used, but some older SDK titles use it, and not reading it breaks things. + self.wad_meta_offset = align_value(self.wad_tmd_offset + self.wad_tmd_size) + self.wad_content_offset = align_value(self.wad_meta_offset + self.wad_meta_size) def get_cert_region(self): """Gets the offset and size of the certificate data.