From ed195c0d727ef4ea7d74d663b0f437bbac32233a Mon Sep 17 00:00:00 2001 From: Ladislav Zezula Date: Tue, 22 Mar 2016 10:56:51 +0100 Subject: + Support for protectors that set hash table offset to zero + Support for protectors that set block table offset to zero --- src/SBaseFileTable.cpp | 18 ++++++++++-------- test/StormTest.cpp | 10 +++++++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/SBaseFileTable.cpp b/src/SBaseFileTable.cpp index 47bbf0e..0b01cd0 100644 --- a/src/SBaseFileTable.cpp +++ b/src/SBaseFileTable.cpp @@ -2154,9 +2154,10 @@ static TMPQHash * LoadHashTable(TMPQArchive * ha) DWORD dwCmpSize; bool bHashTableIsCut = false; - // If the MPQ has no hash table, do nothing - if(pHeader->dwHashTablePos == 0 && pHeader->wHashTablePosHi == 0) - return NULL; + // Note: It is allowed to load hash table if it is at offset 0. + // Example: MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x +// if(pHeader->dwHashTablePos == 0 && pHeader->wHashTablePosHi == 0) +// return NULL; // If the hash table size is zero, do nothing if(pHeader->dwHashTableSize == 0) @@ -2214,9 +2215,10 @@ TMPQBlock * LoadBlockTable(TMPQArchive * ha, bool /* bDontFixEntries */) DWORD dwCmpSize; bool bBlockTableIsCut = false; - // Do nothing if the block table position is zero - if(pHeader->dwBlockTablePos == 0 && pHeader->wBlockTablePosHi == 0) - return NULL; + // Note: It is possible that the block table starts at offset 0 + // Example: MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x +// if(pHeader->dwBlockTablePos == 0 && pHeader->wBlockTablePosHi == 0) +// return NULL; // Do nothing if the block table size is zero if(pHeader->dwBlockTableSize == 0) @@ -2311,8 +2313,8 @@ int LoadAnyHashTable(TMPQArchive * ha) if(pHeader->HetTablePos64 != 0) ha->pHetTable = LoadHetTable(ha); - // Try to load the hash table - if(pHeader->wHashTablePosHi || pHeader->dwHashTablePos) + // Try to load classic hash table + if(pHeader->dwHashTableSize) ha->pHashTable = LoadHashTable(ha); // At least one of the tables must be present diff --git a/test/StormTest.cpp b/test/StormTest.cpp index 2f2b272..3b92fd1 100644 --- a/test/StormTest.cpp +++ b/test/StormTest.cpp @@ -4240,11 +4240,11 @@ int main(int argc, char * argv[]) // Test working with an archive that has no listfile if(nError == ERROR_SUCCESS) nError = TestOpenFile_OpenById("MPQ_1997_v1_Diablo1_DIABDAT.MPQ"); -*/ + // Open the update MPQ from Diablo II (patch 2016) if(nError == ERROR_SUCCESS) nError = TestOpenFile_OpenByName("MPQ_2016_v1_D2XP_IX86_1xx_114a.mpq", "waitingroombkgd.dc6"); -/* + // Open a file whose archive's (signature) file has flags = 0x90000000 if(nError == ERROR_SUCCESS) nError = TestOpenArchive("MPQ_1997_v1_Diablo1_STANDARD.SNP", "ListFile_Blizzard.txt"); @@ -4343,7 +4343,11 @@ int main(int argc, char * argv[]) // Open another protected map if(nError == ERROR_SUCCESS) nError = TestOpenArchive("MPQ_2016_v1_ProtectedMap_TableSizeOverflow.w3x"); - +*/ + // Open another protected map + if(nError == ERROR_SUCCESS) + nError = TestOpenArchive("MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x"); +/* // Open the multi-file archive with wrong prefix to see how StormLib deals with it if(nError == ERROR_SUCCESS) nError = TestOpenArchive_WillFail("flat-file://streaming/model.MPQ.0"); -- cgit v1.2.3