From 3f368a3be825c43ef055b286b2d972f69249ee89 Mon Sep 17 00:00:00 2001
From: Deterous <138427222+Deterous@users.noreply.github.com>
Date: Mon, 16 Dec 2024 10:12:06 +0900
Subject: [PATCH] Create model for PS4 app.pkg header (#7)
* Create model for PS4 app.pkg header
* Rename PS4 app.pkg class
* Fix typo
* Requested changes
* Add newline
---
SabreTools.Models/PlayStation3/Constants.cs | 10 +
SabreTools.Models/PlayStation3/SFB.cs | 3 +-
SabreTools.Models/PlayStation3/SFOHeader.cs | 3 +-
.../PlayStation4/AppPkgHeader.cs | 236 ++++++++++++++++++
SabreTools.Models/PlayStation4/Constants.cs | 11 +
5 files changed, 259 insertions(+), 4 deletions(-)
create mode 100644 SabreTools.Models/PlayStation4/AppPkgHeader.cs
create mode 100644 SabreTools.Models/PlayStation4/Constants.cs
diff --git a/SabreTools.Models/PlayStation3/Constants.cs b/SabreTools.Models/PlayStation3/Constants.cs
index f43fa76..0344c71 100644
--- a/SabreTools.Models/PlayStation3/Constants.cs
+++ b/SabreTools.Models/PlayStation3/Constants.cs
@@ -4,6 +4,16 @@ namespace SabreTools.Models.PlayStation3
///
public static class Constants
{
+ ///
+ /// Identifying bytes for SFO file
+ ///
+ public const uint SFOMagic = 0x00505346;
+
+ ///
+ /// Identifying bytes for SFB file
+ ///
+ public const uint SFBMagic = 0x2E534642;
+
#region Hybrid Flags
///
diff --git a/SabreTools.Models/PlayStation3/SFB.cs b/SabreTools.Models/PlayStation3/SFB.cs
index 445b1b7..da6843d 100644
--- a/SabreTools.Models/PlayStation3/SFB.cs
+++ b/SabreTools.Models/PlayStation3/SFB.cs
@@ -9,8 +9,7 @@ namespace SabreTools.Models.PlayStation3
///
/// ".SFB"
///
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
- public byte[]? Magic;
+ public uint Magic;
///
/// File version(?)
diff --git a/SabreTools.Models/PlayStation3/SFOHeader.cs b/SabreTools.Models/PlayStation3/SFOHeader.cs
index 054111f..5b0576f 100644
--- a/SabreTools.Models/PlayStation3/SFOHeader.cs
+++ b/SabreTools.Models/PlayStation3/SFOHeader.cs
@@ -9,8 +9,7 @@ namespace SabreTools.Models.PlayStation3
///
/// "\0PSF"
///
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
- public byte[]? Magic;
+ public uint Magic;
///
/// Version
diff --git a/SabreTools.Models/PlayStation4/AppPkgHeader.cs b/SabreTools.Models/PlayStation4/AppPkgHeader.cs
new file mode 100644
index 0000000..78a0584
--- /dev/null
+++ b/SabreTools.Models/PlayStation4/AppPkgHeader.cs
@@ -0,0 +1,236 @@
+using System.Runtime.InteropServices;
+
+namespace SabreTools.Models.PlayStation4
+{
+ ///
+ [StructLayout(LayoutKind.Sequential)]
+ public class AppPkgHeader
+ {
+ ///
+ /// Identifying bytes for app.pkg file, "\7FCNT"
+ ///
+ public uint Magic;
+
+ ///
+ /// PKG Type
+ ///
+ public uint Type;
+
+ ///
+ /// PKG Unknown Field
+ ///
+ public uint PKGUnknown;
+
+ ///
+ /// PKG File count
+ ///
+ public uint FileCount;
+
+ ///
+ /// PKG Entry count
+ ///
+ public uint EntryCount;
+
+ ///
+ /// SC Entry count
+ ///
+ public ushort SCEntryCount;
+
+ ///
+ /// PKG Entry count (duplicated)
+ ///
+ public ushort EntryCount2;
+
+ ///
+ /// PKG File Table offset
+ ///
+ public uint TableOffset;
+
+ ///
+ /// PKG Entry data size
+ ///
+ public uint EntryDataSize;
+
+ ///
+ /// Offset of PKG Entries
+ ///
+ public ulong BodyOffset;
+
+ ///
+ /// Length of all PKG Entries
+ ///
+ public ulong BodySize;
+
+ ///
+ /// PKG Content offset
+ ///
+ public ulong ContentOffset;
+
+ ///
+ /// PKG Content size
+ ///
+ public ulong ContentSize;
+
+ ///
+ /// PKG Content ID
+ ///
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x24)]
+ public string? ContentID;
+
+ ///
+ /// PKG Content Padding (Zeroes)
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0xC)]
+ public byte[]? ContentZeroes;
+
+ ///
+ /// PKG DRM Type
+ ///
+ public uint DRMType;
+
+ ///
+ /// PKG Content Type
+ ///
+ public uint ContentType;
+
+ ///
+ /// PKG Content Flags
+ ///
+ public uint ContentFlags;
+
+ ///
+ /// PKG Promote Size
+ ///
+ public uint PromoteSize;
+
+ ///
+ /// PKG Version Date
+ ///
+ public uint VersionDate;
+
+ ///
+ /// PKG Content Flags
+ ///
+ public uint VersionHash;
+
+ ///
+ /// PKG Padding Section 1
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x78)]
+ public byte[]? Zeroes1;
+
+ ///
+ /// PKG SHA256 for Main Entry 1
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
+ public byte[]? MainEntry1SHA256;
+
+ ///
+ /// PKG SHA256 for Main Entry 2
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
+ public byte[]? MainEntry2SHA256;
+
+ ///
+ /// PKG SHA256 for Digest Table
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
+ public byte[]? DigestTableSHA256;
+
+ ///
+ /// PKG SHA256 for Main Table
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
+ public byte[]? MainTableSHA256;
+
+ ///
+ /// PKG Padding Section 2
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x280)]
+ public byte[]? Zeroes2;
+
+ ///
+ /// PFS Unknown Field
+ ///
+ public uint PFSUnknown;
+
+ ///
+ /// PFS Image Count
+ ///
+ public uint PFSImageCount;
+
+ ///
+ /// PFS Image Flags
+ ///
+ public ulong PFSImageFlags;
+
+ ///
+ /// PFS Image Offset
+ ///
+ public ulong PFSImageOffset;
+
+ ///
+ /// PFS Image Size
+ ///
+ public ulong PFSImageSize;
+
+ ///
+ /// Mount Image Offset
+ ///
+ public ulong MountImageOffset;
+
+ ///
+ /// Mount Image Size
+ ///
+ public ulong MountImageSize;
+
+ ///
+ /// PKG Size
+ ///
+ public ulong PKGSize;
+
+ ///
+ /// PKG Signed Size
+ ///
+ public uint PKGSignedSize;
+
+ ///
+ /// PKG Signed Size
+ ///
+ public uint PKGCacheSize;
+
+ ///
+ /// SHA256 for PFS Image
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
+ public byte[]? PFSImageSHA256;
+
+ ///
+ /// SHA256 for PFS Signed
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
+ public byte[]? PFSSignedSHA256;
+
+ ///
+ /// PFS Split Size nth 0
+ ///
+ public ulong PFSSplitSize0;
+
+ ///
+ /// PFS Split Size nth 1
+ ///
+ public ulong PFSSplitSize1;
+
+ ///
+ /// PKG Padding Section 3
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0xB50)]
+ public byte[]? Zeroes3;
+
+ ///
+ /// SHA256 for PKG
+ ///
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
+ public byte[]? PKGSHA256;
+ }
+}
diff --git a/SabreTools.Models/PlayStation4/Constants.cs b/SabreTools.Models/PlayStation4/Constants.cs
new file mode 100644
index 0000000..fdca14d
--- /dev/null
+++ b/SabreTools.Models/PlayStation4/Constants.cs
@@ -0,0 +1,11 @@
+namespace SabreTools.Models.PlayStation4
+{
+ ///
+ public class Constants
+ {
+ ///
+ /// Identifying bytes for app.pkg file, "\7FCNT"
+ ///
+ public const uint AppPkgMagic = 0x7F434E54;
+ }
+}