BOOL CKatakoi::DecodeIar(CArcFile* pclArc) { if (pclArc->GetArcExten() != _T(".iar")) return FALSE; if (memcmp(pclArc->GetHed(), "iar ", 4) != 0) return FALSE; SFileInfo* pstfiWork = pclArc->GetOpenFileInfo(); // Reading YCMemory<BYTE> clmbtSrc(pstfiWork->sizeCmp); pclArc->Read(&clmbtSrc[0], pstfiWork->sizeCmp); // Output buffer DWORD dwDstSize = *(LPDWORD)&clmbtSrc[8]; YCMemory<BYTE> clmbtDst(dwDstSize * 2); // Decompression DecompImage(&clmbtDst[0], dwDstSize, &clmbtSrc[64], *(LPDWORD)&clmbtSrc[16]); long lWidth = *(LPLONG)&clmbtSrc[32]; long lHeight = *(LPLONG)&clmbtSrc[36]; WORD wBpp; switch (*(LPBYTE)&clmbtSrc[0]) { case 0x02: wBpp = 8; break; case 0x1C: wBpp = 24; break; case 0x3C: wBpp = 32; break; default: return FALSE; } BOOL bDiff = (*(LPBYTE)&clmbtSrc[1] == 8); if (bDiff) { // Difference file DecodeCompose(pclArc, &clmbtDst[0], dwDstSize, lWidth, lHeight, wBpp); } else { CImage image; image.Init(pclArc, lWidth, lHeight, wBpp); image.WriteReverse(&clmbtDst[0], dwDstSize); } return TRUE; }
/// Decode /// /// @param pclArc Archive /// BOOL CPaz::Decode(CArcFile* pclArc) { if (pclArc->GetArcExten() != _T(".paz")) return FALSE; // Initialize decryption key InitDecodeKey(pclArc); // Initialize Table InitTable(); // Decrypt table DecodeTable1(); DecodeTable2(); // Create output file SFileInfo* pstFileInfo = pclArc->GetOpenFileInfo(); if (lstrcmpi(PathFindExtension(pstFileInfo->name), _T(".sc")) == 0) { pclArc->OpenScriptFile(); } else { pclArc->OpenFile(); } // Output if (pstFileInfo->format == _T("zlib")) { // ZLIB DWORD dwSrcSize = pstFileInfo->sizeCmp; DWORD dwDstSize = pstFileInfo->sizeOrg; YCMemory<BYTE> clmbtSrc(dwSrcSize); YCMemory<BYTE> clmbtDst(dwDstSize); // Decrypt pclArc->Read(&clmbtSrc[0], dwSrcSize); Decrypt(&clmbtSrc[0], dwSrcSize); DecodeData(&clmbtSrc[0], dwSrcSize); Decrypt2(&clmbtSrc[0], dwSrcSize); // Decompress CZlib clZlib; clZlib.Decompress(&clmbtDst[0], dwDstSize, &clmbtSrc[0], dwSrcSize); // Output pclArc->WriteFile(&clmbtDst[0], dwDstSize); } else { if (pclArc->GetArcName() == _T("mov.paz")) { // Movie DWORD dwBufferSize = GetMovieBufSize(pclArc); YCMemory<BYTE> clmbtBuffer(dwBufferSize); for (DWORD dwWriteTotal = 0; dwWriteTotal != pstFileInfo->sizeOrg; dwWriteTotal += dwBufferSize) { // Get buffer size pclArc->SetBufSize(&dwBufferSize, dwWriteTotal, pstFileInfo->dwSizeOrg2); // Read pclArc->Read(&clmbtBuffer[0], dwBufferSize); // Decrypt Decrypt(&clmbtBuffer[0], dwBufferSize); DecodeMovieData(&clmbtBuffer[0], dwBufferSize); Decrypt2(&clmbtBuffer[0], dwBufferSize); // Adjust buffer size pclArc->SetBufSize(&dwBufferSize, dwWriteTotal, pstFileInfo->sizeOrg); // Write pclArc->WriteFile(&clmbtBuffer[0], dwBufferSize); } } else { // Other data DWORD dwBufferSize = pclArc->GetBufSize(); YCMemory<BYTE> clmbtBuffer(dwBufferSize); for (DWORD dwWriteTotal = 0; dwWriteTotal != pstFileInfo->sizeOrg; dwWriteTotal += dwBufferSize) { // Adjust buffer size pclArc->SetBufSize(&dwBufferSize, dwWriteTotal, pstFileInfo->dwSizeOrg2); // Read pclArc->Read(&clmbtBuffer[0], dwBufferSize); // Decrypt Decrypt(&clmbtBuffer[0], dwBufferSize); DecodeData(&clmbtBuffer[0], dwBufferSize); Decrypt2(&clmbtBuffer[0], dwBufferSize); // Adjust buffer size pclArc->SetBufSize(&dwBufferSize, dwWriteTotal, pstFileInfo->sizeOrg); // Write pclArc->WriteFile(&clmbtBuffer[0], dwBufferSize); } } } return TRUE; }