wiithon.formats.dol module

class wiithon.formats.dol.DOL[source]

Bases: object

classmethod read(stream)[source]
Parameters:

stream (BinaryIO)

Return type:

DOL

has_free_text_section()[source]
Return type:

bool

has_free_data_section()[source]
Return type:

bool

read_at(virtual_addr, size)[source]
Parameters:
  • virtual_addr (int)

  • size (int)

Return type:

bytes

read_until_null_at(virtual_addr)[source]
Parameters:

virtual_addr (int)

Return type:

bytes

write_at(virtual_addr, data)[source]
Parameters:
Return type:

None

to_bytes()[source]
Return type:

bytes

add_text_section(virtual_addr, data)[source]
Parameters:
Return type:

None

add_data_section(virtual_addr, data)[source]
Parameters:
Return type:

None

find_arena_lo_setter()[source]

Finds the lis r3 address in the arenaLo setup sequence.

Pattern (found empirically across multiple Wii games):

lis    r3, X       (3c 60 ?? ??)
addi   r3, r3, Y   (38 63 ?? ??)
addi   r0, r3, 31  (38 03 ?? ??)
rlwinm r3, r0, ?   (54 03 ?? ??)
Returns:

virtual address of the lis.

Return type:

int

read_arena_lo(lis_vaddr)[source]

Decodes the arenaLo value from a lis+addi/ori pair at lis_vaddr.

Parameters:

lis_vaddr (int)

Return type:

int

patch_arena_lo(lis_vaddr, new_value)[source]

Patches the lis+ori pair at lis_vaddr to load new_value into r3.

Parameters:
  • lis_vaddr (int)

  • new_value (int)

Return type:

None

inject_above_arena(sections, manual_arena=None, padding_before=256, reserved_size=None)[source]
Parameters:
  • sections (list[bytes])

  • manual_arena (int | None, default: None)

  • padding_before (int, default: 256)

  • reserved_size (int | None, default: None)

Return type:

tuple[int, list[int]]

find_code_caves(min_size=64)[source]
Parameters:

min_size (int, default: 64)

Return type:

list[tuple[str, int, int]]