From 0d89b2b473dc618c5f5f5fb051121e34cdedad00 Mon Sep 17 00:00:00 2001 From: Ladislav Zezula Date: Fri, 6 Oct 2023 06:38:05 +0200 Subject: Fixed bug in SFileSetFileLocale --- src/SBaseCommon.cpp | 4 ++-- src/SFileAddFile.cpp | 4 ++-- src/SFileCompactArchive.cpp | 2 +- src/SFileGetFileInfo.cpp | 2 +- src/StormLib.h | 12 +++++++----- 5 files changed, 13 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/SBaseCommon.cpp b/src/SBaseCommon.cpp index cb78bb5..de6c58f 100644 --- a/src/SBaseCommon.cpp +++ b/src/SBaseCommon.cpp @@ -403,7 +403,7 @@ DWORD GetDefaultSpecialFileFlags(DWORD dwFileSize, USHORT wFormatVersion) { // Fixed for format 1.0 if(wFormatVersion == MPQ_FORMAT_VERSION_1) - return MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY; + return MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | MPQ_FILE_KEY_V2; // Size-dependent for formats 2.0-4.0 return (dwFileSize > 0x4000) ? (MPQ_FILE_COMPRESS | MPQ_FILE_SECTOR_CRC) : (MPQ_FILE_COMPRESS | MPQ_FILE_SINGLE_UNIT); @@ -696,7 +696,7 @@ DWORD DecryptFileKey( dwFileKey = HashString(szFileName, MPQ_HASH_FILE_KEY); // Fix the key, if needed - if(dwFlags & MPQ_FILE_FIX_KEY) + if(dwFlags & MPQ_FILE_KEY_V2) dwFileKey = (dwFileKey + dwMpqPos) ^ dwFileSize; // Return the key diff --git a/src/SFileAddFile.cpp b/src/SFileAddFile.cpp index 2d14dda..1baf1fa 100644 --- a/src/SFileAddFile.cpp +++ b/src/SFileAddFile.cpp @@ -433,7 +433,7 @@ DWORD SFileAddFile_Init( // Fix Key is not allowed if the file is not encrypted if(!(dwFlags & MPQ_FILE_ENCRYPTED)) - dwFlags &= ~MPQ_FILE_FIX_KEY; + dwFlags &= ~MPQ_FILE_KEY_V2; // If the MPQ is of version 3.0 or higher, we ignore file locale. // This is because HET and BET tables have no known support for it @@ -1303,7 +1303,7 @@ bool WINAPI SFileSetFileLocale(HANDLE hFile, LCID lcNewLocale) } // We have to check if the file+locale is not already there - pFileEntry = GetFileEntryLocale(ha, hf->pFileEntry->szFileName, lcNewLocale, NULL); + pFileEntry = GetFileEntryExact(ha, hf->pFileEntry->szFileName, lcNewLocale, NULL); if(pFileEntry != NULL) { SetLastError(ERROR_ALREADY_EXISTS); diff --git a/src/SFileCompactArchive.cpp b/src/SFileCompactArchive.cpp index d4525b6..1077daa 100644 --- a/src/SFileCompactArchive.cpp +++ b/src/SFileCompactArchive.cpp @@ -163,7 +163,7 @@ static DWORD CopyMpqFileSectors( if(dwErrCode == ERROR_SUCCESS && (pFileEntry->dwFlags & MPQ_FILE_ENCRYPTED)) { dwFileKey2 = dwFileKey1 = hf->dwFileKey; - if(pFileEntry->dwFlags & MPQ_FILE_FIX_KEY) + if(pFileEntry->dwFlags & MPQ_FILE_KEY_V2) { dwFileKey2 = (dwFileKey1 ^ pFileEntry->dwFileSize) - (DWORD)pFileEntry->ByteOffset; dwFileKey2 = (dwFileKey2 + (DWORD)MpqFilePos) ^ pFileEntry->dwFileSize; diff --git a/src/SFileGetFileInfo.cpp b/src/SFileGetFileInfo.cpp index 2a4d7b3..7a8afe0 100644 --- a/src/SFileGetFileInfo.cpp +++ b/src/SFileGetFileInfo.cpp @@ -437,7 +437,7 @@ bool WINAPI SFileGetFileInfo( case SFileInfoEncryptionKeyRaw: dwInt32Value = hf->dwFileKey; - if(pFileEntry->dwFlags & MPQ_FILE_FIX_KEY) + if(pFileEntry->dwFlags & MPQ_FILE_KEY_V2) dwInt32Value = (dwInt32Value ^ pFileEntry->dwFileSize) - (DWORD)hf->MpqFilePos; return GetInfo(pvFileInfo, cbFileInfo, &dwInt32Value, sizeof(DWORD), pcbLengthNeeded); diff --git a/src/StormLib.h b/src/StormLib.h index 4d5992d..901f943 100644 --- a/src/StormLib.h +++ b/src/StormLib.h @@ -218,8 +218,8 @@ extern "C" { // Flags for TMPQBlock::dwFlags #define MPQ_FILE_IMPLODE 0x00000100 // Implode method (By PKWARE Data Compression Library) #define MPQ_FILE_COMPRESS 0x00000200 // Compress methods (By multiple methods) -#define MPQ_FILE_ENCRYPTED 0x00010000 // Indicates whether file is encrypted -#define MPQ_FILE_FIX_KEY 0x00020000 // File decryption key has to be fixed +#define MPQ_FILE_ENCRYPTED 0x00010000 // Indicates an encrypted file +#define MPQ_FILE_KEY_V2 0x00020000 // Indicates an encrypted file with key v2 #define MPQ_FILE_PATCH_FILE 0x00100000 // The file is a patch file. Raw file data begin with TPatchInfo structure #define MPQ_FILE_SINGLE_UNIT 0x01000000 // File is stored as a single unit, rather than split into sectors (Thx, Quantam) #define MPQ_FILE_DELETE_MARKER 0x02000000 // File is a deletion marker. Used in MPQ patches, indicating that the file no longer exists. @@ -233,10 +233,12 @@ extern "C" { #define MPQ_FILE_DEFAULT_INTERNAL 0xFFFFFFFF // Use default flags for internal files +#define MPQ_FILE_FIX_KEY 0x00020000 // Obsolete, do not use + #define MPQ_FILE_VALID_FLAGS (MPQ_FILE_IMPLODE | \ MPQ_FILE_COMPRESS | \ MPQ_FILE_ENCRYPTED | \ - MPQ_FILE_FIX_KEY | \ + MPQ_FILE_KEY_V2 | \ MPQ_FILE_PATCH_FILE | \ MPQ_FILE_SINGLE_UNIT | \ MPQ_FILE_DELETE_MARKER | \ @@ -247,7 +249,7 @@ extern "C" { #define MPQ_FILE_VALID_FLAGS_W3X (MPQ_FILE_IMPLODE | \ MPQ_FILE_COMPRESS | \ MPQ_FILE_ENCRYPTED | \ - MPQ_FILE_FIX_KEY | \ + MPQ_FILE_KEY_V2 | \ MPQ_FILE_DELETE_MARKER | \ MPQ_FILE_SECTOR_CRC | \ MPQ_FILE_SIGNATURE | \ @@ -256,7 +258,7 @@ extern "C" { #define MPQ_FILE_VALID_FLAGS_SCX (MPQ_FILE_IMPLODE | \ MPQ_FILE_COMPRESS | \ MPQ_FILE_ENCRYPTED | \ - MPQ_FILE_FIX_KEY | \ + MPQ_FILE_KEY_V2 | \ MPQ_FILE_EXISTS) // Flags for TPatchInfo::dwFlags -- cgit v1.2.3