- * Mafia - (DTA version ISD0) - Encrypted
* Chameleon - (DTA version ISD1) - Encrypted
* Hidden & Dangerous 2 - (DTA version ISD0) - Encrypted
* Hidden & Dangerous 2 : Sabre Squadron - (DTA version ISD0 + ISD1) - Encrypted
* Wings of War - (DTA version ISD1) - Not Encrypted
Code: Select all
struct t_DTAHeader
{
DWORD dwID; //Can be ISD0 and ISD1
DWORD dwTotalFiles;
DWORD dwTableOffset;
DWORD dwTableSize;
};
struct t_DTATableEntry
{
DWORD dwUnknown;
DWORD dwOffsetAH; // Offset for additional header
DWORD dwOffsetFD; // Offset for compressed file data
char pFileNameHint[16];
};
// Additional header
struct t_DTA_AC_ISD1
{
DWORD dwExtra1;
DWORD dwExtra2;
DWORD dwExtra3;
DWORD dwExtra4;
DWORD dwSize; // Decompressed size
DWORD dwBlocksCount; // Nums of compressed block for current file data
DWORD pExtra5;
DWORD pFNameLength; // &0x7FFF (or you can use 2x short)
};
DWORD dwTempPos = 0;
t_DTAHeader pDTAHeader;
t_DTATableEntry pDTATableEntry;
t_DTA_AC_ISD1 pDTAACISD1;
// Reading header
fread(&pDTAHeader, sizeof(pDTAHeader), 1, fi);
fseek(fi, pDTAHeader.dwTableOffset, SEEK_SET);
for(int i = 0; i < pDTAHeader.dwTotalFiles; i++)
{
fread(&pDTATableEntry, sizeof(pDTATableEntry), 1, fi);
fseek(fi, pDTATableEntry.dwOffsetAH, SEEK_SET);
// Read additional header
fread(&pDTAACISD1, sizeof(pDTAACISD1), 1, fi);
unsigned char* pFileName = new unsigned char[pDTAACISD0.pFNameLength & 0x7FFF];
memset(pFileName, 0, pDTAACISD1.pFNameLength & 0x7FFF);
fread(pFileName, sizeof(char), pDTAACISD1.pFNameLength & 0x7FFF, fi);
dwTempPos = ftel(fi);
WORD wZSize;
WORD wOSize = 0;
WORD wUnknown;
unsigned char* pDstBuffer = new unsigned char[pDTAACISD1.dwSize];
memset(pDstBuffer, 0, pDTAACISD1.dwSize);
int pResult = 0;
for(int j = 0; j < pDTAACISD1.dwBlocksCount; j++)
{
//Read compressed sizes after filename in additional header
fseek(fi, dwTempPos, SEEK_SET);
fread(&wZSize, 2, 1, fi);
fread(&wUnknown, 2, 1, fi);
dwTempPos = ftel(fi);
unsigned char* pScrBuffer = new unsigned char[wZSize];
memset(pScrBuffer, 0, wZSize);
fseek(fi, pDTATableEntry.dwOffsetFD, SEEK_SET);
fread(pScrBuffer, wZSize, 1, fi);
pDTATableEntry.dwOffsetFD = ftel(fi);
//https://github.com/imatix/gsl/blob/master/src/sflcomp.c
wOSize = expand_block(pScrBuffer, pDstBuffer[pResult], wZSize);
pResult = pResult + wOSize;
free((void*) pScrBuffer);
}
//Save file... bla bla bla.....
}
}
Well, 1st block decompressed fine, but with next blocks something wrong

Thanks advance for any hint
