mirror of
https://github.com/ladislav-zezula/StormLib.git
synced 2026-02-16 02:38:30 +01:00
Code refined
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Local functions
|
||||
|
||||
static MTYPE CheckMapType(ULONGLONG FileSize, LPCTSTR szFileName, LPBYTE pbHeaderBuffer, size_t cbHeaderBuffer)
|
||||
static MTYPE CheckMapType(LPCTSTR szFileName, LPBYTE pbHeaderBuffer, size_t cbHeaderBuffer)
|
||||
{
|
||||
LPDWORD HeaderInt32 = (LPDWORD)pbHeaderBuffer;
|
||||
LPCTSTR szExtension;
|
||||
@@ -35,15 +35,6 @@ static MTYPE CheckMapType(ULONGLONG FileSize, LPCTSTR szFileName, LPBYTE pbHeade
|
||||
DWORD DwordValue2 = BSWAP_INT32_UNSIGNED(HeaderInt32[2]);
|
||||
DWORD DwordValue3 = BSWAP_INT32_UNSIGNED(HeaderInt32[3]);
|
||||
|
||||
// Check possible MPQs from Starcraft I BETA. We recognize them by checking the file size.
|
||||
// 167 859: patch_rt.mpq (doesn't contain any WAVE files)
|
||||
// 55 674 173: StarDat.mpq
|
||||
// 183 519 584: Install.exe
|
||||
if(FileSize == 55674173 && DwordValue1 == MPQ_HEADER_SIZE_V1 && DwordValue3 == 0x00030000)
|
||||
return MapTypeStarcraftBeta;
|
||||
if(FileSize == 183519584 && DwordValue0 == 0x00905a4D && DwordValue1 == 3 && DwordValue2 == 4)
|
||||
return MapTypeStarcraftBeta;
|
||||
|
||||
// Check maps by extension (Starcraft, Starcraft II). We must do this before
|
||||
// checking actual data, because the "NP_Protect" protector places
|
||||
// fake Warcraft III header into the Starcraft II maps
|
||||
@@ -84,6 +75,20 @@ static MTYPE CheckMapType(ULONGLONG FileSize, LPCTSTR szFileName, LPBYTE pbHeade
|
||||
return MapTypeNotRecognized;
|
||||
}
|
||||
|
||||
static bool IsStarcraftBetaArchive(TMPQHeader * pHeader)
|
||||
{
|
||||
// The archive must be version 1, with a standard header size
|
||||
if(pHeader->dwID == ID_MPQ && pHeader->dwHeaderSize == MPQ_HEADER_SIZE_V1)
|
||||
{
|
||||
// Check for known archive sizes
|
||||
return (pHeader->dwArchiveSize == 0x00028FB3 || // patch_rt.mpq
|
||||
pHeader->dwArchiveSize == 0x0351853D || // StarDat.mpq
|
||||
pHeader->dwArchiveSize == 0x0AEC8960); // INSTALL.exe
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static TMPQUserData * IsValidMpqUserData(ULONGLONG ByteOffset, ULONGLONG FileSize, void * pvUserData)
|
||||
{
|
||||
TMPQUserData * pUserData;
|
||||
@@ -330,7 +335,7 @@ bool WINAPI SFileOpenArchive(
|
||||
if(MapType == MapTypeNotChecked)
|
||||
{
|
||||
// Do nothing if the file is an AVI file
|
||||
if((MapType = CheckMapType(FileSize, szMpqName, pbHeaderBuffer, dwBytesAvailable)) == MapTypeAviFile)
|
||||
if((MapType = CheckMapType(szMpqName, pbHeaderBuffer, dwBytesAvailable)) == MapTypeAviFile)
|
||||
{
|
||||
dwErrCode = ERROR_AVI_FILE;
|
||||
break;
|
||||
@@ -456,10 +461,8 @@ bool WINAPI SFileOpenArchive(
|
||||
ha->dwFlags |= MPQ_FLAG_LISTFILE_FORCE;
|
||||
|
||||
// StarDat.mpq from Starcraft I BETA: Enable special compression types
|
||||
if(MapType == MapTypeStarcraftBeta)
|
||||
{
|
||||
if(IsStarcraftBetaArchive(ha->pHeader))
|
||||
ha->dwFlags |= MPQ_FLAG_STARCRAFT_BETA;
|
||||
}
|
||||
|
||||
// Remember whether whis is a map for Warcraft III
|
||||
if(MapType == MapTypeWarcraft3)
|
||||
|
||||
Reference in New Issue
Block a user