static PMPQ_PATCH_HEADER LoadFullFilePatch(TMPQFile * hf, MPQ_PATCH_HEADER & PatchHeader) { PMPQ_PATCH_HEADER pFullPatch; int nError = ERROR_SUCCESS; // BSWAP the entire header, if needed BSWAP_ARRAY32_UNSIGNED(&PatchHeader, sizeof(DWORD) * 6); BSWAP_ARRAY32_UNSIGNED(&PatchHeader.dwXFRM, sizeof(DWORD) * 3); // Verify the signatures in the patch header if(PatchHeader.dwSignature != PATCH_SIGNATURE_HEADER || PatchHeader.dwMD5 != PATCH_SIGNATURE_MD5 || PatchHeader.dwXFRM != PATCH_SIGNATURE_XFRM) return NULL; // Allocate space for patch header and compressed data pFullPatch = (PMPQ_PATCH_HEADER)STORM_ALLOC(BYTE, PatchHeader.dwSizeOfPatchData); if(pFullPatch != NULL) { // Copy the patch header memcpy(pFullPatch, &PatchHeader, sizeof(MPQ_PATCH_HEADER)); // Read the patch, depending on patch type if(nError == ERROR_SUCCESS) { switch(PatchHeader.dwPatchType) { case 0x59504f43: // 'COPY' nError = LoadFilePatch_COPY(hf, pFullPatch); break; case 0x30445342: // 'BSD0' nError = LoadFilePatch_BSD0(hf, pFullPatch); break; default: nError = ERROR_FILE_CORRUPT; break; } } // If something failed, free the patch buffer if(nError != ERROR_SUCCESS) { STORM_FREE(pFullPatch); pFullPatch = NULL; } } // Give the result to the caller return pFullPatch; }
static int LoadFilePatch(TMPQFile * hf) { TPatchHeader PatchHeader; DWORD dwBytesRead; int nError = ERROR_SUCCESS; // Read the patch header SFileReadFile((HANDLE)hf, &PatchHeader, sizeof(TPatchHeader), &dwBytesRead, NULL); if(dwBytesRead != sizeof(TPatchHeader)) nError = ERROR_FILE_CORRUPT; // Verify the signatures in the patch header if(nError == ERROR_SUCCESS) { // BSWAP the entire header, if needed BSWAP_ARRAY32_UNSIGNED(&PatchHeader, sizeof(DWORD) * 6); PatchHeader.dwXFRM = BSWAP_INT32_UNSIGNED(PatchHeader.dwXFRM); PatchHeader.dwXfrmBlockSize = BSWAP_INT32_UNSIGNED(PatchHeader.dwXfrmBlockSize); PatchHeader.dwPatchType = BSWAP_INT32_UNSIGNED(PatchHeader.dwPatchType); if(PatchHeader.dwSignature != PATCH_SIGNATURE_HEADER || PatchHeader.dwMD5 != PATCH_SIGNATURE_MD5 || PatchHeader.dwXFRM != PATCH_SIGNATURE_XFRM) nError = ERROR_FILE_CORRUPT; } // Read the patch, depending on patch type if(nError == ERROR_SUCCESS) { switch(PatchHeader.dwPatchType) { case 0x59504f43: // 'COPY' nError = LoadFilePatch_COPY(hf, &PatchHeader); break; case 0x30445342: // 'BSD0' nError = LoadFilePatch_BSD0(hf, &PatchHeader); break; default: nError = ERROR_FILE_CORRUPT; break; } } return nError; }