aboutsummaryrefslogtreecommitdiff
path: root/dep/CascLib/src/CascReadFile.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-06-23 10:25:18 +0200
committerShauren <shauren.trinity@gmail.com>2023-06-23 10:25:18 +0200
commit9ad1e5d635e2fd4c2486d5f2bf1cb52d8e768558 (patch)
tree00b379e3f84ff5b428f0fafd5bdeac0489ede0c4 /dep/CascLib/src/CascReadFile.cpp
parent54596eb8ce5d7933164073eb3768f52124ba4262 (diff)
Dep/CascLib: Update to ladislav-zezula/CascLib@ebd79e8fd43279343c543a27fce620f6b1b53cb9
Diffstat (limited to 'dep/CascLib/src/CascReadFile.cpp')
-rw-r--r--dep/CascLib/src/CascReadFile.cpp65
1 files changed, 51 insertions, 14 deletions
diff --git a/dep/CascLib/src/CascReadFile.cpp b/dep/CascLib/src/CascReadFile.cpp
index 35f91addf75..3fd173b9bde 100644
--- a/dep/CascLib/src/CascReadFile.cpp
+++ b/dep/CascLib/src/CascReadFile.cpp
@@ -116,7 +116,7 @@ static DWORD OpenDataStream(TCascFile * hf, PCASC_FILE_SPAN pFileSpan, PCASC_CKE
}
}
-#ifdef _DEBUG
+#ifdef CASCLIB_DEBUG
static unsigned int table_16C57A8[0x10] =
{
0x049396B8, 0x72A82A9B, 0xEE626CCA, 0x9917754F,
@@ -182,7 +182,7 @@ static DWORD ParseBlteHeader(PCASC_FILE_SPAN pFileSpan, PCASC_CKEY_ENTRY pCKeyEn
if(pEncodedHeader->EncodedSize != pCKeyEntry->EncodedSize)
return ERROR_BAD_FORMAT;
-#ifdef _DEBUG
+#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);
@@ -203,7 +203,7 @@ static DWORD ParseBlteHeader(PCASC_FILE_SPAN pFileSpan, PCASC_CKEY_ENTRY pCKeyEn
{
if(pBlteHeader->MustBe0F != 0x0F)
return ERROR_BAD_FORMAT;
-
+
// Verify the header size
FrameCount = ConvertBytesToInteger_3(pBlteHeader->FrameCount);
ExpectedHeaderSize = 0x0C + FrameCount * sizeof(BLTE_FRAME);
@@ -587,7 +587,7 @@ static DWORD DecodeFileFrame(
switch(pbEncoded[0])
{
case 'E': // Encrypted files
-
+
// The work buffer should not have been allocated by any step
assert(pbWorkBuffer == NULL && cbWorkBuffer == 0);
@@ -613,7 +613,7 @@ static DWORD DecodeFileFrame(
break;
case 'Z': // ZLIB compressed files
-
+
// If we decompressed less than expected, we simply fill the rest with zeros
// Example: INSTALL file from the TACT CASC storage
cbDecodedExpected = cbDecoded;
@@ -784,7 +784,7 @@ static DWORD ReadFile_WholeFile(TCascFile * hf, LPBYTE pbBuffer)
ULONGLONG ByteOffset = pFileSpan->ArchiveOffs + pFileSpan->HeaderSize;
DWORD EncodedSize = pCKeyEntry->EncodedSize - pFileSpan->HeaderSize;
- // Allocate the buffer for the entire encoded span
+ // Allocate the buffer for the entire encoded span
pbEncodedPtr = pbEncoded = CASC_ALLOC<BYTE>(EncodedSize);
if(pbEncoded == NULL)
{
@@ -1020,6 +1020,29 @@ bool WINAPI CascGetFileInfo(HANDLE hFile, CASC_FILE_INFO_CLASS InfoClass, void *
return (pbOutputValue != NULL);
}
+bool WINAPI CascSetFileFlags(HANDLE hFile, DWORD dwOpenFlags)
+{
+ TCascFile * hf;
+
+ // Validate the file handle
+ if((hf = TCascFile::IsValid(hFile)) == NULL)
+ {
+ SetCascError(ERROR_INVALID_HANDLE);
+ return false;
+ }
+
+ // Currently, only CASC_OVERCOME_ENCRYPTED can be changed
+ if(dwOpenFlags & ~CASC_OVERCOME_ENCRYPTED)
+ {
+ SetCascError(ERROR_INVALID_PARAMETER);
+ return false;
+ }
+
+ // Set "overcome encrypted" flag. Will apply on next CascReadFile
+ hf->bOvercomeEncrypted = (dwOpenFlags & CASC_OVERCOME_ENCRYPTED) != 0;
+ return true;
+}
+
//
// THE FILE SIZE PROBLEM
//
@@ -1031,7 +1054,7 @@ bool WINAPI CascGetFileInfo(HANDLE hFile, CASC_FILE_INFO_CLASS InfoClass, void *
// HotS(29049) ENCODING 0x0024BA45 - 0x0024b98a 0x0024BA45 n/a 0x0024BA45 n/a
// HotS(29049) ROOT 0x00193340 - 0x00193340 0x0010db65 0x00193340 0x0010db65 n/a
// HotS(29049) (other) 0x00001080 - 0x00001080 0x000008eb 0x00001080 0x000008eb 0x00001080
-//
+//
// WoW(18888) ENCODING 0x030d487b - 0x030dee79 0x030d487b n/a 0x030d487b n/a
// WoW(18888) ROOT 0x016a9800 - n/a 0x0131313d 0x016a9800 0x0131313d n/a
// WoW(18888) (other) 0x000007d0 - 0x000007d0 0x00000397 0x000007d0 0x00000397 n/a
@@ -1042,6 +1065,13 @@ bool WINAPI CascGetFileSize64(HANDLE hFile, PULONGLONG PtrFileSize)
TCascFile * hf;
DWORD dwErrCode;
+ // Validate the file pointer
+ if(PtrFileSize == NULL)
+ {
+ SetCascError(ERROR_INVALID_PARAMETER);
+ return false;
+ }
+
// Validate the file handle
if((hf = TCascFile::IsValid(hFile)) == NULL)
{
@@ -1049,11 +1079,11 @@ bool WINAPI CascGetFileSize64(HANDLE hFile, PULONGLONG PtrFileSize)
return false;
}
- // Validate the file pointer
- if(PtrFileSize == NULL)
+ // If the content key is zeros, we treat the file as a file with size of 0
+ if(hf->ContentSize == 0)
{
- SetCascError(ERROR_INVALID_PARAMETER);
- return false;
+ PtrFileSize[0] = 0;
+ return true;
}
// ENCODING on older storages: Content size is not present in the BUILD file
@@ -1157,7 +1187,7 @@ DWORD WINAPI CascSetFilePointer(HANDLE hFile, LONG lFilePos, LONG * PtrFilePosHi
{
ULONGLONG NewPos = 0;
LONGLONG DistanceToMove;
-
+
// Assemble the 64-bit distance to move
DistanceToMove = (PtrFilePosHigh != NULL) ? MAKE_OFFSET64(PtrFilePosHigh[0], lFilePos) : (LONGLONG)(LONG)lFilePos;
@@ -1196,6 +1226,13 @@ bool WINAPI CascReadFile(HANDLE hFile, void * pvBuffer, DWORD dwBytesToRead, PDW
return false;
}
+ // Check files with zero size
+ if(hf->ContentSize == 0)
+ {
+ PtrBytesRead[0] = 0;
+ return true;
+ }
+
// If we don't have file frames loaded, we need to do it now.
// Need to do it before file range check, as the file size may be unknown at this point
dwErrCode = EnsureFileSpanFramesLoaded(hf);
@@ -1242,7 +1279,7 @@ bool WINAPI CascReadFile(HANDLE hFile, void * pvBuffer, DWORD dwBytesToRead, PDW
{
// No caching at all. The entire file will be read directly to the user buffer
// Used for loading internal files, where we need to read the whole file
- case CascCacheNothing:
+ case CascCacheNothing:
dwBytesRead2 = ReadFile_NonCached(hf, pbBuffer, StartOffset, EndOffset);
break;
@@ -1268,7 +1305,7 @@ bool WINAPI CascReadFile(HANDLE hFile, void * pvBuffer, DWORD dwBytesToRead, PDW
if(PtrBytesRead != NULL)
PtrBytesRead[0] = 0;
hf->FilePointer = SaveFilePointer;
-
+
// If 0 bytes were requested, it's actually a success
return (dwBytesToRead == 0);
}