aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLadislav Zezula <ladislav.zezula@avast.com>2021-10-06 19:08:02 +0200
committerLadislav Zezula <ladislav.zezula@avast.com>2021-10-06 19:08:02 +0200
commit5ab093b7a57b8779dff06a08fac19d46c40b3329 (patch)
tree6a6ec63b14db50cf3618e4576df2fe94c3eec863
parentc5fb5c7dfa40ae1304ac2ebf1431a9d6a2ba4d13 (diff)
Fixed support for SQP archives
-rw-r--r--src/SBaseSubTypes.cpp27
-rw-r--r--src/StormLib.h2
-rw-r--r--test/StormTest.cpp2
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);