mirror of
https://github.com/ladislav-zezula/StormLib.git
synced 2026-02-03 04:56:25 +01:00
SFileAddListFile optimized for protectors that set too large hash table
This commit is contained in:
@@ -2329,7 +2329,7 @@ static TMPQHash * LoadHashTable(TMPQArchive * ha)
|
||||
TMPQHash * pHashTable = NULL;
|
||||
DWORD dwTableSize;
|
||||
DWORD dwCmpSize;
|
||||
bool bHashTableIsCut = false;
|
||||
DWORD dwRealTableSize = 0;
|
||||
|
||||
// Note: It is allowed to load hash table if it is at offset 0.
|
||||
// Example: MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x
|
||||
@@ -2351,12 +2351,15 @@ static TMPQHash * LoadHashTable(TMPQArchive * ha)
|
||||
dwCmpSize = (DWORD)pHeader->HashTableSize64;
|
||||
|
||||
// Read, decrypt and uncompress the hash table
|
||||
pHashTable = (TMPQHash *)LoadMpqTable(ha, ByteOffset, pHeader->MD5_HashTable, dwCmpSize, dwTableSize, g_dwHashTableKey, &bHashTableIsCut);
|
||||
pHashTable = (TMPQHash *)LoadMpqTable(ha, ByteOffset, pHeader->MD5_HashTable, dwCmpSize, dwTableSize, g_dwHashTableKey, &dwRealTableSize);
|
||||
// DumpHashTable(pHashTable, pHeader->dwHashTableSize);
|
||||
|
||||
// If the hash table was cut, we can/have to defragment it
|
||||
if(pHashTable != NULL && bHashTableIsCut)
|
||||
if(pHashTable != NULL && dwRealTableSize != 0 && dwRealTableSize < dwTableSize)
|
||||
{
|
||||
ha->dwRealHashTableSize = dwRealTableSize;
|
||||
ha->dwFlags |= (MPQ_FLAG_MALFORMED | MPQ_FLAG_HASH_TABLE_CUT);
|
||||
}
|
||||
break;
|
||||
|
||||
case MPQ_SUBTYPE_SQP:
|
||||
@@ -2390,7 +2393,7 @@ TMPQBlock * LoadBlockTable(TMPQArchive * ha, bool /* bDontFixEntries */)
|
||||
ULONGLONG ByteOffset;
|
||||
DWORD dwTableSize;
|
||||
DWORD dwCmpSize;
|
||||
bool bBlockTableIsCut = false;
|
||||
DWORD dwRealTableSize;
|
||||
|
||||
// Note: It is possible that the block table starts at offset 0
|
||||
// Example: MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x
|
||||
@@ -2412,10 +2415,10 @@ TMPQBlock * LoadBlockTable(TMPQArchive * ha, bool /* bDontFixEntries */)
|
||||
dwCmpSize = (DWORD)pHeader->BlockTableSize64;
|
||||
|
||||
// Read, decrypt and uncompress the block table
|
||||
pBlockTable = (TMPQBlock * )LoadMpqTable(ha, ByteOffset, NULL, dwCmpSize, dwTableSize, g_dwBlockTableKey, &bBlockTableIsCut);
|
||||
pBlockTable = (TMPQBlock * )LoadMpqTable(ha, ByteOffset, NULL, dwCmpSize, dwTableSize, g_dwBlockTableKey, &dwRealTableSize);
|
||||
|
||||
// If the block table was cut, we need to remember it
|
||||
if(pBlockTable != NULL && bBlockTableIsCut)
|
||||
if(pBlockTable != NULL && dwRealTableSize && dwRealTableSize < dwTableSize)
|
||||
ha->dwFlags |= (MPQ_FLAG_MALFORMED | MPQ_FLAG_BLOCK_TABLE_CUT);
|
||||
break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user