System File Object (SFO) (PSF)

From Vita Developer wiki
Jump to navigation Jump to search

These config strings are inside the Game Package (PKG).

Name Variable Length Variable Parameter (Example) Length Parameter Notes
APP_VER 0x8 1.00 0x8 Application Version
ATTRIBUTE 0x9 00 00 80 81 0x4 Special functions
ATTRIBUTE2 0xA 00 00 ?? ?? 0x4 This parameter can not exist on some PKG (used for special functions??)
CATEGORY 0x8 gdc 0x4 Category
CONTENT_ID 0xA JP0365-PCSG90004_00-SKP2TRIAL0000000 0x30
GC_RO_SIZE 0xA 00 00 00 00 0x4 ??
GC_RW_SIZE 0xA 00 00 00 00 0x4 ??
PARENTAL_LEVEL 0xE 00 00 00 00 0x4 This should be the same as in the PS3 (from 0 to 11)
PSP2_DISP_VER 0xD 00 01 00 00 0x4 ????
PSP2_SYSTEM_VER 0xF 01.500 0x6 Minimum FW to be play this game
PUBTOOLINFO 0xB c_date=20111205 0x200 Don't know what this is, but it contain creation data (c_date=20111205)
SAVEDATA_MAX_SIZE 0x11 00 00 04 00 ( = 1024) 0x4 i found this value here OFFSET: 0x1043 (File: JA0003-PCSC80003_00-UKETORNE00000000.PKG) in this case this game can use 1024 Bytes (1MB)
STITLE 0x6 uke-torne 0x32 Title of the ????
STITLE_00 0x9 uke-torne 0x32 Title of the ????
TITLE 0x5 uke-torne 0x80 Title of the game
TITLE_00 0x8 uke-torne(?????????????? 0x80 Title of the game
TITLE_ID 0x8 PCSG90004 0x8 APP_ID
VERSION 0x8 01.01 0x4 PKG Version

Header

This is the Header of a SFO/PSF file

Offset Data Arch Notes
0x0 0x00505346 Little Endian PSF Magic
0x4 0x01010000 Little Endian Version
0x8 0x24010000 Little Endian Value Start
0xC 0xdc000000 Little Endian Params Start
0x4 0x11000000 Little Endian N° of params/values

Body

Before understanding the algorithm, a few things: There are 3 variables:

Type of data

0x6+0x10*i
(i=0,1,2,3,4,5,...)

Data Arch Notes
04 02 Little Endian The value is an Integer
04 04 Little Endian The value is an UTF8
04 00 Little Endian The value is an Special UTF8

Position

The position is stored with this algo:

[Value Start]+(0x14+(0x10*i)) [VALUE]
[Param Start]+(0x20+(i*0x10)) [PARAM]
(i=0,1,2,3,4,5,...)

Offset Data Arch Notes
0x14 0x0000 Little Endian Value
0x20 0x00000000 Little Endian Param

Length

The length is stored with this algo:

0x1C+0x10*i [Param]
(0x24+0x10*i)-(0x14+0x10*i) [Value]
(i=0,1,2,3,4,5,...)

Offset Data Arch Notes
0x24-0x14 0x0800 Little Endian Length Value
0x1C 0x08000000 Little Endian Length Param

Algorithm

(i=0,1,2,3,4,5,...)

  • Get Position Value
    • [PSF offset] + [Value Start] + (0x14+(0x10*i))
  • Get Type
    • [PSF offset] + (0x16 * (0x10*i))
  • Get Lenght Param
    • [PSF offset] + (0x1C * (0x10*i))
  • Get Lenght Value
    • [PSF offset] + (0x24+0x10*i)-(0x14+0x10*i)
  • Get Position Param
    • [PSF offset] + [Param Start] + (0x20+(0x10*i))

for any problems, you can give a look into my sourcecode: [sfo_stuff.c]

PSF Dump (From 0xBF0 to 0x11F0)

The length of this is 0x5D0

 offset   00 01 02 03 04 05 06 07  08 09 0A 0B 0C 0D 0E 0F

00000bf0  00 50 53 46 01 01 00 00  24 01 00 00 dc 01 00 00  |.PSF....$.......|  -> Header
00000c00  11 00 00 00 00 00 04 02  06 00 00 00 08 00 00 00  |................|  -> Unknown
00000c10  00 00 00 00 08 00 04 04  04 00 00 00 04 00 00 00  |................|
00000c20  08 00 00 00 12 00 04 02  03 00 00 00 04 00 00 00  |................|  
00000c30  0c 00 00 00 1b 00 04 02  25 00 00 00 30 00 00 00  |........%...0...|
00000c40  10 00 00 00 26 00 04 04  04 00 00 00 04 00 00 00  |....&...........|
00000c50  40 00 00 00 31 00 04 04  04 00 00 00 04 00 00 00  |@...1...........|
00000c60  44 00 00 00 3c 00 04 04  04 00 00 00 04 00 00 00  |D...<...........|
00000c70  48 00 00 00 4b 00 04 02  07 00 00 00 08 00 00 00  |H...K...........|
00000c80  4c 00 00 00 59 00 04 04  04 00 00 00 04 00 00 00  |L...Y...........|
00000c90  54 00 00 00 69 00 04 02  10 00 00 00 00 02 00 00  |T...i...........|
00000ca0  58 00 00 00 75 00 04 04  04 00 00 00 04 00 00 00  |X...u...........|
00000cb0  58 02 00 00 87 00 04 02  20 00 00 00 34 00 00 00  |X....... ...4...|
00000cc0  5c 02 00 00 8e 00 04 02  20 00 00 00 34 00 00 00  |\....... ...4...|
00000cd0  90 02 00 00 98 00 04 02  35 00 00 00 80 00 00 00  |........5.......|
00000ce0  c4 02 00 00 9e 00 04 02  35 00 00 00 80 00 00 00  |........5.......|
00000cf0  44 03 00 00 a7 00 04 02  0a 00 00 00 0c 00 00 00  |D...............|
00000d00  c4 03 00 00 b0 00 04 02  06 00 00 00 08 00 00 00  |................|
00000d10  d0 03 00 00 41 50 50 5f  56 45 52 00 41 54 54 52  |....APP_VER.ATTR| -> Variables
00000d20  49 42 55 54 45 00 43 41  54 45 47 4f 52 59 00 43  |IBUTE.CATEGORY.C|
00000d30  4f 4e 54 45 4e 54 5f 49  44 00 47 43 5f 52 4f 5f  |ONTENT_ID.GC_RO_|
00000d40  53 49 5a 45 00 47 43 5f  52 57 5f 53 49 5a 45 00  |SIZE.GC_RW_SIZE.|
00000d50  50 41 52 45 4e 54 41 4c  5f 4c 45 56 45 4c 00 50  |PARENTAL_LEVEL.P|
00000d60  53 50 32 5f 44 49 53 50  5f 56 45 52 00 50 53 50  |SP2_DISP_VER.PSP|
00000d70  32 5f 53 59 53 54 45 4d  5f 56 45 52 00 50 55 42  |2_SYSTEM_VER.PUB|
00000d80  54 4f 4f 4c 49 4e 46 4f  00 53 41 56 45 44 41 54  |TOOLINFO.SAVEDAT|
00000d90  41 5f 4d 41 58 5f 53 49  5a 45 00 53 54 49 54 4c  |A_MAX_SIZE.STITL|
00000da0  45 00 53 54 49 54 4c 45  5f 30 30 00 54 49 54 4c  |E.STITLE_00.TITL|
00000db0  45 00 54 49 54 4c 45 5f  30 30 00 54 49 54 4c 45  |E.TITLE_00.TITLE|
00000dc0  5f 49 44 00 56 45 52 53  49 4f 4e 00 30 31 2e 30  |_ID.VERSION.01.0| -> Parameters of Variables
00000dd0  30 00 00 00 00 00 00 00  67 64 00 00 4a 50 30 33  |0.......gd..JP03|
00000de0  36 35 2d 50 43 53 47 39  30 30 30 34 5f 30 30 2d  |65-PCSG90004_00-|
00000df0  53 4b 50 32 54 52 49 41  4c 30 30 30 30 30 30 30  |SKP2TRIAL0000000|
00000e00  00 00 00 00 00 00 00 00  00 00 00 00 00 80 1a 00  |................|
00000e30  00 00 00 00 01 00 00 00  30 31 2e 35 30 30 00 00  |........01.500..|
00000e40  00 00 50 01 63 5f 64 61  74 65 3d 32 30 31 31 31  |..P.c_date=20111| -> creation data
00000e50  32 30 35 00 00 00 00 00  00 00 00 00 00 00 00 00  |205.............|
00000e60  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001040  00 00 00 00 00 04 00 00  75 6b 65 2d 74 6f 72 6e  |........uke-torn| ->SAVEDATA_MAX_SIZE + STITLE
00001050  65 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |e...............|
00001060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001070  00 00 00 00 00 00 00 00  00 00 00 00 75 6b 65 2d  |............uke-| ->STITLE_00
00001080  74 6f 72 6e 65 00 00 00  00 00 00 00 00 00 00 00  |torne...........|
00001090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000010b0  75 6b 65 2d 74 6f 72 6e  65 00 00 00 00 00 00 00  |uke-torne.......| ->TITLE
000010c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001130  75 6b 65 2d 74 6f 72 6e  65 28 e3 82 a6 e3 82 b1  |uke-torne(......| ->TITLE_00
00001140  e3 83 88 e3 83 ab e3 83  8d 29 00 00 00 00 00 00  |.........)......|
00001150  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000011b0  50 43 53 43 38 30 30 30  33 00 00 00 30 31 2e 30  |PCSC80003...01.0| ->TITLE_ID + VERSION
000011c0  30 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |0...............|
000011d0  00 00 00 00 00 00 00 01  28 00 00 00 00 00 00 30  |........(......0|
000011e0  80 00 00 00 00 00 00 00  22 00 00 10 1c c7 38 83  |........".....8.|