Difference between revisions of "ZiPatch File Structure"
From FFXIV Classic Wiki
Line 35: | Line 35: | ||
{ | { | ||
[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] | [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] | ||
− | byte[] _version; // version format is unknown, but may be major/minor. Analysis of ffxivupdater.exe indicates the string FileHeaderV2 | + | byte[] _version; // version format is unknown, but may be major/minor. Analysis of ffxivupdater.exe indicates the string FileHeaderV2. 00 00 02 00 observed |
[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] | [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] | ||
Line 45: | Line 45: | ||
} | } | ||
</pre> | </pre> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Revision as of 18:56, 5 June 2019
All ZiPatch files for FINAL FANTASY XIV share the same overall structure. This format was later expanded in 2012 for DRAGON QUEST X and FINAL FANTASY XIV: A Realm Reborn, which are more similar in their DAT structure. Many of the block types found in this version were deprecated, but still remain in the executable for A Realm Reborn.
ZiPatch File Header
91 5A 49 50 41 54 43 48 0D 0A 1A 0A ‘ZIPATCH....
The ZiPatch File Header is followed immediately by n blocks, which each carry specific instructions.
[StructLayout(LayoutKind.Sequential, Pack=4)] struct Block { int dataSize; // Little Endian byte[] data; // data.Length is dataSize + 4 (inclusive of block type identifier) [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] byte[] crc; // crc is a standard CRC32 checksum (RFC 1952) of data }
The block type identifier is indicated by the slice of data[0..3]. Analysis of ffxivupdater.exe indicates the following block types as valid:
FHDR // File Header; observed APLY // Unknown; observed APFS // Unknown; not observed ETRY // Entry File; observed ADIR // Add Directory; observed DELD // Delete Directory; observed
The File Header block is a summary of the changes that will take place as a result of applying the ZiPatch.
[StructLayout(LayoutKind.Sequential, Pack=4, Size=20)] struct FileHeader { [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] byte[] _version; // version format is unknown, but may be major/minor. Analysis of ffxivupdater.exe indicates the string FileHeaderV2. 00 00 02 00 observed [MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] byte[] _result; // DIFF or HIST observed int _numEntryFile; // Little Endian int _numAddDirectory; // Little Endian int _numDeleteDirectory; // Little Endian }