Difference between revisions of "ERF"
(→Header) |
m (→File Data) |
||
Line 344: | Line 344: | ||
|} | |} | ||
− | + | == File Data == | |
− | + | ||
− | + | ||
== Encryption == | == Encryption == |
Revision as of 09:24, 1 March 2011
ERF ("Encapsulated Resource File") files are container files for game resources.
Contents
List of common ERF Files
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.
Common ERF's of certain interests are,
- Game Resources
- packages\core\data\2da.erf
- packages\core\data\anims.erf
- packages\core\data\consolescripts.erf
- packages\core\data\designerareas.erf
- packages\core\data\designercreatures.erf
- packages\core\data\designercutscenes.erf
- packages\core\data\designerdialogs.erf
- packages\core\data\designeritems.erf
- packages\core\data\designerplaceables.erf
- packages\core\data\designerplots.erf
- packages\core\data\designertriggers.erf
- packages\core\data\face.erf
- packages\core\data\gui.erf
- packages\core\data\guiexport.erf
- packages\core\data\iterationtests.erf
- packages\core\data\lightprobedata.erf
- packages\core\data\materialobjects.erf
- packages\core\data\materials.erf
- packages\core\data\misc.erf
- packages\core\data\modelhierarchies.erf
- packages\core\data\modelmeshdata.erf
- packages\core\data\pathfindingpatches.erf
- packages\core\data\postprocesseffects.erf
- packages\core\data\resmetrics.erf
- packages\core\data\scripts.erf
- packages\core\data\shaders.erf
- packages\core\data\states.erf
- packages\core\data\subqueuefiles.erf
- packages\core\data\textures.erf
- packages\core\data\tints.erf
- packages\core\textures\high\texturepack.erf
- packages\core\textures\medium\texturepack.erf
- Patch Resources
- packages\core\patch\... --- Contains Resources added by Game Patches
- Toolset specific Resources
- packages\core\data_tools\... ---Contains Resources for the Toolset
Extracting Resources
The Toolset is capable of extracting ERF Files Contents.
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember.
Packing Resources
The builder to player process packages up resources into ERF files for you, storing the generated ERFs inside DAZIPs.
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.
Overriding Resources
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.
File Format
Version 2.0
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.
Header |
Table of Contents |
Files |
Header
The header consists of:
4 characters (8 bytes) for the type of ERF ("ERF ") |
4 characters (8 bytes) for the version ("V2.0 ") |
16 bit integer representing the number of files encapsulated in this ERF |
Table of Contents
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:
32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long |
32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file |
32bit integer representing the length of the encapsulated file |
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.
Version 2.2
All values are little-endian.
Header
Name | Type / Size | Info |
---|---|---|
magic | utf16[8] | "ERF V2.2", a total of 16 bytes. |
fileCount | uint32 | Number of files encapsulated in this ERF. |
year | uint32 | Year since 1900. |
day | uint32 | Day since January 1st. |
unknown | uint32 | |
flags | uint32 Bit flags |
Flags:
Encryption scheme: (flags & >> 4) & 0xF
Compression scheme: (flags & >> 28) & 0x7
|
unknown | uint32 | |
passwordDigest | byte[16] | MD5 sum of password (as a string). |
Table of Contents
Name | Type / Size | Info |
---|---|---|
toc | entry[fileCount] |
Entry
Name | Type / Size | Info |
---|---|---|
name | utf16[32] | |
offset | uint32 | Offset to entry file data, from start of ERF file. |
packedSize | uint32 | Packed length of file data. |
unpackedSize | uint32 | Unpacked length of file data. |
Version 3.0
Found in Dragon Age 2.
All values are little-endian.
Header
Name | Type / Size | Info |
---|---|---|
magic | utf16[8] | "ERF V3.0", a total of 16 bytes. |
stringTableSize | uint32 | Size of the file name string table. |
fileCount | uint32 | Number of files encapsulated in this ERF. |
flags | uint32 Bit flags |
Flags:
Encryption scheme: (flags & >> 4) & 0xF
Compression scheme: (flags & >> 28) & 0x7
|
unknown | uint32 | Always observed as 0 in DA2 demo. |
passwordDigest | byte[16] | MD5 sum of password (as a string). |
stringTable | char[stringTableSize] | Zero-padded strings referenced by nameOffset in TOC entries. Strings are stored as ASCII. Note that not all TOC entries have to reference an entry in the string table. |
Table of Contents
Name | Type / Size | Info |
---|---|---|
toc | entry[fileCount] |
Entry
Name | Type / Size | Info |
---|---|---|
nameOffset | int32 | Offset in stringTable of the file name for this entry. -1 if none. |
nameHash | uint64 | FNV64 hash of lowercased file name, including path and extension. |
typeHash | uint32 | FNV32 hash of lowercased file extension. |
offset | uint32 | Offset to entry file data, from start of ERF file. |
compressedSize | uint32 | Compressed length of file data. |
uncompressedSize | uint32 | Uncompressed length of file data. |
File Data
Encryption
When encryption is active in an ERF, a digest of the password will be present.
You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.
Blowfish
File data will be encrypted using Blowfish in ECB.
To encrypt:
- Generate random number (represented as string, base 10), such as "12345678".
- Generate digest of the string (without null-terminating character) using MD5 and store it in the header.
- Convert those digits to 64-bit integer (0x0000000000BC614E).
- Store it in byte array in little-endian encoding (0x4E, 0x61, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00).
- Use that array as key to initialize Blowfish.
- Pad your content to multiple of 8 with zeroes.
- Encrypt the data.
To decrypt:
- You already know your password ("12345678").
- Generate its MD5 digest and compare it with the digest in the header.
- If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You may not perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.
- Convert those digits to 64-bit integer (0x0000000000BC614E).
- Store it in byte array in little-endian encoding (0x4E, 0x61, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00).
- Use that array as key to initialize Blowfish.
- Decrypt the data.