+---------------------+ | GENERAL INFORMATION | +---------------------+ This file describes many different archive formats used by games. You can use these specifications to help you create your own programs, or to give you an insight into the information contained in a particular file. ** NOTE: Some specifications are not complete. ** There is absolutely NO GUARENTEE that the information within this document is correct! All information has been obtained through experimentation and investigation only, no information has been verified by the associated companies or game developers. For better clarification of format structures, and for additional formats not listed here, be sure to download the source code for Game Extractor (http://www.watto.org/extract) as it contains fully commented Java code for reading and writing many game archives, and is free for use by anyone. If you have any information that you can add to this file, including new archives and corrections, please contact WATTO at watto@watto.org - your help is greatly appreciated! +-----------------------+ | HOW TO READ THIS FILE | +-----------------------+ * General comments are indicated by a // at the start of the line * Comments for a particular line are written within ( ) at the end of the line * A number at the start of a line is the number of bytes used to store the value * The text to the right of a number is a description of the value * Information in ( ) to the right of a description, is the default value of the field * Information in [ ] to the right of a description, is a calculation to apply to the field * A ? in the description indicates that the description may not be correct * An X at the start of the line (in place of a number) shows a variable number of bytes * A line with "X - Filename (null)" indicates that the filename is read up to the first null byte * A line with "# - Filename (null)" indicates that the filename has a maximum length of # bytes, and the remaining space is filled with null bytes * The statement (big) next to a game name indicates that the archive uses big-endian order (all others use little-endian) * The statement (chunk) next to a game name indicates the use of a variation on the EA IFF'85 chunk format * In most directory-based archives, the file data follows the directory. Unless it is otherwise indicated where the file data is located, this should be assumed, thus read the specs for the game and the file data will follow directly after. * X - File Data indicates that the data for each file is located in this area, with each file's data stored one after the other Example: 4 - Header (HEAD) 2 - Offset [+6] * The header field is 4 bytes long, and has the value "HEAD" * The offset field is 2 bytes long, and you need to add 6 to it for the correct value +------------------+ | 3D Frogger *.mwd | +------------------+ 4 - Header (DAWM) 4 - null 2040 - Description (null) X - Unknown +--------------------------+ | 3D Ultra Cool Pool *.tbv | +--------------------------+ // Same as 3D Ultra Cool Pinball *.tbv +------------------------------------------+ | 3D Ultra Cool Radio Control Racers *.tbv | +------------------------------------------+ // Same as 3D Ultra Cool Pinball *.tbv +------------------------------------------+ | 3D Ultra Cool Radio Control Racers *.rbx | +------------------------------------------+ 4 - Header (158 154 169 11) 4 - Number Of Files // for each file 12 - Filename (null) 4 - File Offset X - File Data +------------------------------+ | 3D Ultra Pinball *.001 *.002 | +------------------------------+ // for each file 13 - Filename (null) 4 - File Size X - File Data +---------------------------------------------+ | 3D Ultra Pinball - The Lost Continent *.001 | +---------------------------------------------+ // Same as 3D Ultra Pinball *.001 +-------------------------------------+ | 3D Ultra Pinball: Thrill Ride *.tbv | +-------------------------------------+ 8 - Header (TBVolume) 1 - null 2 - Unknown 4 - Number Of Files 2 - Unknown 12 - Description 1 (RichRayl@CUC) 12 - Description 2 (null) 4 - Unknown 4 - First File Offset X - Unknown (up to first file offset) // for each file 24 - Filename 4 - File Size X - File Data +------------------------------+ | 4x4 Evolution *.pod (type 1) | +------------------------------+ 4 - Number Of Files 80 - Archive Name // for each file 32 - Filename 4 - Size 4 - Offset X - File Data +------------------------------+ | 4x4 Evolution *.pod (type 2) | +------------------------------+ 4 - Header (POD2) 4 - Unknown 80 - Archive Name 4 - Number Of Files 4 - Number Of Trails // for each file 4 - Filename Offset (from start of filename directory) 4 - Size 4 - Offset 8 - Unknown // for each file X - Filename (null) X - File Data // for each trail 312 - Unknown +-----------------------+ | Absolute Terror *.pak | +-----------------------+ 4 - Header (PAK4) 4 - Data Size? 4 - Unknown (8) 4 - Unknown 16 - null 4 - Unknown 4 - Unknown X - Unknown // SOME KIND OF COMPRESSION OR ENCRYPTION MIGHT BE USED? +------------------+ | Act Of War *.dat | +------------------+ // NOTES: // The files are stored in a special way so as to reduce the amount of space // needed to store the filenames. It does this by grouping the files together // that share a common first-part of their name, and then building up the actual // filename of each file by joinging a whole lot of group names together. // // For example, if we have 2 files called "sound11.wav" and "sound22.wav", you // can see that they both share 5 common letters at the beginning of the filename // (ie "sound"). This archive would have a group with the name "sound" and each // of the 2 files would be saved with names "11.wav" and "22.wav" within that // group, thus saving space. This space saving is only really benificial for // storing directorie names though, as there is a lot of overhead. // // Groups can be nested inside each other, so there is no boundary as to the // number of groups that can exist in a nested way. // // Also, filenames can be reused by using a negative number for the Group/File ID. // In this case, take the offset just before the negative Group/File ID, subtract // the negative number, and it will point to the filename that will be reused. 4 - Header (edat) 4 - Length of the header after the 10 nulls (18) 4 - Unknown 10 - null 2 - Unknown (1) 1 - null 4 - Directory Offset 4 - Directory Length 7 - null X - File Data X - Directory // go to dirOffset // for each group 4 - Group/File Indicator (0=file, #=length of this group entry, -#=offset to a previous file entry) if (group){ 4 - Length of this group, including the file entries (ie relative offset to next group) (or null) X - Group name (null) 0-1 - null padding to a multiple of 2 bytes (ie only exists if groupnameLength+1 is odd) } else if (file){ 4 - Last File Indicator (0=last file in this group, #=length of this file entry) 4 - File Offset 4 - File Length 1 - Unknown (0) // something to do with the Filename position? X - Filename (null) 0-1 - null padding to a multiple of 2 bytes (ie only exists if filenameLength+2 is odd) } else if (previous offset (negative number)){ 4 - Last File Indicator (0=last file in this group, #=length of this file entry) 4 - File Offset 4 - File Length 2 - null } +----------------------------+ | Actua Soccer *.dat + *.off | +----------------------------+ // OFF has the details, DAT has the file data // for each file 4 - Offset 4 - File Size +-------------------------------+ | Actua Soccer 2 *.mad (Type 1) | +-------------------------------+ // for each file 16 - Filename (null) 4 - File Offset 4 - File Length X - File Data +-------------------------------+ | Actua Soccer 2 *.mad (Type 2) | +-------------------------------+ // for each file 4 - File Offset 4 - File Length X - File Data +--------------+ | AFL 98 *.lbm | +--------------+ // Same as Allan Border Cricket *.lbm +--------------+ | AFL 99 *.paf | +--------------+ 1 - Number Of Files // for each file 4 - Unknown 4 - End Of Directory Marker (null indicates end of directory, otherwise there are more files) 4 - Unknown 4 - Offset (relative to the end of the directory) X - File Data +--------------+ | AFL 99 *.pgf | +--------------+ 4 - Header (TCA + (byte)2) 4 - Version (1) 4 - Unknown 4 - Unknown 4 - null 4 - Unknown 2 - Number Of Files? // for each file 44 - Unknown Junk X - Filename (null) (filename is absolute - ie it is D:\XXX) // for each file 2 - Unknown X - Filename (null) X - File Type Description 1 (null) X - File Type Description 2 (null) 60 - Unknown Junk X - File Data +----------------------+ | Age Of Empires *.drs | +----------------------+ // Same as Age Of Empires 2 *.drs +------------------------+ | Age Of Empires 2 *.drs | +------------------------+ 36 - Header (Copyright (c) 1997 Ensemble Studios.) 4 - Unknown (26) 16 - Archive Name (null terminated) (1.00tribe) 4 - Number Of Groups 4 - First File Offset // for each group 4 - Extension (reversed, 32 terminated after reversal) 4 - Directory Offset 4 - Number Of Files // go to each directory offset // for each file in the directory 4 - File ID 4 - Offset 4 - Size X - File Data +----------------------------+ | Airline Tycoon *.gli *.glj | +----------------------------+ 5 - Header (GLIB2) 3 - null 2 - Unknown (3) 4 - Archive Size 8 - null 4 - Unknown 4 - Unknown 4 - Unknown 4 - Number Of Files [-1] 4 - Unknown (54) 4 - Unknown 8 - null 4 - Unknown (13) 4 - Unknown 1 - null 4 - Data Size // for each file 4 - Type ID? 1 - Unknown (1) 8 - Filename (null) 4 - Offset X - File Data +-----------------------------------------+ | Allan Border Cricket *.lbm (chunk)(big) | +-----------------------------------------+ 4 - Type 4 - Size Of Archive 4 - name/extension? // for each file 4 - File Type 4 - Length X - File Data +-------------------------------+ | Allods 2: Rage Of Mages *.res | +-------------------------------+ 4 - Header (&YA1) 4 - Unknown 4 - Unknown 4 - Unknown (1) 4 - Directory Offset 4 - Number Of Files X - File Data // for each file 4 - null 4 - File Offset (if directory, this is the number of files in this directory?) 4 - File Length (if directory, this is the number of files in this directory?) 4 - Directory/File Indicator (0=file, 1=Directory) 16 - Filename (null) +-------------------------------------+ | Amber - Journeys Beyond *.dxr (big) | +-------------------------------------+ // This archive uses BIG endian byte order for all numeric fields 4 - Header (RIFX) 4 - Archive Size [+18] 4 - Header 2 (MV93) 4 - iMap Header (imap) 4 - iMap Length (24) 4 - Unknown (1) 4 - Offset to mMap (44) 4 - Unknown (1217) 12 - null // mMap is the directory 4 - mMap Header (mmap) 4 - mMap Length 2 - Unknown (24) 2 - Unknown (20) 4 - Number Of Files (including nulls at the end of the directory) 4 - Number Of Files (not including the nulls at the end of the directory) 8 - Padding (all 255s) 4 - Unknown 4 - Header (RIFX) 4 - Archive Size [+18] 4 - null 4 - Unknown 4 - null // for each file 4 - File Type/Extension 4 - Length 4 - Offset 8 - null X - null padding (according to the numOfFiles fields above) // for each file 4 - File Size X - File Data 0-1 - null Padding (to multiple of 2 bytes) +------------------+ | Anachronox *.dat | +------------------+ // Uses ZLib compression? 4 - Header (ADAT) 4 - Directory Offset 4 - Directory Length 4 - Unknown (9) X - File Data X - Directory // go to dirOffset // for each file 128 - Filename (null) 4 - File Offset 4 - Decompressed File Length 4 - Compressed File Length 4 - Unknown (hash?) +--------------------------+ | Animal Quest *.ggl *.gsl | +--------------------------+ 2 - Unknown (big-endian) 32 - Header (Copyright (c)ALIVE SOFTWARE 1995) 94 - Unknown // for each file 1 - null 8 - Filename (terminated by spaces) 4 - File Extension (including the .) 1 - null 4 - File Offset 4 - File Size 4 - Unknown X - File Data +-------------------------------+ | Apache Longbow *.bin (Type 1) | +-------------------------------+ 4 - Number Of Files // for each file 4 - Data Offset X - File Data +-------------------------------+ | Apache Longbow *.bin (Type 2) | +-------------------------------+ 4 - Unknown // for each file 8 - Null 4 - Data Offset 12 - Null X - null padding to first file offset at 1444 X - File Data +----------------+ | Aquarium *.sdf | +----------------+ // These are WAV Audio files +----------------------+ | Aquarium *.bin + hdt | +----------------------+ // HDT contains the file offsets, BIN contains the file data // for each file 4 - File Offset +----------------------+ | Armored Fist 3 *.pff | +----------------------+ 4 - First File Offset (20) 4 - Header (PFF3) 4 - Number Of Files 4 - Length Of Each Directory Entry (32) 4 - Directory Offset X - File Data X - Directory // go to directory offset // for each file 4 - End Of Directory Marker (non-null for end of directory, null for a file entry) 4 - File Offset 4 - File Size 4 - Some kind of file type identifier? 16 - Filename (null) 4 - End Of Directory Marker (ie the first field in the loop above - non-null value) 4 - null 4 - End Of Archive Tag (KING) +-------------------------------------+ | Army Men: Toys In Space *.amm *.atl | +-------------------------------------+ 4 - Header (FORM) 4 - Archive Size [+8] 4 - Archive Name (MAP ,TILE) // For each file 4 - File Type/Extension 4 - File Size (if FileType="OATT", subtract 1 from this field!) X - File Data +-----------------------------+ | Battle Isle 2 *.lib (chunk) | +-----------------------------+ 4 - Data Size? 4 - Header (TCT ) 2 - Number Of Files 2 - Unknown // for each file 8 - Filename 4 - Offset X - File Data +------------------------+ | Battlefield 1942 *.rfa | +------------------------+ // Compression is used on some of the files 4 - Directory Offset 4 - Version X - File Data X - Directory // go to dirOffset 4 - Number Of Files // for each file 4 - Filename Length X - Filename 4 - Compressed File Size 4 - Uncompressed File Size 4 - Offset 4 - Type ID? 4 - Unknown 4 - Unknown +---------------------+ | Battle Realms *.h2o | +---------------------+ // NOTE: This archive is unusual in that the directory contains 4 times more entries // than the number of files in the archive, yet it only repeats twice. 480 - Header (starting with "//" + "*" x54 + "//") 1 - Unknown (26) 4 - Version (6) 4 - Number Of Files 4 - null 4 - Decompressed File Data Size 4 - Compressed File Data Size 4 - null 4 - Compressed File Data Size 12 - null // for each file [*4] 4 - File ID? 4 - Decompressed File Size 4 - Compressed File Size 4 - Unknown 4 - File Offset 4 - null 8 - Unknown 4 - null 4 - Unknown ID X - File Data +----------------------------------+ | Battleship Surface Thunder *.mgf | +----------------------------------+ 4 - Header (MGFs) 2 - Version? (1) 2 - Version? (1) 4 - Archive Size 4 - Number Of Files 4 - First File Offset 4 - Unknown // for each file 4 - Filename offset 4 - Size 4 - Unknown 4 - Data Offset // for each file X - Filename (null) X - File Data +---------------------------+ | Betrayal At Krondor *.001 | +---------------------------+ // SAME AS 3D Ultra Pinball *.001 +-------------+ | Blood *.rff | +-------------+ 3 - Header (RFF) 4 - Unknown 1 - null 4 - Directory Offset 4 - Number Of Files X - Unknown +---------------+ | Blood 2 *.rez | +---------------+ 127 - Description/Header 4 - Version (1) 4 - dirOffset 4 - dirSize 4 - Unknown 4 - Offset to Last Dir 4 - Unknown 4 - null 4 - Unknown (19) 4 - Unknown (24) 4 - null 4 - Unknown (1) 13 - null X - File Data X - Directory // go to dirOffset // for each file 4 - Type (0/1) if (type == 1){ // directory 4 - offset 4 - size 4 - Date/Time X - filename (terminated by 1 null) } if (type == 0){ // file 4 - offset 4 - size 4 - Date/Time 4 - File ID? 4 - Type/Extension (reversed) 4 - null X - filename (terminated by 2 nulls!) } +--------------------+ | Bloodrayne 2 *.pod | +--------------------+ 4 - Header (POD3) 4 - Unknown (Checksum or timestamp?) 80 - Description (null) 4 - Number Of Files 4 - Unknown 4 - Unknown (1000) 4 - Unknown (1000) 160 - null 4 - Directory Offset 4 - Unknown 4 - Filename Directory Length 4 - null 4 - Padding (all 255's) 4 - Unknown X - File Data X - Directory X - Filename Directory X - russellm Filename Directory // go to dirOffset // for each file 4 - Relative filename offset (relative to the start of the filename directory) 4 - File Length 4 - File Offset 8 - Unknown (checksum?) // for each file X - Filename (null) // for each file 32 - Description (null) (russellm) 4 - Unknown ((byte)20 + "RdA") 4 - Unknown (1) 256 - Filename (null) 8 - Unknown (checksum?) 8 - null (last file is a checksum or something, maybe for the whole archive) +---------------------+ | Brett Hull 95 *.rsc | +---------------------+ 2 - Number Of Files // for each file 4 - File Size 4 - Timestamp (less the first 4 numbers - ie minus 1099000000000) 4 - Data Offset 13 - Filename (null) X - File Data +----------------------------------------------------------+ | Carmageddon: Total Destruction Racing 2000 *.pak + *.dir | +----------------------------------------------------------+ // *.dir has the details, *.pak has the file data // for each file (read until EOF) X - filename (read until byte=8) 4 - Offset 4 - Size // to determine the filename, do the following // String filename = readByte(); // while (readByte() != (byte)8){ // filename += readByte(); // } // // Explaination: // Each character of the filename is split over 2 bytes, with each 2nd byte determining when to stop // When the 2nd byte is 8, stop. // Otherwise, add the next byte to the filename +------------------+ | Carnivores *.car | +------------------+ 24 - Archive Name 8 - Version ("msc: " + ###) 4 - Number Of Animations 4 - Number Of Sounds 4 - Number Of Points 4 - Number Of Triangles 4 - Texture Length // for each triangle 4 - Point 1 4 - Point 2 4 - Point 3 4 - Point 1 X 4 - Point 2 X 4 - Point 3 X 4 - Point 1 Y 4 - Point 2 Y 4 - Point 3 Y 4 - Flags 4 - Unknown 4 - Parent Triangle Index 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown // for each point 4 - X Coordinate 4 - Y Coordinate 4 - Z Coordinate 4 - Attached Bone Index X - Texture Data // for each animation{ 32 - Animation Name 4 - Divisor 4 - Number Of Frames // for each frame{ // for each point{ 2 - X Coordinate 2 - Y Coordinate 2 - Z Coordinate } } } // for each sound 32 - Sound Name 4 - Sound Length X - Sound Data // for each animation 4 - Sound ID +-----------------------------+ | CART Precision Racing *.pod | +-----------------------------+ // Same as 4x4 Evolution *.pod (version 1) and Terminal Velocity *.pod +-------------------+ | Case Closed *.dsk | +-------------------+ // for each file 4 - Header (SPIS) 4 - Compression Header ((byte)26 + LZH) 4 - Decompressed File Size 4 - Unknown 5 - null 2 - Filename Length 2 - Unknown 4 - Unknown 4 - Decompressed File Size 4 - Compressed File Size 1 - Unknown (2) 4 - Unknown 4 - null X - Filename (null) X - File Data +---------------------------+ | Castle Of The Winds *.cwg | +---------------------------+ 2 - Header (vw) 2 - Version ((byte)1 (byte)1) (ie 1.1 4 - Unknown // for each file 4 - File Offset // stop when the fileOffset = 0 X - null padding to first file offset (or to 128) X - File Data +----------------------+ | Catwoman *.pcm *.pcs | +----------------------+ 4 - Header (BIGB) 4 - Header Size? (484) 120 - Unknown 4 - Directory Offset [+500] 288 - Unknown 4 - Number Of Files 76 - Unknown X - File Data // go to dirOffset // for each file 2 - File Type ID (1 = tga) 2 - Unknown 4 - File Offset [+500] 4 - Offset to File Size Header [+500] // go to file offset 4 - Unknown 64 - Filename of Archive this file is located in (null) 16 - Name 1 16 - Name 2 64 - Last Edited Date 64 - Created Date 64 - Filename (null) 4 - Offset to DDS Header [+fileSizeHeaderOffset] 4 - Offset to DDS Header [+fileSizeHeaderOffset] 4 - null //NOTE - If using the file size header offset, it jumps to this position 4 - File Header Size (relative to File Offset) 4 - File Size 4 - Unknown 4 - Unknown 16 - null X - File Header (to FileHeaderSize) X - File Data +----------------------+ | Catwoman *.vol *.avl | +----------------------+ 4 - Header (VOLT) 4 - Version? (2) 4 - numFiles 4 - Directory Size // for each file 4 - Unknown 4 - File Type ID? (1) 4 - File ID Number? (goes up by 25 for each file) // for each file 4 - File Offset ? 4 - null 4 - File Size ? 4 - null X - Filename (null) X - File Data +----------------+ | Cavewars *.dbs | +----------------+ 7 - Header (wavfile) 4 - Number Of Files // for each file 4 - Offset 4 - Length X - File Data +------------------+ | Champ Kong *.bin | +------------------+ 2 - Number Of Files? // for each file 2 - File Type ID? 14 - Filename (null) 4 - Length 4 - Offset X - File Data +-------------+ | Chaser *.fs | +-------------+ 1 - null X - File Data X - Directory 4 - Directory Offset // go to directory offset 4 - Directory Size (not including the 4 dir offset at the end) 4 - Unknown (8192) 4 - Archive Name Length 4 - Version (1) 4 - Filename Directory Size 4 - Number of Files X - Archive Name (null) // for each file X - Filename (null) // for each file 4 - File Offset 4 - Compressed File Size 4 - Decompressed File Size 4 - null // No compression is used, so the CompressedFileSize=DecompressedFileSize +-----------------------+ | Chasm: The Rift *.bin | +-----------------------+ 4 - Header (CSid) 2 - Number Of Files // for each file 1 - Filename Length 12 - Filename (null) 4 - File Length 4 - File Offset X - null Padding so that the directory is a multiple of 2048 bytes // note: padding does not include first 6 bytes of the archive, only the directory! X - File Data +-------------------+ | Chill Manor *.ani | +-------------------+ 4 - Header (ANI ) 4 - Archive Size [+4] 4 - Header Tag (hdr ) 4 - Version (1) 4 - Unknown (2) 2 - Unknown (10) 4 - Number of Audio Channels (22050) 2 - Mono/Stereo (1) 2 - Bits Per Channel (8) 2 - Unknown (320) 2 - Unknown (19) 4 - Number Of Files 4 - Unknown 4 - Unknown (2205) 4 - Unknown // for each file 4 - Offset (relative to the end of the directory) X - File Data +-------------------+ | Chill Manor *.lab | +-------------------+ // for each file 12 - Filename (null) 4 - Offset X - Padding to multiple of 2048 bytes X - File Data +-----------------------+ | City Of Heroes *.pigg | +-----------------------+ // USES ZLib COMPRESSION 4 - Unknown 2 - Unknown 2 - Unknown 2 - Unknown 2 - Unknown 4 - Number Of Files // for each file 4 - Unknown 4 - null 4 - Decompressed File Size 4 - Unknown 4 - Offset 4 - null 4 - Unknown (all 255) 16 - Unknown (hash?) 4 - Compressed File Size (if =0, it is uncompressed, so compressedSize=decompressedSize) 4 - Unknown 4 - Number Of Filenames 4 - Filename Directory Length // for each file 4 - Filename Length X - Filename (null) X - File Data +-----------------------------------+ | Civilization: Call To Power *.ctp | +-----------------------------------+ // ZIP Archive +-----------------------------------------+ | Close Combat 3: The Russian Front *.sfx | +-----------------------------------------+ // SAME AS CLOSE COMBAT 4 SFX 4 - Number Of Files 4 - Year Of Archive Creation? (99) 8 - null // for each file 4 - File Size 4 - File Offset 2 - Unknown (1) 2 - Unknown (2) 4 - Unknown (8790) 4 - Sound Quality (44100) 2 - Mono/Stereo (2) 2 - Sound Bitrate (8) 4 - Unknown (da + 2*null) X - File Data +-----------------------------------------+ | Close Combat 3: The Russian Front *.zfx | +-----------------------------------------+ 4 - Number Of Files (not always correct!) // for each file 13 - Filename (null) (Warning - can have a null in the middle of the filename too!) X - null Padding to offset 7804 (some have about 20 bytes of junk near the end of the padding) // for each file 4 - File Offset X - Padding to offset 12604 (mostly nulls and other groups of junk data) // for each file 4 - File ID (incremental from number 0) 4 - File Length 476 - Padding to the start of the file (padded with Unknown 4-byte values) X - File Data +-----------------------------------------------+ | Close Combat 4: The Battle Of The Bulge *.azp | +-----------------------------------------------+ 4 - Number Of Files // for each file 256 - Filename (null) 4 - File Offset 4 - File Length X - File Data +-----------------------------------------------+ | Close Combat 4: The Battle Of The Bulge *.gdg | +-----------------------------------------------+ 4 - Header (GADG) // GADG=gdg 4 - Version (1) 4 - Number Of Files // for each file 32 - Filename (null) 4 - Unknown (0/9) 4 - File Type ID? 4 - File Offset X - File Data +-----------------------------------------------+ | Close Combat 4: The Battle Of The Bulge *.pix | +-----------------------------------------------+ 4 - Header (PICS) // PICS=pix 4 - Version (1) 4 - Number Of Files // for each file 32 - Filename (null) 4 - Image Width (800) 4 - Image Height (600) 4 - File Length 4 - File Offset X - File Data +-----------------------------------------------+ | Close Combat 4: The Battle Of The Bulge *.sfx | +-----------------------------------------------+ 4 - Number Of Files 4 - Unknown (99) 8 - null // for each file 4 - File Length 4 - File Offset 2 - Unknown (1) 2 - Unknown (1) 4 - Audio Quality (22050) 4 - Audio Quality (44100) 2 - Number Of Sound Channels (2) 2 - Audio Quality (16) 4 - null X - File Data +---------------------------+ | Colin McRae Rally 2 *.bfl | +---------------------------+ 4 - Header (CMPR) 4 - Archive Size X - File Data X - Directory 4 - Directory Offset [+8] // go to dirOffset // for each file 4 - File Size 4 - Offset [+8] 4 - Filename Length X - Filename 0-3 - Padding to a multiple of 4 bytes +--------------------------+ | Commanche Enhanced *.kdv | +--------------------------+ 4 - Header (KRL0) //note the zero, not an O 4 - archive size [-8] 4 - Header (KDV0) // once again, it is a zero 4 - archive size [-8] 4 - Number Of Files 4 - Unknown 4 - DirSize [-8] 4 - Unknown 4 - Unknown // for each file 4 - File Offset [-8] X - File Data +--------------------------+ | Commanche Enhanced *.dta | +--------------------------+ 4 - Header 1 (Kyle) 4 - Header 2 ( DTA) 4 - Archive Type? 4 - Archive Type? 48 - Description 64 - Unknown X - Unknown +---------------------------------+ | Command: Aces Of The Deep *.dyn | +---------------------------------+ 20 - Header (Dynamix Volume File) + null 2 - Unknown 4 - Unknown 2 - Unknown 2 - Unknown 2 - Unknown 4 - numFiles // for each file 4 - Unknown // for each file 13 - Filename (null) 4 - File Size X - File Data 0-3 - null padding (to a multiple of 4 bytes) +----------------------------------------+ | Command And Conquer *.vqa (chunk)(big) | +----------------------------------------+ 4 - Header (FORM) 4 - Archive Size [+8] 4 - Header 2 (WVQA) // for each file 4 - Type/Extension 4 - File Size X - File Data +-------------------------------+ | Command and Conquer: Generals | +-------------------------------+ 4 - Header (BIGF) 4 - Archive Size 4 - Number Of Files 4 - Directory Size (including this header information ie. first file offset) // for each file 4 - Offset 4 - Size X - Filename (null) X - File Data +--------------------------+ | Counterstrike XBox *.xpr | +--------------------------+ 4 - Header (XPR1) 4 - Archive Size 4 - First File Offset (2048) 4 - Number Of Files // for each file 4 - Filename Offset [+12] 4 - Data Entry Offset [+12] 4 - null // for each file X - Filename (null) 4 - null // for each file 2 - Unknown (1) 2 - Unknown (4) 8 - Offset [+firstFileOffset] 8 - Unknown 4 - Padding (all 255's) X - Padding to first file offset (using dashes "-") X - File Data +----------------------------+ | Crimson Land *.paq (chunk) | +----------------------------+ // The file data is compressed using ZLIB on some files. If a file is compressed, // the compressed file data starts at offset+9 and has size length-9. 4 - Header (paq) + null // for each file X - Filename (null) 4 - File Size X - File Data +---------------------+ | Custom Person *.arc | +---------------------+ 4 - Number Of Files // for each file X - Filename (null) 4 - Data Offset 4 - null +------------------+ | Cybermercs *.res | +------------------+ 2 - Number Of Files 2 - Unknown (0/1) 4 - Unknown 4 - Unknown // for each file 4 - File ID? 2 - Filename Length 2 - Encrypted? (0=normal, 101=encrypted) // for each file X - Filename (the length is obtained from the directory above) 4 - File Offset 4 - File Size X - File Data +------------------------+ | Cyclones *.glb (chunk) | +------------------------+ // for each file 4 - Type 2 - Unknown 4 - Size X - File Data // can use the first field as a header for checking if archive is valid (GOBJ) +--------------------+ | Cyclones *.cd *.hd | +--------------------+ 2 - Number Of Files 4 - dirOffset 4 - dirSize (includes all directory entries and filenames) X - fileData X - Directory // go to dirOffset // for each file 4 - Data Offset (relative to the first file offset. ie 10) 4 - File Size 4 - Filename Offset (relative to dirOffset) // Note that some files have 0 as the offset and size, this should be ignored? // for each file X - Filename (null) +------------------+ | Dark Reign *.ftg | +------------------+ 4 - Header (BOTG) 4 - dirOffset 4 - Number Of Files X - File Data X - Directory // go to dirOffset // for each file 28 - Filename (null) 4 - Offset 4 - Size // NOTE - The files are NOT stored in the directory in the same order as they are stored in the archive // ie. File 1 in the directory is NOT necessarily the first file in the archive starting at offset 12 +--------------------+ | Dark Reign 2 *.zwp | +--------------------+ 4 - Header (NORK) 4 - Version (1) 4 - Unknown 4 - Archive Size 4 - Number Of Files 4 - Directory Offset 32 - null X - File Data X - Directory // go to Directory Offset // for each file 4 - null 1 - Filename Length X - Filename 4 - File Offset 4 - File Length +----------------------+ | Dark Vengeance *.rbd | +----------------------+ // NOTE: Some numbers are big-endian, others are little-endian! 4 - Unknown (512) 4 - Unknown *BIG* (76) 4 - Padding (all 255's) 4 - Unknown 56 - Header (Copyright 1998 Reality Bytes, Inc. All rights reserved.) 952 - null Padding to offset 1024 // for each item 4 - Entry Type (0=File, 1=Leaf Directory, 257=Directory with sub-directories in it) if (entryType=1 || entryType=257){ 4 - Number Of Files/Subdirectories In Directory *BIG* 4 - Number of the following entries to be read before this directory is finished *BIG* 4 - null 4 - null 4 - null 4 - null 4 - null 1 - Directory Name Length 63 - Directory Name (null) } else if (entryType=0){ 4 - File Length *BIG* 4 - File Offset *BIG* 4 - Unknown 4 - Unknown 4 - Purpose Description (SCPL, ttxt, LMAN, MSWD, 8BIM, etc.) 4 - Type Description (WAVE, TEXT, PNGf, etc.) 4 - Unknown 1 - Filename Length 63 - Filename (null) } X - File Data +----------------+ | Darwinia *.dat | +----------------+ // Generic RAR archive +--------------------------------------+ | Dave Mirra Freestyle BMX *.zmd *.zsd | +--------------------------------------+ 4 - Header (MODL) 4 - Archive Size [+8] // for each file 4 - Tag/Extension String 4 - File Length X - File Data +--------------------------------+ | Dave Mirra Freestyle BMX *._sd | +--------------------------------+ // for each file 4 - Tag/Extension String 4 - File Length X - File Data +--------------------------------+ | Dave Mirra Freestyle BMX *.zal | +--------------------------------+ 4 - Header (28 81 129 42) 12 - null 4 OR 84 - Unknown // for each file 1 - File ID (incrementing from 0) 3 - Unknown 4 - Data Offset (+100) 4 - Unknown 4 - File Size 0-3 - Padding to a multiple of 4 bytes X - File Data +-------------------+ | Dawn Of War *.sga | +-------------------+ // SOME FILES ARE ZLIB COMPRESSED 8 - Header (_ARCHIVE) 4 - Version (2) 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 128 - Archive Name (unicode) 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - File Data Offset [+180] 4 - File Data Offset (exact, no need for +180!) 4 - Descriptions Directory Offset (24) [+180] 2 - Number Of Descriptions (1) 4 - Folders Directory Offset [+180] 2 - Number Of Folders 4 - Files Directory Offset [+180] 2 - Number Of Files 4 - Filename Directory Offset [+180] 2 - Number Of Filenames // THE DESCRIPTIONS DIRECTORY OFFSET POINTS TO HERE // for each description 64 - Category / Directory 64 - Archive Name 2 - Unknown 4 - Unknown 4 - Unknown // THE FOLDERS DIRECTORY OFFSET POINTS TO HERE // THIS DIRECTORY HOLDS REFERENCES TO FOLDERS THAT CONTAIN OTHER FOLDERS IN THEM // for each folder 4 - Folder Name Offset (relative to filename directory offset) 2 - First Sub-Folder Number 2 - Last Sub-Folder Number // NOTE - IF THE 2 FIELDS ABOVE =36, THEY CONTAIN NO SUB-FOLDERS 2 - First Filename Number 2 - Last Filename Number // THE FILES DIRECTORY OFFSET POINTS TO HERE // for each file 4 - Filename Offset (relative to filename directory offset) 4 - Unknown 4 - File Offset (relative to start of the file data) 4 - Decompressed File Size 4 - Compressed File Size // THE FILENAMES DIRECTORY OFFSET POINTS TO HERE // for each folder and file X - Filename (null) // THE FILE DATA OFFSET POINTS TO HERE // for each file 235 - Filename (null) 8 - File Header (maybe a hash?) X - File Data +----------------+ | Deadlock *.cam | +----------------+ 8 - Header (CYLBPC ) 2 - Version Main (1) 2 - Version Sub (1) 4 - Number Of File Types // for each file type 4 - Size of the directory for this file type [+8] (including these 4 fields) 4 - File Type Description (WAVE) 4 - Size of each file entry (28) 4 - Number Of Files of this type 4 - null // for each file of this type 4 - Filename? File ID? 16 - null 4 - File Offset 4 - File Size X - File Data +------------------------+ | Deadlock *.hdd + *.hdx | +------------------------+ // HDD STRUCTURE (CONTAINS THE FILE DATA) // for each file 4 - File Size X - File Data // HDX STRUCTURE (THE DIRECTORY) 4 - Number Of Files // for each file 4 - Filename/FileID (null) 4 - null 4 - File Offset +-------------------------+ | Defiance *.dat (Type 1) | +-------------------------+ // Just a ZIP file +-------------------------------------+ | Defiance *.dat (Type 2) *.bio *.rez | +-------------------------------------+ 4 - Header (BRGR) 4 - Version (1) 4 - Directory Size (excluding the first 3 fields of the header) 4 - Version (1) 4 - Unknown 4 - Number Of Files // for each file 4 - Offset 4 - Length 4 - null // FILE DATA (with the following format) // for each file 4 - File Tag / Extension 4 - File Size (BIG ENDIAN ORDER) X - File Data +--------------------------------+ | Delta Force Land Warrior *.sbf | +--------------------------------+ 4 - Header (SBF0) // note the zero, it is not an O 4 - Unknown (256) 8 - Version? (1) 4 - Unknown (24) 4 - Number Of Files // for each file 16 - Filename 4 - Offset 4 - Size 8 - Type ID? X - File Data +--------------------------------+ | Delta Force Land Warrior *.pff | +--------------------------------+ 8 - Header 4 - Number Of Files 4 - Unknown 4 - Directory Offset X - File Data X - Directory // go to dirOffset // for each file 4 - Unknown 4 - File Offset 4 - Size 4 - Unknown 16 - Filename +------------------+ | Demon Star *.glb | +------------------+ 8 - Header (GLB2.0) + null null 8 - Unknown // for each file 4 - Offset 4 - Size 20 - Filename X - File Data +---------------+ | Descent *.pig | +---------------+ 4 - Number Of Images 2 - Number Of Sounds 2 - Unknown // for each Image 8 - Filename 5 - Unknown 4 - Offset // for each Sound 8 - Filename 4 - Raw File Size 4 - Compressed File Size 4 - Offset X - Image File Data X - Sound File Data +---------------+ | Descent *.hog | +---------------+ 3 - Header (DHF) // for each file 13 - Filename (null) 4 - Size X - File Data +-----------------+ | Descent 2 *.hog | +-----------------+ // SAME AS DESCENT *.hog +-----------------------+ | Descent 2 *.s11 *.s22 | +-----------------------+ // compressed and uncompressed sizes are the same, as no compression is used 4 - Header (DSND) 4 - Version (1) 4 - Number Of Files // for each file 8 - Filename (null) 4 - Compressed File Size 4 - Uncompressed File Size 4 - Offset (from end of directory) X - File Data +-----------------+ | Descent 2 *.sow | +-----------------+ // Unknown compression is used in this archive 4 - Unknown (header?) 4 - Unknown 2 - Unknown (16) 6 - Unknown 4 - Unknown 14 - null 14 - Archive Filename // for each file??? 2 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Compressed File Size 4 - Uncompressed File Size 4 - Unknown 2 - null 4 - Unknown (file ID?) 12 - Filename X - File Data +-----------------------------------+ | Descent 3 *.hog *.d3c *.d3m *.mn3 | +-----------------------------------+ 4 - Header (HOG2) 4 - Number Of Files 4 - First File Offset 56 - Padding (filled with bytes of value 255) // for each file 36 - Filename (null) 4 - null 4 - Size 4 - Timestamp X - File Data +---------------------------------------+ | Descent Freespace: The Great War *.vp | +---------------------------------------+ 4 - Header (VPVP) 4 - Version (2) 4 - Directory Offset 4 - Number Of Files X - File Data X - Directory // go to dirOffset // for each file 4 - File Offset 4 - File Length (0=directory, #=file) 32 - Filename (null) 4 - Type Code? (0=directory) // NOTE: Directories are stored as file entries with a length of 0. Directory names // will always build up like as normal file tree. For example, if the directory name // is valid, it is assumed that the directory is inside the current directory, but a // directory with name ".." means go back up to a previous directory. Using this method, // the files and their directories can be built up level by level. +-------------------+ | Desert Raid *.lid | +-------------------+ // for each file 10 - Filename (filled with nulls, if filename is too short) 4 - File ID? 4 - File Size 4 - File Offset X - File Data +---------------------+ | Desert Strike *.dat | +---------------------+ 8 - Number Of Files [-1] 16 - null // for each file 4 - Offset 2 - ID? 2 - Unknown 8 - Filename X - File Data +-------------------------+ | Destruction Derby *.bin | +-------------------------+ // for each file 4 - File Offset 4 - File Size? 4 - Directory/File? (0/1) 4 - File/Directory? (0/100) // NOTE - Files where first field is 1 and also where second field is 100 (not at the same time) // Directories only occur at first field 0 and second field 0 // for each file 4 - null X - File Data +-------------------------------+ | Destruction Derby *.000 *.001 | +-------------------------------+ 6 - Header (PACKED) 4 - Unknown 4 - Decompressed File Size? // if (decompressedSize != fileSize) X - ZLib Compressed Data // else X - Unknown +------------------------+ | Die By The Sword *.atd | +------------------------+ 4 - Number Of Files // for each file 4 - Offset 4 - Length 80 - Filename (null) X - File Data +---------------------+ | Dink Smallwood *.ff | +---------------------+ 4 - Number Of Files // for each file 4 - File Offset 13 - Filename (null) X - File Data +------------------------------------+ | Dirt Track Racing *.pf *.pfc *.pfb | +------------------------------------+ // Same as Leadfoot *.pf +--------------------------------------+ | Dirt Track Racing - Sprint Cars *.pf | +--------------------------------------+ 4 - Version (2) X - File Data X - Directory 4 - Directory Offset 4 - Unknown // go to dirOffset 4 - numFiles? // for each file X - Filename (null) 4 - File ID 4 - Unknown // if unknown field is all 255s, add the following 2 fields{ 4 - File Offset 4 - File Size } 2 - null +------------------------------------+ | Dominion - Storm Over Gift 3 *.000 | +------------------------------------+ // FirstFileOffset = DirectorySize + 60 4 - Unknown 4 - Directory Size (Size of all the file entries) 4 - null 4 - Unknown (9) 4 - Unknown (2) 4 - Unknown (64) 4 - Unknown (1) 12 - null 4 - Number Of Files 4 - Unknown (64) 12 - null // for each file 4 - File Size 252 - null X - File Data +------------------------------------+ | Dominion - Storm Over Gift 3 *.rdf | +------------------------------------+ // Number of files is = (arcSize-dirOffset)/128 56 - Header ("Resource Data File " + (byte)254 + " Copyright (c) 1997 Ion Storm, Ltd." + (byte)10) 8 - null 128 - Description (null) 4 - Unknown 4 - Unknown 4 - Directory Offset X - File Data X - Directory // Go to directory offset // for each file 118 - Filename (null) 2 - File ID 4 - Length 4 - Offset +----------------+ | Driver 3 *.gsd | +----------------+ 4 - Header (01KB) 4 - Number Of Files // for each file 4 - File Offset 4 - Archive Length? X - Padding to multiple of 2048 bytes // for each file 4 - File ID? 4 - Header Size 4 - File Length 4 - null X - Header (size of field = headerSize) X - File Data X - Padding to a multiple of 2048 bytes +--------------------+ | Duke Nukem 2 *.cmp | +--------------------+ // for each file 12 - Filename 4 - Offset 4 - Size X - File Data +---------------------+ | Duke Nukem 3D *.grp | +---------------------+ 12 - Header (KenSilverman) 4 - Number Of Files // for each file 12 - Filename (null) 4 - File Size X - File Data +------------------------+ | Earthworm Jim 3D *.dat | +------------------------+ 4 - numFiles // for each file 4 - File Offset 4 - Unknown (sometimes nulled by 64,0,64,0) 4 - Unknown (0,4,0,7) // for each file 2 - Filename Length (including null) X - Filename (null) X - File Data +----------------------+ | Empire Earth 2 *.zip | +----------------------+ // Generic ZIP archive +-----------------------------------------+ | Empires: Dawn Of The Modern World *.ssa | +-----------------------------------------+ 4 - Header (rass) 4 - Version (1) 4 - null 4 - dirSize // for each file 4 - Filename Length X - filename 4 - offset 4 - Size [-1?] 4 - Unknown X - File Data // Some are PK compressed? +------------------------------------------------+ | Empires: Dawn Of The Modern World *.spt, *.aud | +------------------------------------------------+ // WAVE AUDIO // Some are PK compressed? +--------------------------------+ | Emperor: Battle For Dune *.bag | +--------------------------------+ 4 - Header (GABA) 4 - Version (4) 4 - Number Of Files 4 - Size Of Each Directory Entry (64) // for each file 32 - Filename (null) 4 - Offset 4 - Length 4 - Audio Quality (22050) 4 - File Type? (6,28,37) 4 - Unknown 12 - null X - File Data +---------------------+ | Enemy Nations *.dat | +---------------------+ 4 - Header (WSDF) 4 - Directory Size (not including these 2 fields) // for each file 4 - Filename Length (including null padding to a multiple of 4 bytes) X - Filename 1-4 - (null) Padding to a multiple of 4 bytes 4 - Offset X - File Data +------------------------+ | Enter The Matrix *.asb | +------------------------+ // This archive uses the dash (-) for a filler or unspecified values // most noticable in groups of 4 dashes // also, I can't see why the file offsets don't start right after the directory, // nor continue to the end of the archive 4 - Directory Size (including the directory and all this header stuff) 4 - Header Size (32) 4 - Unknown 4 - numFiles 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Filler 4 - numIDs? [-5] 4 - Filler 4 - Unknown // for each ID 4 - ID number 120 - Filler 212 - Unknown // for each file 4 - File Offset X - File Data +------------------------+ | Enter The Matrix *.car | +------------------------+ // Not an archive? 4 - Version (1000 as a string) 8 - null 4 - Unknown 12 - null 2 - Unknown (1) 2 - Unknown (1)(big) 32 - Filename 1 (null) 32 - Internal Name (null) 32 - Filename 2 (null) 8 - null X - Unknown +------------------------+ | Enter The Matrix *.dcx | +------------------------+ // if any filename is too long, it is cut off 4 - null 16 - Filename (null) 24 - Unknown 4 - numFiles 48 - Unknown // for each file 32 - Filename 4 - Unknown 4 - Unknown (same as above unknown) 4 - File Type? 4 - File Size 4 - File ID or Timestamp? 12 - null X - File Data +-----------------+ | Entomorph *.lib | +-----------------+ 4 - numFiles // for each file 4 - File Offset 4 - File Size X - File Data +-----------------+ | Entomorph *.tlb | +-----------------+ 4 - Header 1 (HLIB) 4 - Archive Size 4 - numFiles 4 - Header 2 (TIL2) // for each file 4 - File Offset X - File Data +--------------------+ | Entrepreneur *.mtd | +--------------------+ 6 - Header (MTDLIB) 4 - Unknown // for each file 6 - File Header Tag (LIBBLK) 4 - File Size 4 - Extension/Type Tag 1 - Version (1) 20 - Filename X - File Data +--------------------+ | Entrepreneur *.sfx | +--------------------+ // Just a WAVE audio file +---------------------------------------------+ | Epic Warhammer 40k - Final Liberation *.muk | +---------------------------------------------+ 34 - Header (MUK file (C) Holistic Design 1997 + (byte)26) 6 - null 4 - Unknown 10 - null // for each file 13 - Filename (null) 4 - Offset 4 - Length X - File Data +---------------------------------------------------+ | Escape From Monkey Island (Monkey Island 4) *.lab | +---------------------------------------------------+ // Same as Star Wars Episode 1 *.lab +----------------+ | Esoteria *.22k | +----------------+ 4 - Header (cgds) 4 - Number Of Files [-1] // for each file 4 - Offset 4 - Archive Size X - File data +---------------+ | Esoteria *.e3 | +---------------+ 7 - Header (ESv1.0 ) 1 - Sub-type ((byte)96 or (byte)97 or (byte)99 or (byte)104 or (byte)105) 4 - Number Of Files // for each file 64 - Filename (null) 4 - Offset 4 - Length X - File Data +-------------------------------+ | Esoteria *.e3 (Internal Type) | +-------------------------------+ 7 - Header (ESv1.0 ) 1 - Sub-type ((byte)48 or (byte)83 or (byte)84 or (byte)94) 4 - null 4 - Type Name Length (including null) // NOTE: THE FOLLOWING 2 FIELDS DON'T APPEAR IF TypeNameLength=99 X - Type Name 1 - null 4 - null 4 - Filename Length (sometimes including null) X - Filename (null) (without extension) 18 - null X - File Data +------------------+ | Etherlords *.res | +------------------+ // Note: The files in the directory are in a different order to the files in the archive // eg File 1 in the directory might be File 273 in the archive // Also, the filenames in the filename directory do not have nulls in between them 4 - Header? ((bytes)60,226,156,1) 4 - Number Of Files 4 - Directory Offset 4 - Filename Directory Length X - File Data X - Offsets Directory X - Filename Directory // Goto DirOffset // for each file 4 - Unknown 4 - File Length 4 - File Offset 4 - Unknown 2 - Filename Length 4 - Filename Offset (relative to the start of the filename directory) // for each file X - Filename +--------------------------------------------+ | Evil Islands: Curse Of The Lost Soul *.res | +--------------------------------------------+ // Same as Etherlords *.res +-------------------------------+ | Extreme Pinball *.bnd + *.idx | +-------------------------------+ // IDX has the details, BND has the file data // for each file 4 - File ID 4 - Unknown 4 - File Type ID 4 - File Offset +------------------------+ | European Air War *.cdf | +------------------------+ // for each file 4 - Next Entry Offset 4 - File ID? 13 - Filename (null) 4 - Offset 4 - Size 5 - Unknown X - File Data +------------------------+ | European Air War *.bgm | +------------------------+ // THESE ARE WAVE AUDIO FILES +----------------------------+ | Evasive Action *.bbm *.lbm | +----------------------------+ // Same as generic LBM_FORM +-------------------+ | Evil Genius *.erb | +-------------------+ 4 - Header (KCAP) 4 - Version (2) 4 - Directory Offset X - File Data X - Directory // go to Directory Offset 4 - Number Of Files // for each file X - Filename (null) 4 - File Size 4 - File Offset 4 - null 4 - Unknown 4 - Unknown +---------------------------------+ | F-14 Fleet Defender *.rnc (big) | +---------------------------------+ 4 - Header (RNCA) 4 - Unknown 3 - Unknown // for each file X - Filename (null) 4 - File Offset // for each file 4 - Header (RNC) + (byte)1 4 - Unknown 4 - File Size (without the header data) 2 - Unknown 2 - Unknown 2 - Unknown X - File Data +------------------------+ | F-22 Lightning 2 *.res | +------------------------+ 12 - Header (RESOURCE2xxx) 4 - Number Of Files 4 - Unknown 4 - Unknown 4 - Unknown // for each file 4 - Offset 4 - Size 4 - Unknown 4 - Unknown 4 - Unknown X - File Data +-------------------+ | F-22 Raptor *.pff | +-------------------+ // SAME AS DELTA FORCE *.pff 4 - First File Offset (20) 4 - Header (PFF0) // NOTE - IT IS A ZERO! 4 - Number Of Files 4 - Length Of Each Directory Entry (32) 4 - Directory Offset X - File Data X - Directory // go to directory offset // for each file 4 - null 4 - File Offset 4 - File Size 4 - Some kind of file type identifier? 16 - Filename (null) +----------------+ | Falcon 4 *.zip | +----------------+ // Just a generic ZIP_PK archive +--------------------+ | Fallen Haven *.sti | +--------------------+ // Generic Bitmap *.bmp Image +---------------------+ | Fallout *.dat (big) | +---------------------+ 4 - Number of Directories 4 - Unknown 2 - null 4 - Unknown 2 - Unknown // for each directory 1 - Directory Name Length X - Directory Name 4 - Unknown 4 - Unknown 4 - Unknown (16) 4 - Unknown // for each file 1 - Filename Length X - Filename 4 - Unknown (64) 4 - File Offset 4 - Decompressed File Size 4 - Compressed File Size X - File Data +-----------------+ | Fallout 2 *.dat | +-----------------+ // THE COMPRESSION USED IS ZLIB X - File Data X - Directory 4 - Directory Length [+8] 4 - Archive Size // go to ArchiveSize - DirectoryLength 4 - Number Of Files // for each file 4 - Filename Length X - Filename 1 - Compression Tag? (1) 4 - Decompressed File Size 4 - Compressed File Size 4 - Offset +---------------------+ | Far Cry *.cgf *.cga | +---------------------+ 6 - Header (CryTek) 2 - Unknown 2 - null 2 - Unknown 4 - Unknown 4 - Directory Offset (can be all 255's, not sure what to do here if not a real value!) X - File Data X - Directory // go to dirOffset 4 - Number Of Files // for each file 2 - ID? 2 - Unknown (both 204) 1 - Group ID? 1 - File Type (0 = Archive Description, 9 = Root Directory?, 8 = Directory, 7 = File) 2 - null 4 - File Offset 4 - File Number (starting at 0) // at each file offset // IF TYPE = 0 X - Description (read until the next field = 14) 2 - ID? (14) (same as ID in dirEntry) 4 - Unknown 2 - Unknown 4 - File Offset (same as in dirEntry) 4 - File Number (same as in dirEntry) // IF TYPE = 9 2 - ID? (same as ID in dirEntry) 4 - Unknown 2 - Unknown 4 - File Offset (same as in dirEntry) 4 - File Number (same as in dirEntry) // IF TYPE = 8 2 - ID? (same as ID in dirEntry) 4 - Unknown 2 - Unknown 4 - File Offset (same as in dirEntry) 4 - File Number (same as in dirEntry) 4 - File Type / Extension? 4 - Unknown (160) 12 - Description (GlobalRange + null) 4 - File Number (same as in dirEntry) 4 - Offset? 4 - Unknown 4 - Unknown 8 - null 8 - Size? // IF TYPE = 7 2 - ID? (same as ID in dirEntry) 4 - Unknown 2 - Unknown 4 - File Offset (same as in dirEntry) 4 - File Number (same as in dirEntry) 128 - Description of item (null) X - File Data +---------------+ | Far Cry *.pak | +---------------+ // ZIP Archive +---------------+ | FIFA 96 *.pog | +---------------+ 2 - Unknown 4 - Unknown 4 - Header X - Unknown +---------------------+ | FIFA 99 *.big *.viv | +---------------------+ // Same as Command And Conquer: Generals *.big +-----------------------------------------------------------------------------+ | FIFA 2000 *.big *.abg *.poa *.viv *.ama *.gea *.dua *.fra *.spa *.swa *.uka | +-----------------------------------------------------------------------------+ // SAME AS COMMAND AND CONQUER GENERALS *.big +----------------------+ | Fighting Steel *.cat | +----------------------+ // Compressed files use ZLIB compression? 4 - Created Year? (2002) 1 - Version (1) 4 - numFiles // for each file 4 - Unknown 4 - Unknown 4 - Uncompressed File Size 4 - Compressed File Size 4 - Unknown (sometimes all 255s) 2 - null 2 - Unknown // for each file 256 - Filename (null) 4 - File Offset 16 - Unknown 4 - Uncompressed File Size ? 4 - Compressed File Size 4 - null 4 - Unknown (1) X - File Data +-----------------------+ | Final Fantasy 7 *.lgp | +-----------------------+ 2 - null 10 - Header (SQUARESOFT) 4 - Number Of Files // for each file 20 - Filename (null) 4 - Offset 3 - Unknown X - Unknown // for each file 20 - Filename (null) (same as in the directory) 4 - File Size 14 - Ending Tag (FINAL FANTASY7) +--------------------------------+ | Firestorm: Thunderhawk 2 *.wad | +--------------------------------+ // BIG ENDIAN ORDERING // for each file 4 - Filename Offset 4 - File Offset 4 - File Length 4 - null // for each file X - Filename (null) 1 - null X - File Data +---------------------------+ | Frank Herberts Dune *.dun | +---------------------------+ // NOTE: The files in the directory are in a different order to the files in the archive. // eg. File 1 in the directory may be File 482 in the archive. 4 - Header? ((bytes)114 16 234 244) 4 - null 4 - Directory Offset 4 - Number Of Files X - File Data X - Directory // go to dirOffset // for each file X - Filename (terminated by (byte)10) (some starting with "..\" or "R:\") 4 - File Offset 4 - File Length +-------------------------------------+ | Freedom Force vs The 3rd Reich *.ff | +-------------------------------------+ // Generic ZIP_PK Archive +----------------------------------+ | Game, Net, Match *.dat (Type BM) | +----------------------------------+ // Bitmap Image +---------------------------------+ | Game, Net, Match *.dat (Type 2) | +---------------------------------+ 4 - Archive Size 4 - numFiles // for each file 4 Offset X - File Data +--------------------------------+ | Game, Net, Match *.lib + *.din | +--------------------------------+ // DIN has the directory, LIB has the file data 4 - Header (DBIN) 4 - numFiles // for each file 4 - File ID (starting at 0) 13 - Filename (null) 4 - File Offset 4 - File Size +-----------------+ | Gateworld *.gw1 | +-----------------+ 32 - Header (HomeBrew File Folder) + 26 + nulls to fill 32 - Unknown // for each file 16 - Filename (null) 4 - File Offset 4 - File Size 8 - null X - File Data +----------------------+ | Genocide *.pak *.wad | +----------------------+ // for each file 4 - Length (including all these header fields) 12 - Filename X - File Data +-----------------+ | Gex *.lev *.idl | +-----------------+ 4 - Number Of Files 12 - null // for each file 4 - Unknown 4 - Unknown 4 - File Size 4 - File Offset X - padding to 2048 X - File Data +-----------------------------+ | Goblins 3 *.stk *.itk *.ltk | +-----------------------------+ 2 - Number Of Files // for each file 13 - Filename (null) 4 - File Offset 4 - File Length 1 - Unknown (0/1) X - File Data +---------------+ | G-Police *.da | +---------------+ // THESE ARE WAVE AUDIO FILES +----------------+ | G-Police *.rdt | +----------------+ 4 - Archive ID? 4 - Directory Size 4 - null 4 - Unknown 4 - null 4 - Header (RDA2) 4 - Unknown 4 - Number Of Files 4 - Type/Extension // for each file 4 - Offset (ignore offsets of 1) X - Padding? X - File Data +--------------------+ | Grand Prix 2 *.bin | +--------------------+ 8 - Header (f1pcanim) 4 - ID? // for each file 4 - Offset 4 - File Size 4 - Unknown 2 - Type? X - File Data +--------------------+ | Grand Prix 3 *.bin | +--------------------+ 28 - Header (ŠPete Cooke & Geoff Crammond) 4 - Number Of Files 8 - null // for each file 4 - Unknown 4 - Unknown 4 - Size 4 - Offset 4 - Unknown 4 - Unknown X - File Data +--------------------+ | Grand Prix 3 *.dat | +--------------------+ 4 - Number Of Files // for each file 4 - File Offset? 4 - khz sound 2 - null 2 - 8-bit sound X - File Data +--------------------------+ | Grand Prix Legends *.dat | +--------------------------+ // SAME AS NASCAR RACING *.dat +-----------------------------------------+ | Great Battles of WWII: Stalingrad *.pak | +-----------------------------------------+ // Generic ZIP_PK Archive +--------------------------+ | GTR: FIA GT Racing *.gtr | +--------------------------+ // Files use ZLib compression? 11 - Header (GMOTORMAS10) 5 - null 4 - Number Of Files 4 - Length of File Data // for each file 4 - File Type ID (18=BMP, 20=TGA) 4 - File Offset (relative to the end of the directory) 4 - Decompressed File Length 4 - Compressed File Length 240 - Filename (null) X - File Data +----------------+ | Gunship! *.cat | +----------------+ // Same as Magic the Gathering *.cat +-----------------+ | Half-Life *.pak | +-----------------+ 4 - Header (PACK) 4 - Directory Offset 4 - Directory Size X - File Data X - Directory // go to dirOffset // for each file 56 - Filename (null) 4 - Offset 4 - Size +-----------------+ | Half-Life *.wad | +-----------------+ 4 - Header (WAD3) 4 - Number Of Files 4 - Directory Offset X - File Data X - Directory // go to dirOffset // for each file 4 - Offset 4 - Compressed File Size 4 - Uncompressed File Size 1 - File Type 1 - Compression Type 2 - Padding 16 - Filename (null) +-------------------+ | Half Life 2 *.bsp | +-------------------+ 4 - Header (VBSP) 4 - Version (19) X - File Data X - Directory 4 - File Header (PK + (byte)1 + (byte)2) 4 - null 2 - Number Of Files? 2 - Number Of Files? 4 - Directory Length [+22] 4 - Unknown 2 - null //EOF // Go to the start of the directory (ie arcSize - dirLength) // for each file 4 - File Header (PK + (byte)1 + (byte)2) 2 - Header Size Part 1 (20) 2 - Header Size Part 2 (10) 8 - null 4 - Unknown 4 - File Size [+30 + FilenameLength] 4 - File Size [+30 + FilenameLength] (Repeat of above field) 4 - Filename Length 10 - null 4 - File Offset [+8] X - Filename +---------------------+ | Half Life 2 *.cache | +---------------------+ 4 - Unknown (2) 4 - Unknown (2) 4 - Unknown 4 - Number Of Files? // for each file 4 - File Size (including filename length + null) X - Filename (null) X - File Data +-------------------+ | Half Life 2 *.sav | +-------------------+ 4 - Header (JSAV) X - File Data X - Directory // go to directory // for each file while (variableID != 12) { 2 - Variable ID if (variableID == 1){ 3 - Unknown } if (variableID == 2){ 4 - Unknown } if (variableID == 12){ 4 - Unknown (3375) } } 4 - Unknown (16256) 6 - null 2 - Unknown (4) 2 - Unknown (72) 2 - Unknown (3) 2 - null 2 - Unknown (12) X - Unknown (null) 2 - Unknown (3866) 128 - filename (null) +------------------+ | Half Life 2 *.so | +------------------+ // Unix Script? 4 - Header ((byte)127 ELF) 4 - Version ((bytes)1,1,1,0) (ie 1.110) 8 - null X - File Data X - Filename Directory // go to filename directory // for each file X - Filename (null) +------------------------------+ | Halloween Harry *.fat + *.-0 | +------------------------------+ //FAT HAS THE DIRECTORY DETAILS // for each file 1 - Filename Length 12 - Filename (nulls to this length) 4 - Offset 4 - Size +------------------------------+ | Halo *.map (version 1 and 2) | +------------------------------+ 4 - Version (1) or (2) 4 - filename Offset (filenames are null terminated) 4 - dirOffset 4 - Number Of Files // go to dirOffset // for each file 4 - ID? 4 - Size 4 - Offset +---------------------+ | Halo *.map (type 2) | +---------------------+ 4 - Header (head) 4 - Version? numParts? (7) 8 - Archive Size 4 - dirOffset 4 - dataSize 8 - null 32 - Filename/Description 32 - Version 4 - Unknown (1) (file1?) // go to dirOffset 4 - Number Of Files? (maybe 2 sets of 2 bytes) 2 - ID1? Type? (internal?) 2 - ID2? (external?) 4 - File ID? 4 - Number Of Files? 4 - Offset? 4 - Size? 4 - dirOffset 4 - nextDir? 8 - Filename 4 - Unknown (255) 2 - File ID 4 - ID1? 4 - ID2? (combined with ID1 for offset?) 12 - Filename X - Unknown +----------------+ | Hardball *.glu | +----------------+ 4 - Header (MB6 + null) // for each file 4 - File Size 4 - File Offset 14 - Encrypted Filename X - File Data +-------------------------+ | Heart Of Darkness *.lvl | +-------------------------+ 4 - Header (null + DOH) 10628 - Unknown // for each file 4 - Offset 4 - Raw File Size 4 - Compressed File Size 4 - null X - padding to 512 bytes (from 10632) (512-Number Of Files*16) // for each file 4 - Offset 4 - Raw File Size 4 - Compressed File Size 4 - null X - padding to 1152 bytes (from 10632) // Files are padded to a multiple of 2048 +-------------------------+ | Heart Of Darkness *.paf | +-------------------------+ 4 - Header Offset // repeat until reach header offset 2 - ID Number? 2 - Offset (to what?) 128 - Header (Packed Animation File V1.0 (c) 1992-96 Amazing Studio) + 10 + 26 + nulls to fill X - Unknown +-----------------------------------+ | Heroes Of Might And Magic 2 *.agg | +-----------------------------------+ 2 - Number Of Files // for each file 4 - Unknown 4 - File Offset 4 - File Length X - File Data // for each file 15 - Filename (null) +----------------------------+ | Hidden And Dangerous *.dta | +----------------------------+ // Generic *.rar archive +-----------------------------------------------------+ | Highway Pursuit *.hfd *.hgd *.hmd *.hod *.hsd *.hvd | +-----------------------------------------------------+ 4 - Header (HPDT) 4 - Number Of Files [/2] // for each file 4 - File Size 4 - Padding Size // for each file X - File Data X - Padding +------------------------------+ | Hi-Octane *.dat (chunk)(big) | +------------------------------+ // for each file 4 - File Type 4 - File Size X - File Data +-----------------------------------------+ | Hitman 2: Silent Assassin *.wav + *.whd | +-----------------------------------------+ // WHD contains the details, WAV contains the file data 4 - Archive Size (without header) 4 - Archive Size (with header) 4 - Unknown 4 - Unknown // for each file X - Filename (null) 4 - Unknown (6) 4 - Unknown 4 - Unknown (17) 4 - Sampling Rate, khz (22050) 4 - Unknown (4) 4 - Unknown 4 - File Size 4 - Number Of Channels?, mono (1) 4 - File Offset 4 - Unknown 4 - Unknown 4 - Unknown +--------------------------------+ | Hitman Contracts *.wav + *.whd | +--------------------------------+ // WHD contains the details, WAV contains the file data 4 - Archive Size (without header) 4 - Archive Size (with header) 4 - Unknown 4 - Unknown // for each file X - Filename (null) 0-3 - Padding (to a multiple of 4 bytes) 4 - Unknown (6) 4 - Unknown 4 - Unknown (17) 4 - Sampling Rate, khz (22050) 4 - Unknown (4) 4 - Unknown 4 - File Size 4 - Number Of Channels?, mono (1) 4 - File Offset 4 - Unknown 4 - Unknown 4 - Unknown +------------------------+ | Hitman Contracts *.zip | +------------------------+ // A ZIP archive +--------------------------+ | Hollywood Monsters *.m02 | +--------------------------+ // for each file 4 - File Offset X - null padding to offset 400 X - File Data // NOTES: // The first offset is 0, indicating the offset to the file start // The last offset is the archive size, indicating the file end // The offsets in between are file offsets, but some offsets are repeated (just ignore the repeats) // Stop reading the directory when you read an offset that is the archive size +-------------------+ | Hotel Giant *.res | +-------------------+ 4 - Number Of Files // for each file 34 - Filename (null) 4 - Offset X - File Data +-----------------------+ | Hoyle Casino 99 *.prf | +-----------------------+ 4 - Version (1) 3 - Header (PRF) 1 - null 4 - Unknown (2) 4 - Unknown (64) 4 - Directory Size 4 - Directry Offset + 24 // numFiles = (dirSize - 24) / 16 - 1; // go to dir offset + 24 // for each file 4 - File Type 4 - File ID 4 - Offset 4 - File Size +--------------------+ | Hyper Cycles *.adt | +--------------------+ // for each file 11 - Unknown 4 - null 4 - File Offset 4 - File Size X - File Data +----------------+ | Ignition *.cdp | +----------------+ 4 - Header (CDP) + null 2 - Version (100) - ie 1.00 4 - Number Of Files? 4 - Unknown 1 - null 4 - Unknown // for each file 4 - Unknown 2 - Unknown 1 - null 4 - Unknown 2 - Unknown 1 - null 2 - Unknown X - File Data // I can't seem to find any offset or file size data anywhere, but it is split up into files. // File 2 starts at about offset 764 +------------------------+ | Ignition *.pfm (chunk) | +------------------------+ // for each file 4 - Type/Extension 4 - File Size X - File Data +----------------------------------------------+ | Indiana Jones And The Infernal Machine *.gob | +----------------------------------------------+ // Same as Indiana Jones 3D *.gob +----------------------+ | Indycar Racing *.dat | +----------------------+ // for each file 2 - Unknown 2 - Unknown 4 - Raw File Size 4 - Compressed File Size 11 - Filename X - File Data +---------------+ | Inferno *.dat | +---------------+ 4 - Directory Offset // go to Directory Offset 2 - Number Of Files 2 - Number Of Folders 2 - Number Of Extensions 2 - Length Of Directory Header [+8] (ie relative offset to first file directory entry) // for each folder 1 - Folder Name Length X - Folder Name // for each extension 1 - Extension Name Length X - Extension Name // for each file 8 - Unknown 4 - File Length? +----------------------+ | Interstate '76 *.mw2 | +----------------------+ // SAME AS MECH WARRIOR 2 *.mw2 4 - Number Of Files // for each file 4 - File Offset X - File Data +----------------------+ | Interstate '76 *.zfs | +----------------------+ // Notes: The archive is stored in chunks of 100 files, each with their own directory. // So you need to read the directory for 100 files, then skip to the next directory. 4 - Header (ZFSF) 4 - Version (1) 4 - Unknown (16) 4 - Number Of Files in each directory (100) 4 - Total Number Of Files in the archive 4 - null 4 - Unknown (28) // for each directory 4 - Next Directory Offset (null for the last directory) // for each file 16 - Filename (null) 4 - File Offset 4 - File ID (incremental stating from 0) 4 - Length 4 - Unknown (Hash?) 4 - null if (the last directory){ X - null padding to fill up the directory - ie. up to (numFilesInEachDir*36 + 4) } X - File Data (for the files in this directory +---------------------------+ | In The Raven Shadow *.dat | +---------------------------+ // NOTE: Some files have offset and length = 0 2 - Number Of Files 4 - Directory Offset 4 - Unknown X - File Data // go to the directory offset // for each file 4 - Offset 4 - Length 4 - File ID? // for each file X - Filename (null) +---------------------------+ | In The Raven Shadow *.lib | +---------------------------+ X - File Data X - Directory 2 - Number Of Files // go to arcSize - (numFiles*21 + 2) // for each file 4 - Length 4 - Offset 13 - Filename (null) +------------------------+ | Jazz Jackrabbit 2 *.it | +------------------------+ 4 - Header (IMPM) 98 - Unknown 64 - Unknown (all @ symbols (byte)64) X - File IDs 1 - 255 // for each file 4 - File Offset // at each file offset 4 - Type/Extension (IMPS, IMPI, etc) X - File Data // Type IMPS - File Entry X - Filename (null) 4 - Unknown 26 - File Description 2 - Compressed True/False (1/0)? 4 - Compressed File Size 8 - null 4 - Decompressed File Size? 8 - null 4 - File Offset 6 - null // TYPE IMPI - Unknown (file?){ X - Unknown } +-------------------------+ | Jazz Jackrabbit 2 *.j2a | +-------------------------+ 4 - Header (ALIB) 4 - Unknown 4 - Header Size (first file offset) 4 - Unknown 4 - Archive Size 4 - Unknown 4 - Number of Files // for each file 4 - File Offset X - File Data +-------------------------+ | Jazz Jackrabbit 2 *.j2b | +-------------------------+ // the files use ZLIB compression? 4 - Header (MUSE) 4 - Unknown 4 - Archive Size 4 - Unknown // for each file 4 - Compressed Size 4 - Decompressed Size X - File Data (each listed one after the other) // continue reading until all the compressed sizes + header size equal the archive size +-------------------------+ | Jazz Jackrabbit 2 *.j2d | +-------------------------+ // the files use ZLIB compression? 4 - Header (PLIB) 4 - Unknown 4 - Unknown 4 - Archive Size 4 - Unknown 4 - Unknown 4 - Unknown X - File Data +-------------------------------+ | Jazz Jackrabbit 2 *.j2l *.j2t | +-------------------------------+ // the files use ZLIB compression? 180 - Header (" Jazz Jackrabbit 2 Data File" + (byte)(13 10 13 10) + " Retail distribution of this data is prohibited without" + (byte)(13 10) + " written permission from Epic MegaGames, Inc." + (byte)(13 10 13 10 26) ) 4 - Type Header (TILE) (LEVL) 4 - Unknown 32 - Archive Description 2 - Unknown 4 - Archive Size 4 - Unknown // for each file 4 - Compressed Size 4 - Decompressed Size X - File Data (each listed one after the other) // continue reading until all the compressed sizes + header size equal the archive size +-------------------------+ | Jazz Jackrabbit 2 *.j2s | +-------------------------+ 4 - Number Of Files in group 1 4 - Directory Offset [+8] X - Files 1 X - Directory X - Directory Filenames X - Files 2 // go to Directory Offset // for each file in group 1 4 - File Offset [+8] 4 - Number of Directories // for each directory 8 - Directory Name (null) 2 - Number Of Files in directory? 2 - Number Directory Offset [+endOfDirectoryOffset] 4 - Files 2 size? 1 - null // for each file in group 2 1 - File Size X - File Data +-------------------------+ | Jazz Jackrabbit 2 *.j2v | +-------------------------+ // the files use ZLIB compression? 8 - Header (CineFeed) 4 - Archive Size 4 - Unknown 4 - Video Width (640) 4 - Video Height (480) 2 - Audio Bits (8) 2 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Video Image Quality? (32) X - File Data +-------------------------+ | Jazz Jackrabbit 2 *.s3m | +-------------------------+ 28 - null 16 - Unknown 4 - Header (SCRM) X - Unknown // Similar? to the Jazz Jackrabbit 2 *.it files +--------------------+ | Jedi Academy *.pk3 | +--------------------+ // ZIP ARCHIVE +--------------------+ | Jedi Outcast *.pk3 | +--------------------+ // ZIP ARCHIVE +-------------------+ | Jets N Guns *.dat | +-------------------+ // NOTES: // The first few bytes of the filenames are encrypted, the last few bytes are not encrypted. // Also, the files are compressed using some kind of flag field amongst the data that tells // how to decompress them. The flag fields are all 1 byte long? // The compression *may* be similar to that used by Maxis in the DBPF-based archives? 2 - Unknown 2 - Unknown 4 - Number Of Files 4 - Directory Offset 4 - Unknown X - File Data X - Directory // go to dirOffset // for each file 2 - Filename Length (including 1 null) X - Filename 1 - null 4 - Decompressed Length 4 - Offset // go to each file offset 4 - Offset to the start of the compressed file data (offset from dir + 12) 4 - Unknown 4 - Compressed Length X - Compressed File Data +--------------+ | Juiced *.dat | +--------------+ // Files are ZLib compressed? // NOTE: The files in the archive are in a different order to the files in the directory // eg File 1 in the directory may be File 523 in the archive. // NOTE: Each file can have multiple compressed parts. Each part is described at each file // offset. To determine how many parts there are in a file, go to the file offset and read // the first field (firstPartOffset). Then do (firstPartOffset-fileOffset)/8 and you have // the number of parts. (or you can just read the field in the directory!) 4 - Number Of Files 4 - Directory Offset X - File Data X - Directory // go to dirOffset // for each file 4 - Unknown 4 - File Offset 4 - Number of File Parts 4 - Compressed File Size 4 - Decompressed File Size // go to each file offset // for each file part 4 - File Part Offset 4 - File Part Length // for each file part X - File Part Data +----------------------+ | Kens Labyrinth *.kzp | +----------------------+ 2 - numFiles // for each file 8 - Filename (null) 4 - File Offset X - File Data +------------------+ | Killswitch *.dat | +------------------+ 4 - Unknown 4 - Unknown 4 - Unknown 12 - Filename (null) 4 - Unknown 4 - null 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Description Data Length // for each description X - Description (null) 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown // for each file 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown // THIS IS THE START OF THE FILE DATA 4 - File Length (-96) 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 64 - Filename (null) X - Rest of the file +-----------------------+ | Kingdom O Magic *.dat | +-----------------------+ // SAME AS WACKY WHEELS *.dat +------------------------------+ | Kohan 2 - Kings Of War *.rwd | +------------------------------+ // IMPORTANT NOTE! // All strings in these archives are Unicode text, meaning that each // letter uses 2 bytes instead of 1. For English, it is suitable to // skip every second character, as it will be null // // So, whenever it says to read a string, read it as unicode! 4 - Header (TGCK) 4 - Unknown (2) 4 - Unknown (3) 4 - Unknown (2) 2 - Description Length [*2, as it is unicode text] X - Description (Unicode text) 4 - null 4 - Unknown X - File Data X - Directory // go to (archiveSize - 288) // HEADER DETAILS 64 - Header Name (Header) (Unicode Text) 8 - Header Offset (12) 8 - Header Length 4 - Unknown 4 - Unknown 8 - Header Length // FILE DATA DETAILS 64 - File Data Name (Files) (Unicode Text) 8 - File Data Offset 8 - File Data Length 4 - Unknown 4 - Unknown 8 - File Data Length // FOOTER DETAILS 64 - Directory Name (Footer) (Unicode Text) 8 - Directory Offset 8 - Directory Length 4 - Unknown 4 - Unknown 8 - Directory Length // Go to directory offset // For each file 4 - File Type ID? 2 - Filename Length [*2, as it is unicode text] X - Filename (Unicode Text) 8 - Offset [+X] (relative to the start of the file data, as found in the FILE DATA DETAILS) 8 - Length 4 - null +----------------+ | Kyrandia *.pak | +----------------+ // for each file 4 - File Offset X - Filename (null) 4 - Archive Size 4 - null 1 - null padding to a multiple of 2 bytes X - File Data +---------------------+ | Lands Of Lore *.pak | +---------------------+ // SAME AS KYRANDIA *.pak +--------------------+ | Last Dynasty *.itk | +--------------------+ 2 - Number Of Files // for each file 13 - Filename (null) 4 - File Length 4 - File Offset 1 - null X - Padding (to 2048 bytes) X - File Data +---------------------------+ | Leadfoot *.pf *.pfb *.pfc | +---------------------------+ 4 - Version (1) // go to endOfFile-4 4 - Directory Offset // go to dirOffset 4 - numFiles? // for each file X - Filename (null) 4 - File ID 4 - Unknown // if unknown field is all 255s, add the following 2 fields // otherwise, it is a directory? 4 - File Offset 4 - File Size 2 - null +-------------------------+ | Lego Loco *.rfd + *.rfh | +-------------------------+ // *.rfh contains the details, *.rfd contains the file data // for each file 4 - Filename Length (including the null) X - Filename + null 4 - Size 4 - ID? +-------------------+ | Lego Racers *.jam | +-------------------+ 4 - Header (LJAM) X - Directories/Subdirectories X - File Data // Directory Format 4 - Number Of Files (0 means that there are no files, only nested directoies) IF numFiles > 0 THEN // for each file 12 - Filename (null) 4 - Offset 4 - Size IF numFiles == 0 THEN 4 - Number Of SubDirectories // for each subdirectory 12 - Subdirectory name 4 - Offset to subdirectory // go to subdirOffset and start again from "Directory Format" +-------------------------------------------+ | Leisure Suit Larry: Manga Cum Laude *.afs | +-------------------------------------------+ // NOTES: Each file, and the directory, are padded to multiples of 2048 bytes using null bytes // So, the first file will start at offset 2048, or 4096, etc, and similarly with the next files. 4 - Header (AFS + null) 4 - Number Of Files // for each file 4 - Offset 4 - Length 4 - Filename Directory Offset // go to filename directory offset // for each file 32 - Filename (null) 4 - File Type ID 2 - Unknown 2 - Unknown 2 - Unknown 2 - Unknown 4 - Junk (matches each value in the directory, including offsets and sizes, in order) +-------------------------------------------+ | Leisure Suit Larry: Manga Cum Laude *.jam | +-------------------------------------------+ 4 - Header (JAM2) 4 - Unknown 4 - First File Offset 4 - Header 2 (none) 12 - null 2 - Number Of Filenames 2 - Number Of Extensions // for each filename 8 - Filename (null) // for each extension 4 - Extension Name (null) // the first extension is all nulls // NOTE: Some files have invalid offset - only allow offsets >= FirstFileOffset 4 - Unknown // for each file 2 - Filename ID 2 - File Extension ID 4 - Offset // at each file offset 4 - Compressed File Size 4 - Decompressed File Size 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown X - File Data 0-3 - Junk padding to a multiple of 4 bytes +------------------------------+ | Le Mans 24 Hours *.dat (big) | +------------------------------+ // for each file 2 - Unknown 2 - Unknown 4 - null 4 - null 2 - File Size [+41<-->44] 2 - Unknown X - File Data +------------------------+ | Le Mans 24 Hours *.pck | +------------------------+ 4 - Header (PACK) 4 - Number Of Files // for each file 35 - Filename (null terminated, filled with spaces (32)) 4 - File Size X - File Data +------------------------+ | Le Mans 24 Hours *.sam | +------------------------+ // This is an archive of WAVE files // we read this using the filesize information supplied in the WAVE files // So the offset of each file actually includes the WAVE header // ie the first offset is at 0, second offset at 0 + filesize + 8, etc. // EXTRA NOTE: Each file is padded with nulls to a multiple of 16 bytes // Also - some WAVE files have incorrect sizes in their header! (less by a few bytes) :( // for each file 4 - WAVE Header (RIFF) 4 - File Size [+8] X - File Data // Note that RIFF may be used as the header of the archive, for validation purposes +----------------------------------+ | Lemmings Paintball *.vsr (chunk) | +----------------------------------+ // This archive has a directory tree structure, with each directory and file sotred // in a chunk format. Each chunk with a CRID header is a directory // NOTE: CRID reversed is DIRC (Directory Chunk) 4 - Header (CRID) 4 - Archive Size [+8] 4 - Number Of Directories 4 - Type? (3) 4 - File Size (not including first 2 fields) (the size of THIS chunk, not the archive size!) // for each directory X - Filename (null) 0-3 - padding to make filename+null a multiple of 4 4 - Unknown 4 - Unknown // for each directory 4 - Header (CRID) 4 - Directory Offset 4 - Directory Size 16 - null 4 - Unknown 4 - File ID // go to each dirOffset 4 - Header (CRID) 4 - Directory Size (same as in the dirEntry above) 4 - Number Of Files in directory 4 - Type? (3) 4 - Offset to First File in the directory [+8] // for each file in the directory X - Filename (null) 0-3 - padding to make filename+null a multiple of 4 4 - Unknown 4 - Unknown // for each file in the directory 4 - Type/Extension (reversed) 4 - File Offset 4 - File Size 16 - null 4 - Unknown 4 - File ID // go to each file offset 4 - Type/Extension (reversed) 4 - File Size X - File Data +--------------------------------------------+ | Links 386 Pro *.crh *.mga *.fga *.lz *.wlz | +--------------------------------------------+ 4 - Header (MDmd) 2 - Unknown (11) 2 - Dir Offset (122) // go to dirOffset // for each file 13 - Filename (stop at first null. filled with spaces to the null at pos 13, so max filename length is 11 + 2 nulls) 4 - Offset //Continue until offset == 0 +--------------------+ | Links Extreme *.ls | +--------------------+ // Same as Links LS *.ls +---------------------------+ | Links LS *.ls *.crx *.ani | +---------------------------+ 4 - Header (LSIs) 2 - Unknown 4 - Offset to Start of Directory 4 - Number Of Files 11 - null 4 - Directory Size 4 - Directory Size 2 - null 4 - Unknown 2 - null 1 - Index Name Length 7 - Index Name (~INDEX~) 5 - Filler (all (byte)4) 1 - null // for each file 17 - Filename (null) 4 - Offset // FILE DATA (with the following format) // for each file 4 - Header (LSIs) 2 - Unknown 4 - Offset to Start of File Data 14 - null 1 - Compressed? (1) 4 - Decompressed File Size 4 - Compressed File Size 8 - Unknown 1 - Filename Length X - Filename 0-12 - Filename filler to length of 12 (all (byte)4) 1 - null X - File Data +--------------------+ | Links LS 1999 *.ls | +--------------------+ // Same as Links LS *.ls +-------------------------------------------+ | Lionheart - Legacy Of The Crusdader *.dat | +-------------------------------------------+ // Generic ZIP_PK Archive +------------------------------+ | Little Bombers Returns *.dat | +------------------------------+ // Files are compressed using ZLib? // This is not quite right - only works for the first file. // Maybe the first file is a compressed directory??? 32 - Header (Artem Skakunov's resource file + (char)13,10) // for each file 2 - File Size [-2] X - File Data +--------------------------------+ | Lode Runner Online *.prs *.prd | +--------------------------------+ // PRD has the details, PRS has the file data 2 - null 128 - Archive Filename (null) 60 - Dummy file entry // for each file 2 - File ID 2 - Unknown 4 - null 4 - File Offset 4 - File Type / Extension 2 - Unknown 14 - Filename (null) 4 - null 4 - File Size +-----------------+ | Longbow 2 *.tre | +-----------------+ // THIS ARCHIVE IS WEIRD IN THAT THE FIRST FEW OFFSETS ARE FINE, THEN THE REMAINING OFFSETS // JUST DISAPPEAR AND YOU CAN'T FIND THE FILES, UNLESS THE FILES AREN'T THERE? 12 - Header (SKNKTREE010A) 4 - Number Of Files 4 - First File Offset // for each file 4 - File Offset 4 - Unknown 4 - Unknown // for each file 4 - null // for each file X - Filename (null) X - File Data +---------------------+ | Lost In Space *.lid | +---------------------+ // SAME AS Desert Raid *.lid +--------------------------------------------------+ | Madden 2004 *.dat (Type 1 - No Compression Used) | +--------------------------------------------------+ // NOTE: Files with length=0 still incur padding, so are actually 64 null bytes 4 - Header (TERF) 4 - Directory Offset (64) 4 - Unknown (83886594) 2 - File Padding Size (64) 2 - Number Of Files 48 - null 4 - Directory Header (DIR1) 4 - Directory Length (including these 2 fields) // for each file 4 - File Offset (relative to the start of the FileDataHeader) 4 - File Length 0-63 - null Padding to a multiple of 64 bytes 4 - File Data Header (DATA) 4 - File Data Length (including these 3 fields) 56 - null // for each file X - File Data 0-63 - null Padding to a multiple of 64 bytes +----------------------------------------------------+ | Madden 2004 *.dat (Type 2 - Some Compression Used) | +----------------------------------------------------+ // NOTE: Files with length=0 still incur padding, so are actually 4 null bytes 4 - Header (TERF) 4 - Directory Offset (16) 4 - Unknown (83886594) 2 - File Padding Size (4) 2 - Number Of Files 4 - Directory Header (DIR1) 4 - Directory Length (including these 2 fields) // for each file 4 - File Offset (relative to the start of the FileDataHeader) 4 - File Length 4 - Compression Header (COMP) 4 - Compression Length (including these 2 fields) // for each file 4 - Compression Tag (0=uncompressed, 5=compressed) 4 - Decompressed Size (0=uncompressed) 4 - File Data Header (DATA) 4 - File Data Length (including these 3 fields) 4 - null // for each file X - File Data 0-3 - null Padding to a multiple of 4 bytes +----------------------------------------------------+ | Madden 2005 *.dat (Type 3 - Some Compression Used) | +----------------------------------------------------+ // NOTE: Files with length=0 still incur padding, so are actually 128 null bytes 4 - Header (TERF) 4 - Directory Offset (128) 4 - Unknown (83886594) 2 - File Padding Size (128) 2 - Number Of Files 4 - Directory Header (DIR1) 4 - Directory Length (including these 2 fields) // for each file 4 - File Offset (relative to the start of the FileDataHeader) 4 - File Length 0-127 - Padding to a multiple of 128 bytes 4 - Compression Header (COMP) 4 - Compression Length (including these 2 fields) // for each file 4 - Compression Tag (0=uncompressed, 5=compressed) 4 - Decompressed Size (0=uncompressed) 0-127 - Padding to a multiple of 128 bytes 4 - File Data Header (DATA) 4 - File Data Length (including these 3 fields) 4 - null // for each file X - File Data 0-127 - null Padding to a multiple of 128 bytes +---------------------------+ | Magic The Gathering *.cat | +---------------------------+ 4 - Number Of Files // for each file 4 - Unknown 4 - Offset 4 - Size +-------------------------+ | Master Of Orion 2 *.lbx | +-------------------------+ 2 - Number Of Files [-1] 4 - Unknown (65197) 2 - null 4 - Offset To Filename Directory (2048)? // for each file 4 - Offset 4 - Archive Size X - Unknown to offset 2048 // for each file 20 - Filename (null) X - null Padding to First File Offset (32768) X - File Data +----------------------+ | Mech Commander *.pak | +----------------------+ 4 - Header (206 250 237 254) 4 - First File Offset // for each file 3 - File Offset 1 - Flags? X - File Data +------------------------+ | Mech Commander 2 *.fst | +------------------------+ // Some or all files are compressed using ZLIB? 4 - Header (175 236 221 202) 4 - numFiles // for each file 4 - File Offset 4 - File Size 4 - Unknown 4 - Unknown 250 - Filename (null) X - File Data +-------------------------------------------+ | Mech Warrior 2: Mercinaries *.prj (chunk) | +-------------------------------------------+ 4 - header (PROJ) 4 - Archive Size [-8] 4 - Unknown 4 - Tag (DDIT) 4 - Directory Size [-20] 4 - Unknown 2 - Number Of Files // for each file 4 - File Type 4 - File Offset 4 - File Size 4 - Unknown 4 - Unknown 2 - Unknown (62) 2 - Unknown (58) X - File Data // at each file offset 4 - File Type 4 - File Size X - File +-----------------------------------+ | Mech Warrior 2: Mercinaries *.mw2 | +-----------------------------------+ 4 - Number Of Files (if this equals the archive size, it is not an archive!) // for each file 4 - File Offset X - File Data +----------------------+ | Mech Warrior 3 *.zbd | +----------------------+ // SAME AS RECOIL *.zbd VERSION 1 4 - null 4 - Version (1) 4 - null 4 - Number Of Files 8 - null // for each file 32 - Filename (null) 4 - Offset 4 - Padding (all 255's) X - File Data +--------------------------------------+ | Medal Of Honor: Pacific Assult *.rez | +--------------------------------------+ // NOTE: Some files are compressed using an unknown routine. The compression is probably // similar to the DBPF compression used by Maxis. 4 - Header (MOPA) 4 - Version (1) 4 - Directory Length 8 - Header 2 (LZSSRLE ) 4 - Header 3 (NONE) 4 - Unknown (1) 4 - Number Of Files // for each file 4 - File Offset 4 - Decompressed Length 4 - File ID? 4 - File Length // for each file X - Filename (null) X - File Data +---------------------------------------+ | Medieval Total War *.lbm (chunk)(big) | +---------------------------------------+ // SAME AS ALLAN BORDER CRICKET *.lbm +--------------------------+ | Medieval Total War *.prf | +--------------------------+ 2 - Unknown // for each file 2 - Offset 2 - Type? // continue until you reach the first offset // Number Of Files = (firstOffset -2) / 4 X - File Data +--------------------------+ | Medieval Total War *.jjm | +--------------------------+ // I DON'T THINK THIS IS AN ARCHIVE! 2 - Unknown 2 - Unknown 1 - Unknown 4 - Unknown (data size?) // for each file 4 - Offset (relative to data offset) 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown +-----------------+ | Mega Race *.dat | +-----------------+ 1 - Unknown // for each file 1 - null (except for the first file entry which = 10) 16 - Filename 4 - File Size 4 - Offset X - Padding to first file at 65536 X - File Data +-----------------------+ | Messiah *.dta + *.idx | +-----------------------+ // The IDX file has the directory, the DTA file has the file data // for each file 120 - Filename (null) 4 - File Offset 4 - File Size +------------------------+ | Metal Gear Solid *.dar | +------------------------+ 4 - Number Of Files // for each file X - Filename (null) 0-3 - Padding (so filename length is a multiple of 4 bytes) 4 - File Size X - File Data 1 - null +----------------------+ | Microman *.pg1 *.pg2 | +----------------------+ // BMP images +-------------------------------+ | Microsoft Baseball 2000 *.fst | +-------------------------------+ 4 - Number Of Files // for each file 4 - Offset 64 - Filename (null) X - File Data +---------------------------------+ | Microsoft Train Simulator *.ace | +---------------------------------+ // ZLib compression is used to compress the file data? 8 - Header (SIMISA@F) 4 - Decompressed Size? 4 - Padding (all 64's) X - File Data (compressed) +----------------------+ | Midtown Madness *.ar | +----------------------+ 4 - Header (ARES) 4 - Number Of Files 4 - Unknown X - Directory // for each file 4 - Offset 4 - Unknown 4 - Unknown 4 - Unknown // for each filename X - Filename (terminated with a null, or a (1,0) pair of bytes) 12 - null X - File Data +------------------------+ | Midtown Madness 2 *.ar | +------------------------+ 4 - Header (DAVE) 4 - Unknown (Number Of Files?) 4 - Filename Offset [+2048] 4 - Data Offset [+Filename Offset+2048] // go to offset 2048 // for each file 4 - File ID 4 - File Offset 4 - Raw File Size 4 - Compressed File Size // go to Filename Offset // for each file X - Filename (null) // Each file is padded out (using null bytes) to a multiple of 2048 bytes +-----------------------+ | Monopoly Deluxe *.fpf | +-----------------------+ 4 - Number Of Files 2 - Unknown (null) // for each file 4 - File Offset (if this is greater than 1070000000 then discard and continue, it is not included in the Number Of Files count) +--------------------------------+ | Monty Python *.bin (Version 1) | +--------------------------------+ // This is a generic archive type for games by the 7th Level 2 - Header (7L) 2 - Version (1) 1 - Description Length 79 - Description (null) 2 - Number Of Files 2 - Unknown 2 - Unknown 2 - Unknown 4 - Unknown 4 - null 2 - Filename Directory Length 4 - N/A (all 255's) 4 - Unknown 8 - null // OFFSET DIRECTORY HERE // for each file 2 - File Type ID? (1,3,5,11,12) 4 - Offset (relative to the end of the directory) 4 - Length // FILENAME DIRECTORY HERE // for each file X - Filename (null) X - File Data +--------------------------------+ | Monty Python *.bin (Version 2) | +--------------------------------+ // This is a generic archive type for games by the 7th Level 4 - Header (7LB + (byte)1) 4 - Version (2) 78 - Description (null) 4 - Unknown (2) 8 - null 4 - Unknown 92 - null 2 - Unknown (1) 4 - Unknown (236) 2 - Unknown 4 - Unknown 2 - Unknown 4 - Unknown 14 - null 4 - Directory Offset 4 - Directory Length 16 - null 4 - Counter Offset 4 - Counter Length 4 - Filename Directory Offset 4 - Filename Directory Length 4 - Unknown Offset 4 - Unknown Length 4 - Image Offset 4 - Image Length 40 - null // OFFSET 322 IS HERE X - File Data X - Directories in the order specified by the header // Go to the directory offset // for each file 2 - File Type ID? (1-18) 4 - Offset 4 - Length +-----------------------------------------------------------+ | Monty Pythons Meaning Of Life *.bin + *.000 (7LU version) | +-----------------------------------------------------------+ // BIN contains the directory, 000 contains the file data 4 - Header (7L + (byte)220 + (byte)1) // (byte) 220 is a U with double dots above it 2 - Unknown 4 - Version (2) 76 - Description (null) 4 - Unknown (258) 2 - null 4 - Unknown 188 - null 4 - Unknown (1) 4 - Unknown (236) 4 - null 4 - Unknown (150) 4 - Unknown (42) 4 - Unknown (268) 4 - Unknown (274) 32 - null 2 - Unknown (1) 4 - Unknown 2 - null 4 - null 4 - Directory Offset 4 - Directory Length 16 - null 4 - Counter Offset 4 - Counter Length 4 - Filename Directory Offset 4 - Filename Directory Length 4 - File Data Offset (ie. offset to the start of the first file) 4 - File Data Length 4 - Image Offset 4 - Image Length 24 - null 4 - Filename Directory 2 Offset 4 - Filename Directory 2 Length 4 - Filename Directory 3 Offset 4 - Filename Directory 3 Length 4 - File ID Directory Offset 4 - File ID Directory Length 8 - null 4 - Source Filename Offset 4 - Source Filename Length // The directory starts here // go to directory offset (which is here anyway) // for each file // 2 - File Type ID? (1-21) // 4 - Offset // 4 - Length // go to each of the filename directories // for (each file?) X - Filename (null) // go to padding directory offset // for (each file?) 4 - File ID? // go to source filename offset X - Source Filename (null) (including path and drive letter) X - null padding (up to "Source Filename Length") +--------------------------------------------------------+ | Monty Pythons Complete Waste Of Time *.bin (7L type 2) | +--------------------------------------------------------+ 2 - Header (7L) 2 - Version (1) 1 - Description Length 79 - Description (null) 2 - Number Of Files 2 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 2 - Filename Directory Length 4 - Unknown 4 - Unknown 8 - null // Directory Starts Here // for each file // 2 - File Type ID? (1-11) // 4 - Offset // 4 - Length // go to the filename directories // for (each file?) X - Filename (null) +------------------+ | Moorhuhn 3 *.dat | +------------------+ // for each file 48 - Filename (null) 4 - Offset 4 - Size 8 - null // repeat until the name = **** // The first filename can be used as a header (MH3 V1.0) // every file is padded to multiples of 512 8 - Checksum +-----------------------+ | Mortal Kombat 3 *.ftr | +-----------------------+ 4 - Header (MFIL) 2 - numFiles 4 - Directory Offset // go to dirOffset 4 - Header 1 (CDIR) 1 - null 8 - Header 2 (FLAGBAG!) 1 - null 4 - Directory Size (excluding the directory header) 4 - Directory Size (excluding the directory header) 4 - null 4 - Unknown // for each file 4 - File Type / Extension 1 - null 8 - Filename (terminated by spaces) 1 - null 4 - File Offset 4 - File Size (excluding the 30 file header) 5 - null // at each file offset 4 - File Type / Extension 1 - null 8 - Filename (terminated by spaces) 1 - null 4 - File Size 4 - File Size 4 - null 4 - Unknown X - File Data +-------------------------------------+ | Mortal Kombat Deadly Alliance *.ssf | +-------------------------------------+ // This is a nested directory structure that starts right at the beginning of the file 4 - Header ( CES) 4 - Unknown (4) 4 - null 4 - Unknown (first instance of this field is the total number of files in the archive?) 4 - Number Of Files 4 - Archive Size // for each File 4 - File Type ID (1,2,3,4,5,6,7,8,9,10) 4 - Offset (relative to the start of the current directory, ie relative to the offset of " CES") 4 - Length X - Padding to multiple of 2048 bytes // What happens now depends on the file type ID // All files with the same type ID number are files with the same extension // // A Sub-Directory has ID=6. If encountered, go to the offset and repeat this format // from the beginning (ie, go to the offset and the first 4 bytes will be " CES", etc.) // // Other IDs mean different file types. Here are the known ones // 2 = 3D Bone? // 3 = 3D Model? // 7 = Directory Index (contains filenames and things like that) // 8 = Unknown Directory (has a similar structure to this format) +--------------------------------+ | Mortal Kombat Deceptions *.ssf | +--------------------------------+ // This is a nested directory structure that starts right at the beginning of the file 4 - Header ( CES) 4 - Unknown (4) 4 - null 4 - Unknown (first instance of this field is the total number of files in the archive?) 4 - Number Of Files 4 - Unknown 4 - Archive Size // for each File 4 - File Type ID (1,2,3,4,5,6,7,8,9,10) 4 - Offset (relative to the start of the current directory, ie relative to the offset of " CES") 4 - Length 4 - Filename Offset (relative to the end of the directory) // for each file X - Filename 1 - null X - Padding // For the root directory, it is padded to 2048 bytes with nulls // For all sub-directories, it is padded to 512 bytes using 4 nulls followed by // a repeating string of "PAD128" // What happens now depends on the file type ID // All files with the same type ID number are files with the same extension // // A Sub-Directory has ID=1. If encountered, go to the offset and repeat this format // from the beginning (ie, go to the offset and the first 4 bytes will be " CES", etc.) // // Other IDs mean different file types. Here are the known ones // 1 = Sub-Directory // 2 = Sprite Texture? // 3 = 3D Model? // 4 = Texture Image? // 8 = Animation Path? +-----------------------------+ | Mortal Kombat Trilogy *.snd | +-----------------------------+ 4 - Number Of Files // for each file 4 - File Offset +-------------------------+ | Motocross Madness *.dat | +-------------------------+ 4 - Header (RES) 4 - Number Of Files // for each file 32 - filename 4 - Offset [+8 header] 4 - Size X - File Data +---------------------------------------+ | Motocross Madness 2 *.res *.tex *.dat | +---------------------------------------+ 3 - Header (RS2) 1 - null 4 - Number Of Files // for each file 4 - Filename Length (including terminating null byte) X - Filename 4 - Offset 4 - Size X - File Data +--------------------+ | Motoracer GP *.bkf | +--------------------+ 4 - Number Of Files // for each file X - Filename (null) 18 - Unknown (hash?) 4 - Offset 2 - Unknown 2 - Unknown X - File Data +-----------------+ | Motorhead *.pak | +-----------------+ 4 - Header (DIVI) 4 - Number Of Files 4 - First File Offset 4 - Type? // for each file 4 - File Offset 4 - Unknown 4 - Type? X - null padding to position 780 X - File Data +----------------+ | MotoTrax *.wad | +----------------+ // Same as Thief 3 *.bik +-------------------------+ | Myst 4 Revelation *.m4r | +-------------------------+ 4 - Description Length X - Description (null) 4 - Number Of Directories 4 - null for each directory { 1 - Number Of SubDirectories (in the current directory) if (num > 0){ 4 - SubDirectory Name Length X - SubDirectory Name (null) } else { 4 - Number Of Files In The Directory for each file { 4 - Filename Length X - Filename (null) 4 - File Length 4 - File Offset } } } +-------------------------+ | Nascar Heat *.res *.trk | +-------------------------+ 4 - Header (0TSR) // Note the zero, not the letter "O" 4 - null 4 - Number Of Files 4 - Number Of Files (duplicate) 4 - Archive Length // for each file 36 - Filename (null) 4 - Type Code (GAMI=*.img, TYAL=*.lyt, PMTS=*.fnt, etc.) 4 - Unknown (1) 4 - File Length [+4] 8 - null 4 - null // for each file X - File Data 4 - null +---------------------+ | Nascar Racing *.dat | +---------------------+ // for each file 2 - Unknown 2 - Unknown 4 - Raw File Size 4 - Compressed File Size 13 - Filename (null) 2 - Unknown X - File Data +------------------------+ | Nascar SimRacing *.mas | +------------------------+ // This archive uses ZLib Compression? 11 - Header (CUBEMAS4.10) 5 - null 4 - Number Of Files 4 - Size Of File Data // for each file 4 - Length of these 6 fields (20) 4 - File Offset (relative to the end of the directory) 2 - Unknown (32) 2 - Unknown (34) 4 - File Size 4 - Decompressed File Size 236 - Filename (null) X - File Data +-----------------------+ | NCAA Final Four *.jam | +-----------------------+ // This is a very simple directory structure that starts repetition from line 2 3 - Header (JAM) 4 - Number Of Files in this Directory // for each file in this directory 15 - Filename (null) 4 - Offset 4 - Length 4 - Number Of Sub-Directories // for each sub-directory 15 - Directory Name 4 - Offset to sub-directory // go to each sub-directory offset // nested repeat from line 2 ("Number of Files In This Directory") +----------------------+ | Need For Speed *.viv | +----------------------+ // Same as BIG_BIGF +------------------------+ | Need For Speed 2 *.viv | +------------------------+ // Same as BIG_BIGF +-----------------------------------+ | Need For Speed: Hot Pursuit *.viv | +-----------------------------------+ // Same as BIG_BIGF +-------------------------------------+ | Need For Speed: Hot Pursuit 2 *.viv | +-------------------------------------+ // Same as BIG_BIGF +-----------------------------------------+ | Need For Speed: Porsche Unleashed *.viv | +-----------------------------------------+ // Same as BIG_BIGF +-----------------------------------+ | Need For Speed: Underground *.ast | +-----------------------------------+ // This format lists all files one after the other. Each file is split up // into chunks, presumably to make for more efficient file buffering when // playing audio. // for each file 4 - Header (SCHI) 4 - Split Header Offset X - Unknown 12 - Split Header (see below) X - File Data Chunks (see below) 4 - File End Tag (SCEI) 4 - Unknown (8) X - Padding (filled with null) // Split Header Format 4 - Split Header (SCCI) 4 - Chunk Data Offset (12) (relative to the start of the split header) 4 - Number Of Chunks // File Data Chunks Format 4 - Chunk Header (SCDI) 4 - Compressed Size (of the chunk) 4 - Uncompressed Size (of the chunk) 4 - Padding (filled with null) X - Chunk Data +-------------------------------------+ | Need For Speed: Underground 2 *.viv | +-------------------------------------+ // NOTE: All values are in BIG ENDIAN order! 4 - Header (BIG4) 4 - Archive Size 4 - Number Of Files 4 - First File Offset / Directory Size // for each file 4 - Offset 4 - Length X - Filename X - null Padding to an offset of 64 bytes // for each file X - File Data X - null Padding to a multiple of 64 bytes +------------------------------------+ | Network Q Rally Championship *.bun | +------------------------------------+ // for each file 4 - File Offset // continue until you reach the first offset // Number Of Files = firstOffset / 4 X - File Data +--------------------------+ | Neverwinter Nights *.bif | +--------------------------+ // Same as BIF_BIFFV1 +-----------------+ | Normality *.das | +-----------------+ 4 - Header (DASP) 2 - Number Of Files? 4 - Unknown 2 - Unknown 4 - Archive Size (First File Offset) // for each file 4 - Offset (ignore or skip offsets of zero) 2 - Half the Size (ie actual file size = size*2) 2 - Unknown X - File Data +----------------+ | NRL 2003 *.fsb | +----------------+ 4 - Header (FSB3) 4 - Number Of Files 4 - dirSize 4 - Data size 4 - Unknown 4 - null //for each file 2 - Entry Size (64) 30 - Filename 4 - Raw File Size? 4 - Offset 4 - Compressed File Size 16 - Other sound information (Khz, bit rate, etc.) X - File Data +---------------------+ | Obscure *.hvp *.001 | +---------------------+ // BIG ENDIAN ORDERING // Uses ZLib compression 11 - Header (HV PackFile) 1 - null 4 - Unknown 4 - Unknown (8) 4 - Number Of Files and Directories 4 - Number Of Files only 4 - Directory Length (not including all these archive header fields) 8 - Unknown // for each entry 4 - Length Of Entry (including this field) 1 - Entry Type Indicator 1 (0=dir, 1=file) 4 - Entry Type Indicator 2 (0=dir, 1=file) if (entryType == dir){ 4 - Number Of Files/SubDirectories In This Directory 1 - Directory Name Length X - Directory Name } else if (entryType == file){ 4 - Compressed Size 4 - Decompressed Size 4 - Unknown (Hash or something?) 4 - File Offset 4 - Filename Length X - Filename } X - File Data +------------------------------------+ | Oddworld: Abes Oddysee *.ddv (big) | +------------------------------------+ // for each file 4 - Type // IF TYPE == MOIR 4 - File ID 4 - Header (AKIK) 2 - File ID (same as above ID field) 2 - File Size 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown X - File Data // IF TYPE == VALE (not 100% correct) 2 - File Size 2 - File ID (same as above ID field) 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown X - File Data +------------------------------+ | Oddworld: Abes Oddysee *.lvl | +------------------------------+ 4 - First File Offset 4 - null 4 - Header (Indx) 4 - null 4 - numFiles? 4 - Unknown (5) 8 - null // for each file 12 - Filename 4 - Unknown 4 - Unknown 4 - File Size X - File Data // at each file offset 8 - Actual file size (without the file header) 8 - Filename/Type/Extension (null) X - File Data X - null padding to a multiple of 2048 bytes +------------------------------------------+ | Official Forumula 1 Racing *.lkf + *.fat | +------------------------------------------+ // LKF contains the file data, FAT contains the offsets X - Filename of the LKF archive this FAT file references 8 - null 496 - Padding to offset 513 // for each file 4 - File Type ID? (Stop loop when = 65535) 4 - Offset 4 - Unknown 4 - Length 4 - null X - Blank file entries of the pattern above, until offset 755 // continue until offset 30116 4 - Unknown 4 - Unknown 4 - Unknown 4 - null 1120 - Padding // continue until the extension is XXX X - Tag Name (null) (eg XXX ) X - File Extension (null) (eg .xxx) X - Directory Name (null) (eg XXX/) 4 - Number of Files, or offsets // 1144 bytes of the following pattern 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown // for each file 1 - null 23 - Filename (32-terminated) +-----------+ | Oni *.dat | +-----------+ 20 - Header 4 - Number Of Files 4 - Unknown 4 - Unknown 4 - First File Offset 4 - Data Size 4 - Filename Directory Offset 4 - Filename Directory Size 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown // for each file 4 - Type/Extension 4 - Offset (relative to first file offset) 4 - Filename Offset (relative to filename directory offset) 4 - File Size 2 - Unknown 2 - Unknown X - File Data // for each filename 4 - Type/Extension X - Filename (null) +----------------------------+ | Operation Flashpoint *.pbo | +----------------------------+ // for each file X - Filename (null) 12 - null 4 - Unknown 4 - File Size // continue until filename is null X - File Data +---------------+ | Outlive *.dat | +---------------+ 4 - Number Of Files // for each file 32 - Filename 4 - File Offset X - File Data +-----------------+ | Overdrive *.epf | +-----------------+ 4 - Header (EPFS) 4 - dirOffset // go to dir offset // for each file 14 - filename (null) (filled up with junk) 4 - File Offset? 4 - Unknown (type? ID?) +----------------------------------+ | Pacman: Adventures in Time *.pac | +----------------------------------+ 4 - header (_CA_) 4 - Unknown (100) (version? ie 1.00) 4 - null 4 - headerSize? (16) 4 - numDirectories // for each directory 4 - Number Of Files 32 - dirName 4 - Offset // for each file 4 - Unknown 32 - filename 4 - Unknown 4 - offset 4 - size +------------------------+ | Panzer Commander *.jrf | +------------------------+ 4 - Header (MTLU) 4 - Number Of Files 4 - Directory Offset 20 - Padding (all 205's) // go to directory offset // for each file 36 - Filename (null) 4 - Length 4 - Offset 4 - null +----------------------+ | Panzer General *.shp | +----------------------+ 4 - Version (1.10) - read as string 4 - Number Of Files // for each file 4 - offset 4 - ID? type? X - File Data +---------------+ | Panzers *.pak | +---------------+ 12 - Header 4 - Directory Size 1 - Unknown // for each file 1 - Filename size X - Filename 4 - Offset 4 - Size 4 - Unknown 2 - Unknown X - File Data +------------------+ | Paradoxion *.pak | +------------------+ 4 - Number Of Files // for each file X - Filename (null) X - File Type Description (null) (eg BGDESC, TEXTURE, MUSIC) 4 - File Offset 4 - File Size 4 - File Type ID 1 (5=BGDESC, 22=TEXTURE, 25=MUSIC) 4 - File Type ID 2 (0=BGDESC, 3=TEXTURE, 1=MUSIC) 4 - null 4 - Unknown X - File Data +-------------------+ | Patrician 2 *.cpr | +-------------------+ 16 - Header (ASCARON_ARCHIVE ) 4 - Version (V0.9) 12 - null 4 - Directory Length [-16] (including all these archive header fields and the 9 null padding) 4 - Directory Length [-15] (not including all these archive header fields or the padding) 4 - Number Of Files 4 - Unknown // for each file 4 - Data Offset 4 - Raw File Length 4 - Unknown (1) X - Filename (null) 9 - null X - File Data +-----------------+ | Perimeter *.pak | +-----------------+ // A ZIP archive +----------------------------+ | Playboy: The Mansion *.cam | +----------------------------+ 8 - Header (CYLBPC ) 2 - Version Main (2) 2 - Version Sub (1) 4 - Number Of File Types // for each file type 4 - Size of the directory for this file type [+8] (including these 4 fields) 4 - File Type Description (WAVE) 4 - Size of each file entry (28) (OLD!) 4 - Number Of Files of this type 4 - null // for each file of this type 4 - Filename? File ID? 4 - File Offset 4 - File Size 4 - null X - File Data +------------------+ | Pontifex 2 *.pfm | +------------------+ 4 - Version (1) 4 - Number Of Files // for each file 32 - filename (null) // go to offset 1160 X - Finished string (padded to 384 bytes) // go to offset 1544 X - Description string (padded to 128 bytes) +-----------------+ | Populus 3 *.sdt | +-----------------+ // SAME AS Sim Theme Park *.sdt 4 - numFiles // for each file 4 - File Offset X - File Data // at each file offset 4 - Unknown 4 - Unknown 16 - Filename (null) 4 - Unknown 8 - null X - File Data +------------------------+ | Prince Of Persia *.dat | +------------------------+ 4 - dirOffset 2 - Number Of Files? // go to dir offset 2 - Number Of Files? // for each file 2 - File ID 4 - File Offset 2 - File Size // EACH FILE IS SEPARATED BY A SINGLE NULL BYTE! +--------------------------+ | Prince Of Persia 2 *.dat | +--------------------------+ 4 - dirOffset 2 - Number Of Files? // go to dir offset 2 - numTypes // for each type 4 - ID/type string (extension) 2 - File Offset // at each type offset 2 - Number Of Files 2 - File ID 4 - File Offset 2 - File Size 2 - Unknown (64) 1 - null Spacing // EACH FILE IS SEPARATED BY A SINGLE NULL BYTE! +-------------------------------------------------+ | Prince Of Persia: Sands Of Time *.bf (Type BIG) | +-------------------------------------------------+ 3 - Header (BIG) 1 - null 4 - Unknown (37) 4 - numFiles 4 - Unknown (5) 8 - null 8 - Unknown (all 255s) 4 - Unknown 4 - Unknown (1) 4 - Unknown 4 - numFiles 4 - Unknown (5) 4 - Header Size (68) 4 - Unknown (all 255s) 4 - null 4 - Unknown // for each file 4 - File Offset 4 - Unknown X - Padding (like 200MB of null padding!) X - File Data +------------------------------------------------+ | Prince Of Persia: Warrior Within *.big + *.fat | +------------------------------------------------+ // FAT has the Directory, BIG has the file data // for each file 4 - File ID? (starting at 0, incrementing by 47) 4 - File Offset 4 - File Length 4 - null 4 - Filename Length (27) (including the trailing null) X - Filename 1 - null +---------------------------------------+ | Prince Of Persia: Warrior Within *.bf | +---------------------------------------+ // SAME AS PoP: Sands Of Time *.bf 4 - Directory Length [+4 for this field] // for each file 4 - Unknown 4 - File Offset (relative to the end of the directory) 4 - File Length 4 - null 4 - Filename Length (including trailing null) X - Filename 1 - null X - File Data +------------------------+ | Princess Maker 2 *.lbx | +------------------------+ X - File Data X - Directory 2 - Number Of Files 4 - Directory Offset // go to dirOffset // for each file 12 - Filename 4 - Offset 4 - Size +----------------------------------+ | Project IGI - I'm Going In *.iff | +----------------------------------+ // Same as Allan Border Cricket LBM_FORM +----------------------------------+ | Project IGI - I'm Going In *.res | +----------------------------------+ 4 - Header (ILFF) 4 - Archive Size 4 - Unknown (4) 4 - null 4 - Resources Header (IRES) // for each file 4 - Entry Header (NAME) 4 - Filename Length (including 1 null) 4 - Unknown (4) 4 - Offset to BODY header (relative to the start of this file entry) X - Filename 1-4 - (null) Padding to a multiple of 4 bytes 4 - Body Header (BODY) 4 - File Size (including all file entry data) 4 - Unknown (4) 4 - File Size (including all file entry data, but excluding this and the previous 3 fields) 4 - File Data Header (ILSF) X - File Data +-----------------+ | Project X *.epf | +-----------------+ // THE SAME AS Overdrive EPF_EPFS +-------------------------+ | Railroad Tycoon 2 *.pak | +-------------------------+ 2 - Number Of Files 4 - Unknown // for each file 4 - Offset 4 - Size 4 - Unknown X - File Data // for each file 15 - Filename (null) +-------------------------+ | Railroad Tycoon 3 *.pk4 | +-------------------------+ 4 - Unknown 4 - Number Of Files // for each file 4 - Hash? 4 - Length 4 - Offset (Relative to the end of the directory) 1 - null 61 - Filename (null) X - File Data +----------------+ | Rayman 2 *.cnt | +----------------+ 4 - Number Of Folders 4 - Number Of Files? 3 - Unknown // for each folder 4 - Folder Name Length X - Encrypted Folder Name 1 - End Of Directory Marker (1) // for each file 4 - null 4 - Filename Length X - Filename 4 - Unknown 4 - Unknown 4 - File Offset 4 - File Length +------------------------------------------------------------+ | Rebel Assult 2: The Hidden Empire *.san *.nut (chunk)(big) | +------------------------------------------------------------+ 4 - Header (ANIM) 4 - Archive Size [+8] // for each file 4 - Type/Extension 4 - File Size X - File Data +------------------------------------------------------+ | Rebel Assult 2: The Hidden Empire *.sad (chunk)(big) | +------------------------------------------------------+ 4 - Header (SAUD) 4 - Archive Size [+8] // for each file 4 - Type/Extension 4 - File Size X - File Data +-----------------------+ | Recoil *.zbd (Type 1) | +-----------------------+ 4 - null 4 - Version (1) 4 - Unknown 4 - numFiles // for each file 4 - Offset (relative to end of directory) 4 - Unknown 32 - Filename (null) X - File Data +-----------------------+ | Recoil *.zbd (Type 2) | +-----------------------+ 4 - Unknown (4) 4 - Version (2) // for each file X*4 - Unknown Fields (values between 2 and 5) 4 - Filename Length X - Filename +------------------------+ | Recoil *.zbd (Type 7) | +------------------------+ 2 - Unknown 2 - Unknown 4 - Version (7) 4 - numFiles? // for each file 120 - Filename (null) 4 - Unknown 4 - File Size X - File Data +------------------------+ | Recoil *.zbd (Type 15) | +------------------------+ 2 - Unknown 2 - Unknown 4 - Version (15) 4 - numFiles 4 - Directory Entry Size (36) 4 - Unknown 4 - Unknown 4 - Unknown // for each file 8 - null 4 - File Size? 4 - Unknown 20 - Filename (null) X - File Data +------------------------+ | Recoil *.zbd (Type 28) | +------------------------+ 4 - Unknown 4 - Version (28) // for each file 4 - Unknown X - Filename (null) 0-3 padding (to make filename+null a multiple of 4) 52 - File Data? +--------------------------+ | Recoil *.zbd (Type RIFF) | +--------------------------+ // This is an archive of WAVE files // we read this using the filesize information supplied in the WAVE files // So the offset of each file actually includes the WAVE header // ie the first offset is at 0, second offset at 0 + filesize + 8, etc. // for each file 4 - WAVE Header (RIFF) 4 - File Size [+8] X - File Data // Note that RIFF may be used as the header of the archive, for validation purposes +-------------------+ | Red Faction *.vpp | +-------------------+ // The archive is based on multiples of 2048 4 - Header (206 10 137 81) 4 - Version (1) 4 - Number Of Files 4 - Archive Size 2032 - Filler (ie filled to position 2048 using nulls) // for each file 60 - Filename 4 - File Size // after the directory X - padding to a multiple of 2048 bytes // The file offsets start at (numFiles * 64) + 2048 + (2048-((numFiles*64) % 2048)) // Where % is the mod function (remainder) // Also, each file is padded to a multiple of 2048, which must be taken into account when // calculating the offset to each file. +----------------------------------------+ | Red Faction 2 *.packfile + *.toc_group | +----------------------------------------+ // toc_group file has the details, packfile has the file data X - filename (null) X - directory Name (null) 4 - Unknown (2) 4 - Unknown (1) X - file filename (dirName + filename) (null) 4 - numFiles? // for each file X - Filename 4 - File Size 4 - File Offset +---------------------+ | Red Faction 2 *.peg | +---------------------+ 4 - Header (GEKV) 4 - Version (6) 4 - Directory Size (first file offset = dirSize + 32) 4 - File Data Size 4 - numFiles 4 - null 4 - numFiles 4 - Unknown (16) // for each file 2 - Unknown 2 - Unknown 4 - Unknown 2 - Unknown 2 - Unknown 48 - Filename (null) 4 - File Offset [+ first file offset] X - File Data +------------------------------------------------------------+ | Redneck Rampage *.ins (and maybe other installer packages) | +------------------------------------------------------------+ 4 - Unknown 4 - Unknown 2 - Unknown 4 - Unknown 2 - Unknown // for each file 4 - File Size (for first file, skip 3 bytes then read the 4 byte number. Remember to subtract 3 off the next field too!) 4 - Unknown 4 - Unknown 2 - Unknown (null) 4 - Unknown (32) X - Filename (null) X - File (compressed) +-------------------------------+ | Return to Mystery Island *.bf | +-------------------------------+ 16 - Header (CryoBF - 2.02.0 + (byte)26) 8 - null 4 - Directory Offset 4 - First File Offset (32) X - File Data X - Directory // go to DirOffset 4 - Number Of Directories // for each directory { 4 - Filename Length X - Filename 4 - Entry Type (1=dir, 2=file) if (type==dir){ 4 - Number Of Files In This Directory // for each file in this directory { X - File Entries (repeat from "//for each directory") } } else if (type==file){ 4 - File Length 4 - null 4 - Offset (relative to the first file offset) } } +-----------------------+ | Risk 2 *.gfx (Type 1) | +-----------------------+ 4 - First File Offset 4 - Unknown // for each file 4 - File Offset [+firstFileOffset] 4 - Unknown 4 - File Size? 4 - Unknown X - File Data +-----------------------+ | Risk 2 *.gfx (Type 2) | +-----------------------+ 32 - Description (null) 4 - Number Of Files 4 - File Data Size // for each file 2 - Unknown 2 - Unknown 2 - Unknown 2 - Unknown +------------------+ | Rival Ball *.prv | +------------------+ //This is a bitmap image! *.bmp +------------------------------+ | RollerCoaster Tycoon 3 *.ovl | +------------------------------+ // .COMMON.OVL FILES Header ------ 4 - Header (FGRK) 4 - null 4 - Version (1) 8 - null 4 - Number Of Directories (maximum of 4 directories) // for each directory 2 - Format Header Length X - Format Header (FGDK,RCT3) 2 - Directory Name Length X - Directory Name 4 - Directory Format? (1=RCT3, 2=FGDK) 2 - Extension Name Length X - Extension Name 8 - Number Of Files Of Type 0 8 - Number Of Files Of Type 1 8 - Number Of Files Of Type 2 8 - Number Of Files Of Type 3 4 - null // NOTES // // The way I think this works is that there are a fixed number of directories // allowed in an archive (4). The directories each list their number of files // under the directory loop, as shown by "Number Of Files Of Type #" above. // // So to read the archive, you would read the filename directory file, then all // files of type 0, then all files of type 1, etc. Filename Directory ------------------ // for each filename directory 4 - Length of Directory // for each file in the directory X - Filename (null) (replace the : character with a . character) File Data --------- // for each file 4 - File Length X - File Data Offset Directory ---------------- 4 - Number Of Entries // for each entry 4 - Offset to something [+185] ID Directory ------------ // If the first 4 bytes are not null, then the ID directory exists // If null, it is the start of the source file directory as indicated below // There are 4 bytes for every 2 entries in the offset directory above // for each numEntries/2 4 - Unknown (1/4) Source File Directory --------------------- // Sometimes this section does not exist // NOTE: THIS SECTION HAS NOT BEEN RESEARCHED FULLY - IT WILL BE BUGGY! 4 - null (start of source file directory marker?) // for each group 4 - Unknown 4 - Group Data Length 2 - Description Length X - Description // for each file in this group 4 - A Relative Offset? 4 - Unknown (1) 1 - Unknown 2 - Filename Length X - Filename 1 - Unknown 1 - Unknown 4 - Group End Marker (all 255s) // .UNIQUE.OVL FILES Header ------ 4 - Header (FGRK) 4 - null 4 - Version (1) 8 - null 4 - Number Of Directories // for each directory 2 - Format Header Length X - Format Header (FGDK,RCT3) 2 - Directory Name Length X - Directory Name 4 - Unknown (1,2) 2 - Extension Name Length X - Extension Name 8 - Number Of Files Of Type 0 8 - Number Of Files Of Type 1 8 - Number Of Files Of Type 2 8 - Number Of Files Of Type 3 4 - null 4 - Directory Length // for each file 4 - Filename Offset (relative to the start of the filename directory) 4 - Unknown 4 - File Type ID? (1) 4 - Directory Length // for each file 4 - File Type ID? (0-6) 4 - Unknown 4 - null 4 - Unknown 4 - Unknown (1-2) 4 - Directory Length // for each file 4 - Unknown 4 - Unknown 4 - Unknown (increments by 20 every X files, where X is variable) 4 - Directory Length // for each file 22 - null 4 - Unknown 2 - null 4 - Unknown 8 - Unknown 4 - null 4 - Unknown 4 - Unknown 4 - Unknown (repeat) 4 - Unknown (repeat) 4 - null 4 - Padding (all 255's) 4 - null 4 - Unknown 4 - Unknown (2) 12 - null 4 - Unknown (1) 4 - null 4 - Offset? (big) 4 - Offset? (big)(repeat) 8 - null 4 - Directory Length // for each file 28 - null 4 - Unknown 28 - null 4 - Unknown 4 - Unknown (2) 28 - null 4 - Unknown (1) 4 - null 4 - Offset? (big) 4 - Offset? (big)(repeat) 4 - Directory Length [*4] // for each file 4 - Unknown // The source file directory comes here, same as in the .common.ovl files +------------------------------+ | Rome Total War *.dat + *.idx | +------------------------------+ // IDX FILE CONTAINS THE DIRECTORY, DAT CONTAINS THE FILE DATA 12 - Description (null) 4 - Number Of Files 4 - Unknown (8) // for each file 4 - File Offset 4 - File Length 12 - null 4 - File Type? (13) X - Filename (null) 3 - Padding (204 204 204) +-----------------------------+ | Rumble Roses *.pac (Type 1) | +-----------------------------+ // NOTE: Some archives have some random data put in them which consists of // a long string with no nulls in it - so if this is encountered just read // until the next null 4 - Header (DPAC) 4 - Number Of Files? 2 - Unknown 4 - Unknown (7) X - null Padding to offset 2048 // for each file? 4 - Type/Extension ID (32-padded) 2 - File ID? 2 - Unknown X - null Padding to offset 16384 // for each file 4 - File Header Tag if (tag == "BPE "){ 4 - Version Number? (256) 4 - Compressed Size 4 - Decompressed Size? X - File Data } else if (tag == "PAC "){ 4 - Number of 8-byte fields X - File Data (length = num8byte * 8) } else if (tag == "TIM2"){ 2 - Unknown (4) 2 - Unknown (1) 8 - null 4 - Image Data Length [-4] X - Image Data } X - null Padding (optional) +-----------------------------+ | Rumble Roses *.pac (Type 2) | +-----------------------------+ // for each file 4 - File Header Tag if (tag == "BPE "){ 4 - Version Number? (256) 4 - Compressed Size 4 - Decompressed Size? X - File Data } else if (tag == "PAC "){ 4 - Number of 8-byte fields X - File Data (length = num8byte * 8) } else if (tag == "TIM2"){ 2 - Unknown (4) 2 - Unknown (1) 8 - null 4 - Image Data Length [-4] X - Image Data } X - null Padding (optional) +-----------------+ | Sabre Ace *.egl | +-----------------+ 4 - Number Of Files // for each file 4 - Offset 31 - Filename (null) 4 - Archive Size 31 - null X - File Data +----------------------+ | Save Our Pizza *.lid | +----------------------+ // SAME AS Desert Raid *.lid +--------------------+ | Screamer 4x4 *.cod | +--------------------+ 21 - Header (->Unique Pc HUNGARY<-) 3 - null 4 - Directory Length // for each file 128 - Filename (null terminated, then filled with "." for the remaining bytes) 4 - Offset 4 - Length +--------------------+ | Second Sight *.pak | +--------------------+ // NOTE: The files in the directory *may be* in a different order to the files in the archive // eg. File1 in the directory may be File622 in the archive 4 - Header (P4CK) 4 - Unknown (Archive Size?) 4 - Unknown 4 - Size Of Filename Directory [-18] 16 - null 2 - Number Of Files? // for each file 1 - Filename Length X - Filename // for each file 1 - Description Length X - Description 4 - Filename ID (starting at 0, incrementing by 1 for each file) 2 - Unknown (127) 2 - Unknown (127) 2 - Unknown (15) 2 - Unknown (13) 4 - Unknown 2 - Unknown 4 - Unknown X - File Data +---------------------------+ | Settlers 3 *.dat (Type 2) | +---------------------------+ 4 - Unknown 4 - Version (2) 4 - null 4 - Unknown 4 - Unknown 4 - Unknown 4 - Header Size? (28) [+8] 4 - Unknown 4 - Unknown // for each file 4 - Offset 8 - Unknown X - File Data +----------------------------+ | Settlers 3 *.dat (Type 12) | +----------------------------+ 4 - Unknown 4 - Version (12) 116 - Unknown // for each file 4 - Offset X - File Data +-----------------------------------+ | Settlers: Heritage Of Kings *.bba | +-----------------------------------+ // ZLib Compression is used extensively in this archive 3 - Header (BAF) 1 - Version (2) 4 - Archive Length [+8] 3 - BAH Header (BAH) 1 - BAH Version (2) 4 - BAH Length (8) 8 - Unknown (BAH Data) 3 - File Data Header (BAf) 1 - File Data Version (2) 4 - File Data Length X - File Data { // THE FILE DATA IS STRUCTURED LIKE THIS... // for each file { 4 - Compression Header if (compressionHeader != 104329917){ // the file is not compressed - read as normal } else { // the file is compressed with ZLib, and has the following structure 4 - Compressed Size (including 4 of these header fields) [-12] 4 - Compressed Size [+4] 4 - Decompressed File Size 4 - Unknown X - Compressed File Data } } } 3 - Directory Header (BAd) 1 - Directory Version (2) 4 - Directory Length X - Directory Data { 3 - File Entries Header (BAe) 1 - File Entries Version (2) 4 - File Entries Length X - File Entries Data { 4 - Compression Header (104329917) 4 - Compressed Data Length (File Entries Length - 8) 4 - Compressed Data Length [+2] 4 - Decompressed Size 4 - Unknown X - Compressed Directory Data { // WHEN DECOMPRESSED USING ZLIB, THE DIRECTORY HAS THIS STRUCTURE 4 - Number Of Files // for each file { 4 - File Type Identifier (also compression identifier) if (fileTypeID == 1){ // directory 8 - null 2 - Directory Name Length 2 - Number of characters from the start of the dirname that provide the parent directory 4 - null 4 - Unknown 8 - null X - Directory Name (null) 0-3 - Padding to multiple of 4 bytes } else { // file 4 - Offset 4 - Decompressed File Size 2 - Filename Length 2 - Number of characters from the start of the filename that provide the directory 4 - Padding (all 255's) 4 - Unknown (something to do with the offset to the next file entry) 8 - Unknown X - Filename (null) 0-3 - Padding to multiple of 4 bytes } } } } 3 - BAh Header (BAh) 1 - BAh Version (2) 4 - BAh Length X - Unknown (BAh Data) } // FILE TYPE ID NUMBERS // // 0 = Uncompressed File // 1 = Directory // 2 = Compressed File +-------------+ | Shade *.res | +-------------+ // The first field can be used as a format verifier header field, by looking for "IPF1" // for each file 4 - File Type ("PK" + (byte)3,4 or "IPF1") 2 - Unknown (20) 2 - Unknown (2) 2 - Unknown (File=8, Dir=0) 4 - Directory/File Identifier? (Dir=823760679, File=823701178) // Note: If it is a Directory - the next 3 fields are null 4 - Timestamp??? 4 - File Size 4 - Decompressed File Size? 4 - Filename Length X - Filename X - File Data +--------------------------------------+ | Shadow Company - Left For Dead *.gut | +--------------------------------------+ 326+(filenameLength*2)+(1 if month=10,11,12) - Header (62x"*" + (char)13 + (char)10 + "** Shadow Company: Left For Dead" + (char)13 + (char)10 + "**" + char)13 + (char)10 + "** [" + filename + "] : GUT resource file" + (char)13 + (char)10 + "** Copyright 1998 by Sinister Games Inc." + (char)13 + (char)10 + "**" + (char)13 + (char)10 + "** [gut_tool.exe] Build date: 17:58:56, Aug 24 1999" + (char)13 + (char)10 + "** [" + filename + "] Created: " + time as HH:MM:S + ", " + date as M/DD/YYYY + (char)13 + char(10) + 62x"*" + (char)13 + char(10)) 8 - Unknown 4 - Unknown 32 - filename (null) // for each file 4 - Filename Length 4 - File Size 4 - File Offset [+headerSize] 4 - null 4 - Unknown X - Encrypted Filename X - File Data +----------------------+ | Shadow Warrior *.shr | +----------------------+ // Just a PK_ZIP archive +---------------------------+ | Shell Shock Nam '67 *.dat | +---------------------------+ 4 - Header 1 (Core) 6 - Version (<1.76>) 6 - Header 2 () 1-4 - Unknown (5) 0-3 - Padding (spaces) 1-4 - Directory length (Big) (UNSIGNED!) (+13 to find the start of file data) 0-3 - Padding (spaces) 1-4 - Number Of Files (Big) (UNSIGNED!) 0-3 - Padding (spaces) // for each file 1-4 - Filename length 0-3 - padding (nulls OR spaces) (so the filename length is 4 bytes total) X - Filename (no null!) 0-3 - Padding (so the filename is a multiple of 4 bytes) (padded with nulls OR spaces) X - File Data // NOTES ON WORKING OUT THE SIZE OF EACH FIELD // This archive format swaps between using byte(0) and byte(32) to represent null values. // Therefore, you need to do the following to work out the size of the 4-byte fields... // 1. Read the first byte (it will always have a value) // 2. Read the second byte // 3. if (byte2 != null AND byte2 != 32) then it is part of the value, else it should be treated as a null // 4. Repeat steps 2 and 3 for the remaining 2 bytes // This way you will build up the 4-byte value correctly. You could also do it the following way... // 1. Read the 4 bytes // 2. Working from the last of the 4 bytes, replace bytes with value byte(32) with value byte(0) // 3. Stop when you reach a null, or when you reach a value != byte(32) // This process should be applied to all the fields marked as size 1-4 (and its partner 0-3) // NOTES ON THE FILE DATA // There are no offsets stored, rather the user must walk through the file to find the file data offsets. // To help, there is a rough pattern in that the 4 bytes before the data starts is the length of the data. // Other than that, I don't know how to move between files, or how to determine the location of the size field. // So, at this point in time, i do not know how to get the specific file // for each file X - Unknown 4 - File Data Size X - File Data +-------------------------------------------+ | Shivers - Harvest of Souls *.sol (Type 1) | +-------------------------------------------+ // The last entry in the directory is a file with null length and offset, and the name THE_END // for each file X - Directory Name (null) X - Filename (null) 1 - End of directory marker (more to follow=null, end of directory=(byte)80) 4 - null 4 - Length 4 - Offset X - File Data +-------------------------------------------+ | Shivers - Harvest of Souls *.sol (Type 2) | +-------------------------------------------+ // The last entry in the directory is a file with null length and offset, and the name THE_END // NOTE - It is not yet possible to decrypt this archive format // for each file X - Filename (null) 1 - Unknown 0-1 - Random Padding to multiple of 2 bytes 4 - Length (encrypted) 4 - Offset (encrypted) +---------------------+ | Silent Hill 3 *.arc | +---------------------+ 4 - Unknown 4 - Number Of Files 4 - Length of blank padding after directory and before file data 4 - null // for each file 4 - Offset 4 - File ID? 4 - Length 4 - Length X - null Padding (size according to the 3rd field) X - File Data +---------------------+ | Silent Hill 3 *.afs | +---------------------+ // SAME AS Leisure Suit Larry: Manga Cum Laude *.afs +---------------------+ | Silent Hunter *.cat | +---------------------+ 2 - numFiles // for each file 13 - Filename (null) 1 - Filename Terminator (space) 4 - Unknown 4 - File Size 4 - File Offset X - File Data +--------------------------------------------+ | Simcity 2000 Special Edition *.idx + *.dat | +--------------------------------------------+ // the idx file contains the index details // for each file 4 - ID 4 - File Offset +--------------------+ | Simcity 3000 *.pak | +--------------------+ 4 - numFiles // for each file 4 - Filename Length X - Filename 4 - Offset X - File Data +-----------------+ | Simcity 4 *.dat | +-----------------+ // Some files use compression 4 - Header (DBPF) 4 - Version (1) 16 - null 4 - Archive ID? 4 - Archive Type 4 - Unknown (7) 4 - Number Of Files 4 - Directory Offset 4 - Directory Size 48 - null X - File Data X - Directory // go to dirOffset // for each file 4 - Type ID 4 - Group ID 4 - Instance ID 4 - Offset 4 - Size +------------------------------------------+ | Sim Golf for Windows 95 *.rf *.flg *.tlp | +------------------------------------------+ 4 - Header (RCNT) 4 - Unknown 4 - Directory Offset 4 - null X - File Data X - Directory // Directory starts here // for each file 12 - Filename 4 - Offset 4 - Length 4 - Unknown (2) +----------------------------------+ | Skunny: Back To The Forest *.lid | +----------------------------------+ // SAME AS Desert Raid *.lid +-------------------+ | Skunny Kart *.lid | +-------------------+ // SAME AS Desert Raid *.lid +--------------------------------------+ | Splinter Cell: Pandora Tomorrow *.u* | +--------------------------------------+ // Generic Unreal Engine Format +-------------------------+ | Sno-Cross Extreme *.sfp | +-------------------------+ // for each file 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Length (including these header fields) 4 - File Type ID? X - File Data +-----------------------+ | Southpark *.dat *.mrg | +-----------------------+ 4 - Number Of Files //for each file 4 - Filename Length (including null byte) X - Filename (null) 4 - File Offset 4 - Raw File Size 4 - Compressed File Size X - File Data +------------------+ | Spec Ops 2 *.zrs | +------------------+ 4 - Unknown (25) 4 - Archive Number? (0/1) 4 - Number Of Files [-1] 4 - Unknown (all 255) 4 - Unknown (22) // for each file 4 - Unknown 4 - File Length [+16 on every file EXCEPT the first file] X - File Data +-----------------+ | Spiderman *.pkr | +-----------------+ // some files are compressed with ZLIB? 4 - Header (PRK3) 4 - dirOffset // go to dirOffset 4 - Unknown (4) 4 - numDirectories 4 - total number of files in all directories // for each directory 32 - dirName 4 - subDirOffset [x52 + dirOffset] 4 - numFiles in the directory // for each file 32 - filename 4 - Unknown 4 - Unknown 4 - File Offset 4 - Raw File Size 4 - Compressed File Size +--------------------------+ | Star Siege *.vol (chunk) | +--------------------------+ 4 - Header (PVOL) 4 - Filename Directory Offset X - File Chunks X - Directory // go to filename directory 4 - Header (vols) 4 - Filename Directory Size [+8] // for each file X - Filename (null) 0-1 - Padding to a multiple of 2 bytes 4 - Header (voli) 4 - Offset Directory Size [+8] // for each file 4 - null 4 - File ID? 4 - File Offset 4 - File Size 1 - null // at each file offset 4 - Chunk Header (VBLK) 2 - File Size 2 - Unknown X - File Data +---------------------------------------+ | Star Wars Episode 1 Racer *.bin (big) | +---------------------------------------+ // BIG ENDIAN ORDERING! 4 - Number Of Files // for each file 4 - File Offset 4 - Unknown 4 - Archive Size X - File Data +-----------------------------------------------+ | Star Wars Episode 1: The Phantom Menace *.lab | +-----------------------------------------------+ 4 - Header (LABN) 4 - Unknown (65644) 4 - Number Of Files 4 - Filename Directory Length 4 - null // for each file 4 - Offset 4 - Size 4 - Type/Extension 4 - Filename Length X - File Data +----------------------------------------------------------------+ | Star Wars: Republic Commando *.ctm *.u *.uax *.ukx *.usx *.utx | +----------------------------------------------------------------+ // Unreal-Engine format +-----------------------------------+ | Star Wars Rogue Squadron 3D *.dat | +-----------------------------------+ 4 - Directory Offset 4 - Directory Length X - File Data X - Directory X - Unknown // go to dirOffset // for each file 4 - Offset 4 - Length 4 - Padding (all 255's) 2 - Unknown ID 2 - Unknown 16 - Filename (null) (replace "_" with ".") // FILE DATA IS SET OUT LIKE THIS... // for each file X - File Data 0-31 - null Padding to multiple of 32 bytes +-----------------------------------+ | Star Wars Rogue Squadron 3D *.000 | +-----------------------------------+ // NOTE: This archive uses BIG ENDIAN format! 4 - Header (BUND) 4 - Archive Size [+8] 4 - Bundle Header (BNHD) 4 - Bundle Header Length X - Bundle Header { 65570 - Padding Data // for each file { 200 - Encrypted Filename (null) (decrypt with xor 208?) 4 - Length? 4 - Offset? 44 - null } } 4 - File Data Header (BNDT) 4 - File Data Length X - File Data +----------------------+ | Steel Panthers *.lbm | +----------------------+ // Same as Allan Border Cricket *.lbm +-----------------+ | Still Life *.sl | +-----------------+ 4 - Header (VXBG) 4 - Directory Length [+8 for these fields] // for each file X - Filename (null) 4 - File Length X - File Data +--------------------+ | Stratosphere *.zpr | +--------------------+ 2 - Version (1) 2 - numFiles? // for each file 129 - Filename (null) 4 - Unknown 4 - Compressed Size 4 - Uncompressed Size 4 - Unknown 4 - Offset (relative to end of directory) X - File Data +----------------------------------+ | Surface Tension *.tc *.vtc *.spf | +----------------------------------+ 4 - Header (SPRF) 4 - Number Of Files // for each file 32 - Filename (null) 4 - Length 4 - Offset X - File Data +------------------------------------------------+ | SWAT 4 *.s4m *.pkg *.u *.uax *.ukx *.usx *.utx | +------------------------------------------------+ // Unreal-Engine format +------------------+ | S.W.I.N.E. *.swn | +------------------+ 4 - Header 1 4 - Unknown 4 - Header 2 (PACK) 4 - Directory Size // for each file 1 - Unknown 1 - Filename Length X - Filename 4 - Offset (relative to end of directory) 4 - Size 5 - Unknown // File offset = 16 + dirSize + offset X - File Data +-------------------------+ | Take No Prisoners *.sfd | +-------------------------+ 4 - Number Of Files // for each file 4 - Offset X - File Data +-------------------------+ | Take No Prisoners *.vbm | +-------------------------+ 4 - Header (VBM ) 2 - Unknown (10) 2 - Unknown (5) 4 - Archive Size 4 - Unknown 4 - Directory Offset (108) 4 - Unknown 4 - Unknown 4 - Unknown 4 - First File Offset 4 - Unknown 4 - Unknown 4 - Unknown 4 - Offset to X's 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - null 4 - Offset to X's 4 - null 4 - Offset to X's (same as 2 fields above) 4 - Padding (all 255's) // for each file 32 - Filename (null) +-------------------------------+ | The Incredibles *.hip (chunk) | +-------------------------------+ // BIG ENDIAN ORDERING!!! // Note: The order of the files in the directory are different to the order of the files // in the archive. ie. File#1 in the directory may be File#2938 in the archive 4 - Archive Header (HIPA) 4 - null 4 - Pack Header (PACK) 4 - Pack Header Length (144) 4 - Version Header (PVER) 4 - Version Header Length (12) 4 - Version (2) 2 - Unknown (10) 2 - Unknown (15) 4 - Unknown (1) 4 - Flags Header (PFLG) 4 - Flags Header Length (4) 4 - Flags 4 - Count Header (PCNT) 4 - Count Header Length (20) 4 - Number Of Files? 4 - Unknown 4 - Unknown 4 - Length of the File Data 4 - Unknown 4 - Creation Date Header (PCRT) 4 - Creation Date Header Length (30) 4 - AD/BC ("AD" + (bytes)226,254) 4 - Day (Sun ) 4 - Month (Sep ) 3 - Date (12 ) 9 - 24-Hour Time (16:59:58 ) 4 - Year (2004) 2 - null 4 - Modification Date Header 4 - Modification Date Header Length (4) 4 - AD/BC ("AD" + (bytes)226,254) 4 - Platform Header? (PLAT) 4 - Platform Header Length (26) 4 - BX Field ("BX" + 2 nulls) 4 - Language ("US" + 2 nulls) 4 - Graphics Format (NTSC) 2 - null X - Game Name (Incredibles) 1 - null 4 - Directory Header (DICT) 4 - Directory Length 4 - Table Of Contents Header (ATOC) 4 - Table Of Contents Length 4 - Information Header (AINF) 4 - Information Header Length (4) 4 - null // for each file 4 - File Entry Header (AHDR) 4 - File Entry Length 4 - Unknown 4 - File Type Code (filled to length with (byte)32 - "spaces") 4 - File Offset 4 - File Length 4 - File Type ID? (12=SCRP) 4 - Unknown (2) 4 - File Details Header (ADBG) 4 - File Details Header Length 4 - null X - Filename (null) X - null Padding (use the FileDetailsHeaderLength to determine the size of this field) 4 - Unknown (Hash or something?) 4 - L Table Of Contents Header (LTOC) 4 - L Table Of Contents Header Length 4 - L Information Header (LINF) 4 - L Information Header Length (4) 4 - null // for each item in the LTOC 4 - L Header (LHDR) 4 - L Header Length (20) 4 - Unknown (1) 4 - null 4 - L File Details Header (LDBG) 4 - L File Details Header Length (4) 4 - Padding (all (byte)255's) X - File Data +--------------------------+ | Theme Park *.dat + *.tab | +--------------------------+ // *.tab has the details, *.dat has the file data 24 - null 4 - Unknown 4 - Unknown // for each file 18 - Filename 4 - Offset 4 - null 4 - Size 2 - Type? +----------------------------+ | The 7th Guest *.gjd + *.rl | +----------------------------+ // RL has the directory, GJD has the file data // RL FILE // for each file 12 - Filename (null) 4 - File Offset 4 - File Size // GJD FILE // for each file X - File Data 1 - null Padding between files +-----------------------------------------------------------------+ | The Chronicles of Riddick - Escape From Butcher Bay *.xwc *.xtc | +-----------------------------------------------------------------+ 16 - Header (MOS DATAFILE2.0 + null) 8 - null 4 - Unknown 20 - null // OPTIONAL PADDING // Read the first few bytes - if it doesn't match the padding then // the padding doesn't exist and you just move on to the loop following X - Padding to offset 2048 (padded using repeats of 1234567890123456) // for each file 4 - Unknown (768) 4 - Unknown (36864) 4 - Length (excluding all header data - ie the length of the file data only) 4 - Unknown (1) 4 - Unknown 4 - Unknown (36864) 4 - null X - File Data +------------------------+ | The Lost Vikings *.dat | +------------------------+ // for each file 4 - Offset X - File Data +--------------------+ | The Punisher *.vpp | +--------------------+ // The archive is based on multiples of 2048 4 - Header (206 10 137 81) 4 - Version (3) 4 - Number Of Files 4 - Archive Size 4 - Unknown (64) 2028 - Filler (ie filled to position 2048 using nulls) // for each file 24 - Filename (null) 4 - File Size 4 - File Size X - padding to a multiple of 2048 bytes X - File Data // The file offsets start at (numFiles * 32) + 2048 + (2048-((numFiles*32) % 2048)) // Where % is the mod function (remainder) // Also, each file is padded to a multiple of 2048, which must be taken into account when // calculating the offset to each file. +----------------+ | The Sims *.far | +----------------+ // no compression is used in this archive, so the raw and compressed file sizes are the same 8 - Header (FAR!byAZ) 4 - Version (1) 4 - Directory Offset X - File Data X - Directory // go to dirOffset 4 - Number Of Files // for each file 4 - Raw File Size 4 - Compressed File Size 4 - Offset 4 - Filename Length X - Filename +----------------------------+ | The Sims *.iff *.flr *.wll | +----------------------------+ 60 - Header (IFF FILE 2.5:TYPE FOLLOWED BY SIZE JAMIE DOORNBOS & MAXIS 1) 4 - Offset to directory file (sometimes is 0) // for each file 4 - Extension/Type 4 - Size (including 76 header) 2 - File ID 2 - Unknown 64 - Filename (null) X - File Data +-----------------------+ | The Sims Online *.far | +-----------------------+ 8 - Header (FAR!byAZ) 4 - Version (1) 4 - Directory Offset X - File Data X - Directory // go to dirOffset 4 - Number Of Files // for each file 4 - Raw File Size 4 - Compressed File Size 4 - Offset 2 - Filename Length X - Filename +-----------------------------------------+ | The Sims Online *.iff *.flr *.wll *.spr | +-----------------------------------------+ // THE SAME AS THE SIMS *.iff +------------------------------+ | The Sims Online *.dat (DBPF) | +------------------------------+ // THE SAME AS SIMCITY 4 *.dat +----------------------------------+ | The Sims Online *.dat (FAR!byAZ) | +----------------------------------+ // The compression is the same as that used in the Simcity 4 DAT_DBPF archives 8 - Header (FAR!byAZ) 4 - Version (3) 4 - dirOffset X - File Data X - Directory // go to dirOffset 4 - Number Of Files // for each file 4 - Original File Size 2 - Compressed Specifics (see below) 1 - Power Value (see below) 1 - Unknown (0 or 128) 4 - Offset 2 - Unknown (1) 2 - Filename Length 4 - Type ID (see below) 4 - File ID X - Filename // TO CALCULATE FILE SIZES // * If the powerValue=0, the file size is the value of compressedSpecifics // * If the compressedSpecifics is negative, do (((powerValue+1)*65536) + compressedSpecifics) // * If the compressedSpecifics is positive, do ((powerValue * 65536) + compressedSpecifics) // // if (compressedSpecifics < 0){ // fileSize = (65536 * (powerValue_l + 1)) + compressedSpecifics; // } // else { // if (powerValue_l > 0){ // - fileSize = (65536 * powerValue_l) + compressedSpecifics; // - } // else { // - fileSize = compressedSpecifics; // - } // } // THE TYPE ID NUMBERS // 1 - BMP image - (compressed) // 2 - TGA image - (compressed) // 5 - SKEL skeleton - (compressed) // 7 - ANIM animation - (compressed) // 9 - MESH model - (compressed) // 11 - BND binding - (uncompressed) // 12 - APR appearance - (uncompressed) // 13 - OTF outfit - (uncompressed) // 14 - PNG image - (uncompressed) // 15 - PO purchasable object (uncompressed) // 16 - COL collection - (compressed) // 18 - HAG group - (compressed) // 19 - JPEG image - (compressed) // 20 - JPEG image - (uncompressed) +----------------------------+ | Thief - The Dark Age *.crf | +----------------------------+ // Generic ZIP_PK Archive +-------------------------------+ | Thief 3: Deadly Shadows *.gmp | +-------------------------------+ 4 - Header 2 - Unknown 2 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 8 - Unknown 8 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown // for each file 1 - Filename Length (including null) X - Filename (null) 1 - Unknown (16) 1 - Unknown (0) or (4) 1 - Unknown (7) 1 - Unknown (0) or (4) // ends with filename length = 1 and all other fields = null +-------------------------------+ | Thief 3: Deadly Shadows *.ibt | +-------------------------------+ 2 - Version (1) 4 - Unknown 2 - Unknown (null) 4 - First File Offset (dirSize) 4 - File Data Size 4 - Unknown 4 - Unknown 4 - Number Of Files 4 - Unknown 8 - Unknown 8 - Unknown // for each file 4 - ID or Group type? 4 - File Offset 4 - File Size 4 - Size of padding after the file (this is not included in the file size) 4 - File ID? 4 - File Type? (66) 4 - Unknown 8 - Unknown 8 - Unknown 1 - Unknown (8) X - Filename X - Padding to a length of 308 (using nulls) // continues until offset = 1 X - Unknown X - Files +-------------------------------+ | Thief 3: Deadly Shadows *.bik | +-------------------------------+ 4 - Header (BIKi) 4 - archiveSize? (a little too big) 4 - Number Of Files 4 - Unknown 4 - Number Of Files 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Version? (1) 4 - Unknown 4 - Unknown 4 - Unknown // for each file 4 - File Offset +--------------------------+ | Throne Of Darkness *.lot | +--------------------------+ X - File Data X - Directory 4 - Unknown (17) 4 - Directory Length [+4] // go to ArchiveSize - DirectoryLength X - Unknown (seems to vary in size) 1 - null 1 - Unknown 4 - Unknown (-1091568946) 4 - null 4 - Number Of Directories // for each directory 1 - Directory Name Length X - Directory Name 1 - Number Of Files In Directory 1-X - Unknown (minimum 1 bytes?) 1 - null // for each file in this directory 1 - Unknown 1 - Filename Length [-1] X - Filename 1 - Unknown 1 - Unknown 4 - File Size X - Unknown 1 - null +-------------------+ | Tie Fighter *.lfd | +-------------------+ // for each file 12 - filename (null to fill) 4 - offset X - File Data // the header can be read as RMAPresource, which is actually the first filename in every archive +-------------------------------------+ | TOCA Touring Car Championship *.bfp | +-------------------------------------+ 4 - Number Of Files 4 - First File Offset [+12] 4 - Unknown // for each file 16 - Filename (null) 4 - Offset (relative to the end of the directory) 4 - Length X - File Data +-------------------------------+ | Tony Hawk: Pro Skater 2 *.pkr | +-------------------------------+ // No compression is used, so the compressed and uncompressed sizes are the same 4 - Header (PKR2) 4 - Version (1) 4 - Number Of Directories 4 - Number Of Files // for each directory 32 - Directory Name 4 - File Entry Offset 4 - Number Of Files // for each file 32 - Filename 4 - Unknown (-2) 4 - Offset 4 - Uncompressed Size 4 - Compressed Size X - File Data +-----------------------------+ | Tony Hawk Underground *.prx | +-----------------------------+ // not quite right 4 - Number Of Files? 2 - Unknown (3) 4 - Archive Size? 2 - null // for each file 4 - Decompressed File Size 4 - Compressed File Size 4 - File Type ID? 4 - Unknown 35 - Filename (null) X - File Data +-------------------------------+ | Tony Hawk Underground 2 *.prx | +-------------------------------+ // not quite right 4 - Number Of Files? 2 - Unknown (3) 4 - Archive Size? 2 - null // for each file 4 - Decompressed File Size 4 - Compressed File Size 4 - File Type ID? 4 - Unknown 41 - Filename (null) X - File Data +------------------------------------+ | Total Annihilation: Kingdoms *.hpi | +------------------------------------+ 4 - Header (HAPI) 4 - Unknown 4 - Directory Offset 4 - Directory Size 4 - Filename Directory Offset 4 - Unknown (32) 4 - Archive Size? [+78] X - File Data // go to directory offset 4 - null 4 - First Directory Offset // for each directory 4 - Directory Filename Offset [+filenameDirectoryOffset] 4 - Directory Offset [+dirOffset] 4 - null // go to each dirOffset 4 - Filename? (starts at 1) 4 - Directory Size 4 - null 4 - Unknown (40) 4 - numFiles in Directory // for each file 4 - Filename Offset [+filenameDirectoryOffset] 4 - File Offset 4 - File Size 4 - Unknown 4 - Unknown 4 - Unknown // go to filename directory offset X - Filename (null) +--------------------+ | Tower Assult *.epf | +--------------------+ // THE SAME AS Overdrive EPF_EPFS +-------------------+ | Track Mania *.dat | +-------------------+ // go to end of file 4 - Archive Size +---------------------+ | Traffic Giant *.obe | +---------------------+ // for each file 4 - Number Of Files (at start only - all other files have value null) 4 - File ID X - filename (null) X - data and padding to size 136 bytes +---------------------+ | Traffic Giant *.obh | +---------------------+ 4 - Number Of Files 4 - Unknown // for each file X - filename (null) X - data and padding to size 144 bytes +----------------------------+ | Traffic Giant *.jfl (maps) | +----------------------------+ // for each file 4 - Number Of Files (at start only - all other files have value null) 4 - File ID 4 - Version? (1) 4 - Unknown ID 4 - Unknown ID X - filename (null) X - null padding to size 216 bytes +------------------------+ | Transport Tycoon *.001 | +------------------------+ // THIS IS A NORMAL ZIP ARCHIVE +------------------------------+ | Tribes Vengeance *.pkg *.tvm | +------------------------------+ // NOTE: Can't read these yet - not sure where the file offsets and/or file sizes are 8 - Header ((bytes)193,131,42,158,130,0,27,0) 4 - Version (1) 4 - Number Of Files 4 - Unknown (64) 4 - Unknown #2 4 - File Data Size? 4 - Unknown 4 - Same as 2 fields above +14 16 - Unknown 4 - Unknown (1) 4 - Same As Unknown Field #2 4 - Number Of Files // for each file 1 - Filename Length (including null) X - Filename 1 - null 1 - Unknown (16) 1 - Unknown (0/4) 1 - Unknown (7) 1 - Unknown (0/4) X - File Data +--------------------------------------------------+ | Triple Play 98: Home Run Derby *.big *.viv (big) | +--------------------------------------------------+ // BIG ENDIAN FORMAT 2 - Header (192,251) 2 - Directory Size [+ 0-7] 2 - Number Of Files 1 - null // for each file 2 - Offset 2 - Length 1 - Unknown X - Filename (null) 1 - Unknown X - File Data +----------------------------+ | Tyrian 2 *.mus *.shp *.lvl | +----------------------------+ 2 - Number Of Files // for each file 4 - Offset X - File Data +-----------------------------+ | Ultima 7 *.dat (chunk)(big) | +-----------------------------+ // SAME AS Allan Border Cricket LBM_FORM +----------------------------------------+ | Ultima 7 *.dat *.vga *.flx *.tim *.spc | +----------------------------------------+ 80 - Header (Ultima Vil Data File (C) 1992 Origin Inc.) + nulls to fill OR (Ultima Vil initial game) + nulls to fill OR all null 4 - Unknown 4 - numFiles 4 - Unknown 12 - null 4 - Unknown 4 - Unknown 16 - null // for each file 4 - File Offset 4 - File Size X - File Data // Some directory entries are size and offset 0 - these should be ignored // However, these entries DO count in the numFiles field +----------------+ | Ultima 7 *.shp | +----------------+ 4 - Archive Size // for each file 4 - File Offset X - File Data +-------------------------+ | Ultimate Race Pro *.bin | +-------------------------+ 16 - Header (LIBSYSHEADER1.0 + null) 4 - Number Of Files [-1] // for each file 120 - Filename 4 - File Offset 4 - null 120 - null 4 - Archive Size? 4 - null X - File Data +------------------+ | USAF *.ptt *.dem | +------------------+ 12 - Header (Pixel - Strm) 1 - null 5 - Version (01.10 as a string) 2 - null 4 - Version (1) 4 - null 4 - Number Of Files 2 - null 4 - Unknown 14 - null // for each file 32 - Filename (null) 4 - Unknown 4 - Unknown 4 - Unknown 2 - Unknown 2 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - Unknown 4 - File Offset X - null padding to 74384 X - File Data +------------------------+ | US Navy Fighters *.lib | +------------------------+ 5 - Header (EALIB) 2 - Number Of Files // for each file 1 - ID? 13 - filename 4 - offset 18 - nullBytes X - file data +--------------------------+ | US Marine Fighters *.lib | +--------------------------+ // SAME AS US NAVY FIGHTERS *.lib +----------------+ | Vietcong *.cbf | +----------------+ 8 - Header (BIGF + (char)1 + ZBL) 8 - Archive Size 4 - Number Of Files 8 - Directory Offset 8 - Directory Size 8 - First File Offset (header size) (64) 4 - Unknown 8 - Unknown 8 - null // go to dirOffset // for each file 2 - Entry Size (not including these 2 bytes) X - Entry // THIS FORMAT MIGHT USE A TECHNIQUE SIMILAR TO THE INDEXING TECHNIQUE USED IN UNREAL TOURNAMENT !? // Notes: // // The most probable explaination of the archive format is that the directory entries // are encrypted, and that each directory entry stores the filename of the file. This // would explain the different sized directory entries. // // There is a repeating pattern of bytes that appear in the directory, in the arrangement // 33,243,6,50,30. It is possible that this is a repeating key - if so then it probably // repeats over and over, but pauses when reading the entry size field. // // Also, by looking at some of the files, it is probable that some files are encrypted // using byte 90 (Z) +---------------------+ | Vinyl Goddess *.lbr | +---------------------+ 2 - numFiles // for each file 2 - Unknown 4 - File Offset X - File Data +---------------------------------+ | Virtual Soccer 96 *.dat + *.off | +---------------------------------+ // Same as Actua Soccer *.dat + *.off +--------------------+ | Wacky Wheels *.dat | +--------------------+ 2 - Number Of Files (add 1 ?) // for each file 14 - filename (null, padded with junk after the null, up to a second null at position 14) 4 - File Size 4 - File Offset X - File Data +-------------------+ | Wanted Guns *.pkf | +-------------------+ 4 - Number Of Files // for each file 256 - Filename (null) (including full path) 256 - Filename (null) 4 - File Offset 4 - null 4 - File Length 4 - File Length X - File Data +------------+ | Wari *.pak | +------------+ 2 - Unknown 2 - Unknown 4 - Unknown // for each file 2 - Unknown 1 - Filename Length X - Filename 4 - File Size 1 - Unknown 2 - Unknown 2 - Unknown 4 - Unknown 4 - Unknown 1 - Unknown X - File Data +-----------------------+ | Warning Forever *.bin | +-----------------------+ 4 - Number Of Files 4 - Filename Directory Length // for each file 4 - Filename Offset (relative to the start of the filename directory) 4 - File Offset 4 - File Length // for each file X - Filename (null) X - File Data +-------------------------+ | WarWind *.000 --> *.005 | +-------------------------+ 4 - Number Of Files // for each file 4 - File Offset 4 - Unknown (Archive Size?) X - File Data +--------------------+ | Warzone 2100 *.wdg | +--------------------+ 4 - Header (WDG4) 4 - Number Of Files // for each file 4 - Unknown 4 - File Offset 4 - Unknown +-------------------------------------+ | Wheel Of Time *.u *.uax *.utx *.wot | +-------------------------------------+ // Unreal engine format files +-----------------+ | Wild West *.lid | +-----------------+ // SAME AS Desert Raid *.lid +------------------------------------------------+ | Wing Commander 2 *.s00 *.v00 *.v04 *.v08 *.r00 | +------------------------------------------------+ 4 - Archive Size // for each file 2 - File Offset 2 - Type? X - File Data // this is still buggy, some file offsets are negative, etc. +------------------------+ | Worms Armageddon *.bww | +------------------------+ // THIS IS A BITMAP IMAGE *.bmp +-----------------+ | WWE Raw 2 *.fpk | +-----------------+ 4 - Unknown 4 - Unknown 4 - Unknown 4 - Number Of Directories 4 - Number Of Files 4 - Length Of File Data 4 - Unknown 4 - Unknown // for each directory { 20 - Directory Name (null) (first directory name is "___RootDirectory___") 2 - Number Of Sub-Directories in this directory 2 - Number Of Files in this directory 4 - Unknown (null if no subdirectories) 4 - Unknown (null if no files) // for each sub-directory in this directory { repeat from "//for each directory" } } // for each file { 20 - Filename (null) 4 - Offset (relative to the end of the directory) 4 - Length } X - File Data +-----------------+ | WWE WMXXI *.wad | +-----------------+ // The files in the directory are in a different order to the files in the archive // The file data is compressed using ZLib 3 - Header (WAD) 4 - Version (1) 4 - null 4 - Number Of Files // for each file 4 - Unknown (Hash?) 4 - File Offset 4 - null // for each file 2 - Length of file header [+2 for this field] 4 - Decompressed Length (or null) 4 - null 1 - Unknown (1) X - Filename (determine the filename length from the LengthOfFileHeader field) X - File Data +--------------+ | Xargon *.xr1 | +--------------+ // This is only for some files // for each file 4 - File Offset // continue until offset == 0, or offset > filesize X - Unknown X - File Data +--------------+ | X-Wing *.lfd | +--------------+ // SAME AS TIE FIGHTER *.lfd +-----------------------+ | X-Wing Alliance *.imc | +-----------------------+ 4 - Header (MCMP) 1 - null 4 - Number Of Files [-1] 4 - Unknown // for each file 1 - null 4 - Offset? 4 - Flags? X - File Data +---------------------------------+ | You Don't Know Jack *.srf (big) | +---------------------------------+ // This format is probably not an archive! // BIG Endian format! 4 - Header (srf1) 4 - Archive Size // For each file 4 - File Size (including these two 4-byte fields) 4 - File Type/Extension (32 terminated) X - File Data +----------------+ | Zanzarah *.pak | +----------------+ // NOTE: The files in the directory are NOT in the same order as the files in the archive // ie. file 1 in the directory may actually be file 3827 in the archive, etc. 4 - null 4 - Number Of Files? // for each file 4 - Filename Length X - Filename (including ..\ at the front of the filename) 4 - Offset (relative to the end of the archive +4) 4 - Length X - File Data +-----------------------------+ | Zero Population Count *.sce | +-----------------------------+ // This archive uses BIG_ENDIAN numbering !! 2 - Unknown (2) 2 - Unknown (1) 64 - File Description? (MAP) (null) 4 - Unknown 4 - Directory Offset 2 - Number Of Files 2 - Unknown 2 - Unknown 2 - Unknown 44 - null // Go to dirOffset // for each file 4 - File Offset 4 - File Length 2 - File ID (Incremental, starting at 0) 2 - Unknown (0/2/4) 2 - Unknown (0/4) 4 - Unknown (0/1/3/20/28) 66 - Filename (null) +-----------------------------+ | Zero Population Count *.shp | +-----------------------------+ // This archive uses BIG_ENDIAN numbering !! // The first file offset is 2048 // Keep reading through the directory until the Offset is all 255's and the size is 0. // All dir entries from this point onwards follow the same pattern. // for each file 4 - null 4 - File Offset 4 - File Size 4 - Padding (all 255's) 16 - null X - File Data +-----------------------------+ | Zero Population Count *.snd | +-----------------------------+ // This archive uses BIG_ENDIAN numbering !! // Continue reading until File ID == 0 4 - Version (1) 4 - Header (snd2) 4 - Unknown 246 - null // for each file 4 - File ID (incrementing by +10, starting at 1000) 2 - Stereo/Mono? (1) 2 - Bitrate? (32) 8 - null 4 - File Type (0=?, 1=File, 4=?) 2 - null 4 - File Offset 4 - File Size 4 - File Size 30 - null X - File Data +-------------+ | Zorro *.gxl | +-------------+ 2 - Unknown 50 - Header (Copyright (c) Genus Microprogramming, Inc. 1998-94) or (Copyright (c) Genus Microprogramming, Inc. 1998-90) 2 - Unknown (100) 74 - Unknown // for each file 1 - null 8 - Filename (terminated by spaces) 4 - File Extension (including the .) 1 - null 4 - File Offset 4 - File Size 2 - Unknown 2 - Unknown X - File Data