diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-09-05 00:10:35 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-09-05 00:10:35 +0200 |
commit | d57b58849bda868f2463d38cc636f01af919316c (patch) | |
tree | 5beef62c041526d9468683e4388b6341f1530cc1 /dep/CascLib/src/CascReadFile.cpp | |
parent | ba224f70ad81fa0e5d1f0c4daf197e143317cdaa (diff) |
Dep/CascLib: Update to ladislav-zezula/CascLib@5c60050770767f2e606f6fec0c35beb8b9b00c60
Diffstat (limited to 'dep/CascLib/src/CascReadFile.cpp')
-rw-r--r-- | dep/CascLib/src/CascReadFile.cpp | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/dep/CascLib/src/CascReadFile.cpp b/dep/CascLib/src/CascReadFile.cpp index c2a209bb307..32efbc5b100 100644 --- a/dep/CascLib/src/CascReadFile.cpp +++ b/dep/CascLib/src/CascReadFile.cpp @@ -161,9 +161,8 @@ static void VerifyHeaderSpan(PBLTE_ENCODED_HEADER pBlteHeader, ULONGLONG HeaderO } #endif -static DWORD ParseBlteHeader(PCASC_FILE_SPAN pFileSpan, PCASC_CKEY_ENTRY pCKeyEntry, ULONGLONG HeaderOffset, LPBYTE pbEncodedBuffer, size_t cbEncodedBuffer, size_t * pcbHeaderSize) +static DWORD ParseBlteHeader(PCASC_FILE_SPAN pFileSpan, ULONGLONG HeaderOffset, LPBYTE pbEncodedBuffer, size_t cbEncodedBuffer, size_t * pcbHeaderSize) { - PBLTE_ENCODED_HEADER pEncodedHeader = (PBLTE_ENCODED_HEADER)pbEncodedBuffer; PBLTE_HEADER pBlteHeader = (PBLTE_HEADER)pbEncodedBuffer; DWORD ExpectedHeaderSize; DWORD ExHeaderSize = 0; @@ -176,29 +175,29 @@ static DWORD ParseBlteHeader(PCASC_FILE_SPAN pFileSpan, PCASC_CKEY_ENTRY pCKeyEn // On local files, there is just BLTE_HEADER if(ConvertBytesToInteger_4_LE(pBlteHeader->Signature) != BLTE_HEADER_SIGNATURE) { + PBLTE_ENCODED_HEADER pEncodedHeader; + // There must be at least some bytes if(cbEncodedBuffer < FIELD_OFFSET(BLTE_ENCODED_HEADER, MustBe0F)) return ERROR_BAD_FORMAT; + pEncodedHeader = (PBLTE_ENCODED_HEADER)pbEncodedBuffer; - // Note that some newer WoW builds have the entire encoded part zeroed - // Tested on WoW retail 50401, file DBFilesClient\\LoreTextPublic.db2 - if(pEncodedHeader->EncodedSize != 0 && pEncodedHeader->EncodedSize != pCKeyEntry->EncodedSize) + // Since Jul-2023, users report that the the encoded part of the BLTE header + // may contain zeros or even complete garbage. Do NOT test anything else than the signature + // Tested on WoW Classic 49821, file "Sound\\Music\\GlueScreenMusic\\wow_main_theme.mp3" + // Data File: data.004, file offset 00000000-18BDD2AA (encoded header zeroed) + if(ConvertBytesToInteger_4_LE(pEncodedHeader->Signature) != BLTE_HEADER_SIGNATURE) return ERROR_BAD_FORMAT; + pBlteHeader = (PBLTE_HEADER)(pEncodedHeader->Signature); + ExHeaderSize = FIELD_OFFSET(BLTE_ENCODED_HEADER, Signature); #ifdef CASCLIB_DEBUG // Not really needed, it's here just for explanation of what the values mean //assert(memcmp(pCKeyEntry->EKey, pEncodedHeader->EKey.Value, MD5_HASH_SIZE) == 0); VerifyHeaderSpan(pEncodedHeader, HeaderOffset); #endif - // Capture the EKey - ExHeaderSize = FIELD_OFFSET(BLTE_ENCODED_HEADER, Signature); - pBlteHeader = (PBLTE_HEADER)(pbEncodedBuffer + ExHeaderSize); } - // Verify the signature - if(ConvertBytesToInteger_4_LE(pBlteHeader->Signature) != BLTE_HEADER_SIGNATURE) - return ERROR_BAD_FORMAT; - // Capture the header size. If this is non-zero, then array // of chunk headers follow. Otherwise, the file is just one chunk HeaderSize = ConvertBytesToInteger_4(pBlteHeader->HeaderSize); @@ -230,7 +229,7 @@ static LPBYTE ReadMissingHeaderData(PCASC_FILE_SPAN pFileSpan, ULONGLONG DataFil { LPBYTE pbNewBuffer; - // Reallocate the buffer + // Reallocate the buffer. Note that if this fails, the original buffer is still valid pbNewBuffer = CASC_REALLOC(pbEncodedBuffer, cbTotalHeaderSize); if(pbNewBuffer != NULL) { @@ -408,7 +407,7 @@ static DWORD LoadEncodedHeaderAndSpanFrames(PCASC_FILE_SPAN pFileSpan, PCASC_CKE if(FileStream_Read(pFileSpan->pStream, &ReadOffset, pbEncodedBuffer, (DWORD)cbEncodedBuffer)) { // Parse the BLTE header - dwErrCode = ParseBlteHeader(pFileSpan, pCKeyEntry, ReadOffset, pbEncodedBuffer, cbEncodedBuffer, &cbHeaderSize); + dwErrCode = ParseBlteHeader(pFileSpan, ReadOffset, pbEncodedBuffer, cbEncodedBuffer, &cbHeaderSize); if(dwErrCode == ERROR_SUCCESS) { // If the headers are larger than the initial read size, we read the missing data |