aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/SBaseFileTable.cpp10
-rw-r--r--src/SFileOpenArchive.cpp39
-rw-r--r--src/SFileReadFile.cpp7
-rwxr-xr-xtest/StormTest.cpp22
-rw-r--r--test/stormlib-test-001.txt275
5 files changed, 203 insertions, 150 deletions
diff --git a/src/SBaseFileTable.cpp b/src/SBaseFileTable.cpp
index fa388fc..a222ac5 100644
--- a/src/SBaseFileTable.cpp
+++ b/src/SBaseFileTable.cpp
@@ -479,8 +479,16 @@ DWORD ConvertMpqHeaderToFormat4(
{
case MPQ_FORMAT_VERSION_1:
- // Check for malformed MPQ header version 1.0
+ // Make sure that the MPQ Header is properly swapped
BSWAP_TMPQHEADER(pHeader, MPQ_FORMAT_VERSION_1);
+
+ // Check for blatantly wrong MPQ header by the hash table position
+ if(((ByteOffset + pHeader->dwHashTablePos) & 0xFFFFFFFF) > FileSize)
+ return ERROR_FAKE_MPQ_HEADER;
+ if(((ByteOffset + pHeader->dwBlockTablePos) & 0xFFFFFFFF) > FileSize)
+ return ERROR_FAKE_MPQ_HEADER;
+
+ // Check for malformed MPQ header version 1.0
if(pHeader->wFormatVersion != MPQ_FORMAT_VERSION_1 || pHeader->dwHeaderSize != MPQ_HEADER_SIZE_V1)
{
pHeader->wFormatVersion = MPQ_FORMAT_VERSION_1;
diff --git a/src/SFileOpenArchive.cpp b/src/SFileOpenArchive.cpp
index 4b2d3b4..a97ecea 100644
--- a/src/SFileOpenArchive.cpp
+++ b/src/SFileOpenArchive.cpp
@@ -228,7 +228,7 @@ bool WINAPI SFileOpenArchive(
DWORD dwFlags,
HANDLE * phMpq)
{
- TMPQUserData * pUserData;
+ TMPQUserData * pUserData = NULL;
TFileStream * pStream = NULL; // Open file stream
TMPQArchive * ha = NULL; // Archive handle
TFileEntry * pFileEntry;
@@ -354,18 +354,25 @@ bool WINAPI SFileOpenArchive(
{
if(ha->pUserData == NULL && dwHeaderID == ID_MPQ_USERDATA)
{
+ // Copy the eventual user data to the separate buffer
+ memcpy(&ha->UserData, ha->HeaderData, sizeof(TMPQUserData));
+
// Verify if this looks like a valid user data
- pUserData = IsValidMpqUserData(ByteOffset, FileSize, ha->HeaderData);
+ pUserData = IsValidMpqUserData(ByteOffset, FileSize, &ha->UserData);
if(pUserData != NULL)
{
- // Fill the user data header
- ha->UserDataPos = ByteOffset;
- ha->pUserData = &ha->UserData;
- memcpy(ha->pUserData, pUserData, sizeof(TMPQUserData));
-
- // Continue searching from that position
- ByteOffset += ha->pUserData->dwHeaderOffs;
- break;
+ // Set the byte offset to the loaded user data
+ ULONGLONG TempByteOffset = ByteOffset + pUserData->dwHeaderOffs;
+
+ // Read the eventual MPQ header from the position where the user data points
+ if(!FileStream_Read(ha->pStream, &TempByteOffset, ha->HeaderData, sizeof(ha->HeaderData)))
+ {
+ dwErrCode = GetLastError();
+ break;
+ }
+
+ // Re-initialize the header ID
+ dwHeaderID = BSWAP_INT32_UNSIGNED(ha->HeaderData[0]);
}
}
}
@@ -405,12 +412,24 @@ bool WINAPI SFileOpenArchive(
// Move the pointers
ByteOffset += 0x200;
+ pUserData = NULL;
}
}
// Did we identify one of the supported headers?
if(dwErrCode == ERROR_SUCCESS)
{
+ // If we retrieved the offset from the user data offset, initialize the user data
+ if(pUserData != NULL)
+ {
+ // Fill the user data header
+ ha->pUserData = &ha->UserData;
+ ha->UserDataPos = ByteOffset;
+
+ // Set the real byte offset
+ ByteOffset = ByteOffset + pUserData->dwHeaderOffs;
+ }
+
// Set the user data position to the MPQ header, if none
if(ha->pUserData == NULL)
ha->UserDataPos = ByteOffset;
diff --git a/src/SFileReadFile.cpp b/src/SFileReadFile.cpp
index b0698c1..8ab5f48 100644
--- a/src/SFileReadFile.cpp
+++ b/src/SFileReadFile.cpp
@@ -194,6 +194,13 @@ static DWORD ReadMpqSectors(TMPQFile * hf, LPBYTE pbBuffer, DWORD dwByteOffset,
dwErrCode = ERROR_FILE_CORRUPT;
break;
}
+
+ // Special case (MPQ_2024_v1_300TK2.09p.w3x, file File00010254.blp):
+ // Extracted less than required. Fill the rest with zeros
+ if((DWORD)(cbOutSector) < dwBytesInThisSector)
+ {
+ memset(pbOutSector + cbOutSector, 0, dwBytesInThisSector - cbOutSector);
+ }
}
else
{
diff --git a/test/StormTest.cpp b/test/StormTest.cpp
index 048f715..3276c59 100755
--- a/test/StormTest.cpp
+++ b/test/StormTest.cpp
@@ -1651,7 +1651,9 @@ static DWORD SearchArchive(
// Construct the full name of the listfile
CreateFullPathName(szListFile, _countof(szListFile), szListFileDir, _T("ListFile_Blizzard.txt"));
- // fp = fopen("E:\\mpq-listing.txt", "wt");
+
+ // Create the log file with file sizes and CRCs
+ //fp = fopen("C:\\mpq-listing.txt", "wt");
// Prepare hashing
md5_init(&md5state);
@@ -1694,9 +1696,23 @@ static DWORD SearchArchive(
if(fp != NULL)
{
pFileData->dwCrc32 = crc32(0, pFileData->FileData, pFileData->dwFileSize);
- fprintf(fp, "%08x: %s \n", pFileData->dwCrc32, sf.cFileName);
+ fprintf(fp, "%08x:%08x: %s \n", pFileData->dwFileSize, pFileData->dwCrc32, sf.cFileName);
}
+ // Also write the content of the file to the test directory
+ //if(fp != NULL)
+ //{
+ // FILE * fp2;
+ // char szFullPath[MAX_PATH] = "C:\\test\\";
+
+ // strcat(szFullPath, sf.cFileName);
+ // if((fp2 = fopen(szFullPath, "wb")) != NULL)
+ // {
+ // fwrite(pFileData->FileData, 1, pFileData->dwFileSize, fp2);
+ // fclose(fp2);
+ // }
+ //}
+
// Free the loaded file data
STORM_FREE(pFileData);
}
@@ -4046,6 +4062,7 @@ static const TEST_INFO1 Test_OpenMpqs[] =
{_T("MPQ_2022_v1_Sniper.scx"), NULL, "2e955271b70b79344ad85b698f6ce9d8", 64}, // Multiple items in hash table for staredit\scenario.chk (locale=0, platform=0)
{_T("MPQ_2022_v1_OcOc_Bound_2.scx"), NULL, "25cad16a2fb4e883767a1f512fc1dce7", 16},
{_T("MPQ_2023_v1_Lusin2Rpg1.28.w3x"), NULL, "9c21352f06cf763fcf05e8a2691e6194", 10305, &HashVals},
+ {_T("MPQ_2024_v1_300TK2.09p.w3x"), NULL, "e442e3d2e7d457b9ba544544013b791f", 32588}, // Fake MPQ User data, fake MPQ header at offset 0x200
// ASI plugins
{_T("MPQ_2020_v1_HS0.1.asi"), NULL, "50cba7460a6e6d270804fb9776a7ec4f", 6022},
@@ -4093,6 +4110,7 @@ static const TEST_INFO1 Test_OpenMpqs[] =
// Check the GetFileInfo operations
{_T("MPQ_2002_v1_StrongSignature.w3m"), NULL, "7b725d87e07a2173c42fe2314b95fa6c", 17 | TFLG_GET_FILE_INFO},
{_T("MPQ_2013_v4_SC2_EmptyMap.SC2Map"), NULL, "88e1b9a88d56688c9c24037782b7bb68", 33 | TFLG_GET_FILE_INFO},
+
};
static const TEST_INFO1 Test_ReopenMpqs[] =
diff --git a/test/stormlib-test-001.txt b/test/stormlib-test-001.txt
index 2979f56..17a8cbc 100644
--- a/test/stormlib-test-001.txt
+++ b/test/stormlib-test-001.txt
@@ -1,149 +1,150 @@
==== Test Suite for StormLib version 9.25 ====
InitWorkFolder: Work directory /media/ladik/MPQs (default)
-TestLiFiSearch (FLAT-MAP:listfile-test.txt) succeeded.
-TestLiFiSearch (listfile-test.txt) succeeded.
-TestFileStream (MPQ_2013_v4_alternate-original.MPQ) succeeded.
-TestFileStream (MPQ_2013_v4_alternate-original.MPQ) succeeded.
-TestFileStream (MPQ_2013_v4_alternate-complete.MPQ) succeeded.
-TestFileStream (part-file://MPQ_2009_v2_WoW_patch.MPQ.part) succeeded.
-TestFileStream (blk4-file://streaming/model.MPQ.0) succeeded.
-TestFileStream (mpqe-file://MPQ_2011_v2_EncryptedMpq.MPQE) succeeded.
-TestFileMirror (part-file://MPQ_2009_v1_patch-created.MPQ.part) succeeded.
-TestFileMirror (part-file://MPQ_2009_v1_patch-partial.MPQ.part) succeeded.
-TestFileMirror (part-file://MPQ_2009_v1_patch-complete.MPQ.part) succeeded.
-TestFileMirror (MPQ_2013_v4_alternate-created.MPQ) succeeded.
-TestFileMirror (MPQ_2013_v4_alternate-incomplete.MPQ) succeeded.
-TestFileMirror (MPQ_2013_v4_alternate-complete.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_patch_rt_SC1B.mpq) succeeded.
-TestReadingMpq (MPQ_1997_v1_StarDat_SC1B.mpq) succeeded.
-TestReadingMpq (MPQ_1997_v1_INSTALL_SC1B.EXE_) succeeded.
-TestReadingMpq: Warning: CRC32 error on (signature)
+TestLiFiSearch (FLAT-MAP:listfile-test.txt) succeeded.
+TestLiFiSearch (listfile-test.txt) succeeded.
+TestFileStream (MPQ_2013_v4_alternate-original.MPQ) succeeded.
+TestFileStream (MPQ_2013_v4_alternate-original.MPQ) succeeded.
+TestFileStream (MPQ_2013_v4_alternate-complete.MPQ) succeeded.
+TestFileStream (part-file://MPQ_2009_v2_WoW_patch.MPQ.part) succeeded.
+TestFileStream (blk4-file://streaming/model.MPQ.0) succeeded.
+TestFileStream (mpqe-file://MPQ_2011_v2_EncryptedMpq.MPQE) succeeded.
+TestFileMirror (part-file://MPQ_2009_v1_patch-created.MPQ.part) succeeded.
+TestFileMirror (part-file://MPQ_2009_v1_patch-partial.MPQ.part) succeeded.
+TestFileMirror (part-file://MPQ_2009_v1_patch-complete.MPQ.part) succeeded.
+TestFileMirror (MPQ_2013_v4_alternate-created.MPQ) succeeded.
+TestFileMirror (MPQ_2013_v4_alternate-incomplete.MPQ) succeeded.
+TestFileMirror (MPQ_2013_v4_alternate-complete.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_patch_rt_SC1B.mpq) succeeded.
+TestReadingMpq (MPQ_1997_v1_StarDat_SC1B.mpq) succeeded.
+TestReadingMpq (MPQ_1997_v1_INSTALL_SC1B.EXE_) succeeded.
+TestReadingMpq: Warning: CRC32 error on (signature)
TestReadingMpq: Warning: CRC32 error on (signature)
TestReadingMpq (MPQ_2016_v1_D2XP_IX86_1xx_114a.mpq) succeeded.
-TestReadingMpq (MPQ_2018_v1_icon_error.w3m) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_STANDARD.SNP) succeeded.
-TestReadingMpq (MPQ_2012_v2_EmptyMpq.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_EmptyMpq.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_patch-base-16357.MPQ) succeeded.
-TestReadingMpq (MPQ_2011_v4_InvalidHetEntryCount.MPQ) succeeded.
-TestReadingMpq (MPQ_2002_v1_BlockTableCut.MPQ) succeeded.
-TestReadingMpq (MPQ_2010_v2_HasUserData.s2ma) succeeded.
-TestReadingMpq: Warning: CRC32 error on (listfile)
+TestReadingMpq (MPQ_2018_v1_icon_error.w3m) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_STANDARD.SNP) succeeded.
+TestReadingMpq (MPQ_2012_v2_EmptyMpq.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_EmptyMpq.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_patch-base-16357.MPQ) succeeded.
+TestReadingMpq (MPQ_2011_v4_InvalidHetEntryCount.MPQ) succeeded.
+TestReadingMpq (MPQ_2002_v1_BlockTableCut.MPQ) succeeded.
+TestReadingMpq (MPQ_2010_v2_HasUserData.s2ma) succeeded.
+TestReadingMpq: Warning: CRC32 error on (listfile)
TestReadingMpq: Warning: CRC32 error on (listfile)
TestReadingMpq: Warning: CRC32 error on File00000003.xxx
TestReadingMpq (MPQ_2014_v1_AttributesOneEntryLess.w3x) succeeded.
-TestReadingMpq (MPQ_2020_v1_AHF04patch.mix) succeeded.
-TestReadingMpq (MPQ_2010_v3_expansion-locale-frFR.MPQ) succeeded.
-TestReadingMpq (mpqe-file://MPQ_2011_v2_EncryptedMpq.MPQE) succeeded.
-TestReadingMpq (part-file://MPQ_2010_v2_HashTableCompressed.MPQ.part) succeeded.
-TestReadingMpq (blk4-file://streaming/model.MPQ.0) succeeded.
-TestReadingMpq: Warning: CRC32 error on replay.message.events
+TestReadingMpq (MPQ_2020_v1_AHF04patch.mix) succeeded.
+TestReadingMpq (MPQ_2010_v3_expansion-locale-frFR.MPQ) succeeded.
+TestReadingMpq (mpqe-file://MPQ_2011_v2_EncryptedMpq.MPQE) succeeded.
+TestReadingMpq (part-file://MPQ_2010_v2_HashTableCompressed.MPQ.part) succeeded.
+TestReadingMpq (blk4-file://streaming/model.MPQ.0) succeeded.
+TestReadingMpq: Warning: CRC32 error on replay.message.events
TestReadingMpq (MPQ_2023_v2_MemoryCorruption.SC2Replay) succeeded.
-TestReadingMpq (MPQ_2023_v1_StarcraftMap.scm) succeeded.
-TestReadingMpq (MPQ_2023_v1_BroodWarMap.scx) succeeded.
-TestReadingMpq (MPQ_2023_v1_Volcanis.scm) succeeded.
-TestReadingMpq (MPQ_2023_v4_UTF8.s2ma) succeeded.
-TestReadingMpq (MPQ_2023_v1_GreenTD.w3x) succeeded.
-TestReadingMpq (MPQ_2023_v4_1F644C5A.SC2Replay) succeeded.
-TestReadingMpq (<Chinese MPQ name>) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidUserData.w3x) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidMpqFormat.w3x) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_Spazzler.w3x) succeeded.
-TestReadingMpq (MPQ_2014_v1_ProtectedMap_Spazzler2.w3x) succeeded.
-TestReadingMpq (MPQ_2014_v1_ProtectedMap_Spazzler3.w3x) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_BOBA.w3m) succeeded.
-TestReadingMpq (MPQ_2015_v1_ProtectedMap_KangTooJee.w3x) succeeded.
-TestReadingMpq (MPQ_2015_v1_ProtectedMap_Somj2hM16.w3x) succeeded.
-TestReadingMpq (MPQ_2015_v1_ProtectedMap_Spazy.w3x) succeeded.
-TestReadingMpq (MPQ_2015_v1_MessListFile.mpq) succeeded.
-TestReadingMpq (MPQ_2016_v1_ProtectedMap_TableSizeOverflow.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_ProtectedMap_Somj2.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_WME4_4.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_SP_(4)Adrenaline.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_ProtectedMap_1.4.w3x) succeeded.
-TestReadingMpq (MPQ_2016_v1_KoreanFile.w3m) succeeded.
-TestReadingMpq (MPQ_2017_v1_Eden_RPG_S2_2.5J.w3x) succeeded.
-TestReadingMpq (MPQ_2017_v1_BigDummyFiles.w3x) succeeded.
-TestReadingMpq (MPQ_2017_v1_TildeInFileName.mpq) succeeded.
-TestReadingMpq (MPQ_2018_v1_EWIX_v8_7.w3x) succeeded.
-TestReadingMpq (MPQ_2020_v4_FakeMpqHeaders.SC2Mod) succeeded.
-TestReadingMpq (MPQ_2020_v4_NP_Protect_1.s2ma) succeeded.
-TestReadingMpq (MPQ_2020_v4_NP_Protect_2.s2ma) succeeded.
-TestReadingMpq (MPQ_2015_v1_flem1.w3x) succeeded.
-TestReadingMpq (MPQ_2002_v1_ProtectedMap_HashTable_FakeValid.w3x) succeeded.
-TestReadingMpq (MPQ_2021_v1_CantExtractCHK.scx) succeeded.
-TestReadingMpq (MPQ_2022_v1_Sniper.scx) succeeded.
-TestReadingMpq (MPQ_2022_v1_OcOc_Bound_2.scx) succeeded.
-TestReadingMpq (MPQ_2023_v1_Lusin2Rpg1.28.w3x) succeeded.
-TestReadingMpq (MPQ_2020_v1_HS0.1.asi) succeeded.
-TestReadingMpq (MPQ_2022_v1_hs0.8.asi) succeeded.
-TestReadingMpq (MPQ_2022_v1_MoeMoeMod.asi) succeeded.
-TestReadingMpq (MPx_2013_v1_LongwuOnline.mpk) succeeded.
-TestReadingMpq (MPx_2013_v1_WarOfTheImmortals.sqp) succeeded.
-TestReadingMpq (MPx_2022_v1_Music.mpk) succeeded.
-TestReadingMpq (MPx_2022_v1_Scp.mpk) succeeded.
-TestReadingMpq (MPx_2022_v1_UI.mpk) succeeded.
-TestReadingMpq (MPQ_1998_v1_StarCraft.mpq) succeeded.
-TestReadingMpq (MPQ_2012_v4_OldWorld.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_world.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_locale-enGB.MPQ) succeeded.
-TestReadingMpq (MPQ_2013_v4_Base1.SC2Data) succeeded.
-TestReadingMpq (MPQ_2013_v4_Mods#Core.SC2Mod#enGB.SC2Assets) succeeded.
-TestReadingMpq (MPQ_2013_v4_Base1.SC2Data) succeeded.
-TestReadingMpq (MPQ_2013_v4_Base3.SC2Maps) succeeded.
-TestReadingMpq (MPQ_2013_v4_Mods#Liberty.SC2Mod#enGB.SC2Data) succeeded.
-TestReadingMpq (MPQ_2014_v4_base-Win.MPQ) succeeded.
-TestReadingMpq (MPQ_2014_v4_base-Win.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_STANDARD.SNP) succeeded.
-TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
-TestReadingMpq (MPQ_2003_v1_WeakSignatureEmpty.exe) succeeded.
-TestReadingMpq (MPQ_2002_v1_StrongSignature.w3m) succeeded.
-TestReadingMpq (MPQ_1998_v1_StarDat.mpq) succeeded.
-TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
-TestReadingMpq (flat-file://streaming/model.MPQ.0) succeeded.
-TestReadingMpq (MPQ_2013_vX_Battle.net.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
-TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
-TestReadingMpq (MPQ_2002_v1_StrongSignature.w3m) succeeded.
-TestReadingMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
-Test_ReopenMpq (MPQ_2010_v3_expansion-locale-frFR.MPQ) succeeded.
-Test_ReopenMpq (MPQ_2016_v1_00000.pak) succeeded.
-Test_ReopenMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
-Test_ReopenMpq (MPQ_2013_v4_expansion1.MPQ) succeeded.
-Test_ReopenMpq (MPQ_2014_v1_out1.w3x) succeeded.
-Test_ReopenMpq (MPQ_2014_v1_out2.w3x) succeeded.
-Test_ReopenMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
-Test_ReopenMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
-Test_ReopenMpq (MPQ_2002_v1_LargeMapFile.w3m) succeeded.
-Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
-Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
-TestModifyMpq (MPQ_2014_v4_Base.StormReplay) succeeded.
-TestModifyMpq (MPQ_2022_v1_v4.329.w3x) succeeded.
-TestModifyMpq (MPQ_2023_v1_StarcraftMap.scm) succeeded.
-TestVerifyHash succeeded.
-CreateNewMpq (StormLibTest_EmptyMpq_v2.mpq) succeeded.
-CreateNewMpq (StormLibTest_EmptyMpq_v4.mpq) succeeded.
+TestReadingMpq (MPQ_2023_v1_StarcraftMap.scm) succeeded.
+TestReadingMpq (MPQ_2023_v1_BroodWarMap.scx) succeeded.
+TestReadingMpq (MPQ_2023_v1_Volcanis.scm) succeeded.
+TestReadingMpq (MPQ_2023_v4_UTF8.s2ma) succeeded.
+TestReadingMpq (MPQ_2023_v1_GreenTD.w3x) succeeded.
+TestReadingMpq (MPQ_2023_v4_1F644C5A.SC2Replay) succeeded.
+TestReadingMpq (<Chinese MPQ name>) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidUserData.w3x) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_InvalidMpqFormat.w3x) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_Spazzler.w3x) succeeded.
+TestReadingMpq (MPQ_2014_v1_ProtectedMap_Spazzler2.w3x) succeeded.
+TestReadingMpq (MPQ_2014_v1_ProtectedMap_Spazzler3.w3x) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_BOBA.w3m) succeeded.
+TestReadingMpq (MPQ_2015_v1_ProtectedMap_KangTooJee.w3x) succeeded.
+TestReadingMpq (MPQ_2015_v1_ProtectedMap_Somj2hM16.w3x) succeeded.
+TestReadingMpq (MPQ_2015_v1_ProtectedMap_Spazy.w3x) succeeded.
+TestReadingMpq (MPQ_2015_v1_MessListFile.mpq) succeeded.
+TestReadingMpq (MPQ_2016_v1_ProtectedMap_TableSizeOverflow.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_ProtectedMap_Somj2.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_WME4_4.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_SP_(4)Adrenaline.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_ProtectedMap_1.4.w3x) succeeded.
+TestReadingMpq (MPQ_2016_v1_KoreanFile.w3m) succeeded.
+TestReadingMpq (MPQ_2017_v1_Eden_RPG_S2_2.5J.w3x) succeeded.
+TestReadingMpq (MPQ_2017_v1_BigDummyFiles.w3x) succeeded.
+TestReadingMpq (MPQ_2017_v1_TildeInFileName.mpq) succeeded.
+TestReadingMpq (MPQ_2018_v1_EWIX_v8_7.w3x) succeeded.
+TestReadingMpq (MPQ_2020_v4_FakeMpqHeaders.SC2Mod) succeeded.
+TestReadingMpq (MPQ_2020_v4_NP_Protect_1.s2ma) succeeded.
+TestReadingMpq (MPQ_2020_v4_NP_Protect_2.s2ma) succeeded.
+TestReadingMpq (MPQ_2015_v1_flem1.w3x) succeeded.
+TestReadingMpq (MPQ_2002_v1_ProtectedMap_HashTable_FakeValid.w3x) succeeded.
+TestReadingMpq (MPQ_2021_v1_CantExtractCHK.scx) succeeded.
+TestReadingMpq (MPQ_2022_v1_Sniper.scx) succeeded.
+TestReadingMpq (MPQ_2022_v1_OcOc_Bound_2.scx) succeeded.
+TestReadingMpq (MPQ_2023_v1_Lusin2Rpg1.28.w3x) succeeded.
+TestReadingMpq (MPQ_2024_v1_300TK2.09p.w3x) succeeded.
+TestReadingMpq (MPQ_2020_v1_HS0.1.asi) succeeded.
+TestReadingMpq (MPQ_2022_v1_hs0.8.asi) succeeded.
+TestReadingMpq (MPQ_2022_v1_MoeMoeMod.asi) succeeded.
+TestReadingMpq (MPx_2013_v1_LongwuOnline.mpk) succeeded.
+TestReadingMpq (MPx_2013_v1_WarOfTheImmortals.sqp) succeeded.
+TestReadingMpq (MPx_2022_v1_Music.mpk) succeeded.
+TestReadingMpq (MPx_2022_v1_Scp.mpk) succeeded.
+TestReadingMpq (MPx_2022_v1_UI.mpk) succeeded.
+TestReadingMpq (MPQ_1998_v1_StarCraft.mpq) succeeded.
+TestReadingMpq (MPQ_2012_v4_OldWorld.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_world.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_locale-enGB.MPQ) succeeded.
+TestReadingMpq (MPQ_2013_v4_Base1.SC2Data) succeeded.
+TestReadingMpq (MPQ_2013_v4_Mods#Core.SC2Mod#enGB.SC2Assets) succeeded.
+TestReadingMpq (MPQ_2013_v4_Base1.SC2Data) succeeded.
+TestReadingMpq (MPQ_2013_v4_Base3.SC2Maps) succeeded.
+TestReadingMpq (MPQ_2013_v4_Mods#Liberty.SC2Mod#enGB.SC2Data) succeeded.
+TestReadingMpq (MPQ_2014_v4_base-Win.MPQ) succeeded.
+TestReadingMpq (MPQ_2014_v4_base-Win.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_STANDARD.SNP) succeeded.
+TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
+TestReadingMpq (MPQ_2003_v1_WeakSignatureEmpty.exe) succeeded.
+TestReadingMpq (MPQ_2002_v1_StrongSignature.w3m) succeeded.
+TestReadingMpq (MPQ_1998_v1_StarDat.mpq) succeeded.
+TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
+TestReadingMpq (flat-file://streaming/model.MPQ.0) succeeded.
+TestReadingMpq (MPQ_2013_vX_Battle.net.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
+TestReadingMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
+TestReadingMpq (MPQ_2002_v1_StrongSignature.w3m) succeeded.
+TestReadingMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
+Test_ReopenMpq (MPQ_2010_v3_expansion-locale-frFR.MPQ) succeeded.
+Test_ReopenMpq (MPQ_2016_v1_00000.pak) succeeded.
+Test_ReopenMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
+Test_ReopenMpq (MPQ_2013_v4_expansion1.MPQ) succeeded.
+Test_ReopenMpq (MPQ_2014_v1_out1.w3x) succeeded.
+Test_ReopenMpq (MPQ_2014_v1_out2.w3x) succeeded.
+Test_ReopenMpq (MPQ_1997_v1_Diablo1_DIABDAT.MPQ) succeeded.
+Test_ReopenMpq (MPQ_2013_v4_SC2_EmptyMap.SC2Map) succeeded.
+Test_ReopenMpq (MPQ_2002_v1_LargeMapFile.w3m) succeeded.
+Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
+Test_Signature (MPQ_1999_v1_WeakSigned1.mpq) succeeded.
+TestModifyMpq (MPQ_2014_v4_Base.StormReplay) succeeded.
+TestModifyMpq (MPQ_2022_v1_v4.329.w3x) succeeded.
+TestModifyMpq (MPQ_2023_v1_StarcraftMap.scm) succeeded.
+TestVerifyHash succeeded.
+CreateNewMpq (StormLibTest_EmptyMpq_v2.mpq) succeeded.
+CreateNewMpq (StormLibTest_EmptyMpq_v4.mpq) succeeded.
CreateNewMpq (StormLibTest_Český.mpq) succeeded. .
-CreateNewMpq (StormLibTest_Русский.mpq) succeeded. ...
-CreateNewMpq (StormLibTest_ελληνικά.mpq) succeeded.
+CreateNewMpq (StormLibTest_Русский.mpq) succeeded. ...
+CreateNewMpq (StormLibTest_ελληνικά.mpq) succeeded.
CreateNewMpq (StormLibTest_日本語.mpq) succeeded. ..
-CreateNewMpq (StormLibTest_简体中文.mpq) succeeded....
-CreateNewMpq (StormLibTest_الععربية.mpq) succeeded....
-CreateNewMpq (StormLibTest_NonStdNames.mpq) succeeded.
-CreateNewMpq (StormLibTest_MpqEditorTest.mpq) succeeded.
-TestCreateGaps (StormLibTest_GapsTest.mpq) succeeded.
-TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
-TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
-TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
-TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
-IncMaxFileCount (StormLibTest_IncMaxFileCount.mpq) succeeded.
-TestFileFlag (StormLibTest_FileFlagTest.mpq) succeeded.
-TestCompressions: Warning: CRC32 error on WaveFile_01.wav
+CreateNewMpq (StormLibTest_简体中文.mpq) succeeded....
+CreateNewMpq (StormLibTest_الععربية.mpq) succeeded....
+CreateNewMpq (StormLibTest_NonStdNames.mpq) succeeded.
+CreateNewMpq (StormLibTest_MpqEditorTest.mpq) succeeded.
+TestCreateGaps (StormLibTest_GapsTest.mpq) succeeded.
+TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
+TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
+TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
+TestCreateFull (StormLibTest_FileTableFull.mpq) succeeded.
+IncMaxFileCount (StormLibTest_IncMaxFileCount.mpq) succeeded.
+TestFileFlag (StormLibTest_FileFlagTest.mpq) succeeded.
+TestCompressions: Warning: CRC32 error on WaveFile_01.wav
TestCompressions: Warning: CRC32 error on WaveFile_02.wav
-TestCompressions (StormLibTest_AddWaveMonoBadTest.mpq) succeeded.
-TestCompressions: Warning: CRC32 error on WaveFile_01.wav
+TestCompressions (StormLibTest_AddWaveMonoBadTest.mpq) succeeded.
+TestCompressions: Warning: CRC32 error on WaveFile_01.wav
TestCompressions: Warning: CRC32 error on WaveFile_02.wav
-ListFilePos (StormLibTest_ListFilePos.mpq) succeeded.
-TestBigArchive (StormLibTest_BigArchive_v4.mpq) succeeded. \ No newline at end of file
+ListFilePos (StormLibTest_ListFilePos.mpq) succeeded.
+TestBigArchive (StormLibTest_BigArchive_v4.mpq) succeeded. \ No newline at end of file