private void openPkg(string filename) { using (var fs = File.OpenRead(filename)) { var pkg = new LibOrbisPkg.PKG.PkgReader(fs).ReadHeader(); OpenTab(new Views.ObjectView(pkg), Path.GetFileName(filename)); } }
private void LoadPackage(string filename) { if (state.Loaded) { Unload(); } var pkgFile = GameArchives.Util.LocalFile(filename); if (filename.EndsWith(".pkg")) { try { string contentId; using (var tempS = pkgFile.GetStream()) { var hdr = new LibOrbisPkg.PKG.PkgReader(tempS).ReadHeader(); contentId = hdr.content_id; } state.pkg = GameArchives.PackageReader.ReadPackageFromFile(pkgFile, new string(LibOrbisPkg.Util.Crypto.ComputeKeys( contentId, "00000000000000000000000000000000", 1) .Select(b => (char)b).ToArray())); } catch (Exception) { } } else { state.pkg = GameArchives.PackageReader.ReadPackageFromFile(pkgFile); } if (state.pkg is GameArchives.PFS.PFSPackage) { if (state.pkg.RootDirectory.TryGetFile("pfs_image.dat", out var f)) { state.dispose = state.pkg.Dispose; state.pkg = GameArchives.PackageReader.ReadPackageFromFile(f); } if (state.pkg.RootDirectory.TryGetFile("main_ps4.hdr", out var f2)) { state.dispose = state.pkg.Dispose; state.pkg = GameArchives.PackageReader.ReadPackageFromFile(f2); } } state.root = state.pkg.RootDirectory; SetTitle(filename); FinishLoad(); }
private async void CombinePKGPartsToolStripMenuItem_Click(object sender, EventArgs e) { using (var ofd = new OpenFileDialog() { Title = "Select part 0", Filter = "PKG Files (*_0.pkg)|*_0.pkg" }) { if (ofd.ShowDialog() != DialogResult.OK) { return; } var filenames = new List <string>(); filenames.Add(ofd.FileName); ulong pkgSize = 0; long remainingSize = 0; using (var s = File.OpenRead(filenames[0])) { var hdr = new LibOrbisPkg.PKG.PkgReader(s).ReadHeader(); pkgSize = hdr.package_size; remainingSize = (long)hdr.package_size - s.Length; } if (remainingSize <= 0) { MessageBox.Show("Error: reported package size was less than part file size"); return; } // remove the _0.pkg (6 characters) from the filename var baseFilename = filenames[0].Substring(0, filenames[0].Length - 6); var targetFilename = baseFilename + ".pkg"; using (var sfd = new SaveFileDialog() { Title = "Select output file", Filter = "PKG Files (*.pkg)|*.pkg", FileName = targetFilename }) { if (sfd.ShowDialog() != DialogResult.OK) { return; } targetFilename = sfd.FileName; } var i = 0; while (remainingSize > 0) { var newFile = $"{baseFilename}_{++i}.pkg"; if (File.Exists(newFile)) { filenames.Add(newFile); remainingSize -= new FileInfo(newFile).Length; } else { MessageBox.Show($"Error: missing part {i}, should be {remainingSize} bytes."); return; } } using (var logWindow = new LogWindow()) using (var fo = File.Create(targetFilename)) { fo.SetLength((long)pkgSize); logWindow.StartPosition = this.StartPosition; logWindow.Show(this); logWindow.GetWriter().WriteLine($"Merging files to {targetFilename}..."); foreach (var fn in filenames) { using (var fi = File.OpenRead(fn)) { logWindow.GetWriter().WriteLine($"Copying {fn}"); await fi.CopyToAsync(fo); } } logWindow.GetWriter().WriteLine("Done. Saved to " + targetFilename); } } }