diff options
author | Ladislav Zezula <zezula@volny.cz> | 2025-05-30 20:39:15 +0200 |
---|---|---|
committer | Ladislav Zezula <zezula@volny.cz> | 2025-05-30 20:39:34 +0200 |
commit | 0ce73c5b464cb438f9faae69c5a8305241898b54 (patch) | |
tree | 45b9239830d23bede55a60744e856bf8707c594c | |
parent | 7acd704ad0800d229962c4a29b71ef66cfa0ca1c (diff) |
Fixed
-rw-r--r-- | StormLib_test.vcxproj | 2 | ||||
-rw-r--r-- | src/SFileOpenArchive.cpp | 48 | ||||
-rwxr-xr-x | test/StormTest.cpp | 80 | ||||
-rw-r--r-- | test/TLogHelper.cpp | 17 | ||||
-rw-r--r-- | test/stormlib-test-001.txt | 9 |
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. |