From f1655f8afe2ef76d4906eb3e94dfd3c2b5241eb4 Mon Sep 17 00:00:00 2001 From: Ladislav Zezula Date: Thu, 26 May 2016 23:46:09 +0200 Subject: + Added support for an updated Somj2hM16 protection --- src/SBaseFileTable.cpp | 6 +++++- test/StormTest.cpp | 12 ++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/SBaseFileTable.cpp b/src/SBaseFileTable.cpp index 49e4de2..b38dbc3 100644 --- a/src/SBaseFileTable.cpp +++ b/src/SBaseFileTable.cpp @@ -734,11 +734,15 @@ static int BuildFileTableFromBlockTable( TMPQHash * pHash; LPDWORD DefragmentTable = NULL; DWORD dwItemCount = 0; + DWORD dwFlagMask; // Sanity checks assert(ha->pFileTable != NULL); assert(ha->dwFileTableSize >= ha->dwMaxFileCount); + // MPQs for Warcraft III doesn't know some flags, namely MPQ_FILE_SINGLE_UNIT and MPQ_FILE_PATCH_FILE + dwFlagMask = (ha->dwFlags & MPQ_FLAG_WAR3_MAP) ? ~(MPQ_FILE_SINGLE_UNIT | MPQ_FILE_PATCH_FILE) : 0xFFFFFFFF; + // Defragment the hash table, if needed if(ha->dwFlags & MPQ_FLAG_HASH_TABLE_CUT) { @@ -816,7 +820,7 @@ static int BuildFileTableFromBlockTable( // Fill the rest of the file entry pFileEntry->dwFileSize = pBlock->dwFSize; pFileEntry->dwCmpSize = pBlock->dwCSize; - pFileEntry->dwFlags = pBlock->dwFlags; + pFileEntry->dwFlags = pBlock->dwFlags & dwFlagMask; } } diff --git a/test/StormTest.cpp b/test/StormTest.cpp index 9a6f79d..f0456e7 100644 --- a/test/StormTest.cpp +++ b/test/StormTest.cpp @@ -4456,7 +4456,11 @@ int main(int argc, char * argv[]) // Open another protected map if(nError == ERROR_SUCCESS) nError = TestOpenArchive("MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x"); - +*/ + // Something like Somj 2.0 + if(nError == ERROR_SUCCESS) + nError = TestOpenArchive("MPQ_2016_v1_ProtectedMap_Somj2.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"); @@ -4550,11 +4554,11 @@ int main(int argc, char * argv[]) // Compact the archive if(nError == ERROR_SUCCESS) nError = TestOpenArchive_CompactArchive("MPQ_2010_v3_expansion-locale-frFR.MPQ", "StormLibTest_CraftedMpq1_v3.mpq", true); -*/ + // Compact the archive if(nError == ERROR_SUCCESS) - nError = TestOpenArchive_CompactArchive("00000.pak", "00000.pak", false); -/* + nError = TestOpenArchive_CompactArchive("MPQ_2016_v1_00000.pak", "MPQ_2016_v1_00000.pak", false); + // Open a MPQ (add custom user data to it) if(nError == ERROR_SUCCESS) nError = TestOpenArchive_CompactArchive("MPQ_2013_v4_SC2_EmptyMap.SC2Map", "StormLibTest_CraftedMpq2_v4.mpq", true); -- cgit v1.2.3