bool ChunkedFile::loadFile(HANDLE mpq, std::string const& fileName, bool log) { free(); HANDLE file; if (!CascOpenFile(mpq, fileName.c_str(), CASC_LOCALE_ALL, 0, &file)) { if (log) printf("No such file %s\n", fileName.c_str()); return false; } data_size = CascGetFileSize(file, nullptr); data = new uint8[data_size]; CascReadFile(file, data, data_size, nullptr/*bytesRead*/); parseChunks(); if (prepareLoadedData()) { CascCloseFile(file); return true; } printf("Error loading %s\n", fileName.c_str()); CascCloseFile(file); free(); return false; }
static LPBYTE LoadFileToMemory(TCascStorage * hs, LPBYTE pbEncodingKey, DWORD * pcbFileData) { QUERY_KEY EncodingKey; LPBYTE pbFileData = NULL; HANDLE hFile; DWORD cbBytesRead = 0; DWORD cbFileData = 0; // Open the file by encoding key EncodingKey.pbData = pbEncodingKey; EncodingKey.cbData = MD5_HASH_SIZE; if(CascOpenFileByEncodingKey((HANDLE)hs, &EncodingKey, 0, &hFile)) { // Retrieve the file size cbFileData = CascGetFileSize(hFile, NULL); if(cbFileData > 0) { pbFileData = CASC_ALLOC(BYTE, cbFileData); if(pbFileData != NULL) { CascReadFile(hFile, pbFileData, cbFileData, &cbBytesRead); } } // Close the file CascCloseFile(hFile); } // Give the file to the caller if(pcbFileData != NULL) pcbFileData[0] = cbBytesRead; return pbFileData; }
qint64 CascFile::bytesAvailable() const{ QMutexLocker lock(&d->Storage->Lock); if(!this->isOpen()) return QIODevice::bytesAvailable(); DWORD hiSize; DWORD loSize = CascGetFileSize(d->FileHandle, &hiSize); return (qint64(hiSize) << 32 | loSize) - this->pos(); }
static int TestOpenStorage_OpenFile(const TCHAR * szStorage, const char * szFileName) { HANDLE hStorage; HANDLE hFile; DWORD dwBytesRead; BYTE Buffer[0x1000]; int nError = ERROR_SUCCESS; // Open the storage directory if(!CascOpenStorage(szStorage, 0, &hStorage)) { assert(GetLastError() != ERROR_SUCCESS); nError = GetLastError(); } DWORD dwFileCount = 0; if(CascGetStorageInfo(hStorage, CascStorageFileCount, &dwFileCount, sizeof(DWORD), NULL)) { printf("file count: %d\n", dwFileCount); } DWORD dwFeatures = 0; if(CascGetStorageInfo(hStorage, CascStorageFeatures, &dwFeatures, sizeof(DWORD), NULL)) { printf("support listfile? %s\n", (dwFeatures & CASC_FEATURE_LISTFILE) ? "YES" : "NO"); } if(nError == ERROR_SUCCESS) { // Open a file if(!CascOpenFile(hStorage, szFileName, CASC_LOCALE_ZHCN, 0, &hFile)) { assert(GetLastError() != ERROR_SUCCESS); nError = GetLastError(); } } // Read some data from the file if(nError == ERROR_SUCCESS) { DWORD dwFileSize, dwFileSizeHigh; dwFileSize = CascGetFileSize(hFile, &dwFileSizeHigh); printf("file name : %s, file size: %d\n", szFileName, dwFileSize); // Read data from the file CascReadFile(hFile, Buffer, sizeof(Buffer), &dwBytesRead); CascCloseFile(hFile); } // Close storage and return if(hStorage != NULL) CascCloseStorage(hStorage); return nError; }
static void DumpIndexKey( FILE * fp, TCascStorage * hs, LPBYTE pbIndexKey, int nDumpLevel) { PCASC_INDEX_ENTRY pIndexEntry; TCascFile * hf; QUERY_KEY QueryKey; HANDLE hFile; BYTE HeaderArea[MAX_HEADER_AREA_SIZE]; char szBuffer[0x20]; QueryKey.pbData = pbIndexKey; QueryKey.cbData = MD5_HASH_SIZE; pIndexEntry = FindIndexEntry(hs, &QueryKey); if(pIndexEntry != NULL) { ULONGLONG FileOffset = ConvertBytesToInteger_5(pIndexEntry->FileOffsetBE); DWORD ArchIndex = (DWORD)(FileOffset >> 0x1E); DWORD FileSize = ConvertBytesToInteger_4_LE(pIndexEntry->FileSizeLE); // Mask the file offset FileOffset &= 0x3FFFFFFF; fprintf(fp, " data.%03u at 0x%08x (0x%lx bytes)\n", ArchIndex, (DWORD)FileOffset, FileSize); if(nDumpLevel > 2) { QueryKey.pbData = pIndexEntry->IndexKey; QueryKey.cbData = MD5_HASH_SIZE; if(CascOpenFileByIndexKey((HANDLE)hs, &QueryKey, 0, &hFile)) { // Make sure that the data file is open and frame header loaded CascGetFileSize(hFile, NULL); hf = IsValidFileHandle(hFile); assert(hf->pStream != NULL); // Read the header area FileOffset = hf->HeaderOffset - BLTE_HEADER_DELTA; FileStream_Read(hf->pStream, &FileOffset, HeaderArea, sizeof(HeaderArea)); CascCloseFile(hFile); // Dump the header area fprintf(fp, " FileSize: %X Rest: %s\n", ConvertBytesToInteger_4_LE(&HeaderArea[0x10]), StringFromBinary(&HeaderArea[0x14], 10, szBuffer)); } } }