Inital support for Wii TMD parsing

This commit is contained in:
Xpl0itU 2024-04-15 16:40:44 +02:00
parent fdff675462
commit 164f3fc620

50
tmd.go
View file

@ -3,10 +3,17 @@ package wiiudownloader
import ( import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"fmt"
"io" "io"
) )
const (
TMD_VERSION_WII = 0x00
TMD_VERSION_WIIU = 0x01
)
type TMD struct { type TMD struct {
Version byte
TitleVersion uint16 TitleVersion uint16
ContentCount uint16 ContentCount uint16
Contents []Content Contents []Content
@ -16,7 +23,45 @@ func parseTMD(data []byte) (*TMD, error) {
tmd := &TMD{} tmd := &TMD{}
reader := bytes.NewReader(data) reader := bytes.NewReader(data)
reader.Seek(476, io.SeekStart) reader.Seek(0x180, io.SeekStart)
if err := binary.Read(reader, binary.BigEndian, &tmd.Version); err != nil {
return nil, err
}
switch tmd.Version {
case TMD_VERSION_WII:
reader.Seek(0x1DC, io.SeekStart)
if err := binary.Read(reader, binary.BigEndian, &tmd.TitleVersion); err != nil {
return nil, err
}
if err := binary.Read(reader, binary.BigEndian, &tmd.ContentCount); err != nil {
return nil, err
}
tmd.Contents = make([]Content, tmd.ContentCount)
for i := 0; i < int(tmd.ContentCount); i++ {
offset := 0x1E4 + (0x24 * i)
reader.Seek(int64(offset), io.SeekStart)
if err := binary.Read(reader, binary.BigEndian, &tmd.Contents[i].ID); err != nil {
return nil, err
}
reader.Seek(2, io.SeekCurrent)
if err := binary.Read(reader, binary.BigEndian, &tmd.Contents[i].Type); err != nil {
return nil, err
}
if err := binary.Read(reader, binary.BigEndian, &tmd.Contents[i].Size); err != nil {
return nil, err
}
}
case TMD_VERSION_WIIU:
reader.Seek(0x1DC, io.SeekStart)
if err := binary.Read(reader, binary.BigEndian, &tmd.TitleVersion); err != nil { if err := binary.Read(reader, binary.BigEndian, &tmd.TitleVersion); err != nil {
return nil, err return nil, err
@ -46,5 +91,8 @@ func parseTMD(data []byte) (*TMD, error) {
return nil, err return nil, err
} }
} }
default:
return nil, fmt.Errorf("unknown TMD version: %d", tmd.Version)
}
return tmd, nil return tmd, nil
} }