VFF
Jump to navigation
Jump to search
VFF is a "virtual FAT filesystem", which is used as a container for primarily WC24 downloaded content, as well as E-Mail storage.
Header
Start | Length | Typical value | Description |
---|---|---|---|
0 | 4 | 'VFF ' | 4-byte magic |
4 | 2 | feff | Byte-order-marker? (magic value, never checked by code) |
6 | 2 | 0100 | (length field? never checked by code) |
8 | 4 | 01400000 | Total file size |
12 | 2 | 0020 | Size of header |
14 | 18 | zeroes | padding |
Following the header is two FATs, which are FAT12/FAT16 (depending on total volume size). Each FAT size is determined by the below algo. Following the FATs is the root directory cluster, 0x1000 bytes long. Following the root cluster is the data "clusters". The data "clusters" have are 0x200 bytes long each. The size of the FAT is determined by the following algorithm:
#define ALIGN_FORWARD(x,align) \
((typeof(x))((((u32)(x)) + (align) - 1) & (~((align)-1))))
#define CLUSTER_SIZE 0x200
u32 WC24_GetVFF_FATSize(u32 filesize)
{
u32 num_clusters = filesize / CLUSTER_SIZE;
u32 fat_bits = 32;
if (num_clusters < 0xFFF5) fat_bits = 16;
if (num_clusters < 0xFF5) fat_bits = 12;
return ALIGN_FORWARD(num_clusters * fat_bits / 8, CLUSTER_SIZE);
}
Trivial vff filesystem dumper (from marcan's old code stash): [1]