FST: Difference between revisions
→Main Header: Extra FST info from ddi |
|||
| Line 20: | Line 20: | ||
! Field !! Size !! Offset !! Description | ! Field !! Size !! Offset !! Description | ||
|- | |- | ||
|Magic || | |Magic || 0x4 || 0x0 || always 0x46535400 ("FST" and a null byte) | ||
|- | |- | ||
|Secondary header size || | |Secondary header size || 0x4 || 0x4 || (not sure) | ||
|- | |- | ||
|Secondary header count || | |Secondary header count || 0x4 || 0x8 || Number of secondary headers in the FST | ||
|- | |||
|Unknown || 0x2 || 0xC || (0x0100) | |||
|- | |||
|Unknown || 0x12 || 0xE || Null bytes | |||
|} | |} | ||
Revision as of 08:24, 15 November 2017
The Filesystem Table, or FST, is a file present in Wii U disk images and downloaded content that describes the folders and files contained in the title.
It seems to be based on the Wii's FST format, but an extra header/cluster section was added.
All numbers are big-endian.
The file is composed of four sections:
- the main header
- a number of secondary headers describing storage clusters
- a number of file and directory entries, beginning with the root directory
- a table of null-terminated names
Main Header
Size: 0x20 bytes
| Field | Size | Offset | Description |
|---|---|---|---|
| Magic | 0x4 | 0x0 | always 0x46535400 ("FST" and a null byte) |
| Secondary header size | 0x4 | 0x4 | (not sure) |
| Secondary header count | 0x4 | 0x8 | Number of secondary headers in the FST |
| Unknown | 0x2 | 0xC | (0x0100) |
| Unknown | 0x12 | 0xE | Null bytes |
Secondary header
Each of these entries describe the position of data on disk. For downloaded content, each corresponds to one entry from the TMD.
Size: 0x20 each
| Field | Size | Offset | Description |
|---|---|---|---|
| Unknown | 4 | 0 | - |
| Unknown | 4 | 4 | - |
| Title ID | 8 | 8 | Not in all entries, some are zeros. |
| Group ID | 4 | 16 | Not in all entries, some are zeros. |
| Unknown | 2 | 20 | Varies 0x0100/0x0200. |
| Unknown | 10 | 22 | Zeros. |
File/Directory entry
Each of these represents a file or a directory.
Size: 0x10 each
| Field | Size | Offset | Description |
|---|---|---|---|
| Type | 1 | 0 | Zero for file entries, non-zero for directory entries |
| Name Offset | 3 | 1 | Offset in bytes of the name of the file from the start of the nametable |
| Offset | 4 | 4 | Offset of the file in its storage cluster: usually in sectors (multiply by 32 for byte offset); may be in bytes if the 0x4 bit in flags is set |
| Size | 4 | 8 | Size of the file in bytes |
| Flags | 2 | 12 | 0x4: offset is in bytes, not sectors; 0x440: data contains SHA-1 hash |
| Storage cluster index | 2 | 14 | an index to the list of secondary headers. Additionally, for downloaded content, same as the content ID (an index into the title metadata's list of files.) |
In this case, the size corresponds to the number of entries this directory contains, and the offset field corresponds to the parent directory's offset.
Nametable
Table of null-terminated filenames.
External Links
https://code.google.com/p/cdecrypt/source/browse/trunk/main.cpp - Crediar's CDecrypt tool that can parse FSTs from downloaded content
https://github.com/CarlKenner/dolphin/blob/WiiU/Source/Core/DiscIO/FileSystemWiiU.cpp - A fork of Dolphin by CarlKenner that can read WiiU disk images.
http://blog.delroth.net/2011/06/reading-wii-discs-with-python/ - some information on the Wii's FST format