aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/SBaseSubTypes.cpp27
-rw-r--r--src/StormLib.h2
2 files changed, 16 insertions, 13 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)