private void DoApplyPatchISO(string inputFile, string outputFile, string patchData) { var patches = GetPatches(patchData); DiscUtils.Complete.SetupHelper.SetupComplete(); var tempFolder = "./temp"; var tempFolderAFS = "./tempAFS"; var deepSearch = DeepSearchCheckbox.Checked; // cleanup previous work RecursivelyDeleteDirectory(tempFolder); RecursivelyDeleteDirectory(tempFolderAFS); // prepare directories Directory.CreateDirectory(tempFolder); Directory.CreateDirectory(tempFolderAFS); var volumeLabel = string.Empty; ExtractISO(inputFile, tempFolder, out volumeLabel); volumeLabel += "_PATCHED"; // which archive files contain the bin files we care about? var patchingFiles = GetArchivePatchInfo(patches); // loop through, unpacking and repacking the archives as we go foreach (var entry in patchingFiles) { var unpackAFS = entry.Key; var unpackExtensions = entry.Value; var inputArchiveFile = string.Format("{0}/{1}", tempFolder, unpackAFS); var outputArchiveFolder = string.Format("{0}/{1}", tempFolderAFS, unpackAFS); var archive = ExtractFromAFS(inputArchiveFile, outputArchiveFolder); if (archive == null) { Log($"Couldn't find {inputArchiveFile}"); continue; } // search for any archived files with the extensions we care about var unpackFiles = new List <string>(); for (var d = 0; d < archive.directory.Length; ++d) { var dir_entry = archive.directory[d]; for (var e = 0; e < unpackExtensions.Count; ++e) { var extension = unpackExtensions[e]; // not exactly strict if (deepSearch || dir_entry.filename.Contains(extension)) { unpackFiles.Add(dir_entry.filename); break; } } } // uncompress, patch, recompress, reinject into AFS instance var metadata = new List <TempFileMetadata>(); // update progress bar var max_progress = unpackFiles.Count * 3; var cur_progress = 0; // uncompress Log("Decompressing packed files."); for (var i = 0; i < unpackFiles.Count; ++i) { UpdateProress(cur_progress, 0, max_progress); cur_progress += 1; var unpackFile = unpackFiles[i]; var targetFilenameFull = string.Format("{0}/{1}", outputArchiveFolder, unpackFile); var targetFilenameUnpackedFull = $"{targetFilenameFull}.unpacked"; var meta = new TempFileMetadata(); meta.originalFilename = targetFilenameFull; meta.unpackedFilename = targetFilenameUnpackedFull; metadata.Add(meta); meta.uncompressed = UnpackAFS_File(targetFilenameFull); if (!meta.uncompressed) { Log($"Failed to uncompress {targetFilenameFull}! Did crappack fail?"); continue; } } Log("Patching uncompressed files."); for (var i = 0; i < unpackFiles.Count; ++i) { UpdateProress(cur_progress, 0, max_progress); cur_progress += 1; var unpackFile = unpackFiles[i]; var meta = metadata[i]; if (!meta.uncompressed) { continue; } meta.patched = PatchFile(meta.unpackedFilename, patches); } Log("Recompressing patched files. This may take awhile."); for (var i = 0; i < unpackFiles.Count; ++i) { UpdateProress(cur_progress, 0, max_progress); cur_progress += 1; var unpackFile = unpackFiles[i]; var meta = metadata[i]; if (!meta.uncompressed || !meta.patched) { continue; } meta.recompressed = RepackAFS_File(meta.originalFilename, meta.unpackedFilename); if (!meta.recompressed) { Log($"Failed to recompressed {meta.originalFilename}! Did crappack fail?"); continue; } meta.reinjected = ReinjectInAFS(archive, meta.originalFilename); if (!meta.reinjected) { Log($"Failed to reinject {meta.originalFilename}"); continue; } } // possibly keep for reference // note: unless deleted it will get put into the ISO var keepOldArchives = KeepOldArchivesCheckBox.Checked; if (keepOldArchives) { Log("Cloning previous AFS."); CloneOldAFS(inputArchiveFile); } Log("Rebuilding fresh AFS."); RebuildAFS(archive, inputArchiveFile); // rebuilds from scratch, using the modified instance } Log("Rebuilding fresh ISO."); RepackISO(tempFolder, outputFile, volumeLabel); // if checked, delete all the temp stuff we made var cleanup = CleanupCheckbox.Checked; if (cleanup) { RecursivelyDeleteDirectory(tempFolder); RecursivelyDeleteDirectory(tempFolderAFS); } }
private void DoApplyPatchISO(string inputFile, string outputFile, string patchData, string archiveData) { var patches = GetPatches(patchData); DiscUtils.Complete.SetupHelper.SetupComplete(); var tempFolder = "./temp"; var tempFolderAFS = "./tempAFS"; if (!Directory.Exists(tempFolder)) { Directory.CreateDirectory(tempFolder); } if (!Directory.Exists(tempFolderAFS)) { Directory.CreateDirectory(tempFolderAFS); } var volumeLabel = string.Empty; ExtractISO(inputFile, tempFolder, out volumeLabel); volumeLabel += "_PATCHED"; // which archive files contain the bin files we care about? var patchingFiles = new Dictionary <string, List <string> >(); var archives = archiveData.Split(','); foreach (var archive in archives) { var fileList = new List <string>(); fileList.Add("sub_main.bin"); patchingFiles.Add(archive, fileList); } // previously hard coded //patchingFiles.Add("AFS_DATA.AFS", new List<string>() { ".bin" }); foreach (var entry in patchingFiles) { var unpackAFS = entry.Key; var unpackExtensions = entry.Value; var inputDataFile = string.Format("{0}/{1}", tempFolder, unpackAFS); var outputDataFolder = string.Format("{0}/{1}", tempFolderAFS, unpackAFS); var archive = ExtractFromAFS(inputDataFile, outputDataFolder); // search for any archived files with the extensions we care about var unpackFiles = new List <string>(); for (var d = 0; d < archive.directory.Length; ++d) { var dir_entry = archive.directory[d]; for (var e = 0; e < unpackExtensions.Count; ++e) { var extension = unpackExtensions[e]; if (dir_entry.filename.Contains(extension)) // not exactly strict { unpackFiles.Add(dir_entry.filename); break; } } } // uncompress, patch, recompress, reinject into AFS instance var metadata = new List <TempFileMetadata>(); // update progress bar var max_progress = unpackFiles.Count * 3; var cur_progress = 0; // uncompress Log("Decompressing packed files."); for (var i = 0; i < unpackFiles.Count; ++i) { UpdateProress(cur_progress, 0, max_progress); cur_progress += 1; var unpackFile = unpackFiles[i]; var targetFilenameFull = string.Format("{0}/{1}", outputDataFolder, unpackFile); var targetFilenameUnpackedFull = $"{targetFilenameFull}.unpacked"; var meta = new TempFileMetadata(); meta.originalFilename = targetFilenameFull; meta.unpackedFilename = targetFilenameUnpackedFull; metadata.Add(meta); meta.uncompressed = UnpackAFS_File(targetFilenameFull); if (!meta.uncompressed) { Log($"Failed to uncompress {targetFilenameFull}! Did crappack fail?"); continue; } } Log("Patching uncompressed files."); for (var i = 0; i < unpackFiles.Count; ++i) { UpdateProress(cur_progress, 0, max_progress); cur_progress += 1; var unpackFile = unpackFiles[i]; var meta = metadata[i]; if (!meta.uncompressed) { continue; } meta.patched = PatchFile(meta.unpackedFilename, patches); } Log("Recompressing patched files. This may take awhile."); for (var i = 0; i < unpackFiles.Count; ++i) { UpdateProress(cur_progress, 0, max_progress); cur_progress += 1; var unpackFile = unpackFiles[i]; var meta = metadata[i]; if (!meta.uncompressed || !meta.patched) { continue; } meta.recompressed = RepackAFS_File(meta.originalFilename, meta.unpackedFilename); if (!meta.recompressed) { Log($"Failed to recompressed {meta.originalFilename}! Did crappack fail?"); continue; } meta.reinjected = ReinjectInAFS(archive, meta.originalFilename); if (!meta.reinjected) { Log($"Failed to reinject {meta.originalFilename}"); continue; } } Log("Cloning previous AFS."); CloneOldAFS(inputDataFile); // for reference (note: unless deleted it will get put into the ISO) Log("Rebuilding fresh AFS."); RebuildAFS(archive, inputDataFile); // rebuilds from scratch, using the modified instance } Log("Rebuilding fresh ISO."); RepackISO(tempFolder, outputFile, volumeLabel); }