From 80021e4a6704d1854a37aa183c62323ff1cf9011 Mon Sep 17 00:00:00 2001 From: Zezula Ladislav Date: Fri, 28 Jul 2017 10:43:49 +0200 Subject: + Fixed bug when SFileAddFileEx could add a file with MPQ_FILE_SINGLE_UNIT to a Warcraft III map --- src/SBaseFileTable.cpp | 4 ++-- src/SFileAddFile.cpp | 2 +- src/SFileOpenArchive.cpp | 2 +- src/StormLib.h | 9 +++++++++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/SBaseFileTable.cpp b/src/SBaseFileTable.cpp index d9664a5..39ba125 100644 --- a/src/SBaseFileTable.cpp +++ b/src/SBaseFileTable.cpp @@ -351,7 +351,7 @@ int ConvertMpqHeaderToFormat4( // If version 1.0 is forced, then the format version is forced to be 1.0 // Reason: Storm.dll in Warcraft III ignores format version value - if((dwFlags & MPQ_OPEN_FORCE_MPQ_V1) || (bIsWarcraft3Map)) + if((dwFlags & MPQ_OPEN_FORCE_MPQ_V1) || bIsWarcraft3Map) wFormatVersion = MPQ_FORMAT_VERSION_1; // Format-specific fixes @@ -752,7 +752,7 @@ static int BuildFileTableFromBlockTable( 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; + dwFlagMask = (ha->dwFlags & MPQ_FLAG_WAR3_MAP) ? MPQ_FILE_VALID_FLAGS_W3X : MPQ_FILE_VALID_FLAGS; // Defragment the hash table, if needed if(ha->dwFlags & MPQ_FLAG_HASH_TABLE_CUT) diff --git a/src/SFileAddFile.cpp b/src/SFileAddFile.cpp index 0b70d35..376813b 100644 --- a/src/SFileAddFile.cpp +++ b/src/SFileAddFile.cpp @@ -792,7 +792,7 @@ bool WINAPI SFileCreateFile( if(nError == ERROR_SUCCESS) { // Mask all unsupported flags out - dwFlags &= MPQ_FILE_VALID_FLAGS; + dwFlags &= (ha->dwFlags & MPQ_FLAG_WAR3_MAP) ? MPQ_FILE_VALID_FLAGS_W3X : MPQ_FILE_VALID_FLAGS; // Check for valid flag combinations if((dwFlags & (MPQ_FILE_IMPLODE | MPQ_FILE_COMPRESS)) == (MPQ_FILE_IMPLODE | MPQ_FILE_COMPRESS)) diff --git a/src/SFileOpenArchive.cpp b/src/SFileOpenArchive.cpp index a78b169..a896eaf 100644 --- a/src/SFileOpenArchive.cpp +++ b/src/SFileOpenArchive.cpp @@ -307,7 +307,7 @@ bool WINAPI SFileOpenArchive( } // Check for MPK archives (Longwu Online - MPQ fork) - if(dwHeaderID == ID_MPK && bIsWarcraft3Map == false) + if(bIsWarcraft3Map == false && dwHeaderID == ID_MPK) { // Now convert the MPK header to MPQ Header version 4 nError = ConvertMpkHeaderToFormat4(ha, FileSize, dwFlags); diff --git a/src/StormLib.h b/src/StormLib.h index dfa31f9..ca84cbc 100644 --- a/src/StormLib.h +++ b/src/StormLib.h @@ -231,6 +231,15 @@ extern "C" { MPQ_FILE_SIGNATURE | \ MPQ_FILE_EXISTS) +#define MPQ_FILE_VALID_FLAGS_W3X (MPQ_FILE_IMPLODE | \ + MPQ_FILE_COMPRESS | \ + MPQ_FILE_ENCRYPTED | \ + MPQ_FILE_FIX_KEY | \ + MPQ_FILE_DELETE_MARKER | \ + MPQ_FILE_SECTOR_CRC | \ + MPQ_FILE_SIGNATURE | \ + MPQ_FILE_EXISTS) + // We need to mask out the upper 4 bits of the block table index. // This is because it gets shifted out when calculating block table offset // BlockTableOffset = pHash->dwBlockIndex << 0x04 -- cgit v1.2.3