1+ using System . IO ;
2+ using System . Text ;
3+ using SabreTools . IO . Extensions ;
4+ using static SabreTools . Models . PlayStation4 . Constants ;
5+
6+ namespace SabreTools . Serialization . Deserializers
7+ {
8+ public class AppPkgHeader : BaseBinaryDeserializer < Models . PlayStation4 . AppPkgHeader >
9+ {
10+ /// <inheritdoc/>
11+ public override Models . PlayStation4 . AppPkgHeader ? Deserialize ( Stream ? data )
12+ {
13+ // If the data is invalid
14+ if ( data == null || ! data . CanRead )
15+ return null ;
16+
17+ try
18+ {
19+ // Create a new app.pkg header to fill
20+ var appPkgHeader = new Models . PlayStation4 . AppPkgHeader ( ) ;
21+
22+ appPkgHeader . Magic = data . ReadUInt32BigEndian ( ) ;
23+ if ( appPkgHeader . Magic != AppPkgMagic )
24+ return null ;
25+
26+ appPkgHeader . Type = data . ReadUInt32BigEndian ( ) ;
27+ appPkgHeader . PKGUnknown = data . ReadUInt32BigEndian ( ) ;
28+ appPkgHeader . FileCount = data . ReadUInt32BigEndian ( ) ;
29+ appPkgHeader . EntryCount = data . ReadUInt32BigEndian ( ) ;
30+ appPkgHeader . SCEntryCount = data . ReadUInt16BigEndian ( ) ;
31+ appPkgHeader . EntryCount2 = data . ReadUInt16BigEndian ( ) ;
32+ appPkgHeader . TableOffset = data . ReadUInt32BigEndian ( ) ;
33+ appPkgHeader . EntryDataSize = data . ReadUInt32BigEndian ( ) ;
34+ appPkgHeader . BodyOffset = data . ReadUInt64BigEndian ( ) ;
35+ appPkgHeader . BodySize = data . ReadUInt64BigEndian ( ) ;
36+ appPkgHeader . ContentOffset = data . ReadUInt64BigEndian ( ) ;
37+ appPkgHeader . ContentSize = data . ReadUInt64BigEndian ( ) ;
38+ byte [ ] contentID = data . ReadBytes ( 0x24 ) ;
39+ appPkgHeader . ContentID = Encoding . ASCII . GetString ( contentID ) . TrimEnd ( '\0 ' ) ;
40+ appPkgHeader . ContentZeroes = data . ReadBytes ( 0xC ) ;
41+ appPkgHeader . DRMType = data . ReadUInt32BigEndian ( ) ;
42+ appPkgHeader . ContentType = data . ReadUInt32BigEndian ( ) ;
43+ appPkgHeader . ContentFlags = data . ReadUInt32BigEndian ( ) ;
44+ appPkgHeader . PromoteSize = data . ReadUInt32BigEndian ( ) ;
45+ appPkgHeader . VersionDate = data . ReadUInt32BigEndian ( ) ;
46+ appPkgHeader . VersionHash = data . ReadUInt32BigEndian ( ) ;
47+ appPkgHeader . Zeroes1 = data . ReadBytes ( 0x78 ) ;
48+ appPkgHeader . MainEntry1SHA256 = data . ReadBytes ( 0x20 ) ;
49+ appPkgHeader . MainEntry2SHA256 = data . ReadBytes ( 0x20 ) ;
50+ appPkgHeader . DigestTableSHA256 = data . ReadBytes ( 0x20 ) ;
51+ appPkgHeader . MainTableSHA256 = data . ReadBytes ( 0x20 ) ;
52+ appPkgHeader . Zeroes2 = data . ReadBytes ( 0x280 ) ;
53+ appPkgHeader . PFSUnknown = data . ReadUInt32BigEndian ( ) ;
54+ appPkgHeader . PFSImageCount = data . ReadUInt32BigEndian ( ) ;
55+ appPkgHeader . PFSImageFlags = data . ReadUInt64BigEndian ( ) ;
56+ appPkgHeader . PFSImageOffset = data . ReadUInt64BigEndian ( ) ;
57+ appPkgHeader . PFSImageSize = data . ReadUInt64BigEndian ( ) ;
58+ appPkgHeader . MountImageOffset = data . ReadUInt64BigEndian ( ) ;
59+ appPkgHeader . MountImageSize = data . ReadUInt64BigEndian ( ) ;
60+ appPkgHeader . PKGSize = data . ReadUInt64BigEndian ( ) ;
61+ appPkgHeader . PKGSignedSize = data . ReadUInt32BigEndian ( ) ;
62+ appPkgHeader . PKGCacheSize = data . ReadUInt32BigEndian ( ) ;
63+ appPkgHeader . PFSImageSHA256 = data . ReadBytes ( 0x20 ) ;
64+ appPkgHeader . PFSSignedSHA256 = data . ReadBytes ( 0x20 ) ;
65+ appPkgHeader . PFSSplitSize0 = data . ReadUInt64BigEndian ( ) ;
66+ appPkgHeader . PFSSplitSize1 = data . ReadUInt64BigEndian ( ) ;
67+ appPkgHeader . Zeroes3 = data . ReadBytes ( 0xB50 ) ;
68+ appPkgHeader . PKGSHA256 = data . ReadBytes ( 0x20 ) ;
69+
70+ return appPkgHeader ;
71+ }
72+ catch
73+ {
74+ // Ignore the actual error
75+ return null ;
76+ }
77+ }
78+ }
79+ }
0 commit comments