diff options
Diffstat (limited to 'dep/CascLib/src/CascOpenStorage.cpp')
-rw-r--r-- | dep/CascLib/src/CascOpenStorage.cpp | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/dep/CascLib/src/CascOpenStorage.cpp b/dep/CascLib/src/CascOpenStorage.cpp index 398dfb62960..ec277f67c13 100644 --- a/dep/CascLib/src/CascOpenStorage.cpp +++ b/dep/CascLib/src/CascOpenStorage.cpp @@ -121,6 +121,29 @@ static bool IsIndexFileName_V2(const TCHAR * szFileName) _tcsicmp(szFileName + 0x0A, _T(".idx")) == 0); } +static bool IsRootFile_Starcraft1(LPBYTE pbFileData, DWORD cbFileData) +{ + LPBYTE pbFileEnd = pbFileData + cbFileData; + LPBYTE pbHashName; + LPBYTE pbHashEnd; + + // Skip the file name + while(pbFileData < pbFileEnd && pbFileData[0] != '|') + pbFileData++; + if(pbFileData[0] != '|') + return false; + + // Then, a MD5 must follow + pbHashName = pbHashEnd = pbFileData + 1; + while(pbHashEnd < pbFileEnd && pbHashEnd[0] != 0x0A) + pbHashEnd++; + if(pbHashEnd[0] != 0x0A) + return false; + + // The length must be exactly 32 characters + return ((pbHashEnd - pbHashName) == 32); +} + static bool IsCascIndexHeader_V1(LPBYTE pbFileData, DWORD cbFileData) { PFILE_INDEX_HEADER_V1 pIndexHeader = (PFILE_INDEX_HEADER_V1)pbFileData; @@ -913,7 +936,10 @@ static int LoadRootFile(TCascStorage * hs, DWORD dwLocaleMask) break; default: - nError = RootHandler_CreateWoW6(hs, pbRootFile, cbRootFile, dwLocaleMask); + if(IsRootFile_Starcraft1(pbRootFile, cbRootFile)) + nError = RootHandler_CreateSC1(hs, pbRootFile, cbRootFile); + else + nError = RootHandler_CreateWoW6(hs, pbRootFile, cbRootFile, dwLocaleMask); break; } } @@ -1123,6 +1149,10 @@ bool WINAPI CascGetStorageInfo( dwInfoValue = hs->dwBuildNumber; break; + case CascStorageInstalledLocales: + dwInfoValue = hs->dwDefaultLocale; + break; + default: SetLastError(ERROR_INVALID_PARAMETER); return false; |