diff options
author | Ladislav Zezula <ladislav.zezula@avast.com> | 2021-10-06 19:08:02 +0200 |
---|---|---|
committer | Ladislav Zezula <ladislav.zezula@avast.com> | 2021-10-06 19:08:02 +0200 |
commit | 5ab093b7a57b8779dff06a08fac19d46c40b3329 (patch) | |
tree | 6a6ec63b14db50cf3618e4576df2fe94c3eec863 | |
parent | c5fb5c7dfa40ae1304ac2ebf1431a9d6a2ba4d13 (diff) |
Fixed support for SQP archives
-rw-r--r-- | src/SBaseSubTypes.cpp | 27 | ||||
-rw-r--r-- | src/StormLib.h | 2 | ||||
-rw-r--r-- | test/StormTest.cpp | 2 |
3 files changed, 17 insertions, 14 deletions
diff --git a/src/SBaseSubTypes.cpp b/src/SBaseSubTypes.cpp index 6ab4a99..9808ef3 100644 --- a/src/SBaseSubTypes.cpp +++ b/src/SBaseSubTypes.cpp @@ -201,6 +201,9 @@ TMPQHash * LoadSqpHashTable(TMPQArchive * ha) // Ignore free entries if(pSqpHash->dwBlockIndex != HASH_ENTRY_FREE) { + // Store the hash entry to a temporary variable + TSQPHash TempEntry = *pSqpHash; + // Check block index against the size of the block table if(pHeader->dwBlockTableSize <= MPQ_BLOCK_INDEX(pSqpHash) && pSqpHash->dwBlockIndex < HASH_ENTRY_DELETED) dwErrCode = ERROR_FILE_CORRUPT; @@ -209,15 +212,13 @@ TMPQHash * LoadSqpHashTable(TMPQArchive * ha) if(pSqpHash->dwAlwaysZero != 0 && pSqpHash->dwAlwaysZero != HASH_ENTRY_FREE) dwErrCode = ERROR_FILE_CORRUPT; - // Store the file name hash - pMpqHash->dwName1 = pSqpHash->dwName1; - pMpqHash->dwName2 = pSqpHash->dwName2; - - // Store the rest. Note that this must be done last, - // because block index corresponds to pMpqHash->dwName2 - pMpqHash->dwBlockIndex = MPQ_BLOCK_INDEX(pSqpHash); + // Copy the entry to the MPQ hash entry + pMpqHash->dwName1 = TempEntry.dwName1; + pMpqHash->dwName2 = TempEntry.dwName2; + pMpqHash->dwBlockIndex = MPQ_BLOCK_INDEX(&TempEntry); pMpqHash->Platform = 0; pMpqHash->lcLocale = 0; + pMpqHash->Reserved = 0; } } @@ -241,7 +242,6 @@ TMPQBlock * LoadSqpBlockTable(TMPQArchive * ha) TSQPBlock * pSqpBlockEnd; TSQPBlock * pSqpBlock; TMPQBlock * pMpqBlock; - DWORD dwFlags; DWORD dwErrCode = ERROR_SUCCESS; // Load the hash table @@ -253,15 +253,18 @@ TMPQBlock * LoadSqpBlockTable(TMPQArchive * ha) pMpqBlock = (TMPQBlock *)pSqpBlockTable; for(pSqpBlock = pSqpBlockTable; pSqpBlock < pSqpBlockEnd; pSqpBlock++, pMpqBlock++) { + // Store the block entry to a temporary variable + TSQPBlock TempEntry = *pSqpBlock; + // Check for valid flags if(pSqpBlock->dwFlags & ~MPQ_FILE_VALID_FLAGS) dwErrCode = ERROR_FILE_CORRUPT; // Convert SQP block table entry to MPQ block table entry - dwFlags = pSqpBlock->dwFlags; - pMpqBlock->dwCSize = pSqpBlock->dwCSize; - pMpqBlock->dwFSize = pSqpBlock->dwFSize; - pMpqBlock->dwFlags = dwFlags; + pMpqBlock->dwFilePos = TempEntry.dwFilePos; + pMpqBlock->dwCSize = TempEntry.dwCSize; + pMpqBlock->dwFSize = TempEntry.dwFSize; + pMpqBlock->dwFlags = TempEntry.dwFlags; } // If an error occured, we need to free the hash table diff --git a/src/StormLib.h b/src/StormLib.h index 0e4c411..f7279e6 100644 --- a/src/StormLib.h +++ b/src/StormLib.h @@ -255,7 +255,7 @@ extern "C" { // BlockTableOffset = pHash->dwBlockIndex << 0x04 // Malformed MPQ maps may contain block indexes like 0x40000001 or 0xF0000023 #define BLOCK_INDEX_MASK 0x0FFFFFFF -#define MPQ_BLOCK_INDEX(pHash) (pHash->dwBlockIndex & BLOCK_INDEX_MASK) +#define MPQ_BLOCK_INDEX(pHash) ((pHash)->dwBlockIndex & BLOCK_INDEX_MASK) // Compression types for multiple compressions #define MPQ_COMPRESSION_HUFFMANN 0x01 // Huffmann compression (used on WAVE files only) diff --git a/test/StormTest.cpp b/test/StormTest.cpp index 651d8e9..3ba9b1e 100644 --- a/test/StormTest.cpp +++ b/test/StormTest.cpp @@ -4302,7 +4302,7 @@ int _tmain(int argc, TCHAR * argv[]) // Open all files from the command line
//
- TestArchive(_T("ProblemMpqArchive.SC2Replay"), NULL, 0, "replay.game.events", NULL);
+ TestArchive(_T("e:\\Other.sqp"), NULL, 0, "replay.game.events", NULL);
for(int i = 1; i < argc; i++)
{
TestOpenArchive_CompactArchive(argv[i], _T("TestArchiveCopy.mpq"), false);
|