mirror of
https://github.com/Xpl0itU/WiiUDownloader.git
synced 2025-05-12 22:26:15 -04:00
Inital support for Wii TMD parsing
This commit is contained in:
parent
fdff675462
commit
164f3fc620
1 changed files with 65 additions and 17 deletions
50
tmd.go
50
tmd.go
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue