IPAK Files: Difference between revisions

From COD Engine Research
Red-EyeX32 (talk | contribs)
No edit summary
 
(10 intermediate revisions by 3 users not shown)
Line 4: Line 4:


== Structure ==
== Structure ==
Thanks to kokole for the structure.
<syntaxhighlight lang="cpp">
struct ipak_header_t
struct IPakHeader
{
{
char identifier[4]; // "IPAK"
  unsigned int magic;
unsigned int version; //0x50000
  unsigned int version;
unsigned int fileSize;
  unsigned int size;
unsigned int sectionCount; //from what I've seen it's always 2 (1 = info 2 = data)
  unsigned int sectionCount;
};
};
   
   
struct section_t
struct IPakSection
{
{
unsigned int sectionIndex; //enum 0x1 = info, 0x2 = data
  unsigned int type; //enum 0x1 = info, 0x2 = data
unsigned int sectionStart;
  unsigned int offset;
unsigned int sectionLength;
  unsigned int size;
unsigned int numOfEntries; // each entry is a compressed iwi file in section 2 and entry info in section 1
  unsigned int itemCount;
};
};
   
   
struct entry_info_t
struct IPakIndexEntry
{
{
u32 hash; // checksum, type?
  unsigned __int64 key;
u32 id;
  unsigned int offset;
u32 entryStart; // location of compressed iwi file
  unsigned int size;
u32 entryLength;
};
}; // 16 bytes
   
   
struct entry_t
struct IPakDataChunkHeader
{
{
entry_header_t header;
  unsigned int countAndOffset; // 24 bits = offset, 8 bits = count
block_info_t blocks[31]; //they can be null, actual number of blocks is header->blockCount;
  unsigned int commands[31]; //(depending on endian) blockSize = (info & 0xFFFF); , compressedFlag = info >> 24;
};
};
</syntaxhighlight>
struct entry_header_t
{
int blockCount; // actual blockcount = *(byte*)&blockCount[0];
};
struct block_info_t
{ //enum 0x0 = plaintext, 0x1 = encrypted
unsigned int info; //(depending on endian) blockSize = (info & 0xFFFF); , compressedFlag = info >> 24;
}; // 4 bytes
 
== Decompression Methods ==
== Decompression Methods ==


The compression method is just the basic LZO1X compression.
The compression method is just the basic LZO1X compression.
The same as compression used on the SAVEGAME.SVG file for the save data.


PC:
PC:

Latest revision as of 01:20, 4 July 2015

IPAK's, implemented in Black Ops 2, are basically an archive of compressed image data.

Structure

struct IPakHeader
{
  unsigned int magic;
  unsigned int version;
  unsigned int size;
  unsigned int sectionCount;
};
 
struct IPakSection
{
  unsigned int type; //enum 0x1 = info, 0x2 = data
  unsigned int offset;
  unsigned int size;
  unsigned int itemCount;
};
 
struct IPakIndexEntry
{
  unsigned __int64 key;
  unsigned int offset;
  unsigned int size;
};
 
struct IPakDataChunkHeader
{
  unsigned int countAndOffset; // 24 bits = offset, 8 bits = count
  unsigned int commands[31]; //(depending on endian) blockSize = (info & 0xFFFF); , compressedFlag = info >> 24;
};

Decompression Methods

The compression method is just the basic LZO1X compression.

PC:

http://pastebin.com/vd9t2U2B

PS3:

1.00 t6mp_ps3f.self - 0x6AEA78

XBOX:

tu9 default_mp.xex - 0x828E5090
tu13 default_mp.xex - 0x828E6308