IPAK Files: Difference between revisions

From COD Engine Research
Kokole (talk | contribs)
Kokole (talk | contribs)
Line 5: Line 5:
== Structure ==
== Structure ==
Thanks to kokole for the structure.
Thanks to kokole for the structure.
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;
  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;
};
};
struct entry_header_t
{
int sizeOfPreviousBlocks : 24; // size of previously decompressed blocks, 0 if it's the first array of blocks for this file
int blockCount : 8;
};
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 ==

Revision as of 19:30, 20 December 2014

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

Structure

Thanks to kokole for the 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