aboutsummaryrefslogtreecommitdiff
path: root/src/SFileOpenArchive.cpp
diff options
context:
space:
mode:
authorLadislav Zezula <zezula@volny.cz>2020-12-13 12:32:25 +0100
committerLadislav Zezula <zezula@volny.cz>2020-12-13 12:32:25 +0100
commit383e1572eecafdfe4f92ddad7a4bece069e12f38 (patch)
tree9c419d10e4cb4e2e569155f91cc93a7fdec62efc /src/SFileOpenArchive.cpp
parent866269d740b32cf209e5188c5269c4118f8be07b (diff)
Added support for amternative MPQ markers
Diffstat (limited to 'src/SFileOpenArchive.cpp')
-rw-r--r--src/SFileOpenArchive.cpp42
1 files changed, 35 insertions, 7 deletions
diff --git a/src/SFileOpenArchive.cpp b/src/SFileOpenArchive.cpp
index 500e041..1d2c2f9 100644
--- a/src/SFileOpenArchive.cpp
+++ b/src/SFileOpenArchive.cpp
@@ -146,9 +146,37 @@ static int VerifyMpqTablePositions(TMPQArchive * ha, ULONGLONG FileSize)
return ERROR_SUCCESS;
}
-/*****************************************************************************/
-/* Public functions */
-/*****************************************************************************/
+//-----------------------------------------------------------------------------
+// Support for alternate markers. Call before SFileOpenArchive
+
+#define SFILE_MARKERS_MIN_SIZE (sizeof(DWORD) + sizeof(DWORD) + sizeof(const char *) + sizeof(const char *))
+
+bool WINAPI SFileSetArchiveMarkers(PSFILE_MARKERS pMarkers)
+{
+ // Check structure minimum size
+ if(pMarkers == NULL || pMarkers->dwSize < SFILE_MARKERS_MIN_SIZE)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return false;
+ }
+
+ // Make sure that the MPQ cryptography is initialized at this time
+ InitializeMpqCryptography();
+
+ // Remember the marker for MPQ header
+ g_dwMpqSignature = pMarkers->dwSignature;
+
+ // Remember the encryption key for hash table
+ if(pMarkers->szHashTableKey != NULL)
+ g_dwHashTableKey = HashString(pMarkers->szHashTableKey, MPQ_HASH_FILE_KEY);
+
+ // Remember the encryption key for block table
+ if(pMarkers->szBlockTableKey != NULL)
+ g_dwBlockTableKey = HashString(pMarkers->szBlockTableKey, MPQ_HASH_FILE_KEY);
+
+ // Succeeded
+ return true;
+}
//-----------------------------------------------------------------------------
// SFileGetLocale and SFileSetLocale
@@ -156,13 +184,13 @@ static int VerifyMpqTablePositions(TMPQArchive * ha, ULONGLONG FileSize)
LCID WINAPI SFileGetLocale()
{
- return lcFileLocale;
+ return g_lcFileLocale;
}
LCID WINAPI SFileSetLocale(LCID lcNewLocale)
{
- lcFileLocale = lcNewLocale;
- return lcFileLocale;
+ g_lcFileLocale = lcNewLocale;
+ return g_lcFileLocale;
}
//-----------------------------------------------------------------------------
@@ -323,7 +351,7 @@ bool WINAPI SFileOpenArchive(
// 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)
+ if(dwHeaderID == g_dwMpqSignature && dwHeaderSize >= MPQ_HEADER_SIZE_V1)
{
// Now convert the header to version 4
nError = ConvertMpqHeaderToFormat4(ha, ByteOffset, FileSize, dwFlags, MapType);