diff options
| -rw-r--r-- | src/SBaseCommon.cpp | 26 | ||||
| -rw-r--r-- | src/SFileFindFile.cpp | 2 | ||||
| -rw-r--r-- | src/SFileOpenFileEx.cpp | 8 | ||||
| -rw-r--r-- | src/StormCommon.h | 8 | ||||
| -rw-r--r-- | src/StormLib.h | 7 | ||||
| -rwxr-xr-x | test/StormTest.cpp | 51 | ||||
| -rw-r--r-- | test/TLogHelper.cpp | 1 | 
7 files changed, 92 insertions, 11 deletions
diff --git a/src/SBaseCommon.cpp b/src/SBaseCommon.cpp index 3f95ded..7f2aa8c 100644 --- a/src/SBaseCommon.cpp +++ b/src/SBaseCommon.cpp @@ -1968,3 +1968,29 @@ void ConvertTMPQHeader(void *header, uint16_t version)  }
  #endif  // STORMLIB_LITTLE_ENDIAN
 +
 +//-----------------------------------------------------------------------------
 +// Debug support
 +
 +/*
 +#include <strsafe.h>
 +
 +#if defined(STORMLIB_WINDOWS) && defined(_DEBUG)
 +void SFileLog(const char * format, ...)
 +{
 +    va_list argList;
 +    char * szBuffer;
 +    size_t nLength = 0x1000;
 +
 +    if((szBuffer = STORM_ALLOC(char, 0x1000)) != NULL)
 +    {
 +        va_start(argList, format);
 +        StringCchVPrintfA(szBuffer, nLength, format, argList);
 +        va_end(argList);
 +
 +        OutputDebugStringA(szBuffer);
 +        STORM_FREE(szBuffer);
 +    }
 +}
 +#endif
 +*/
