aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--StormLib_vs19.vcxproj2
-rw-r--r--StormLib_vs19_dll.vcxproj8
-rw-r--r--StormLib_vs19_test.vcxproj8
-rw-r--r--make-msvc.bat16
-rw-r--r--src/SBaseCommon.cpp5
-rw-r--r--src/SBaseFileTable.cpp12
-rw-r--r--src/SFileAddFile.cpp2
-rw-r--r--src/SFileCreateArchive.cpp29
-rw-r--r--src/SFileFindFile.cpp4
-rw-r--r--src/SFileOpenArchive.cpp32
-rw-r--r--src/SFileReadFile.cpp10
-rw-r--r--src/StormCommon.h1
-rw-r--r--src/StormLib.h11
-rw-r--r--test/StormTest.cpp55
-rw-r--r--test/TLogHelper.cpp2
15 files changed, 115 insertions, 82 deletions
diff --git a/StormLib_vs19.vcxproj b/StormLib_vs19.vcxproj
index ffcf960..e0c83f9 100644
--- a/StormLib_vs19.vcxproj
+++ b/StormLib_vs19.vcxproj
@@ -73,7 +73,7 @@
<XPDeprecationWarning>false</XPDeprecationWarning>
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
<ConfigurationType>StaticLibrary</ConfigurationType>
- <PlatformToolset>v141</PlatformToolset>
+ <PlatformToolset>v141_xp</PlatformToolset>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
diff --git a/StormLib_vs19_dll.vcxproj b/StormLib_vs19_dll.vcxproj
index 712b427..1dbbce8 100644
--- a/StormLib_vs19_dll.vcxproj
+++ b/StormLib_vs19_dll.vcxproj
@@ -28,24 +28,24 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
- <PlatformToolset>v141</PlatformToolset>
+ <PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
- <PlatformToolset>v141</PlatformToolset>
+ <PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
- <PlatformToolset>v141</PlatformToolset>
+ <PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
- <PlatformToolset>v141</PlatformToolset>
+ <PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
diff --git a/StormLib_vs19_test.vcxproj b/StormLib_vs19_test.vcxproj
index 3bd8248..9f91ade 100644
--- a/StormLib_vs19_test.vcxproj
+++ b/StormLib_vs19_test.vcxproj
@@ -28,24 +28,24 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
- <PlatformToolset>v141</PlatformToolset>
+ <PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
- <PlatformToolset>v141</PlatformToolset>
+ <PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
- <PlatformToolset>v141</PlatformToolset>
+ <PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
- <PlatformToolset>v141</PlatformToolset>
+ <PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
diff --git a/make-msvc.bat b/make-msvc.bat
index 9a2ea8e..8b9a559 100644
--- a/make-msvc.bat
+++ b/make-msvc.bat
@@ -42,14 +42,14 @@ goto:eof
call %1 %2
if "%2" == "x86" set SLN_TRG=Win32
if "%2" == "x64" set SLN_TRG=x64
-devenv.com %3 /project "%LIB_NAME%" /rebuild "DebugAD|%SLN_TRG%"
-devenv.com %3 /project "%LIB_NAME%" /rebuild "DebugAS|%SLN_TRG%"
-devenv.com %3 /project "%LIB_NAME%" /rebuild "DebugUD|%SLN_TRG%"
-devenv.com %3 /project "%LIB_NAME%" /rebuild "DebugUS|%SLN_TRG%"
-devenv.com %3 /project "%LIB_NAME%" /rebuild "ReleaseAD|%SLN_TRG%"
-devenv.com %3 /project "%LIB_NAME%" /rebuild "ReleaseAS|%SLN_TRG%"
-devenv.com %3 /project "%LIB_NAME%" /rebuild "ReleaseUD|%SLN_TRG%"
-devenv.com %3 /project "%LIB_NAME%" /rebuild "ReleaseUS|%SLN_TRG%"
+devenv.com %3 /project "%LIB_NAME%" /build "DebugAD|%SLN_TRG%"
+devenv.com %3 /project "%LIB_NAME%" /build "DebugAS|%SLN_TRG%"
+devenv.com %3 /project "%LIB_NAME%" /build "DebugUD|%SLN_TRG%"
+devenv.com %3 /project "%LIB_NAME%" /build "DebugUS|%SLN_TRG%"
+devenv.com %3 /project "%LIB_NAME%" /build "ReleaseAD|%SLN_TRG%"
+devenv.com %3 /project "%LIB_NAME%" /build "ReleaseAS|%SLN_TRG%"
+devenv.com %3 /project "%LIB_NAME%" /build "ReleaseUD|%SLN_TRG%"
+devenv.com %3 /project "%LIB_NAME%" /build "ReleaseUS|%SLN_TRG%"
:: Restore environment variables to the old level
set INCLUDE=%SAVE_INCLUDE%
diff --git a/src/SBaseCommon.cpp b/src/SBaseCommon.cpp
index a1aa78e..98d541a 100644
--- a/src/SBaseCommon.cpp
+++ b/src/SBaseCommon.cpp
@@ -1334,11 +1334,12 @@ DWORD AllocateSectorOffsets(TMPQFile * hf, bool bLoadFromFile)
// They are mostly empty on WoW release MPQs, but on MPQs from PTR,
// they contain random non-zero data. Their meaning is unknown.
//
- // These extra values are, however, include in the dwCmpSize in the file
+ // These extra values are, however, included in the dwCmpSize in the file
// table. We cannot ignore them, because compacting archive would fail
//
- if(hf->SectorOffsets[0] > dwSectorOffsLen)
+ // Clear the lower 2 bits in order to make sure that the value is aligned to 4 bytes
+ if((hf->SectorOffsets[0] & 0xFFFFFFFC) > dwSectorOffsLen)
{
// MPQ protectors put some ridiculous values there. We must limit the extra bytes
if(hf->SectorOffsets[0] > (dwSectorOffsLen + 0x400))
diff --git a/src/SBaseFileTable.cpp b/src/SBaseFileTable.cpp
index 7d52f7c..97fa3a2 100644
--- a/src/SBaseFileTable.cpp
+++ b/src/SBaseFileTable.cpp
@@ -893,15 +893,11 @@ static DWORD 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_VALID_FLAGS_W3X : MPQ_FILE_VALID_FLAGS;
-
// Defragment the hash table, if needed
if(ha->dwFlags & MPQ_FLAG_HASH_TABLE_CUT)
{
@@ -976,10 +972,12 @@ static DWORD BuildFileTableFromBlockTable(
if(pFileEntry->ByteOffset == 0 && pBlock->dwFSize == 0)
pFileEntry->ByteOffset = ha->pHeader->dwHeaderSize;
+ // Clear file flags that are unknown to this type of map.
+ pFileEntry->dwFlags = pBlock->dwFlags & ha->dwValidFileFlags;
+
// Fill the rest of the file entry
- pFileEntry->dwFileSize = pBlock->dwFSize;
- pFileEntry->dwCmpSize = pBlock->dwCSize;
- pFileEntry->dwFlags = pBlock->dwFlags & dwFlagMask;
+ pFileEntry->dwFileSize = pBlock->dwFSize;
+ pFileEntry->dwCmpSize = pBlock->dwCSize;
}
}
diff --git a/src/SFileAddFile.cpp b/src/SFileAddFile.cpp
index 7b88c12..9c7331b 100644
--- a/src/SFileAddFile.cpp
+++ b/src/SFileAddFile.cpp
@@ -795,7 +795,7 @@ bool WINAPI SFileCreateFile(
if(dwErrCode == ERROR_SUCCESS)
{
// Mask all unsupported flags out
- dwFlags &= (ha->dwFlags & MPQ_FLAG_WAR3_MAP) ? MPQ_FILE_VALID_FLAGS_W3X : MPQ_FILE_VALID_FLAGS;
+ dwFlags &= ha->dwValidFileFlags;
// Check for valid flag combinations
if((dwFlags & (MPQ_FILE_IMPLODE | MPQ_FILE_COMPRESS)) == (MPQ_FILE_IMPLODE | MPQ_FILE_COMPRESS))
diff --git a/src/SFileCreateArchive.cpp b/src/SFileCreateArchive.cpp
index 742b829..4266070 100644
--- a/src/SFileCreateArchive.cpp
+++ b/src/SFileCreateArchive.cpp
@@ -202,20 +202,21 @@ bool WINAPI SFileCreateArchive2(const TCHAR * szMpqName, PSFILE_CREATE_MPQ pCrea
if(dwErrCode == ERROR_SUCCESS)
{
memset(ha, 0, sizeof(TMPQArchive));
- ha->pfnHashString = HashStringSlash;
- ha->pStream = pStream;
- ha->dwSectorSize = pCreateInfo->dwSectorSize;
- ha->UserDataPos = MpqPos;
- ha->MpqPos = MpqPos;
- ha->pHeader = pHeader = (TMPQHeader *)ha->HeaderData;
- ha->dwMaxFileCount = dwHashTableSize;
- ha->dwFileTableSize = 0;
- ha->dwReservedFiles = dwReservedFiles;
- ha->dwFileFlags1 = pCreateInfo->dwFileFlags1;
- ha->dwFileFlags2 = pCreateInfo->dwFileFlags2;
- ha->dwFileFlags3 = pCreateInfo->dwFileFlags3 ? MPQ_FILE_EXISTS : 0;
- ha->dwAttrFlags = pCreateInfo->dwAttrFlags;
- ha->dwFlags = dwMpqFlags | MPQ_FLAG_CHANGED;
+ ha->pfnHashString = HashStringSlash;
+ ha->pStream = pStream;
+ ha->dwSectorSize = pCreateInfo->dwSectorSize;
+ ha->UserDataPos = MpqPos;
+ ha->MpqPos = MpqPos;
+ ha->pHeader = pHeader = (TMPQHeader *)ha->HeaderData;
+ ha->dwMaxFileCount = dwHashTableSize;
+ ha->dwFileTableSize = 0;
+ ha->dwReservedFiles = dwReservedFiles;
+ ha->dwValidFileFlags = (pCreateInfo->dwMpqVersion > 1) ? MPQ_FILE_VALID_FLAGS : MPQ_FILE_VALID_FLAGS_W3X;
+ ha->dwFileFlags1 = pCreateInfo->dwFileFlags1;
+ ha->dwFileFlags2 = pCreateInfo->dwFileFlags2;
+ ha->dwFileFlags3 = pCreateInfo->dwFileFlags3 ? MPQ_FILE_EXISTS : 0;
+ ha->dwAttrFlags = pCreateInfo->dwAttrFlags;
+ ha->dwFlags = dwMpqFlags | MPQ_FLAG_CHANGED;
pStream = NULL;
// Fill the MPQ header
diff --git a/src/SFileFindFile.cpp b/src/SFileFindFile.cpp
index ef8b834..223e194 100644
--- a/src/SFileFindFile.cpp
+++ b/src/SFileFindFile.cpp
@@ -221,7 +221,7 @@ static bool DoMPQSearch_FileEntry(
if((pFileEntry->dwFlags & hs->dwFlagMask) == MPQ_FILE_EXISTS)
{
// Ignore fake files which are not compressed but have size higher than the archive
- if ((pFileEntry->dwFlags & MPQ_FILE_COMPRESS_MASK) == 0 && (pFileEntry->dwFileSize > ha->FileSize))
+ if((pFileEntry->dwFlags & MPQ_FILE_COMPRESS_MASK) == 0 && (pFileEntry->dwFileSize > ha->FileSize))
return false;
// Now we have to check if this file was not enumerated before
@@ -236,8 +236,6 @@ static bool DoMPQSearch_FileEntry(
// Prepare the block index
dwBlockIndex = (DWORD)(pFileEntry - ha->pFileTable);
- if(dwBlockIndex == 569)
- szNameBuff[0] = 'F';
// Get the file name. If it's not known, we will create pseudo-name
szFileName = pFileEntry->szFileName;
diff --git a/src/SFileOpenArchive.cpp b/src/SFileOpenArchive.cpp
index ea29850..dcc7e18 100644
--- a/src/SFileOpenArchive.cpp
+++ b/src/SFileOpenArchive.cpp
@@ -18,6 +18,7 @@
#include "StormCommon.h"
#define HEADER_SEARCH_BUFFER_SIZE 0x1000
+#define MINIMUM_MPQ_SIZE 0x0C
//-----------------------------------------------------------------------------
// Local functions
@@ -35,21 +36,28 @@ static MTYPE CheckMapType(LPCTSTR szFileName, LPBYTE pbHeaderBuffer, size_t cbHe
DWORD DwordValue2 = BSWAP_INT32_UNSIGNED(HeaderInt32[2]);
DWORD DwordValue3 = BSWAP_INT32_UNSIGNED(HeaderInt32[3]);
- // Test for AVI files (Warcraft III cinematics) - 'RIFF', 'AVI ' or 'LIST'
- if(DwordValue0 == 0x46464952 && DwordValue2 == 0x20495641 && DwordValue3 == 0x5453494C)
- return MapTypeAviFile;
-
- // Check for Starcraft II maps
+ // Check maps by extension (Starcraft, Starcraft II). We must do this before
+ // checking actual data, because the "NP_Protect" protector places
+ // fake Warcraft III header into the Starcraft II maps
if((szExtension = _tcsrchr(szFileName, _T('.'))) != NULL)
{
- // The "NP_Protect" protector places fake Warcraft III header
- // into the Starcraft II maps, whilst SC2 maps have no other header but MPQ v4
+ // Check for Starcraft II maps by extension
if(!_tcsicmp(szExtension, _T(".s2ma")) || !_tcsicmp(szExtension, _T(".SC2Map")) || !_tcsicmp(szExtension, _T(".SC2Mod")))
{
return MapTypeStarcraft2;
}
+
+ // Check for Starcraft I maps by extension
+ if(!_tcsicmp(szExtension, _T(".scm")) || !_tcsicmp(szExtension, _T(".scx")))
+ {
+ return MapTypeStarcraft;
+ }
}
+ // Test for AVI files (Warcraft III cinematics) - 'RIFF', 'AVI ' or 'LIST'
+ if(DwordValue0 == 0x46464952 && DwordValue2 == 0x20495641 && DwordValue3 == 0x5453494C)
+ return MapTypeAviFile;
+
// Check for Warcraft III maps
if(DwordValue0 == 0x57334D48 && DwordValue1 == 0x00000000)
return MapTypeWarcraft3;
@@ -271,6 +279,7 @@ bool WINAPI SFileOpenArchive(
bool bSearchComplete = false;
memset(ha, 0, sizeof(TMPQArchive));
+ ha->dwValidFileFlags = MPQ_FILE_VALID_FLAGS;
ha->pfnHashString = HashStringSlash;
ha->pStream = pStream;
pStream = NULL;
@@ -288,6 +297,8 @@ bool WINAPI SFileOpenArchive(
// Limit the header searching to about 130 MB of data
if(EndOfSearch > 0x08000000)
EndOfSearch = 0x08000000;
+ if(FileSize < HEADER_SEARCH_BUFFER_SIZE)
+ memset(pbHeaderBuffer, 0, HEADER_SEARCH_BUFFER_SIZE);
// Find the offset of MPQ header within the file
while(bSearchComplete == false && ByteOffset < EndOfSearch)
@@ -438,7 +449,14 @@ bool WINAPI SFileOpenArchive(
// Remember whether whis is a map for Warcraft III
if(MapType == MapTypeWarcraft3)
+ {
+ ha->dwValidFileFlags = MPQ_FILE_VALID_FLAGS_W3X;
ha->dwFlags |= MPQ_FLAG_WAR3_MAP;
+ }
+
+ // If this is starcraft map, set the flag mask
+ if(MapType == MapTypeStarcraft)
+ ha->dwValidFileFlags = MPQ_FILE_VALID_FLAGS_SCX;
// Set the size of file sector
ha->dwSectorSize = (0x200 << ha->pHeader->wSectorSize);
diff --git a/src/SFileReadFile.cpp b/src/SFileReadFile.cpp
index 34edc06..1703748 100644
--- a/src/SFileReadFile.cpp
+++ b/src/SFileReadFile.cpp
@@ -663,7 +663,8 @@ static DWORD ReadMpqFileLocalFile(TMPQFile * hf, void * pvBuffer, DWORD dwFilePo
bool WINAPI SFileReadFile(HANDLE hFile, void * pvBuffer, DWORD dwToRead, LPDWORD pdwRead, LPOVERLAPPED lpOverlapped)
{
- TMPQFile * hf = (TMPQFile *)hFile;
+ TFileEntry * pFileEntry;
+ TMPQFile * hf;
DWORD dwBytesRead = 0; // Number of bytes read
DWORD dwErrCode = ERROR_SUCCESS;
@@ -673,7 +674,7 @@ bool WINAPI SFileReadFile(HANDLE hFile, void * pvBuffer, DWORD dwToRead, LPDWORD
lpOverlapped = lpOverlapped;
// Check valid parameters
- if(!IsValidFileHandle(hFile))
+ if((hf = IsValidFileHandle(hFile)) == NULL)
{
SetLastError(ERROR_INVALID_HANDLE);
return false;
@@ -697,6 +698,7 @@ bool WINAPI SFileReadFile(HANDLE hFile, void * pvBuffer, DWORD dwToRead, LPDWORD
}
// Clear the last used compression
+ pFileEntry = hf->pFileEntry;
hf->dwCompression0 = 0;
// If the file is local file, read the data directly from the stream
@@ -706,7 +708,7 @@ bool WINAPI SFileReadFile(HANDLE hFile, void * pvBuffer, DWORD dwToRead, LPDWORD
}
// If the file is a patch file, we have to read it special way
- else if(hf->hfPatch != NULL && (hf->pFileEntry->dwFlags & MPQ_FILE_PATCH_FILE) == 0)
+ else if(hf->hfPatch != NULL && (pFileEntry->dwFlags & MPQ_FILE_PATCH_FILE) == 0)
{
dwErrCode = ReadMpqFilePatchFile(hf, pvBuffer, hf->dwFilePos, dwToRead, &dwBytesRead);
}
@@ -718,7 +720,7 @@ bool WINAPI SFileReadFile(HANDLE hFile, void * pvBuffer, DWORD dwToRead, LPDWORD
}
// If the file is single unit file, redirect it to read file
- else if(hf->pFileEntry->dwFlags & MPQ_FILE_SINGLE_UNIT)
+ else if(pFileEntry->dwFlags & MPQ_FILE_SINGLE_UNIT)
{
dwErrCode = ReadMpqFileSingleUnit(hf, pvBuffer, hf->dwFilePos, dwToRead, &dwBytesRead);
}
diff --git a/src/StormCommon.h b/src/StormCommon.h
index e9187f9..f452112 100644
--- a/src/StormCommon.h
+++ b/src/StormCommon.h
@@ -81,6 +81,7 @@ typedef enum _MTYPE
MapTypeNotChecked, // The map type was not checked yet
MapTypeNotRecognized, // The file does not seems to be a map
MapTypeAviFile, // The file is actually an AVI file (Warcraft III cinematics)
+ MapTypeStarcraft, // The file is a Starcraft map
MapTypeWarcraft3, // The file is a Warcraft III map
MapTypeStarcraft2 // The file is a Starcraft II map
} MTYPE, *PMTYPE;
diff --git a/src/StormLib.h b/src/StormLib.h
index f7279e6..1335f0e 100644
--- a/src/StormLib.h
+++ b/src/StormLib.h
@@ -25,7 +25,7 @@
/* hash table */
/* 08.12.03 4.11 DCH Fixed bug in reading file sector larger than 0x1000 */
/* on certain files. */
-/* Fixed bug in AddFile with MPQ_FILE_REPLACE_EXISTING */
+/* Fixed bug in AddFile with MPQ_FILE_REPLACEEXISTING */
/* (Thanx Daniel Chiamarello, dchiamarello@madvawes.com)*/
/* 21.12.03 4.50 Lad Completed port for Mac */
/* Fixed bug in compacting (if fsize is mul of 0x1000) */
@@ -193,7 +193,7 @@ extern "C" {
#define MPQ_FLAG_CHECK_SECTOR_CRC 0x00000020 // Checking sector CRC when reading files
#define MPQ_FLAG_SAVING_TABLES 0x00000040 // If set, we are saving MPQ internal files and MPQ tables
#define MPQ_FLAG_PATCH 0x00000080 // If set, this MPQ is a patch archive
-#define MPQ_FLAG_WAR3_MAP 0x00000100 // If set, this MPQ is a map for Warcraft III
+#define MPQ_FLAG_WAR3_MAP 0x00000100 // If set, this MPQ is a Warcraft III map
#define MPQ_FLAG_LISTFILE_NONE 0x00000200 // Set when no (listfile) was found in InvalidateInternalFiles
#define MPQ_FLAG_LISTFILE_NEW 0x00000400 // Set when (listfile) invalidated by InvalidateInternalFiles
#define MPQ_FLAG_LISTFILE_FORCE 0x00000800 // Save updated listfile on exit
@@ -250,6 +250,12 @@ extern "C" {
MPQ_FILE_SIGNATURE | \
MPQ_FILE_EXISTS)
+#define MPQ_FILE_VALID_FLAGS_SCX (MPQ_FILE_IMPLODE | \
+ MPQ_FILE_COMPRESS | \
+ MPQ_FILE_ENCRYPTED | \
+ MPQ_FILE_FIX_KEY | \
+ 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
@@ -839,6 +845,7 @@ typedef struct _TMPQArchive
DWORD dwFileFlags2; // Flags for (attributes)
DWORD dwFileFlags3; // Flags for (signature)
DWORD dwAttrFlags; // Flags for the (attributes) file, see MPQ_ATTRIBUTE_XXX
+ DWORD dwValidFileFlags; // Valid flags for the current MPQ
DWORD dwFlags; // See MPQ_FLAG_XXXXX
DWORD dwSubType; // See MPQ_SUBTYPE_XXX
diff --git a/test/StormTest.cpp b/test/StormTest.cpp
index 13b0ace..3d783aa 100644
--- a/test/StormTest.cpp
+++ b/test/StormTest.cpp
@@ -4327,49 +4327,56 @@ int _tmain(int argc, TCHAR * argv[])
// Open all files from the command line
//
+<<<<<<< HEAD
for(int i = 1; i < argc; i++)
{
TestArchive(_T("MPQ_2021_v1_CantExtractCHK.scx"), _T("Listfile_Blizzard.txt"), 0, NULL, NULL);
}
+=======
+ //for(int i = 1; i < argc; i++)
+ //{
+ // TestArchive(_T("MPQ_2021_v1_CantExtractCHK.scx"), _T("Listfile_Blizzard.txt"), TEST_FLAG_FILE_COUNT, NULL, NULL);
+ //}
+>>>>>>> 1a94f94 (Support for protected SCX files)
//
// Search all testing archives and verify their SHA1 hash
//
- if(dwErrCode == ERROR_SUCCESS)
- {
- dwErrCode = FindFiles(ForEachFile_VerifyFileChecksum, szMpqSubDir);
- }
+ //if(dwErrCode == ERROR_SUCCESS)
+ //{
+ // dwErrCode = FindFiles(ForEachFile_VerifyFileChecksum, szMpqSubDir);
+ //}
//
// Test file stream operations
//
- if(dwErrCode == ERROR_SUCCESS)
- {
- for(size_t i = 0; i < _countof(TestList_StreamOps); i++)
- {
- dwErrCode = TestFileStreamOperations(TestList_StreamOps[i].szMpqName1, TestList_StreamOps[i].dwFlags);
- if(dwErrCode != ERROR_SUCCESS)
- break;
- }
- }
+ //if(dwErrCode == ERROR_SUCCESS)
+ //{
+ // for(size_t i = 0; i < _countof(TestList_StreamOps); i++)
+ // {
+ // dwErrCode = TestFileStreamOperations(TestList_StreamOps[i].szMpqName1, TestList_StreamOps[i].dwFlags);
+ // if(dwErrCode != ERROR_SUCCESS)
+ // break;
+ // }
+ //}
//
// Test master-mirror reading operations
//
- if(dwErrCode == ERROR_SUCCESS)
- {
- for(size_t i = 0; i < _countof(TestList_MasterMirror); i++)
- {
- dwErrCode = TestReadFile_MasterMirror(TestList_MasterMirror[i].szMpqName1,
- TestList_MasterMirror[i].szMpqName2,
- TestList_MasterMirror[i].dwFlags != 0);
- if(dwErrCode != ERROR_SUCCESS)
- break;
- }
- }
+ //if(dwErrCode == ERROR_SUCCESS)
+ //{
+ // for(size_t i = 0; i < _countof(TestList_MasterMirror); i++)
+ // {
+ // dwErrCode = TestReadFile_MasterMirror(TestList_MasterMirror[i].szMpqName1,
+ // TestList_MasterMirror[i].szMpqName2,
+ // TestList_MasterMirror[i].dwFlags != 0);
+ // if(dwErrCode != ERROR_SUCCESS)
+ // break;
+ // }
+ //}
//
// Test opening various archives - correct, damaged, protected
diff --git a/test/TLogHelper.cpp b/test/TLogHelper.cpp
index 3d09823..f277e64 100644
--- a/test/TLogHelper.cpp
+++ b/test/TLogHelper.cpp
@@ -423,7 +423,7 @@ char * TLogHelper::CopyFormatCharacter(char * szBuffer, const char *& szFormat)
// String format
if(szFormat[0] == '%')
{
- if(szFormat[1] == 's' && szFormat[2] != ')')
+ if(szFormat[1] == 's')
{
strcpy(szBuffer, szStringFormat);
szFormat += 2;