static int LoadMpqPatch_BSD0(TMPQFile * hf, TPatchHeader * pPatchHeader) { LPBYTE pbDecompressed = NULL; LPBYTE pbCompressed = NULL; DWORD cbDecompressed = 0; DWORD cbCompressed = 0; DWORD dwBytesRead = 0; int nError = ERROR_SUCCESS; // Allocate space for compressed data cbCompressed = pPatchHeader->dwXfrmBlockSize - SIZE_OF_XFRM_HEADER; pbCompressed = ALLOCMEM(BYTE, cbCompressed); if(pbCompressed == NULL) nError = ERROR_SUCCESS; // Read the compressed patch data if(nError == ERROR_SUCCESS) { // Load the rest of the header SFileReadFile((HANDLE)hf, pbCompressed, cbCompressed, &dwBytesRead); if(dwBytesRead != cbCompressed) nError = ERROR_FILE_CORRUPT; } // Get the uncompressed size of the patch if(nError == ERROR_SUCCESS) { cbDecompressed = pPatchHeader->dwSizeOfPatchData - sizeof(TPatchHeader); hf->pPatchHeader = (TPatchHeader *)ALLOCMEM(BYTE, pPatchHeader->dwSizeOfPatchData); if(hf->pPatchHeader == NULL) nError = ERROR_NOT_ENOUGH_MEMORY; } // Now decompress the patch data if(nError == ERROR_SUCCESS) { // Copy the patch header memcpy(hf->pPatchHeader, pPatchHeader, sizeof(TPatchHeader)); pbDecompressed = (LPBYTE)hf->pPatchHeader + sizeof(TPatchHeader); // Uncompress or copy the patch data if(cbCompressed < cbDecompressed) { Decompress_RLE(pbDecompressed, cbDecompressed, pbCompressed, cbCompressed); } else { assert(cbCompressed == cbDecompressed); memcpy(pbDecompressed, pbCompressed, cbCompressed); } } // Free buffers and exit if(pbCompressed != NULL) FREEMEM(pbCompressed); return nError; }
static int LoadFilePatch_BSD0(TMPQFile * hf, PMPQ_PATCH_HEADER pFullPatch) { LPBYTE pbDecompressed = (LPBYTE)(pFullPatch + 1); LPBYTE pbCompressed = NULL; DWORD cbDecompressed = 0; DWORD cbCompressed = 0; DWORD dwBytesRead = 0; int nError = ERROR_SUCCESS; // Calculate the size of compressed data cbDecompressed = pFullPatch->dwSizeOfPatchData - sizeof(MPQ_PATCH_HEADER); cbCompressed = pFullPatch->dwXfrmBlockSize - SIZE_OF_XFRM_HEADER; // Is that file compressed? if(cbCompressed < cbDecompressed) { pbCompressed = STORM_ALLOC(BYTE, cbCompressed); if(pbCompressed == NULL) nError = ERROR_NOT_ENOUGH_MEMORY; // Read the compressed patch data if(nError == ERROR_SUCCESS) { SFileReadFile((HANDLE)hf, pbCompressed, cbCompressed, &dwBytesRead, NULL); if(dwBytesRead != cbCompressed) nError = ERROR_FILE_CORRUPT; } // Decompress the data if(nError == ERROR_SUCCESS) Decompress_RLE(pbDecompressed, cbDecompressed, pbCompressed, cbCompressed); if(pbCompressed != NULL) STORM_FREE(pbCompressed); } else { SFileReadFile((HANDLE)hf, pbDecompressed, cbDecompressed, &dwBytesRead, NULL); if(dwBytesRead != cbDecompressed) nError = ERROR_FILE_CORRUPT; } return nError; }
static int LoadFilePatch_BSD0(TMPQFile * hf, PMPQ_PATCH_HEADER pFullPatch) { unsigned char * pbDecompressed = (unsigned char *)(pFullPatch + 1); unsigned char * pbCompressed = NULL; size_t cbDecompressed = 0; size_t cbCompressed = 0; size_t dwBytesRead = 0; int nError = ERROR_SUCCESS; /* Calculate the size of compressed data */ cbDecompressed = pFullPatch->dwSizeOfPatchData - sizeof(MPQ_PATCH_HEADER); cbCompressed = pFullPatch->dwXfrmBlockSize - SIZE_OF_XFRM_HEADER; /* Is that file compressed? */ if(cbCompressed < cbDecompressed) { pbCompressed = STORM_ALLOC(uint8_t, cbCompressed); if(pbCompressed == NULL) nError = ERROR_NOT_ENOUGH_MEMORY; /* Read the compressed patch data */ if(nError == ERROR_SUCCESS) { SFileReadFile((void *)hf, pbCompressed, cbCompressed, &dwBytesRead); if(dwBytesRead != cbCompressed) nError = ERROR_FILE_CORRUPT; } /* Decompress the data */ if(nError == ERROR_SUCCESS) Decompress_RLE(pbDecompressed, cbDecompressed, pbCompressed, cbCompressed); if(pbCompressed != NULL) STORM_FREE(pbCompressed); } else { SFileReadFile((void *)hf, pbDecompressed, cbDecompressed, &dwBytesRead); if(dwBytesRead != cbDecompressed) nError = ERROR_FILE_CORRUPT; } return nError; }
bool IsPatchData(const void * pvData, DWORD cbData, LPDWORD pdwPatchedFileSize) { TPatchHeader * pPatchHeader = (TPatchHeader *)pvData; BLIZZARD_BSDIFF40_FILE DiffFile; DWORD dwPatchType; if(cbData >= sizeof(TPatchHeader) + sizeof(BLIZZARD_BSDIFF40_FILE)) { dwPatchType = BSWAP_INT32_UNSIGNED(pPatchHeader->dwPatchType); if(dwPatchType == 0x30445342) { // Give the caller the patch file size if(pdwPatchedFileSize != NULL) { Decompress_RLE((LPBYTE)&DiffFile, sizeof(BLIZZARD_BSDIFF40_FILE), (LPBYTE)(pPatchHeader + 1), sizeof(BLIZZARD_BSDIFF40_FILE)); DiffFile.NewFileSize = BSWAP_INT64_UNSIGNED(DiffFile.NewFileSize); *pdwPatchedFileSize = (DWORD)DiffFile.NewFileSize; return true; } } } return false; }