aboutsummaryrefslogtreecommitdiff
path: root/src/SFileOpenArchive.cpp
diff options
context:
space:
mode:
authorLadislav Zezula <ladislav.zezula@avg.com>2014-01-13 14:11:30 +0100
committerLadislav Zezula <ladislav.zezula@avg.com>2014-01-13 14:11:30 +0100
commit699180bf90ef4952dc7e0f57ce025f54424e30cd (patch)
tree63e6b8ebfd03cae39d0193e8498b7086640103d4 /src/SFileOpenArchive.cpp
parent8fa3f25f3e2654bfc1d4ff9caa0b9c849b8ee514 (diff)
+ Support for MPQs locked by the Spazzler protector
Diffstat (limited to 'src/SFileOpenArchive.cpp')
-rw-r--r--src/SFileOpenArchive.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/SFileOpenArchive.cpp b/src/SFileOpenArchive.cpp
index 27c9972..356aa59 100644
--- a/src/SFileOpenArchive.cpp
+++ b/src/SFileOpenArchive.cpp
@@ -21,12 +21,11 @@
/* Local functions */
/*****************************************************************************/
-static bool IsAviFile(void * pvFileBegin)
+static bool IsAviFile(DWORD * HeaderData)
{
- LPDWORD AviHeader = (DWORD *)pvFileBegin;
- DWORD DwordValue0 = BSWAP_INT32_UNSIGNED(AviHeader[0]);
- DWORD DwordValue2 = BSWAP_INT32_UNSIGNED(AviHeader[2]);
- DWORD DwordValue3 = BSWAP_INT32_UNSIGNED(AviHeader[3]);
+ DWORD DwordValue0 = BSWAP_INT32_UNSIGNED(HeaderData[0]);
+ DWORD DwordValue2 = BSWAP_INT32_UNSIGNED(HeaderData[2]);
+ DWORD DwordValue3 = BSWAP_INT32_UNSIGNED(HeaderData[3]);
// Test for 'RIFF', 'AVI ' or 'LIST'
return (DwordValue0 == 0x46464952 && DwordValue2 == 0x20495641 && DwordValue3 == 0x5453494C);
@@ -192,6 +191,7 @@ bool WINAPI SFileOpenArchive(
{
ULONGLONG SearchOffset = 0;
DWORD dwStreamFlags = 0;
+ DWORD dwHeaderSize;
DWORD dwHeaderID;
memset(ha, 0, sizeof(TMPQArchive));
@@ -231,7 +231,7 @@ bool WINAPI SFileOpenArchive(
}
// If there is the MPQ user data signature, process it
- dwHeaderID = BSWAP_INT32_UNSIGNED(*(LPDWORD)ha->HeaderData);
+ dwHeaderID = BSWAP_INT32_UNSIGNED(ha->HeaderData[0]);
if(dwHeaderID == ID_MPQ_USERDATA && ha->pUserData == NULL && (dwFlags & MPQ_OPEN_FORCE_MPQ_V1) == 0)
{
// Verify if this looks like a valid user data
@@ -249,8 +249,12 @@ bool WINAPI SFileOpenArchive(
}
}
- // There must be MPQ header signature
- if(dwHeaderID == ID_MPQ)
+ // There must be MPQ header signature. Note that STORM.dll from Warcraft III actually
+ // tests the MPQ header size. It must be at least 0x20 bytes in order to load it
+ // Abused by Spazzler Map protector. Note that the size check is not present
+ // in Storm.dll v 1.00, so Diablo I code would load the MPQ anyway.
+ dwHeaderSize = BSWAP_INT32_UNSIGNED(ha->HeaderData[1]);
+ if(dwHeaderID == ID_MPQ && dwHeaderSize >= MPQ_HEADER_SIZE_V1)
{
// Now convert the header to version 4
nError = ConvertMpqHeaderToFormat4(ha, SearchOffset, FileSize, dwFlags);