/// Decode /// /// @param archive Archive /// bool CPaz::Decode(CArcFile* archive) { if (archive->GetArcExten() != _T(".paz")) return false; // Initialize decryption key InitDecodeKey(archive); // Initialize Table InitTable(); // Decrypt table DecodeTable1(); DecodeTable2(); // Create output file const SFileInfo* file_info = archive->GetOpenFileInfo(); if (lstrcmpi(PathFindExtension(file_info->name), _T(".sc")) == 0) { archive->OpenScriptFile(); } else { archive->OpenFile(); } // Output if (file_info->format == _T("zlib")) { // ZLIB std::vector<u8> src(file_info->sizeCmp); std::vector<u8> dst(file_info->sizeOrg); // Decrypt archive->Read(src.data(), src.size()); Decrypt(src.data(), src.size()); DecodeData(src.data(), src.size()); Decrypt2(src.data(), src.size()); // Decompress CZlib zlib; zlib.Decompress(dst.data(), dst.size(), src.data(), src.size()); // Output archive->WriteFile(dst.data(), dst.size()); } else { if (archive->GetArcName() == _T("mov.paz")) { // Movie size_t buffer_size = GetMovieBufSize(archive); std::vector<u8> buffer(buffer_size); for (size_t total_written = 0; total_written != file_info->sizeOrg; total_written += buffer_size) { // Get buffer size archive->SetBufSize(&buffer_size, total_written, file_info->dwSizeOrg2); // Read archive->Read(buffer.data(), buffer_size); // Decrypt Decrypt(buffer.data(), buffer_size); DecodeMovieData(buffer.data(), buffer_size); Decrypt2(buffer.data(), buffer_size); // Adjust buffer size archive->SetBufSize(&buffer_size, total_written, file_info->sizeOrg); // Write archive->WriteFile(buffer.data(), buffer_size); } } else { // Other data size_t buffer_size = archive->GetBufSize(); std::vector<u8> buffer(buffer_size); for (size_t total_written = 0; total_written != file_info->sizeOrg; total_written += buffer_size) { // Adjust buffer size archive->SetBufSize(&buffer_size, total_written, file_info->dwSizeOrg2); // Read archive->Read(buffer.data(), buffer_size); // Decrypt Decrypt(buffer.data(), buffer_size); DecodeData(buffer.data(), buffer_size); Decrypt2(buffer.data(), buffer_size); // Adjust buffer size archive->SetBufSize(&buffer_size, total_written, file_info->sizeOrg); // Write archive->WriteFile(buffer.data(), buffer_size); } } } 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; }