Difference between revisions of "Unreal Engine 4 PAK"

From XentaxWiki
Jump to: navigation, search
(Notes and Comments)
(Format Specifications)
Line 9: Line 9:
 
=== Format Specifications ===  
 
=== Format Specifications ===  
  
<div class="toccolours mw-collapsible" id="mw-customcollapsible-myDivision" style="width:800px; overflow:auto;">
+
<div style="border:solid 1px #AAAAAA; padding:4px; background-color:#F9F9F9; font-weight:bold;">
<pre>
+
<tt>
// TODO
+
<font color="blue"><i>Uses ZLib, GZip, or Snappy Compression</i></font><br />
</pre>
+
<font color="blue"><i>FILE DATA</i></font><br />
 +
&nbsp;&nbsp;<font color="blue"><i>for each file</i></font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Compressed Length  <font color="purple">(not including the file header fields or padding)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Decompressed Length<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Compression Type  <font color="purple">(0=uncompressed, 1=ZLib, 2=GZip, 4=Snappy)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;byte {20}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<font color="red">Unknown</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>if (compressed){</i></font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Number of Compressed Blocks<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>for each compressed block</i></font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Offset to the start of the compressed data block  <font color="purple">(relative to the start of the archive)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Offset to the end of the compressed data block  <font color="purple">(relative to the start of the archive)</font><br />
 +
<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte {1}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>for each compressed block</i></font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Decompressed Length of thie block<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte {X}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;File Data  <font color="purple">(ZLib Compression)</font><br />
 +
<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte {0-2047}&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null Padding to a multiple of 2048 bytes  <font color="purple">(sometimes, not always)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>}</i></font><br />
 +
<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>else if (uncompressed){</i></font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte {1}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte {X}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;File Data<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte {0-2047}&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null Padding to a multiple of 2048 bytes  <font color="purple">(sometimes, not always)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>}</i></font><br />
 +
<br />
 +
<font color="blue"><i>DIRECTORY</i></font><br />
 +
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Relative Directory Name Length  <font color="purple">(including null terminator)</font> <font color="purple">(10)</font><br />
 +
&nbsp;&nbsp;byte {9}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Relative Directory Name  <font color="purple">(../../../)</font><br />
 +
&nbsp;&nbsp;byte {1}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null Relative Directory Name Terminator<br />
 +
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Number of Files<br />
 +
&nbsp;&nbsp;<font color="blue"><i>for each file</i></font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Filename Length  <font color="purple">(including null terminator)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;byte {X}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Filename<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;byte {1}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null Filename Terminator<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;File Offset<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Compressed Length  <font color="purple">(not including the file header fields or padding)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Decompressed Length<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Compression Type  <font color="purple">(0=uncompressed, 1=ZLib, 2=GZip, 4=Snappy)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;byte {20}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<font color="red">Unknown</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>if (compressed){</i></font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Number of Compressed Blocks<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>for each compressed block</i></font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Offset to the start of the compressed data block  <font color="purple">(relative to the start of the archive)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Offset to the end of the compressed data block  <font color="purple">(relative to the start of the archive)</font><br />
 +
<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte {1}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Decompressed Block Size  <font color="purple">(65536 if multiple blocks, otherwise the same as the decompressed length)</font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>}</i></font><br />
 +
<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>else if (uncompressed){</i></font><br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte {1}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null<br />
 +
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>}</i></font><br />
 +
<br />
 +
<font color="blue"><i>FOOTER (44 bytes)</i></font><br />
 +
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Magic Number  <font color="purple">((bytes)225,18,111,90)</font><br />
 +
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Version  <font color="purple">(3)</font><br />
 +
&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Directory Offset<br />
 +
&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Directory Length  <font color="purple">(not including FOOTER)</font><br />
 +
&nbsp;&nbsp;byte {20}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<font color="red">Unknown</font><br />
 +
<br />
 +
</tt>
 
</div>
 
</div>
  

Revision as of 14:38, 20 September 2021

Back to index | Edit this page

PAK

  • Format Type : Archive
  • Endian Order : Little Endian
  • Signature : None


Format Specifications

Uses ZLib, GZip, or Snappy Compression
FILE DATA
  for each file
    uint64 {8}       - null
    uint64 {8}       - Compressed Length (not including the file header fields or padding)
    uint64 {8}       - Decompressed Length
    uint32 {4}       - Compression Type (0=uncompressed, 1=ZLib, 2=GZip, 4=Snappy)
    byte {20}        - Unknown
    if (compressed){
      uint32 {4}       - Number of Compressed Blocks
      for each compressed block
        uint64 {8}       - Offset to the start of the compressed data block (relative to the start of the archive)
        uint64 {8}       - Offset to the end of the compressed data block (relative to the start of the archive)

      byte {1}         - null
      for each compressed block
        uint32 {4}       - Decompressed Length of thie block
        byte {X}         - File Data (ZLib Compression)

      byte {0-2047}    - null Padding to a multiple of 2048 bytes (sometimes, not always)
      }

    else if (uncompressed){
      uint32 {4}       - null
      byte {1}         - null
      byte {X}         - File Data
      byte {0-2047}    - null Padding to a multiple of 2048 bytes (sometimes, not always)
      }

DIRECTORY
  uint32 {4}       - Relative Directory Name Length (including null terminator) (10)
  byte {9}         - Relative Directory Name (../../../)
  byte {1}         - null Relative Directory Name Terminator
  uint32 {4}       - Number of Files
  for each file
    uint32 {4}       - Filename Length (including null terminator)
    byte {X}         - Filename
    byte {1}         - null Filename Terminator
    uint64 {8}       - File Offset
    uint64 {8}       - Compressed Length (not including the file header fields or padding)
    uint64 {8}       - Decompressed Length
    uint32 {4}       - Compression Type (0=uncompressed, 1=ZLib, 2=GZip, 4=Snappy)
    byte {20}        - Unknown
    if (compressed){
      uint32 {4}       - Number of Compressed Blocks
      for each compressed block
        uint64 {8}       - Offset to the start of the compressed data block (relative to the start of the archive)
        uint64 {8}       - Offset to the end of the compressed data block (relative to the start of the archive)

      byte {1}         - null
      uint32 {4}       - Decompressed Block Size (65536 if multiple blocks, otherwise the same as the decompressed length)
      }

    else if (uncompressed){
      uint32 {4}       - null
      byte {1}         - null
      }

FOOTER (44 bytes)
  uint32 {4}       - Magic Number ((bytes)225,18,111,90)
  uint32 {4}       - Version (3)
  uint64 {8}       - Directory Offset
  uint64 {8}       - Directory Length (not including FOOTER)
  byte {20}        - Unknown

MultiEx BMS Script

Not written yet.

Notes and Comments

  • These files normally occur in path such as "\<game_name>\<build_name>\Content\Paks\<build_name>-WindowsNoEditor.pak"

Games

List of games using this file format:

  • Little Nightmares II (PC) (*.PAK)

Compatible Programs

// TODO