From f813753a661731f970f0522597c228738bf8d075 Mon Sep 17 00:00:00 2001 From: Ladislav Zezula Date: Wed, 26 Jul 2017 20:34:02 +0200 Subject: Added support for PG1.11.973 protector --- src/SBaseFileTable.cpp | 5 +++-- src/SFileGetFileInfo.cpp | 2 +- src/SFileOpenArchive.cpp | 4 ++-- src/StormCommon.h | 2 +- test/StormTest.cpp | 5 ++--- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/SBaseFileTable.cpp b/src/SBaseFileTable.cpp index 50bf69e..d9664a5 100644 --- a/src/SBaseFileTable.cpp +++ b/src/SBaseFileTable.cpp @@ -338,7 +338,8 @@ int ConvertMpqHeaderToFormat4( TMPQArchive * ha, ULONGLONG MpqOffset, ULONGLONG FileSize, - DWORD dwFlags) + DWORD dwFlags, + bool bIsWarcraft3Map) { TMPQHeader * pHeader = (TMPQHeader *)ha->HeaderData; ULONGLONG BlockTablePos64 = 0; @@ -350,7 +351,7 @@ int ConvertMpqHeaderToFormat4( // If version 1.0 is forced, then the format version is forced to be 1.0 // Reason: Storm.dll in Warcraft III ignores format version value - if(dwFlags & MPQ_OPEN_FORCE_MPQ_V1) + if((dwFlags & MPQ_OPEN_FORCE_MPQ_V1) || (bIsWarcraft3Map)) wFormatVersion = MPQ_FORMAT_VERSION_1; // Format-specific fixes diff --git a/src/SFileGetFileInfo.cpp b/src/SFileGetFileInfo.cpp index 365dce5..4f15501 100644 --- a/src/SFileGetFileInfo.cpp +++ b/src/SFileGetFileInfo.cpp @@ -416,7 +416,7 @@ bool WINAPI SFileGetFileInfo( if(ha != NULL) { nInfoType = SFILE_INFO_TYPE_NOT_FOUND; - if(MAKE_OFFSET64(ha->pHeader->wBlockTablePosHi, ha->pHeader->dwBlockTablePos) != 0) + if(MAKE_OFFSET64(ha->pHeader->wBlockTablePosHi, ha->pHeader->dwBlockTablePos) < ha->FileSize) { cbSrcFileInfo = ha->pHeader->dwBlockTableSize * sizeof(TMPQBlock); if(cbFileInfo >= cbSrcFileInfo) diff --git a/src/SFileOpenArchive.cpp b/src/SFileOpenArchive.cpp index 62effe7..a78b169 100644 --- a/src/SFileOpenArchive.cpp +++ b/src/SFileOpenArchive.cpp @@ -301,13 +301,13 @@ bool WINAPI SFileOpenArchive( if(dwHeaderID == ID_MPQ && dwHeaderSize >= MPQ_HEADER_SIZE_V1) { // Now convert the header to version 4 - nError = ConvertMpqHeaderToFormat4(ha, SearchOffset, FileSize, dwFlags); + nError = ConvertMpqHeaderToFormat4(ha, SearchOffset, FileSize, dwFlags, bIsWarcraft3Map); bSearchComplete = true; break; } // Check for MPK archives (Longwu Online - MPQ fork) - if(dwHeaderID == ID_MPK) + if(dwHeaderID == ID_MPK && bIsWarcraft3Map == false) { // Now convert the MPK header to MPQ Header version 4 nError = ConvertMpkHeaderToFormat4(ha, FileSize, dwFlags); diff --git a/src/StormCommon.h b/src/StormCommon.h index 27ba45f..868f1c1 100644 --- a/src/StormCommon.h +++ b/src/StormCommon.h @@ -185,7 +185,7 @@ TMPQFile * IsValidFileHandle(HANDLE hFile); ULONGLONG FileOffsetFromMpqOffset(TMPQArchive * ha, ULONGLONG MpqOffset); ULONGLONG CalculateRawSectorOffset(TMPQFile * hf, DWORD dwSectorOffset); -int ConvertMpqHeaderToFormat4(TMPQArchive * ha, ULONGLONG MpqOffset, ULONGLONG FileSize, DWORD dwFlags); +int ConvertMpqHeaderToFormat4(TMPQArchive * ha, ULONGLONG MpqOffset, ULONGLONG FileSize, DWORD dwFlags, bool bIsWarcraft3Map); bool IsValidHashEntry(TMPQArchive * ha, TMPQHash * pHash); diff --git a/test/StormTest.cpp b/test/StormTest.cpp index 21dcb7b..7e46a9d 100644 --- a/test/StormTest.cpp +++ b/test/StormTest.cpp @@ -4550,10 +4550,9 @@ int main(int argc, char * argv[]) if(nError == ERROR_SUCCESS) nError = TestOpenArchive("MPQ_2016_v1_KoreanFile.w3m"); */ - + // Load map protected by PG1.11.973 if(nError == ERROR_SUCCESS) - nError = TestOpenArchive_ProtectedMap("War3TFT_127b_Russian.exe", NULL, 17, "War3patch.mpq"); - + nError = TestOpenArchive("MPQ_2017_v1_Eden_RPG_S2_2.5J.w3x"); /* // Open the multi-file archive with wrong prefix to see how StormLib deals with it if(nError == ERROR_SUCCESS) -- cgit v1.2.3