#ifndef __CASC_STRUCTS_H__
#define __CASC_STRUCTS_H__
#define CASC_INDEX_COUNT 0x10
#define CASC_CKEY_SIZE 0x10
#define CASC_EKEY_SIZE 0x09
#define CASC_MAX_DATA_FILES 0x1000
#define FILE_INDEX_PAGE_SIZE 0x200
typedef struct _BLOCK_SIZE_AND_HASH
{
DWORD cbBlockSize;
DWORD dwBlockHash;
} BLOCK_SIZE_AND_HASH, *PBLOCK_SIZE_AND_HASH;
typedef struct _FILE_INDEX_GUARDED_BLOCK
{
DWORD BlockSize;
DWORD BlockHash;
} FILE_INDEX_GUARDED_BLOCK, *PFILE_INDEX_GUARDED_BLOCK;
typedef struct _FILE_INDEX_HEADER_V1
{
USHORT IndexVersion; BYTE BucketIndex; BYTE align_3;
DWORD field_4;
ULONGLONG field_8;
ULONGLONG SegmentSize; BYTE EncodedSizeLength; BYTE StorageOffsetLength; BYTE EKeyLength; BYTE FileOffsetBits; DWORD EKeyCount1;
DWORD EKeyCount2;
DWORD KeysHash1;
DWORD KeysHash2;
DWORD HeaderHash;
} FILE_INDEX_HEADER_V1, *PFILE_INDEX_HEADER_V1;
typedef struct _FILE_INDEX_HEADER_V2
{
USHORT IndexVersion; BYTE BucketIndex; BYTE ExtraBytes; BYTE EncodedSizeLength; BYTE StorageOffsetLength; BYTE EKeyLength; BYTE FileOffsetBits; ULONGLONG SegmentSize;
} FILE_INDEX_HEADER_V2, *PFILE_INDEX_HEADER_V2;
typedef struct _FILE_EKEY_ENTRY
{
BYTE EKey[CASC_EKEY_SIZE]; BYTE FileOffsetBE[5]; BYTE EncodedSize[4]; } FILE_EKEY_ENTRY, *PFILE_EKEY_ENTRY;
template <int CHKSUM_LENGTH>
struct FILE_INDEX_FOOTER
{
BYTE TocHash[MD5_HASH_SIZE]; BYTE Version; BYTE Reserved[2]; BYTE PageSizeKB; BYTE OffsetBytes; BYTE SizeBytes; BYTE EKeyLength; BYTE FooterHashBytes; BYTE ElementCount[4]; BYTE FooterHash[CHKSUM_LENGTH];
};
#define FILE_MAGIC_ENCODING 0x4E45
typedef struct _FILE_ENCODING_HEADER
{
USHORT Magic; BYTE Version; BYTE CKeyLength; BYTE EKeyLength; BYTE CKeyPageSize[2]; BYTE EKeyPageSize[2]; BYTE CKeyPageCount[4]; BYTE EKeyPageCount[4]; BYTE field_11; BYTE ESpecBlockSize[4];
} FILE_ENCODING_HEADER, *PFILE_ENCODING_HEADER;
typedef struct _FILE_CKEY_PAGE
{
BYTE FirstKey[MD5_HASH_SIZE]; BYTE SegmentHash[MD5_HASH_SIZE];
} FILE_CKEY_PAGE, *PFILE_CKEY_PAGE;
typedef struct _FILE_CKEY_ENTRY
{
USHORT EKeyCount; BYTE ContentSize[4]; BYTE CKey[CASC_CKEY_SIZE]; BYTE EKey[CASC_CKEY_SIZE];
} FILE_CKEY_ENTRY, *PFILE_CKEY_ENTRY;
typedef struct _FILE_ESPEC_ENTRY
{
BYTE ESpecKey[MD5_HASH_SIZE]; BYTE ESpecIndexBE[4]; BYTE FileSizeBE[5];
} FILE_ESPEC_ENTRY, *PFILE_ESPEC_ENTRY;
#define FILE_MAGIC_DOWNLOAD 0x4C44
typedef struct _FILE_DOWNLOAD_HEADER
{
USHORT Magic; BYTE Version; BYTE EKeyLength; BYTE EntryHasChecksum; BYTE EntryCount[4]; BYTE TagCount[2];
BYTE FlagByteSize;
BYTE BasePriority;
BYTE Unknown2[3];
} FILE_DOWNLOAD_HEADER, *PFILE_DOWNLOAD_HEADER;
typedef struct _FILE_DOWNLOAD_ENTRY
{
BYTE EKey[MD5_HASH_SIZE]; BYTE FileSize[5]; BYTE Priority;
} FILE_DOWNLOAD_ENTRY, *PFILE_DOWNLOAD_ENTRY;
#define FILE_MAGIC_INSTALL 0x4E49
typedef struct _FILE_INSTALL_HEADER
{
USHORT Magic; BYTE Version; BYTE EKeyLength; BYTE TagCount[2]; BYTE EntryCount[4];
} FILE_INSTALL_HEADER, *PFILE_INSTALL_HEADER;
#define BLTE_HEADER_SIGNATURE 0x45544C42
#define BLTE_HEADER_DELTA 0x1E
#define MAX_ENCODED_HEADER 0x1000
typedef struct _BLTE_HEADER
{
BYTE Signature[4]; BYTE HeaderSize[4]; BYTE MustBe0F; BYTE FrameCount[3]; } BLTE_HEADER, *PBLTE_HEADER;
typedef struct _BLTE_ENCODED_HEADER
{
ENCODED_KEY EKey; DWORD EncodedSize; BYTE field_14; BYTE field_15; BYTE JenkinsHash[4]; BYTE Checksum[4];
BYTE Signature[4]; BYTE HeaderSize[4]; BYTE MustBe0F; BYTE FrameCount[3]; } BLTE_ENCODED_HEADER, *PBLTE_ENCODED_HEADER;
typedef struct _BLTE_FRAME
{
BYTE EncodedSize[4]; BYTE ContentSize[4]; CONTENT_KEY FrameHash;
} BLTE_FRAME, *PBLTE_FRAME;
#endif