mirror of
https://github.com/NinjaCheetah/libWiiPy.git
synced 2025-04-26 13:21:01 -04:00
WAD header reading, offset calculation for partitions
Currently untested.
This commit is contained in:
parent
c4d0d3e4e4
commit
286df1a03e
102
src/libWiiPy/wad.py
Normal file
102
src/libWiiPy/wad.py
Normal file
@ -0,0 +1,102 @@
|
||||
# Project: libWiiPy by NinjaCheetah
|
||||
# File: wad.py by rmc
|
||||
#
|
||||
# See https://wiibrew.org/wiki/WAD_files for details about the WAD format
|
||||
|
||||
import binascii
|
||||
from dataclasses import dataclass
|
||||
from typing import List
|
||||
|
||||
|
||||
@dataclass
|
||||
class ContentRecord:
|
||||
"""Creates a content record object that contains the details of a content contained in a title."""
|
||||
cid: int # Content ID
|
||||
index: int # Index in the list of contents
|
||||
content_type: int # normal: 0x0001; dlc: 0x4001; shared: 0x8001
|
||||
content_size: int
|
||||
content_hash: bytearray # SHA1 hash content
|
||||
|
||||
|
||||
class wadHeader:
|
||||
"""Break down 32 byte WAD header."""
|
||||
def __init__(self, wadhdr):
|
||||
self.wadhdr = wadhdr
|
||||
self.wad_hdr_size: int
|
||||
self.wad_type: int
|
||||
self.wad_version: int
|
||||
# Sizes
|
||||
self.wad_cert_size: int
|
||||
self.wad_crl_size: int
|
||||
self.wad_tik_size: int
|
||||
self.wad_tmd_size: int
|
||||
self.wad_app_size: int # Note that this is the size of the app region. This is each individual app file bundled together.
|
||||
self.wad_meta_size: int
|
||||
# Offsets
|
||||
self.wad_cert_offset: int
|
||||
self.wad_crl_offset: int
|
||||
self.wad_tik_offset: int
|
||||
self.wad_tmd_offset: int
|
||||
self.wad_app_offset: int
|
||||
self.wad_meta_offset: int
|
||||
#self.content_record: List[ContentRecord]
|
||||
# Load header data from WAD file
|
||||
with open(wad, "rb") as wadfile:
|
||||
#====================================================================================
|
||||
# Get the sizes of each data region contained within the WAD. Sorry for mid code!
|
||||
#====================================================================================
|
||||
# Header length. Always seems to be 32 so we'll ignore it for now.
|
||||
wadfile.seek(0x0)
|
||||
self.wad_hdr_size = wadfile.read(4)
|
||||
# WAD type
|
||||
wadfile.seek(0x04)
|
||||
self.wad_type = wadfile.read(2)
|
||||
# WAD version
|
||||
wadfile.seek(0x06)
|
||||
self.wad_version = wadfile.read(2)
|
||||
# WAD cert size
|
||||
wadfile.seek(0x08)
|
||||
self.wad_cert_size = wadfile.read(4)
|
||||
# WAD crl size
|
||||
wadfile.seek(0x0c)
|
||||
self.wad_crl_size = wadfile.read(4)
|
||||
# WAD ticket size
|
||||
wadfile.seek(0x10)
|
||||
self.wad_tik_size = wadfile.read(4)
|
||||
# WAD TMD size
|
||||
wadfile.seek(0x14)
|
||||
self.wad_tmd_size = wadfile.read(4)
|
||||
# WAD app size
|
||||
wadfile.seek(0x18)
|
||||
self.wad_app_size = wadfile.read(4)
|
||||
# Publisher of the title
|
||||
wadfile.seek(0x1c)
|
||||
self.wad_meta_size = wadfile.read(4)
|
||||
#====================================================================================
|
||||
# Calculate file offsets from sizes
|
||||
#====================================================================================
|
||||
self.wad_cert_offset + self.wad_hdr_size
|
||||
# I've never seen crl used (don't even know what it's for) but still calculating in case...
|
||||
self.wad_crl_offset + self.wad_cert_offset + self.wad_cert_size
|
||||
self.wad_tik_offset + self.wad_crl_offset + self.wad_crl_size
|
||||
self.wad_tmd_offset + self.wad_tik_offset + self.wad_tik_size
|
||||
self.wad_app_offset + self.wad_tmd_offset + self.wad_tmd_size
|
||||
# Same with meta. If private Nintendo tools calculate these then maaaaaybe we should too.
|
||||
self.wad_meta_offset + self.wad_app_offset + self.wad_app_size
|
||||
|
||||
def get_cert_region(self):
|
||||
"""Returns the offset and size for the cert"""
|
||||
return self.wad_cert_offset, self.wad_cert_size
|
||||
|
||||
def get_ticket_region(self):
|
||||
"""Returns the offset and size for the ticket"""
|
||||
return self.wad_tik_offset, self.wad_tik_size
|
||||
|
||||
def get_tmd_region(self):
|
||||
"""Returns the offset and size for the TMD"""
|
||||
return self.wad_tmd_offset, self.wad_tmd_size
|
||||
|
||||
def get_app_region(self):
|
||||
"""Returns the offset and size for the app"""
|
||||
return self.wad_app_offset, self.wad_tmd_size
|
||||
|
Loading…
x
Reference in New Issue
Block a user