void LoadPfs(string filename) { pfs = MemoryMappedFile.CreateFromFile(filename, System.IO.FileMode.Open, mapName: null, 0, MemoryMappedFileAccess.Read); accessor = new MemoryMappedViewAccessor_(pfs.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read), true); using (var s = pfs.CreateViewStream(0, 0x5A0, MemoryMappedFileAccess.Read)) { header = PfsHeader.ReadFromStream(s); objectView1.ObjectPreview(header); pfsSeed.Text = header.Seed.ToHexCompact(); } xtsReader = accessor; UpdateHexView(); }
private void setPKGPFSFileMetadataToolStripMenuItem_Click(object sender, EventArgs e) { using (var ofd = new OpenFileDialog() { Title = "Select files", Filter = "PKG/PFS Files (*.pkg, *.dat)|*.pkg;*.dat", Multiselect = true }) { if (ofd.ShowDialog() != DialogResult.OK) { return; } foreach (var filename in ofd.FileNames) { DateTime creationTime = File.GetCreationTimeUtc(filename); DateTime modifiedTime = File.GetLastWriteTime(filename); using (var f = File.OpenRead(filename)) { if (filename.ToLowerInvariant().EndsWith(".dat")) { var header = PfsHeader.ReadFromStream(f); creationTime = modifiedTime = new DateTime(1970, 1, 1) .AddSeconds(header.InodeBlockSig.Time1_sec); } else if (filename.ToLowerInvariant().EndsWith(".pkg")) { var pkgHeader = new PkgReader(f).ReadHeader(); f.Position = (long)pkgHeader.pfs_image_offset; var header = PfsHeader.ReadFromStream(f); creationTime = modifiedTime = new DateTime(1970, 1, 1) .AddSeconds(header.InodeBlockSig.Time1_sec); } } File.SetCreationTimeUtc(filename, creationTime); File.SetLastWriteTimeUtc(filename, modifiedTime); } } }
public PFSView(string filename) { InitializeComponent(); pfsFile = MemoryMappedFile.CreateFromFile(filename, System.IO.FileMode.Open, mapName: null, 0, MemoryMappedFileAccess.Read); va = pfsFile.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read); va.Read(0, out int val); if (val == PFSCReader.Magic) { reader = new PfsReader(new PFSCReader(va)); } else { PfsHeader header; using (var h = pfsFile.CreateViewStream(0, 0x600, MemoryMappedFileAccess.Read)) { header = PfsHeader.ReadFromStream(h); } byte[] tweak = null, data = null; if (header.Mode.HasFlag(PfsMode.Encrypted)) { var passcode = new PasscodeEntry("Please enter data key", 32); passcode.Text = "PFS is encrypted"; passcode.ShowDialog(); data = passcode.Passcode.FromHexCompact(); passcode = new PasscodeEntry("Please enter tweak key", 32); passcode.Text = "PFS is encrypted"; passcode.ShowDialog(); data = passcode.Passcode.FromHexCompact(); reader = new PfsReader(va, data: data, tweak: tweak); } else { reader = new PfsReader(va); } } fileView1.AddRoot(reader, filename); }
public PkgView(string path) { InitializeComponent(); if (path == null) { return; } pkgFile = MemoryMappedFile.CreateFromFile(path); using (var s = pkgFile.CreateViewStream()) ObjectPreview(new PkgReader(s).ReadHeader(), pkgHeaderTreeView); using (var s = pkgFile.CreateViewStream()) pkg = new PkgReader(s).ReadPkg(); try { using (var s = pkgFile.CreateViewStream((long)pkg.Header.pfs_image_offset, (long)pkg.Header.pfs_image_size)) ObjectPreview(PfsHeader.ReadFromStream(s), pfsHeaderTreeView); } catch (Exception e) { pkgHeaderTabControl.TabPages.Remove(outerPfsHeaderTabPage); MessageBox.Show("Error loading outer PFS: " + e.Message + Environment.NewLine + "Please report this issue at https://github.com/maxton/LibOrbisPkg/issues"); } if (pkg.Metas.Metas.Where(entry => entry.id == EntryId.ICON0_PNG).FirstOrDefault() is MetaEntry icon0) { using (var s = pkgFile.CreateViewStream(icon0.DataOffset, icon0.DataSize)) { pictureBox1.Image = Image.FromStream(s); } } contentIdTextBox.Text = pkg.Header.content_id; titleTextBox.Text = pkg.ParamSfo.ParamSfo["TITLE"]?.ToString(); sizeLabel.Text = FileView.HumanReadableFileSize((long)pkg.Header.package_size); var category = pkg.ParamSfo.ParamSfo["CATEGORY"].ToString(); typeLabel.Text = SFOView.SfoTypes.Where(x => x.Category == category).FirstOrDefault() is SFOView.SfoType t ? t.Description : "Unknown"; versionLabel.Text = pkg.ParamSfo.ParamSfo["VERSION"]?.ToString(); if (pkg.ParamSfo.ParamSfo["APP_VER"] is Utf8Value v) { appVerLabel.Text = v.Value; } else { appVerLabelLabel.Visible = false; appVerLabel.Visible = false; } var sfoEditor = new SFOView(pkg.ParamSfo.ParamSfo, true); sfoEditor.Dock = DockStyle.Fill; tabPage1.Controls.Add(sfoEditor); if (pkg.CheckPasscode("00000000000000000000000000000000")) { passcode = "00000000000000000000000000000000"; ekpfs = Crypto.ComputeKeys(pkg.Header.content_id, passcode, 1); } else { ekpfs = pkg.GetEkpfs(); } ReopenFileView(); foreach (var e in pkg.Metas.Metas) { var lvi = new ListViewItem(new[] { e.id.ToString(), string.Format("0x{0:X}", e.DataSize), string.Format("0x{0:X}", e.DataOffset), e.Encrypted ? "Yes" : "No", e.KeyIndex.ToString(), }); lvi.Tag = e; entriesListView.Items.Add(lvi); } }
public PkgView(string path) { InitializeComponent(); if (path == null) { return; } pkgFile = MemoryMappedFile.CreateFromFile(path, FileMode.Open, "pkgFile" + idx++, 0, MemoryMappedFileAccess.Read); using (var s = pkgFile.CreateViewStream(0, 0, MemoryMappedFileAccess.Read)) ObjectPreview(new PkgReader(s).ReadHeader(), pkgHeaderTreeView); using (var s = pkgFile.CreateViewStream(0, 0, MemoryMappedFileAccess.Read)) pkg = new PkgReader(s).ReadPkg(); try { using (var s = pkgFile.CreateViewStream((long)pkg.Header.pfs_image_offset, (long)pkg.Header.pfs_image_size, MemoryMappedFileAccess.Read)) ObjectPreview(PfsHeader.ReadFromStream(s), pfsHeaderTreeView); } catch (Exception e) { pkgHeaderTabControl.TabPages.Remove(outerPfsHeaderTabPage); MessageBox.Show("Error loading outer PFS: " + e.Message + Environment.NewLine + "Please report this issue at https://github.com/maxton/LibOrbisPkg/issues"); } if (pkg.Metas.Metas.Where(entry => entry.id == EntryId.ICON0_PNG).FirstOrDefault() is MetaEntry icon0) { using (var s = pkgFile.CreateViewStream(icon0.DataOffset, icon0.DataSize, MemoryMappedFileAccess.Read)) { pictureBox1.Image = Image.FromStream(s); } } contentIdTextBox.Text = pkg.Header.content_id; titleTextBox.Text = pkg.ParamSfo.ParamSfo["TITLE"]?.ToString(); sizeLabel.Text = FileView.HumanReadableFileSize((long)pkg.Header.package_size); var category = pkg.ParamSfo.ParamSfo["CATEGORY"].ToString(); typeLabel.Text = SFOView.SfoTypes.Where(x => x.Category == category).FirstOrDefault() is SFOView.SfoType t ? t.Description : "Unknown"; versionLabel.Text = pkg.ParamSfo.ParamSfo["VERSION"]?.ToString(); if (pkg.ParamSfo.ParamSfo["APP_VER"] is Utf8Value v) { appVerLabel.Text = v.Value; } else { appVerLabelLabel.Visible = false; appVerLabel.Visible = false; } var sfoEditor = new SFOView(pkg.ParamSfo.ParamSfo, true); sfoEditor.Dock = DockStyle.Fill; tabPage1.Controls.Add(sfoEditor); if (pkg.CheckPasscode("00000000000000000000000000000000")) { passcode = "00000000000000000000000000000000"; ekpfs = Crypto.ComputeKeys(pkg.Header.content_id, passcode, 1); } else if (KeyDB.Instance.Passcodes.TryGetValue(pkg.Header.content_id, out var keydbPasscode) && pkg.CheckPasscode(keydbPasscode)) { passcode = keydbPasscode; ekpfs = Crypto.ComputeKeys(pkg.Header.content_id, passcode, 1); } else if (pkg.GetEkpfs() is byte[] ek && ek != null) { ekpfs = ek; }