\ No newline at end of file diff --git a/src/SFileFindFile.cpp b/src/SFileFindFile.cpp index b741e5f..8f4849f 100644 --- a/src/SFileFindFile.cpp +++ b/src/SFileFindFile.cpp @@ -352,7 +352,9 @@ static DWORD DoMPQSearch(TMPQSearch * hs, SFILE_FIND_DATA * lpFindFileData)          dwErrCode = (ha->pHashTable != NULL) ? DoMPQSearch_HashTable(hs, lpFindFileData, ha)
                                               : DoMPQSearch_FileTable(hs, lpFindFileData, ha);
          if(dwErrCode == ERROR_SUCCESS)
 +        {
              return dwErrCode;
 +        }
          // If there is no more patches in the chain, stop it.
          // This also keeps hs->ha non-NULL, which is required
 diff --git a/src/SFileOpenFileEx.cpp b/src/SFileOpenFileEx.cpp index 90c7fab..2954669 100644 --- a/src/SFileOpenFileEx.cpp +++ b/src/SFileOpenFileEx.cpp @@ -155,6 +155,14 @@ bool OpenPatchedFile(HANDLE hMpq, const char * szFileName, HANDLE * PtrFile)                      hf = hfPatch;                  }              } + +            // If the opened file has the delete marker, we don't open the file +            if(hfBase && hf && hf->pFileEntry->dwFlags & MPQ_FILE_DELETE_MARKER) +            { +                SFileCloseFile((HANDLE)(hfBase)); +                SetLastError(ERROR_FILE_DELETED); +                hfBase = NULL; +            }          }      }      else diff --git a/src/StormCommon.h b/src/StormCommon.h index 1e67a27..bf82039 100644 --- a/src/StormCommon.h +++ b/src/StormCommon.h @@ -513,5 +513,13 @@ void DumpFileTable(TFileEntry * pFileTable, DWORD dwFileTableSize);  #endif
 +/*
 +#ifdef _DEBUG
 +void SFileLog(const char * format, ...);
 +#else
 +inline void SFileLog(...) {}
 +#endif
 +*/
 +
  #endif // __STORMCOMMON_H__
 diff --git a/src/StormLib.h b/src/StormLib.h index bf884c5..c4542d9 100644 --- a/src/StormLib.h +++ b/src/StormLib.h @@ -102,11 +102,11 @@ extern "C" {  //  Z - S for static-linked CRT library, D for multithreaded DLL CRT library  // -#if defined(__STORMLIB_SELF__) && !defined(STORMLIB_NO_AUTO_LINK) -#define STORMLIB_NO_AUTO_LINK // Define this if you don't want to link using pragmas when using msvc +#if defined(__STORMLIB_SELF__) && !defined(__STORMLIB_NO_STATIC_LINK__) +#define __STORMLIB_NO_STATIC_LINK__ // Define this if you don't want to link using pragmas when using msvc  #endif -#if defined(_MSC_VER) && !defined(STORMLIB_NO_AUTO_LINK) +#if defined(_MSC_VER) && !defined(__STORMLIB_NO_STATIC_LINK__)    #ifndef WDK_BUILD      #ifdef _DEBUG                                 // DEBUG VERSIONS        #ifndef _UNICODE @@ -163,6 +163,7 @@ extern "C" {  #define ERROR_UNKNOWN_FILE_NAMES         10007  // A name of at least one file is unknown  #define ERROR_CANT_FIND_PATCH_PREFIX     10008  // StormLib was unable to find patch prefix for the patches  #define ERROR_FAKE_MPQ_HEADER            10009  // The header at this position is fake header +#define ERROR_FILE_DELETED               10010  // The file is present but contains delete marker  // Values for SFileCreateArchive  #define HASH_TABLE_SIZE_MIN         0x00000004  // Verified: If there is 1 file, hash table size is 4 diff --git a/test/StormTest.cpp b/test/StormTest.cpp index 7cd885d..7a4459c 100755 --- a/test/StormTest.cpp +++ b/test/StormTest.cpp @@ -106,7 +106,7 @@ typedef struct _TEST_EXTRA_HASHVAL  typedef struct _TEST_EXTRA_HASHVALS
  {
 -    EXTRA_TYPE Type;                        // Must be PatchList
 +    EXTRA_TYPE Type;                        // Must be HashValues
      TEST_EXTRA_HASHVAL Items[2];
  } TEST_EXTRA_HASHVALS, *PTEST_EXTRA_HASHVALS;
 @@ -573,16 +573,16 @@ static void CreateFullPathName(char * szBuffer, size_t cchBuffer, LPCTSTR szSubD  static DWORD CalculateFileHash(TLogHelper * pLogger, LPCTSTR szFullPath, LPTSTR szFileHash)
  {
      TFileStream * pStream;
 -    unsigned char file_hash[SHA256_DIGEST_SIZE];
 -    LPCTSTR szShortPlainName = GetShortPlainName(szFullPath);
      hash_state sha256_state;
      ULONGLONG ByteOffset = 0;
      ULONGLONG FileSize = 0;
 -    LPCSTR szHashingFormat = "Hashing %s " fmt_X_of_Y_a;
 +    LPCTSTR szShortPlainName = GetShortPlainName(szFullPath);
 +    LPCTSTR szHashingFormat = _T("Hashing %s ") fmt_X_of_Y_t;
      LPBYTE pbFileBlock;
      DWORD cbBytesToRead;
      DWORD cbFileBlock = 0x100000;
      DWORD dwErrCode = ERROR_SUCCESS;
 +    BYTE file_hash[SHA256_DIGEST_SIZE];
      // Notify the user
      pLogger->PrintProgress(_T("Hashing %s ..."), szShortPlainName);
 @@ -1038,7 +1038,10 @@ static DWORD GetFilePatchCount(TLogHelper * pLogger, HANDLE hMpq, LPCSTR szFileN      }
      else
      {
 -        pLogger->PrintError("Open failed: %s", szFileName);
 +        if(GetLastError() != ERROR_FILE_DELETED)
 +        {
 +            pLogger->PrintError("Open failed: %s", szFileName);
 +        }
      }
      return nPatchCount;
 @@ -1049,7 +1052,7 @@ static DWORD VerifyFilePatchCount(TLogHelper * pLogger, HANDLE hMpq, LPCSTR szFi      DWORD dwPatchCount = 0;
      // Retrieve the patch count
 -    pLogger->PrintProgress(_T("Verifying patch count for %s ..."), szFileName);
 +    pLogger->PrintProgress("Verifying patch count for %s ...", szFileName);
      dwPatchCount = GetFilePatchCount(pLogger, hMpq, szFileName);
      // Check if there are any patches at all
 @@ -1442,6 +1445,7 @@ static DWORD LoadMpqFile(TLogHelper & Logger, HANDLE hMpq, LPCSTR szFileName, LC      // Make sure that we open the proper locale file
      SFileSetLocale(lcFileLocale);
 +    *ppFileData = NULL;
      // Open the file from MPQ
      if(SFileOpenFileEx(hMpq, szFileName, 0, &hFile))
 @@ -1510,7 +1514,7 @@ static DWORD LoadMpqFile(TLogHelper & Logger, HANDLE hMpq, LPCSTR szFileName, LC      }
      else
      {
 -        if((dwSearchFlags & SEARCH_FLAG_IGNORE_ERRORS) == 0)
 +        if((dwSearchFlags & SEARCH_FLAG_IGNORE_ERRORS) == 0 && GetLastError() != ERROR_FILE_DELETED)
          {
              dwErrCode = Logger.PrintError("Open failed: %s", szFileName);
          }
 @@ -3859,7 +3863,28 @@ static DWORD TestUtf8Conversions(const BYTE * szTestString, const TCHAR * szList  }
  static void Test_PlayingSpace()
 -{}
 +{
 +/*
 +    HANDLE hFile = NULL;
 +    HANDLE hMpq = NULL;
 +
 +    if(SFileOpenArchive(_T("\\Ladik\\Incoming\\texture.MPQ"), 0, STREAM_FLAG_READ_ONLY, &hMpq))
 +    {
 +        if(SFileOpenPatchArchive(hMpq, _T("\\Ladik\\Incoming\\patch.mpq"), NULL, 0))
 +        {
 +            if(SFileOpenFileEx(hMpq, "Creature\\GnomeSpidertank\\FlameLickSmallBlue.blp", 0, &hFile))
 +            {
 +                DWORD dwBytesRead = 0;
 +                BYTE Buffer[1024];
 +
 +                SFileReadFile(hFile, Buffer, sizeof(Buffer), &dwBytesRead, NULL);
 +                SFileCloseFile(hFile);
 +            }
 +        }
 +        SFileCloseArchive(hMpq);
 +    }
 +*/
 +}
  //-----------------------------------------------------------------------------
  // Tables
 @@ -3946,6 +3971,15 @@ static const TEST_EXTRA_PATCHES PatchSC1 =      0
  };
 +static const TEST_EXTRA_PATCHES PatchBETA =
 +{
 +    PatchList,
 +    _T("wow-08-beta-patch.mpq\0"),
 +    "Creature\\GnomeSpidertank\\FlameLickSmallBlue.blp",
 +    0
 +};
 +
 +
  static const TEST_EXTRA_PATCHES Patch13286 =
  {
      PatchList,
 @@ -4201,6 +4235,7 @@ static const TEST_INFO1 Test_OpenMpqs[] =      // Patched MPQs
      {_T("MPQ_1998_v1_StarCraft.mpq"),                           NULL, "5ecef2f41c5fd44c264e269416de9495",   1943, &PatchSC1},   // Patched MPQ from StarCraft I
 +    {_T("MPQ_2005_v1_texture.MPQ"),                             NULL, "f95f44bfd8e6dde30508bfec2d4cb842",  45533, &PatchBETA},  // WoW BETA:  Patched "texture.MPQ"
      {_T("MPQ_2012_v4_OldWorld.MPQ"),                            NULL, "07643ec62864b4dd4fc8f8a6a16ce006",  71439, &Patch13286}, // WoW 13286: Patched "OldWorld.MPQ"
      {_T("MPQ_2013_v4_world.MPQ"),                               NULL, "af9baeceab20139bbf94d03f99170ae0",  48930, &Patch15050}, // WoW 15050: Patched "world.MPQ"
      {_T("MPQ_2013_v4_locale-enGB.MPQ"),                         NULL, "d39e743aaf6dad51d643d65e6e564804",  14349, &Patch16965}, // WoW 16965: Patched "locale-enGB.MPQ"
 diff --git a/test/TLogHelper.cpp b/test/TLogHelper.cpp index c0e5e14..baa5327 100644 --- a/test/TLogHelper.cpp +++ b/test/TLogHelper.cpp @@ -29,6 +29,7 @@  #endif
  #define fmt_X_of_Y_a  "(" fmt_I64u_a " of " fmt_I64u_a ")"
 +#define fmt_X_of_Y_t  _T(fmt_X_of_Y_a)
  #ifdef __CASCLIB_SELF__
  #define TEST_MIN CASCLIB_MIN
  | 
