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 +- 4 files changed, 7 insertions(+), 6 deletions(-) (limited to 'src') 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); -- cgit v1.2.3