The vault is a set of structures with ChunkBlocks which are read sequentially. In Burnout Paradise, these are:
- Vers: The version
- DepN: The dependency node
- StrN: The start node
- DatN: The data node
- ExpN: The export node
- PtrN: The pointer node
Attrib::Vault::ChunkBlock
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x4 |
uint32_t |
mType |
A type ID similar in form to a magic number |
|
0x4 |
0x4 |
uint32_t |
mSize |
The total size of the chunk |
|
Version
Attrib::Vault::VersionNode
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x8 |
ChunkBlock |
super_ChunkBlock |
|
|
0x8 |
0x8 |
uint64_t |
mVersion |
Version hash |
|
Dependency node
Attrib::Vault::DependencyNode
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x8 |
ChunkBlock |
super_ChunkBlock |
|
|
0x8 |
0x8 |
HashInt |
mCount |
Number of dependencies |
|
This structure is immediately followed by the hashes of the dependency strings, then the offsets of the strings relative to the start of the first string, then the strings themselves.
Start node
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x8 |
ChunkBlock |
super_ChunkBlock |
|
|
??? |
|
|
|
|
|
Size is 16 bytes, but the final 8 bytes is always null. This node appears to not be read by the game.
Data node
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x8 |
ChunkBlock |
super_ChunkBlock |
|
|
This is followed by several collections.
This node is not read directly. Pointers in other nodes read the data that lies in this node.
Attrib::CollectionLoadData
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x8 |
Key |
mKey |
|
|
0x8 |
0x8 |
Key |
mClass |
|
|
0x10 |
0x8 |
Key |
mParent |
|
|
0x18 |
0x4 |
uint32_t |
mTableReserve |
Amount allocated for entries |
|
0x1C |
0x4 |
uint32_t |
mTableKeyShift |
|
|
0x20 |
0x4 |
uint32_t |
mNumEntries |
Number of entries |
|
0x24 |
0x2 |
uint16_t |
mNumTypes |
Number of types |
|
0x26 |
0x2 |
uint16_t |
mTypesLen |
Amount allocated for types |
|
0x28 |
0x4 |
void* |
mLayout |
|
Always nullptr in resource
|
0x2C |
0x4 |
|
|
padding |
|
This is always followed by the types, then the entries (which are nodes).
Attrib::Node
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x8 |
Key |
mKey |
|
|
0x8 |
0x4 |
anon_union_0 |
field_1 |
|
Just a pointer
|
0xC |
0x2 |
uint16_t |
mTypeIndex |
|
|
0xE |
0x1 |
uint8_t |
mMax |
|
|
0xF |
0x1 |
uint8_t |
mFlags |
|
|
Attrib::Node::anon_union_0
Length |
Type |
Name |
Description |
Comments
|
0x4 |
void* |
mPtr |
|
|
0x4 |
Array* |
mArray |
|
|
0x4 |
uintptr_t |
mValue |
|
|
0x4 |
uintptr_t |
mOffset |
|
|
Export node
Attrib::Vault::ExportNode
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x8 |
ChunkBlock |
super_ChunkBlock |
|
|
0x8 |
0x8 |
HashInt |
mCount |
Number of dependencies |
|
Followed by export entries of an amount defined by mCount.
Attrib::Vault::ExportEntry
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x8 |
ExportID |
mID |
|
|
0x8 |
0x8 |
TypeID |
mType |
|
|
0x10 |
0x4 |
uint32_t |
mDataBytes |
Size of the data node |
|
0x14 |
0x4 |
uint32_t |
mDataOffset |
Offset of the data in the data node |
Relative to vlt start
|
Pointer node
Attrib::Vault::PointerNode
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x8 |
ChunkBlock |
super_ChunkBlock |
|
|
Followed by several PtrRefs.
Attrib::PtrRef
Offset |
Length |
Type |
Name |
Description |
Comments
|
0x0 |
0x4 |
uint32_t |
mFixupOffset |
|
|
0x4 |
0x2 |
uint16_t |
mPtrType |
|
See type.
|
0x6 |
0x2 |
uint16_t |
mIndex |
Which dependency to use |
0 is always the vault, 1 is always the bin
|
0x8 |
0x8 |
anon_union_0 |
field_3 |
|
|
Attrib::PtrRef::anon_union_0
Length |
Type |
Name |
Description |
Comments
|
0x8 |
ExportID |
mExportID |
|
|
0x8 |
HashInt |
mOffset |
|
|
EPtrRefType
Information from VaultLib.
Name |
Value |
Comments
|
PtrEnd |
0 |
End of the pointer node
|
PtrNull |
1 |
|
PtrSetFixupTarget |
2 |
|
PtrDepRelative |
3 |
Relative to the beginning of the dependency
|
PtrExport |
4 |
|