Seregon/ShadPKG

A tool for deriving PKG packet encryption keys for ps4 written in c++

C++/47.3 KB/No license
core/file_format/pfs.h
1// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3 
4#pragma once
5 
6#include <cstddef>
7#include <string>
8 
9#include "common/shadpkg_types.h"
10 
11#define PFS_FILE 2
12#define PFS_DIR 3
13#define PFS_CURRENT_DIR 4
14#define PFS_PARENT_DIR 5
15 
16enum PfsMode : unsigned short {
17 None = 0,
18 Signed = 0x1,
19 Is64Bit = 0x2,
20 Encrypted = 0x4,
21 UnknownFlagAlwaysSet = 0x8
22};
23 
24struct PSFHeader_ {
25 s64 version;
26 s64 magic;
27 s64 id;
28 u8 fmode;
29 u8 clean;
30 u8 read_only;
31 u8 rsv;
32 PfsMode mode;
33 s16 unk1;
34 s32 block_size;
35 s32 n_backup;
36 s64 n_block;
37 s64 dinode_count;
38 s64 nd_block;
39 s64 dinode_block_count;
40 s64 superroot_ino;
41};
42 
43struct PFSCHdr {
44 s32 magic;
45 s32 unk4;
46 s32 unk8;
47 s32 block_sz;
48 s64 block_sz2;
49 s64 block_offsets;
50 u64 data_start;
51 s64 data_length;
52};
53 
54enum InodeMode : u16 {
55 o_read = 1,
56 o_write = 2,
57 o_execute = 4,
58 g_read = 8,
59 g_write = 16,
60 g_execute = 32,
61 u_read = 64,
62 u_write = 128,
63 u_execute = 256,
64 dir = 16384,
65 file = 32768,
66};
67 
68enum InodeFlags : u32 {
69 compressed = 0x1,
70 unk1 = 0x2,
71 unk2 = 0x4,
72 unk3 = 0x8,
73 readonly = 0x10,
74 unk4 = 0x20,
75 unk5 = 0x40,
76 unk6 = 0x80,
77 unk7 = 0x100,
78 unk8 = 0x200,
79 unk9 = 0x400,
80 unk10 = 0x800,
81 unk11 = 0x1000,
82 unk12 = 0x2000,
83 unk13 = 0x4000,
84 unk14 = 0x8000,
85 unk15 = 0x10000,
86 internal = 0x20000
87};
88 
89struct Inode {
90 u16 Mode;
91 u16 Nlink;
92 u32 Flags;
93 s64 Size;
94 s64 SizeCompressed;
95 s64 Time1_sec;
96 s64 Time2_sec;
97 s64 Time3_sec;
98 s64 Time4_sec;
99 u32 Time1_nsec;
100 u32 Time2_nsec;
101 u32 Time3_nsec;
102 u32 Time4_nsec;
103 u32 Uid;
104 u32 Gid;
105 u64 Unk1;
106 u64 Unk2;
107 u32 Blocks;
108 u32 loc;
109};
110 
111struct pfs_fs_table {
112 std::string name;
113 u32 inode;
114 u32 type;
115};
116 
117struct Dirent {
118 s32 ino;
119 s32 type;
120 s32 namelen;
121 s32 entsize;
122 char name[512];
123};
124