diff options
| -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.  | 
