aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLadislav Zezula <zezula@volny.cz>2025-05-30 20:39:15 +0200
committerLadislav Zezula <zezula@volny.cz>2025-05-30 20:39:34 +0200
commit0ce73c5b464cb438f9faae69c5a8305241898b54 (patch)
tree45b9239830d23bede55a60744e856bf8707c594c
parent7acd704ad0800d229962c4a29b71ef66cfa0ca1c (diff)
Fixed
-rw-r--r--StormLib_test.vcxproj2
-rw-r--r--src/SFileOpenArchive.cpp48
-rwxr-xr-xtest/StormTest.cpp80
-rw-r--r--test/TLogHelper.cpp17
-rw-r--r--test/stormlib-test-001.txt9
5 files changed, 78 insertions, 78 deletions
diff --git a/StormLib_test.vcxproj b/StormLib_test.vcxproj
index cfa4d65..e7703c4 100644
--- a/StormLib_test.vcxproj
+++ b/StormLib_test.vcxproj
@@ -46,7 +46,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset>
- <CharacterSet>MultiByte</CharacterSet>
+ <CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
diff --git a/src/SFileOpenArchive.cpp b/src/SFileOpenArchive.cpp
index 217feca..7b55a8c 100644
--- a/src/SFileOpenArchive.cpp
+++ b/src/SFileOpenArchive.cpp
@@ -22,6 +22,31 @@
//-----------------------------------------------------------------------------
// Local functions
+#ifndef IMAGE_DOS_SIGNATURE
+
+#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
+#define IMAGE_FILE_DLL 0x2000 // File is a DLL.
+
+typedef struct _IMAGE_DOS_HEADER
+{
+ USHORT e_magic;
+ USHORT dummy[0x1B];
+ DWORD e_lfanew;
+} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
+
+typedef struct _IMAGE_FILE_HEADER
+{
+ USHORT Machine;
+ USHORT NumberOfSections;
+ DWORD TimeDateStamp;
+ DWORD PointerToSymbolTable;
+ DWORD NumberOfSymbols;
+ USHORT SizeOfOptionalHeader;
+ USHORT Characteristics;
+} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
+#endif
+
+
static MTYPE CheckMapType(LPCTSTR szFileName, LPBYTE pbHeaderBuffer, size_t cbHeaderBuffer)
{
LPDWORD HeaderInt32 = (LPDWORD)pbHeaderBuffer;
@@ -64,11 +89,26 @@ static MTYPE CheckMapType(LPCTSTR szFileName, LPBYTE pbHeaderBuffer, size_t cbHe
// MIX files are DLL files that contain MPQ in overlay.
// Only Warcraft III is able to load them, so we consider them Warcraft III maps
- if(cbHeaderBuffer > 0x200 && pbHeaderBuffer[0] == 'M' && pbHeaderBuffer[1] == 'Z')
+ // Do not include EXE files, because they may be World of Warcraft patches
+ if(cbHeaderBuffer > sizeof(IMAGE_DOS_HEADER))
{
- // Check the value of IMAGE_DOS_HEADER::e_lfanew at offset 0x3C
- if(0 < HeaderInt32[0x0F] && HeaderInt32[0x0F] < 0x10000)
- return MapTypeWarcraft3;
+ PIMAGE_FILE_HEADER pFileHeader;
+ PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)(pbHeaderBuffer);
+ size_t dwMaxAllowedSize = cbHeaderBuffer - sizeof(DWORD) - sizeof(IMAGE_FILE_HEADER);
+
+ // Verify the header of EXE/DLL files
+ if((pDosHeader->e_magic == IMAGE_DOS_SIGNATURE) && (0 < pDosHeader->e_lfanew && pDosHeader->e_lfanew < 0x10000))
+ {
+ // Is the file an EXE?
+ if((size_t)pDosHeader->e_lfanew <= dwMaxAllowedSize)
+ {
+ pFileHeader = (PIMAGE_FILE_HEADER)(pbHeaderBuffer + pDosHeader->e_lfanew + sizeof(DWORD));
+ if(pFileHeader->Characteristics & IMAGE_FILE_DLL)
+ {
+ return MapTypeWarcraft3;
+ }
+ }
+ }
}
// No special map type recognized
diff --git a/test/StormTest.cpp b/test/StormTest.cpp
index c4eff22..2992238 100755
--- a/test/StormTest.cpp
+++ b/test/StormTest.cpp
@@ -3866,51 +3866,12 @@ static DWORD TestUtf8Conversions(const BYTE * szTestString, const TCHAR * szList
static void Test_PlayingSpace()
{
- HANDLE SFileOpenArchivevar0 = NULL;
- LPCSTR fuzzData = "c:\\segv";
-
- for(DWORD i = 0; i < 1000; i++)
- {
- char NewName[128];
-
- sprintf(NewName, "c:\\segv%04u", i);
- CopyFileA(fuzzData, NewName, FALSE);
- SFileOpenArchivevar0 = NULL;
-
- bool SFileOpenArchiveval1 = SFileOpenArchive(NewName, i, 0, &SFileOpenArchivevar0);
- if(!SFileOpenArchiveval1)
- {
- fprintf(stderr, "err2");
- exit(0);
- }
-
- bool SFileAddWaveval1 = SFileAddWave(SFileOpenArchivevar0, fuzzData, fuzzData, i, 1);
- if(!SFileAddWaveval1)
- {
- SFileCloseArchive(SFileOpenArchivevar0);
- fprintf(stderr, "err4");
- exit(0);
- }
- }
-
- bool SFileRemoveFileval1 = SFileRemoveFile(SFileOpenArchivevar0, fuzzData, (DWORD)_tcslen(fuzzData));
- if(!SFileRemoveFileval1)
- {
- fprintf(stderr, "err6");
- exit(0);
- }
-
- DWORD SFileVerifyArchiveval1 = SFileVerifyArchive(SFileOpenArchivevar0);
- if(!SFileVerifyArchiveval1)
- {
- fprintf(stderr, "err7");
- exit(0);
- }
+ HANDLE hMpq;
+ HANDLE hFile;
-/*
- if(SFileOpenArchive(_T("E:\\DIABDAT.MPQ"), 0, 0, &hMpq))
+ if(SFileOpenArchive(_T("e:\\Ladik\\Incoming\\WoW-1.11.2.5464-to-1.12.0.5595-enUS-patch.exe"), 0, 0, &hMpq))
{
- if(SFileOpenFileEx(hMpq, "d1221a.mpq", 0, &hFile))
+ if(SFileOpenFileEx(hMpq, "AccountLogin.xml", 0, &hFile))
{
DWORD dwBytesRead = 0;
BYTE Buffer[1024];
@@ -3920,7 +3881,6 @@ static void Test_PlayingSpace()
}
SFileCloseArchive(hMpq);
}
-*/
}
//-----------------------------------------------------------------------------
@@ -3931,8 +3891,9 @@ static LPCTSTR szSigned2 = _T("StarDat.mpq");
static LPCTSTR szSigned3 = _T("War2Patch_202.exe");
static LPCTSTR szSigned4 = _T("(10)DustwallowKeys.w3m");
static LPCTSTR szSigned5 = _T("WoW-1.2.3.4211-enUS-patch.exe");
-static LPCTSTR szSigned6 = _T("WoW-3.0.1.8337-to-3.0.1.8392-enGB-patch.exe");
-static LPCTSTR szSigned7 = _T("wow-final.MPQ");
+static LPCTSTR szSigned6 = _T("WoW-1.11.2.5464-to-1.12.0.5595-enUS-patch.exe");
+static LPCTSTR szSigned7 = _T("WoW-3.0.1.8337-to-3.0.1.8392-enGB-patch.exe");
+static LPCTSTR szSigned8 = _T("wow-final.MPQ");
static LPCTSTR szDiabdatMPQ = _T("MPQ_1997_v1_Diablo1_DIABDAT.MPQ");
@@ -4298,9 +4259,10 @@ static const TEST_INFO1 Test_OpenMpqs[] =
{_T("MPQ_1999_v1_WeakSignature.exe"), szSigned3, "c1084033d0bd5f7e2b9b78b600c0bba8", 24 | TFLG_SIGCHECK_BEFORE},
{_T("MPQ_1999_v1_WeakSignature.exe"), szSigned3, "807fe2e4d38eccf5ee6bc88f5ee5940d", 25 | TFLG_SIGCHECK_BEFORE | TFLG_MODIFY | TFLG_SIGCHECK_AFTER},
{_T("MPQ_2002_v1_StrongSignature.w3m"), szSigned4, "7b725d87e07a2173c42fe2314b95fa6c", 17 | TFLG_SIGCHECK_BEFORE},
- {_T("MPQ_2003_v1_WeakSignatureEmpty.exe"), szSigned5, "97580f9f6d98ffc50191c2f07773e818", 12259 | TFLG_SIGCHECK_BEFORE},
- {_T("MPQ_2007_v2_StrongSignature1.exe"), szSigned6, "e82bc35366d5f1c588143e5bd35919c0", 23 | TFLG_SIGCHECK_BEFORE},
- {_T("MPQ_2007_v2_StrongSignature2.MPQ"), szSigned7, "53cedaf7ba8c67b2e2ca95d5eb2b9380", 1622 | TFLG_SIGCHECK_BEFORE},
+ {_T("MPQ_2003_v1_WeakSignatureEmpty.exe"), szSigned5, "1e24a80dafa5285a0aee9470263e5b7c", 12259 | TFLG_SIGCHECK_BEFORE},
+ {_T("MPQ_2006_v1_WoW-1.11.2.5464-patch.exe_"), szSigned6, "6d1ccbfc344b6a2bc4ddf14867e45fea", 952 | TFLG_SIGCHECK_BEFORE},
+ {_T("MPQ_2007_v2_StrongSignature1.exe"), szSigned7, "c553320a2f841ccb86c0643f58d8488a", 23 | TFLG_SIGCHECK_BEFORE},
+ {_T("MPQ_2007_v2_StrongSignature2.MPQ"), szSigned8, "53cedaf7ba8c67b2e2ca95d5eb2b9380", 1622 | TFLG_SIGCHECK_BEFORE},
// Multi-file archive with wrong prefix to see how StormLib deals with it
{_T("flat-file://streaming/model.MPQ.0"), _T("flat-file://model.MPQ.0"), NULL, 0 | TFLG_WILL_FAIL},
@@ -4387,17 +4349,17 @@ static const LPCSTR Test_CreateMpq_Localized[] =
//-----------------------------------------------------------------------------
// Main
-#define TEST_COMMAND_LINE
-#define TEST_LOCAL_LISTFILE
-#define TEST_STREAM_OPERATIONS
-#define TEST_MASTER_MIRROR
-#define TEST_OPEN_MPQ
-#define TEST_REOPEN_MPQ
-#define TEST_VERIFY_SIGNATURE
-#define TEST_REPLACE_FILE
-#define TEST_VERIFY_HASHES
+//#define TEST_COMMAND_LINE
+//#define TEST_LOCAL_LISTFILE
+//#define TEST_STREAM_OPERATIONS
+//#define TEST_MASTER_MIRROR
+//#define TEST_OPEN_MPQ
+//#define TEST_REOPEN_MPQ
+//#define TEST_VERIFY_SIGNATURE
+//#define TEST_REPLACE_FILE
+//#define TEST_VERIFY_HASHES
#define TEST_CREATE_MPQS
-#define TEST_MISC_MPQS
+//#define TEST_MISC_MPQS
int _tmain(int argc, TCHAR * argv[])
{
diff --git a/test/TLogHelper.cpp b/test/TLogHelper.cpp
index ad8a067..f58575b 100644
--- a/test/TLogHelper.cpp
+++ b/test/TLogHelper.cpp
@@ -332,7 +332,6 @@ class TLogHelper
{
char * szBufferPtr;
char * szBufferEnd;
- size_t nNewPrinted;
size_t nLength = 0;
DWORD dwErrCode = Test_GetLastError();
XCHAR szMessage[0x200];
@@ -366,11 +365,8 @@ class TLogHelper
szBufferPtr += nLength;
}
- // Remember how much did we print
- nNewPrinted = (szBufferPtr - szBuffer);
-
// Shall we pad the string?
- if((nLength = (szBufferPtr - szBuffer - 1)) < nPrevPrinted)
+ if((nLength = (szBufferPtr - szBuffer)) < nPrevPrinted)
{
size_t nPadding = nPrevPrinted - nLength;
@@ -381,21 +377,20 @@ class TLogHelper
szBufferPtr += nPadding;
}
+ // Remember how much did we print
+ nPrevPrinted = (szBufferPtr - szBuffer);
+
// Shall we add new line?
- if((bPrintEndOfLine != false) && (szBufferPtr < szBufferEnd))
+ if((bPrintEndOfLine) && (szBufferPtr < szBufferEnd))
*szBufferPtr++ = '\n';
*szBufferPtr = 0;
// Remember if we printed a message
- if(bPrintEndOfLine != false)
+ if(bPrintEndOfLine)
{
bMessagePrinted = true;
nPrevPrinted = 0;
}
- else
- {
- nPrevPrinted = nNewPrinted;
- }
// Finally print the message
printf_console("%s", szBuffer);
diff --git a/test/stormlib-test-001.txt b/test/stormlib-test-001.txt
index 8e3770c..1b9d95e 100644
--- a/test/stormlib-test-001.txt
+++ b/test/stormlib-test-001.txt
@@ -127,6 +127,9 @@ TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
TestReadingMpq (MPQ_1999_v1_WeakSignature.exe) succeeded.
TestReadingMpq (MPQ_2002_v1_StrongSignature.w3m) succeeded.
TestReadingMpq (MPQ_2003_v1_WeakSignatureEmpty.exe) succeeded.
+TestReadingMpq: Warning: CRC32 error on (signature)
+TestReadingMpq: Warning: CRC32 error on (signature)
+TestReadingMpq (MPQ_2006_v1_WoW-1.11.2.5464-patch.exe_) succeeded.
TestReadingMpq (MPQ_2007_v2_StrongSignature1.exe) succeeded.
TestReadingMpq (MPQ_2007_v2_StrongSignature2.MPQ) succeeded.
TestReadingMpq (flat-file://streaming/model.MPQ.0) succeeded.
@@ -152,10 +155,10 @@ 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_Č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.