APM

From owdev
Jump to: navigation, search

APM

APMFile

uint64 build_version;
uint32 build_number;
uint32 package_count;
uint32 entry_count;
uint32 unk_0;
APMEntry* entries[entry_count];
APMPackage* packages[package_count];

APMEntry

uint32 index;
uint32 a;
uint32 b;

APMPackage

uint64 local_key;       // CMF Key
uint64 primary_key;     // CMF Key
uint64 external_key;    // CMF Key
uint64 encryption_hash; // hash of the encryption key
uint64 package_key;     // CMF Key, leads to a PackageIndex file
uint32 unk_0;
uint32 unk_1;           // size?
uint32 unk_2;

CMF

CASC Key is the MD5 hash of the APM filename with the "cmf" extension.

In example:

Manifest/enUS.apm -> Manifest/enUS.cmf

CMFFile

uint64 build_version;
uint64 build_number;
uint32 entry_count;
uint32 header;
CMFEntry* entries[entry_count];
CMFBlob* hashes[]; // read until EOF

CMFEntry

Data is typically identical to APMEntry

uint32 index;
uint32 a;
uint32 b;

CMFBlob

uint64 key;   // CMF Key
uint32 flags; // unknown
md5    hash;  // CASC Key

PackageIndex

uint64 offset_records;
uint64 unk_offset_0;
uint64 unk_offset_1;
uint64 dependency_offset;
uint64 unk_0;
uint32 unk_count_0;
uint32 record_count;
uint32 unk_count_1;
uint32 record_size;
uint32 unk_1;
uint32 dependency_count;
uint64 unk_2;
uint64 bundle_key;                         // CMF Key
uint64 unk_3;
PackageIndexRecord* records[record_count]; // WARNING: Read record_size bytes and decompress with gzip.
uint32* dependencies[dependency_count];

PackageIndexRecord

Read CASC Encoding info from the key obtained from the CMF in order to get the size EVEN IF IT HAS THE BUNDLE FLAG.

uint64 key;    // CMF Key
uint32 flags;  // Has 0x40000000 when in bundle, otherwise in encoding
uint32 offset; // bundle offset