// Verifies the archive against the signature DWORD WINAPI SFileVerifyArchive(HANDLE hMpq) { MPQ_SIGNATURE_INFO si; TMPQArchive * ha = (TMPQArchive *)hMpq; // Verify input parameters if(!IsValidMpqHandle(ha)) return ERROR_VERIFY_FAILED; // Get the MPQ signature and signature type memset(&si, 0, sizeof(MPQ_SIGNATURE_INFO)); if(!QueryMpqSignatureInfo(ha, &si)) return ERROR_VERIFY_FAILED; // Verify the signature switch(si.nSignatureType) { case SIGNATURE_TYPE_NONE: return ERROR_NO_SIGNATURE; case SIGNATURE_TYPE_WEAK: return VerifyWeakSignature(ha, &si); case SIGNATURE_TYPE_STRONG: return VerifyStrongSignature(ha, &si); } return ERROR_VERIFY_FAILED; }
// Verifies the archive against the signature DWORD WINAPI SFileVerifyArchive(HANDLE hMpq) { MPQ_SIGNATURE_INFO si; TMPQArchive * ha = (TMPQArchive *)hMpq; // Verify input parameters if(!IsValidMpqHandle(hMpq)) return ERROR_VERIFY_FAILED; // If the archive was modified, we need to flush it if(ha->dwFlags & MPQ_FLAG_CHANGED) SFileFlushArchive(hMpq); // Get the MPQ signature and signature type memset(&si, 0, sizeof(MPQ_SIGNATURE_INFO)); if(!QueryMpqSignatureInfo(ha, &si)) return ERROR_VERIFY_FAILED; // If there is no signature if(si.SignatureTypes == 0) return ERROR_NO_SIGNATURE; // We haven't seen a MPQ with both signatures assert(si.SignatureTypes == SIGNATURE_TYPE_WEAK || si.SignatureTypes == SIGNATURE_TYPE_STRONG); // Verify the strong signature, if present if(si.SignatureTypes & SIGNATURE_TYPE_STRONG) return VerifyStrongSignature(ha, &si); // Verify the weak signature, if present if(si.SignatureTypes & SIGNATURE_TYPE_WEAK) return VerifyWeakSignature(ha, &si); return ERROR_NO_SIGNATURE; }