PARAM.SFO: Difference between revisions

From PS3 Developer wiki
Jump to navigation Jump to search
(big cleanup, more intuitive code strings used everywhere, and few updated sections)
Line 1: Line 1:
[[Category:Software]]
[[Category:Software]]


'''SFO''' ('''S'''ystem '''F'''ile '''O'''???) are used in folders wich content needs to be displayed in the [[XMB]]. In the same folder than the SFO are the "content files" (ICON0.PNG PIC0.PNG etc...) and in few cases (like in savegames) there is a [[PARAM.PFD]] for security reasons.
'''SFO''' ('''S'''ystem '''F'''ile '''O'''???) are used in folders wich content needs to be displayed in the [[XMB]]. In the same folder are the [[Content Information Files]] and for speciall content (like savegames) there is a [[PARAM.PFD]] for security reasons.


The parameters SFO contains can be simplyfied as imputs and outputs of the content:
The parameters SFO contains can be simplyfied as imputs and outputs of the content:
Line 7: Line 7:
* Contains the information strings needed to display the content in the [[XMB]] and his restrictions (e.g. name and version of a game).
* Contains the information strings needed to display the content in the [[XMB]] and his restrictions (e.g. name and version of a game).
* When executing the content, the SFO is sending "boot modifyers" (or flags) to the content to activate "speciall modes" (e.g. audio and video modes of a game).
* When executing the content, the SFO is sending "boot modifyers" (or flags) to the content to activate "speciall modes" (e.g. audio and video modes of a game).




Line 21: Line 20:
===Header===
===Header===
<pre>
<pre>
typdef struct Header
typdef struct Header
{
{
uint32_t Signature; /* Always PSF */
uint32_t Signature; /* Always PSF */
uint32_t Version; /* Usually 1.1 */
uint32_t Version; /* Usually 1.1 */
uint32_t Name_Table_Start; /* Start position of the Name_Table */
uint32_t Name_Table_Start; /* Start position of the Name_Table */
uint32_t Data_Table_Start; /* Start position of the Data_Table */
uint32_t Data_Table_Start; /* Start position of the Data_Table */
uint32_t Entries_Number; /* Number of entries */
uint32_t Entries_Number; /* Number of entries */
};
};
</pre>
</pre>


Line 39: Line 38:
  uint16_t Name_Table_Offset; /* Offset of the Name of the entry, from start of Name_Table */
  uint16_t Name_Table_Offset; /* Offset of the Name of the entry, from start of Name_Table */
  uint16_t Data_Type; /* Type of data of the entry in the Data_Table */
  uint16_t Data_Type; /* Type of data of the entry in the Data_Table */
  uint32_t Data_Used; /* Used Bytes by the entry in the Data_Table */
  uint32_t Data_Size_Used; /* Used Bytes by the entry in the Data_Table */
  uint32_t Data_Size; /* Total bytes reserved for the entry in the Data_Table */
  uint32_t Data_Size_Total; /* Total bytes reserved for the entry in the Data_Table */
  uint32_t Data_Table_Offset; /* Offset of the Data of the entry, from start of Data_Table */
  uint32_t Data_Table_Offset; /* Offset of the Data of the entry, from start of Data_Table */
  };
  };
Line 65: Line 64:


===Data_Table===
===Data_Table===
This table has no padding between entries neither at the end, padding is not supported in any way, "Data_Size" is in the "Definition_Table" and the space is reserved for each entry
This table has no padding between entries neither at the end, padding is not supported in any way, "Data_Size_Total" for each entry is in the "Definition_Table" and the space can be considered reserved, even when is not used or filled with zeroes


The number of "Data_Used" bytes for each entry is in the "Definition_Table", it matches the "Data_Size" when the entry is an integer (integer entries uses all the reserved bytes) but can vary with utf-8 entries (e.g. TITLE of the game), additionally utf-8 entries needs 1 blank byte after the last character of the text string, this byte can be considered part of the string to count the "Data_Used" bytes for the entry in the "Definition_Table"
The number of '''Data_Size_Used''' bytes for each entry is in the '''Definition_Table''', it matches the '''Data_Size_Total''' when the entry is an integer (integer entries uses all the reserved bytes) but can vary with utf-8 entries (e.g. TITLE of a game), additionally utf-8 entries needs 1 blank byte after the last character of the text string, this byte can be considered part of the string to count the '''Data_Size_Total''' bytes for this entry in the '''Definition_Table'''


==Internall Structure Examples==
==Internall Structure Examples==


===SFO===
===SFO===
This is an example of a hand made SFO structure, it contains only 1 entry (TITLE_ID), i choosed this one because is short enought to explain the structure in 4 lines, needs padding at the end of the Name_Table, and the Data_Used is smaller than the Data_Size
This is an example of a hand made SFO structure, it contains only 1 entry (TITLE_ID), i choosed this one because his '''Data_Size_Total''' is short enought (16 bytes) to build the full structure in a minimall size, needs padding at the end of the '''Name_Table''', and the '''Data_Size_Used''' is smaller than '''Data_Size_Total'''


  0x0000  00 50 53 46  01 01 00 00  24 00 00 00  30 00 00 00 | .PSF....$...0... |
  0x0000  00 50 53 46  01 01 00 00  24 00 00 00  30 00 00 00 | .PSF....$...0... |
Line 91: Line 90:
| 0x0004 || 0x04 || 01 01 00 00 || Big endian, decimal || 1.1 || Version (the point is added by the system)
| 0x0004 || 0x04 || 01 01 00 00 || Big endian, decimal || 1.1 || Version (the point is added by the system)
|-
|-
| 0x0008 || 0x04 || 24 00 00 00 || Big endian || 0x0024 || Start of Name_Table
| 0x0008 || 0x04 || 24 00 00 00 || Big endian || 0x0024 || Start of '''Name_Table'''
|-
|-
| 0x000C || 0x04 || 30 00 00 00 || Big endian || 0x0030 || Start of Data_Table
| 0x000C || 0x04 || 30 00 00 00 || Big endian || 0x0030 || Start of '''Data_Table'''
|-
|-
| 0x0010 || 0x04 || 01 00 00 00 || Big endian, decimal || 1 || Number of entries in the tables
| 0x0010 || 0x04 || 01 00 00 00 || Big endian, decimal || 1 || Number of entries in the tables
Line 99: Line 98:
! Definition_Table
! Definition_Table
|-
|-
| 0x0014 || 0x02 || 0000 || Big endian || 0 || (Start of "TITLE_ID") - (Start of Name_Table) = 0x0024-0x0024 = 0
| 0x0014 || 0x02 || 0000 || Big endian || 0 || (Start of '''Name''') - (Start of '''Name_Table''') = 0x0024-0x0024 = 0
|-
|-
| 0x0016 || 0x02 || 0402 || Unknown || || Data_Type
| 0x0016 || 0x02 || 0402 || Unknown || || '''Data_Type'''
|-
|-
| 0x0018 || 0x04 || 0A000000 || Big endian, decimal || 10 || Data_Used (ABCD12345 are 9 bytes + 1 blank = 10)
| 0x0018 || 0x04 || 0A000000 || Big endian, decimal || 10 || '''Data_Size_Used''' (ABCD12345 are 9 bytes + 1 blank = 10)
|-
|-
| 0x001C || 0x04 || 0F000000 || Big endian, decimal || 16 || Data_Size
| 0x001C || 0x04 || 0F000000 || Big endian, decimal || 16 || '''Data_Size_Total''' (TITLE_ID Data_Size_Total is always 16 bytes)
|-
|-
| 0x0020 || 0x04 || 00000000 || Big endian || 0 || (Start of "ABCD12345") - (Start of Data_Table) = 0x0030-0x0030 = 0
| 0x0020 || 0x04 || 00000000 || Big endian || 0 || (Start of '''Data''') - (Start of '''Data_Table''') = 0x0030-0x0030 = 0
|-
|-
! Name_Table
! Name_Table
|-
|-
| 0x0024 || 0x09 || 5449544C455F494400 ||  To utf-8 || TITLE_ID || Name, included 1 blank byte at the end
| 0x0024 || 0x09 || 5449544C455F494400 ||  To utf-8 || TITLE_ID || '''Name''', included 1 blank byte at the end
|-
|-
| 0x002D || 0x03 || 000000 || || || Padding (9 from the previous entry + 3 padding = 12 bytes)
| 0x002D || 0x03 || 000000 || || || Padding (9 from the previous entry + 3 padding = 12 bytes)
Line 117: Line 116:
! Data_Table
! Data_Table
|-
|-
| 0x0030 || 0x0F || 41424344313233343500000000000000 || To utf-8 || ABCD12345 || Data, 16 bytes block size, 10 bytes used included 1 blank byte
| 0x0030 || 0x0F || 41424344313233343500000000000000 || To utf-8 || ABCD12345 || '''Data'''. ('''Data_Size_Total'''=16 bytes. '''Data_Size_Used'''=10 bytes)
|}
|}


*Notes
*When you generate a non proper file playing with the flags, you can have a nice icon of "corrupted data", but in some cases the game will still boot normally. In other cases when adding or removing parameters the file is "partially" corrupted because a "break point" in the structure and the file is "partially" loaded (the PS3 loads the values before the structure "break point" normally, but after this point the values shown as corrupted or missed)
When you generate a non proper file playing with the flags, you can have a nice icon of "corrupted data", but in some cases the game will still boot normally. In other cases when adding or removing parameters the file is "partially" corrupted because a "break point" in the structure and the file is "partially" loaded (the PS3 loads the values before the structure "break point" normally, but after this point the values shown as corrupted or missed)
 
*The corrupted icon is part of the firmware, in the path... (i dont remember)


The corrupted icon is part of the firmware, in the path... (i dont remember)
*When adding "non-stadard" parameters to a "standard" SFO the system (or firmware) blocks this "not-expected" parameter. The file loads normally, but the added parameter is ignored (e.g. when adding SUB_TITLE to a SFO for catergory "HG")


The minimall structure tested (and working) for a hombrew can be copied/downloaded at the bottom of the page, its not "standard" but the PS3 doesnt complains, and probably can be reduced even more
*The minimall structure tested (and working) for a hombrew can be copied/downloaded at the bottom of the page, its not "standard" but the PS3 doesnt complains, and probably can be reduced even more


===SFX===
===SFX===
This is a PARAM.SFX from the Blue-Ray "move demo disc", the disc contains some installable demos in format .PKG in the path /PS3_EXTRA/D000/DATA000.PKG & /PS3_EXTRA/D000/PARAM.SFX
This is a PARAM.SFX from the Blue-Ray "move demo disc", the disc contains some installable demos in format .PKG in the paths /PS3_EXTRA/D000/DATA000.PKG controlled by a /PS3_EXTRA/D000/PARAM.SFX


The entryes and values are self explanatory, this files can be created easily by hand
The entries and values are self explanatory, this files can be created easily by hand


<pre>
<pre>
Line 150: Line 150:
{| border="1" cellspacing="0" cellpadding="5" border="#999" class="wikitable sortable" style="border:1px solid #999; border-collapse: collapse;"  
{| border="1" cellspacing="0" cellpadding="5" border="#999" class="wikitable sortable" style="border:1px solid #999; border-collapse: collapse;"  
|- bgcolor="#cccccc"
|- bgcolor="#cccccc"
! Variable Name !! Data_Size !! Data_Type !! TR !! SD !! HG !! GP !! GD !! 1P !! 2P !! MN
! Parameter !! Data_Type !! Data_Size_Total !! Data_Size_Used !! TR !! SD !! HG !! GP !! GD !! 1P !! 2P !! MN
|-
|-
| ACCOUNTID || 16 || utf-8 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| ACCOUNTID || utf-8 || 16 || 16 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| ACCOUNT_ID || 16 || integer || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| ACCOUNT_ID || integer || 16 || 16 || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| ANALOG_MODE || 4 || integer || {{No}} || {{No}} || {{No}} || ??? || {{No}} || {{Yes}} || ??? || {{No}}
| ANALOG_MODE || integer || 4 || 4 || {{No}} || {{No}} || {{No}} || ??? || {{No}} || {{Yes}} || ??? || {{No}}
|-
|-
| APP_VER || 8 || utf-8 || {{No}} || {{No}} || {{Opt}} || ??? || {{No}} || {{No}} || ??? || {{Yes}}
| APP_VER || utf-8 || 8 || 6 || {{No}} || {{No}} || {{Opt}} || ??? || {{No}} || {{No}} || ??? || {{Yes}}
|-
|-
| ATTRIBUTE || 4 || integer || {{No}} || {{Yes}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
| ATTRIBUTE || integer || 4 || 4 || {{No}} || {{Yes}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
|-
|-
| BOOTABLE || 4|| integer || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
| BOOTABLE || integer || 4 || 4 || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
|-
|-
| CATEGORY || 4 || utf-8 || {{No}} || {{Yes}} || {{Yes}} || ??? || {{Yes}} || {{Yes}} || ??? || {{Yes}}
| CATEGORY || utf-8 || 4 || 3 || {{No}} || {{Yes}} || {{Yes}} || ??? || {{Yes}} || {{Yes}} || ??? || {{Yes}}
|-
|-
| LANG || 4 || integer || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| DETAIL || utf-8 || 1024 || variable || {{No}} || {{Opt}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| DETAIL || 1024 || utf-8 || {{No}} || {{Opt}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| LANG || integer || 4 || 4 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| LICENSE || 512 || utf-8 || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| LICENSE || utf-8 || 512 || variable || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| NPCOMMID || 16 || utf-8 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| NPCOMMID || utf-8 || 16 || 12 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| NP_COMMUNICATION_ID || 16 || utf-8 || {{No}} || {{No}} || {{Opt}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| NP_COMMUNICATION_ID || utf-8 || 16 || variable || {{No}} || {{No}} || {{Opt}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| PADDING || 8|| integer || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| PADDING || integer || 8 || 0 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| PARAMS || 1024 || integer || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| PARAMS || integer || 1024 || 1024 || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| PARAMS2 || 12 || integer || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| PARAMS2 || integer || 12 || 12 || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| PARENTALLEVEL || 4 || integer || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{Yes}} || ??? || {{No}}
| PARENTALLEVEL || integer || 4 || 4 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{Yes}} || ??? || {{No}}
|-
|-
| PARENTAL_LEVEL || 4 || integer || {{No}} || {{Yes}} || {{Yes}} || ??? || {{Yes}} || {{No}} || ??? || {{Yes}}
| PARENTAL_LEVEL || integer || 4 || 4 || {{No}} || {{Yes}} || {{Yes}} || ??? || {{Yes}} || {{No}} || ??? || {{Yes}}
|-
|-
| PS3_SYSTEM_VER || 8 || utf-8 || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
| PS3_SYSTEM_VER || utf-8 || 8 || 8 || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
|-
|-
| RESOLUTION || 4 || integer || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
| RESOLUTION || integer || 4 || 4 || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
|-
|-
| SAVEDATA_DIRECTORY || 64 || utf-8 || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| SAVEDATA_DIRECTORY || utf-8 || 64 || variable || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| SAVEDATA_LIST_PARAM || 8 || utf-8 || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| SAVEDATA_LIST_PARAM || utf-8 || 8 || variable || {{No}} || {{Yes}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| SOUND_FORMAT || 4 || integer || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
| SOURCE || integer || 4 || 4 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| SOURCE || 4 || integer || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| SOUND_FORMAT || integer || 4 || 4 || {{No}} || {{No}} || {{Yes}} || ??? || {{No}} || {{Yes}} || ??? || {{Yes}}
|-
|-
| SUB_TITLE || 128 || utf-8 || {{No}} || {{Opt}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| SUB_TITLE || utf-8 || 128 || variable || {{No}} || {{Opt}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| TITLE || 128 || utf-8 || {{No}} || {{Yes}} || {{Yes}} || ??? || {{Yes}} || {{Yes}} || ??? || {{Yes}}
| TITLE || utf-8 || 128 || variable || {{No}} || {{Yes}} || {{Yes}} || ??? || {{Yes}} || {{Yes}} || ??? || {{Yes}}
|-
|-
| TITLEID000, 001, 002... || 16 || utf-8 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| TITLEID0'''xx''' || utf-8 || 16 || 9 || {{Yes}} || {{No}} || {{No}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| TITLE_00, 01, 02... || 128 || utf-8 || {{No}} || {{No}} || {{Opt}} || ??? || {{No}} || {{No}} || ??? || {{No}}
| TITLE_'''xx''' || utf-8 || 128 || variable || {{No}} || {{No}} || {{Opt}} || ??? || {{No}} || {{No}} || ??? || {{No}}
|-
|-
| TITLE_ID || 16 || utf-8 || {{No}} || {{No}} || {{Yes}} || ??? || {{Yes}} || {{Yes}} || ??? || {{Yes}}
| TITLE_ID || utf-8 || 16 || 10 || {{No}} || {{No}} || {{Yes}} || ??? || {{Yes}} || {{Yes}} || ??? || {{Yes}}
|-
|-
| VERSION || 8 || utf-8 || {{Yes}} || {{No}} || {{Yes}} || ??? || {{Yes}} || {{Yes}} || ??? || {{Yes}}
| VERSION || utf-8 || 8 || 6 (or 3) || {{Yes}} || {{No}} || {{Yes}} || ??? || {{Yes}} || {{Yes}} || ??? || {{Yes}}
|-
|-
|}
|}


Notes:
* Colored columns are named by his CATEGORY
* Columns at the right are named by his CATEGORY
** TR.- Trophies (used "TR" for convenience, but is not a valid CATEGORY, actually trophies dont have CATEGORY)
* TR.- is used in the table for trophies to keep the colums width, but is not a valid CATEGORY, actually trophies dont have CATEGORY
** SD.- Save Data
* SD.- Save Data
** HG.- HDD Game (same SFO format than DG)
* HG.- HDD Game (same for DG or "Disc Game" refered to an originall Blue Ray disc game)
** GP.- Game Patch <--- game patches uses GD category, needs verifycation
* GP.- Game Patch. needed example
** GD.- Game Data
* GD.- Game Data
** 1P.- PS1 classics (PlayStation One games)
* 1P.- PS1 classics (PlayStation One games)
** 2P.- PS2 Classics (PlayStation 2 games) <--- not verifyed
* 2P.- PS2 Classics (PlayStation 2 games) needed example
** MN.- Mini
* MN.- Mini


==Parameters Descriptions==
==Parameters Descriptions==


===ACCOUNTID & ACCOUNT_ID===
===ACCOUNTID & ACCOUNT_ID===
Data_Type: utf-8
Data_Size_Total: 16 bytes
Data_Size_Used: 16 bytes
PSN User Account (blank when not registered in PSN
PSN User Account (blank when not registered in PSN


===ANALOG_MODE===
===ANALOG_MODE===
Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes
Used in PS1 games to make them compatibles with the analog sticks of the Dualshock Controller
Used in PS1 games to make them compatibles with the analog sticks of the Dualshock Controller


===APP_VER===
===APP_VER===
Data_Type: utf-8
Data_Size_Total: 8 bytes
Data_Size_Used: 6 bytes
Not used in old games
Not used in old games


=== ATTRIBUTE ===
===ATTRIBUTE===
  Data type: Int32
Data_Type: uint32_t
  Block fixed size: 4 bytes
Data_Size_Total: 4 bytes
  Bytes used: 4
Data_Size_Used: 4 bytes
 
This parameter contains a maximun of 32 flags that can be turned on/off to activate/deactivate speciall boot modes for the content.
This parameter contains a maximun of 32 flags that can be turned on/off to activate/deactivate speciall boot modes for the content.


Line 318: Line 330:
| 00 00 00 80 || 80 00 00 00 || 10000000 00000000 00000000 00000000 || Not used yet ?
| 00 00 00 80 || 80 00 00 00 || 10000000 00000000 00000000 00000000 || Not used yet ?
|}
|}


Some examples. If you find a game with a flag in his ATTRIBUTE that is not yet in the table, please add it
Some examples. If you find a game with a flag in his ATTRIBUTE that is not yet in the table, please add it
Line 330: Line 341:
|}
|}


 
*'''PSP Remote Play'''
*PSP Remote Play
The format "MPEG4 AVC/AAC" only works when the other format "MPEG4 SP/ATRAC" is activated
The format "MPEG4 AVC/AAC" only works when the other format "MPEG4 SP/ATRAC" is activated


*PSP Export
*'''PSP Export'''
Can be activate depend to CATEGORY (HG and others?) and works only if "feel free to fill" checked by "feel free to fill"
Can be activate depend to CATEGORY (HG and others?) and works only if "feel free to fill" checked by "feel free to fill"


*XMB In-game
*'''XMB In-game'''
Is a feature that lets you pause the game (with the PS button) and play your own music from the files stored in your HDD
Is a feature that lets you pause the game (with the PS button) and play your own music from the files stored in your HDD
The formats supported are the same than the native ones, it support playlists and all the normall functions of the music player. It was introduced in firmware 2.40
The formats supported are the same than the native ones, it support playlists and all the normall functions of the music player. It was introduced in firmware 2.40


*Move Controller warning screen
*'''Move Controller warning screen'''
This screen (and the other warning screens) are displayed before the game is launched, them explains the correct way to use the move controller, navigation controller, and eye cam respectively
This screen (and the other warning screens) are displayed before the game is launched, them explains the correct way to use the move controller, navigation controller, and eye cam respectively


Line 348: Line 358:
A example of a bad use of this screens is "3.56 FJW cfw" that patches all SFO's to activate 2 of this flags to force all his users to see 2 logos (i cant comment one of them, and the other the gargoile) causing a delay in the timing to boot a game or program >:P
A example of a bad use of this screens is "3.56 FJW cfw" that patches all SFO's to activate 2 of this flags to force all his users to see 2 logos (i cant comment one of them, and the other the gargoile) causing a delay in the timing to boot a game or program >:P


*Navigation Controller, and Eye Cam warning screens
*'''Navigation Controller, and Eye Cam warning screens'''
Only works when "Move Controller" warning screen is activated
Only works when "Move Controller" warning screen is activated


*Calibration Notification
*'''Calibration Notification'''
This flag makes appear a calibration screen, but only when the controller has not been calibrated previously (or when is missconfigured)
This flag makes appear a calibration screen, but only when the controller has not been calibrated previously (or when is missconfigured)


*Stereoscopic 3D Warning Screen
*'''Stereoscopic 3D Warning Screen'''
This is a warning screen similar than the ones related with move peripherals, but only appear when you are using a 3D compatible TV (is intended to give you some seconds to catch your 3D glasses)
This is a warning screen similar than the ones related with move peripherals, but only appear when you are using a 3D compatible TV (is intended to give you some seconds to catch your 3D glasses)


*Installable Packages in path PS3_GAME\PKGDIR\PKG** (where ** is a number from 00 to 99)
*'''Installable Packages'''
In path PS3_GAME\PKGDIR\PKG** (where ** is a number from 00 to 99)
This is one of the 2 ways to install packages (used in Blue-Ray discs), it can be said that the flags is "activating" the sub-folder PKGDIR, inside PKGDIR there is another SFO that can be considered an "Level2 SFO"
This is one of the 2 ways to install packages (used in Blue-Ray discs), it can be said that the flags is "activating" the sub-folder PKGDIR, inside PKGDIR there is another SFO that can be considered an "Level2 SFO"


The ATTRIBUTE of this "Level2 SFO" is always an "1" (different of the values explained in this table that are only applicables to "Level1 SFO's"
The ATTRIBUTE of this "Level2 SFO" is always an "1" (different of the values explained in this table that are only applicables to "Level1 SFO's"


*Enable game purchase
*'''Enable game purchase'''
Only works if the category is a DG/HD and checked by "feel free to fill". Can change somes settings as titles, parental lock level, resolutions, and others Content Informations Files (probably related to expirations and such) after you purchased the game.
Only works if the category is a DG/HD and checked by "feel free to fill". Can change somes settings as titles, parental lock level, resolutions, and others Content Informations Files (probably related to expirations and such) after you purchased the game.


*Move compatible
*'''Move compatible'''
Enables support for the Move Controller (Navigation Controller and Eye Cam are activated at the same time that the Move Controller and doesn't have/need a flag)
Enables support for the Move Controller (Navigation Controller and Eye Cam are activated at the same time that the Move Controller and doesn't have/need a flag)


=== BOOTABLE ===
===BOOTABLE===
  Data type: Int32
Data_Type: uint32_t
  Block fixed size: 4 bytes
Data_Size_Total: 4 bytes
  Bytes used: 4
Data_Size_Used: 4 bytes


{| class="wikitable"
{| class="wikitable"
Line 384: Line 395:


===CATEGORY===
===CATEGORY===
Data_Type: utf-8
Data_Size_Total: 4 bytes
Data_Size_Used: 3 bytes




Line 389: Line 403:


===LANG===
===LANG===
Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes
The language used when the trophy file was installed.  
The language used when the trophy file was installed.  


===DETAIL===
===DETAIL===
Data_Type: utf-8
Data_Size_Total: 1024 bytes
Data_Size_Used: variable
Third and next lines of text under the icon in XMB
Third and next lines of text under the icon in XMB


===LICENSE===
===LICENSE===
Data_Type: utf-8
Data_Size_Total: 512 bytes
Data_Size_Used: variable


===NP_COMMUNICATION_ID===
===NP_COMMUNICATION_ID===
  Data type: utf-8
  Data_Type: utf-8
  Block fixed size: 16 bytes
  Data_Size_Total: 16 bytes
  Bytes used: 16
  Data_Size_Used: variable


Comm ID for Bootable message
Comm ID for Bootable message


===NPCOMMID===
===NPCOMMID===
  Data type: utf-8
  Data_Type: utf-8
  Block fixed size: 16 bytes
  Data_Size_Total: 16 bytes
  Bytes used: 16
  Data_Size_Used: 12 bytes


Used in [[Trophy_files|trophies]] with the format NPWRxxyyy_zz (e.g. NPWR00153_00)
Used in [[Trophy_files|trophies]] with the format NPWRxxyyy_zz (e.g. NPWR00153_00)


===PADDING===
===PADDING===
Data_Type: uint64_t
Data_Size_Total: 8 bytes
Data_Size_Used: 0 bytes


=== PARAMS===
===PARAMS===
Data_Type: ?
Data_Size_Total: 1024 bytes
Data_Size_Used: ? bytes


{| class="wikitable"
{| class="wikitable"
Line 441: Line 472:


===PARENTALLEVEL, PARENTAL_LEVEL & PARENTAL_LEVEL_x===
===PARENTALLEVEL, PARENTAL_LEVEL & PARENTAL_LEVEL_x===
  Data type: Int32
Data_Type: uint32_t
  Block fixed size: 4 bytes
Data_Size_Total: 4 bytes
  Bytes used: 4
Data_Size_Used: 4 bytes


PARENTAL_LEVEL is a scale from 0 to 11 to restrict the access to the content for the different users of the console (can be configured for kids in his user profile).
PARENTAL_LEVEL is a scale from 0 to 11 to restrict the access to the content for the different users of the console (can be configured for kids in his user profile).
Line 501: Line 532:


===PS3_SYSTEM_VER===
===PS3_SYSTEM_VER===
Data_Type: utf-8
Data_Size_Total: 8 bytes
Data_Size_Used: 8 bytes
Minimun firmware required to run the Game/App
Minimun firmware required to run the Game/App


=== RESOLUTION ===
===RESOLUTION===
  Data type: Int32
Data_Type: uint32_t
  Block fixed size: 4 bytes
Data_Size_Total: 4 bytes
  Bytes used: 4
Data_Size_Used: 4 bytes


Video modes flags
Video modes flags
Line 533: Line 568:


===SAVEDATA_DIRECTORY===
===SAVEDATA_DIRECTORY===
Data_Type: utf-8
Data_Size_Total: 64 bytes
Data_Size_Used: variable
Name of the folder for store SaveData (game saves)
Name of the folder for store SaveData (game saves)
===SAVEDATA_LIST_PARAM===
===SAVEDATA_LIST_PARAM===
Data_Type: utf-8
Data_Size_Total: 8 bytes
Data_Size_Used: variable
===SOURCE===
Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes
Used in trophies


=== SOUND_FORMAT ===
===SOUND_FORMAT===
  Data type: Int32
Data_Type: uint32_t
  Block fixed size: 4 bytes
Data_Size_Total: 4 bytes
  Bytes used: 4
Data_Size_Used: 4 bytes


Sound modes flags
Sound modes flags
Line 558: Line 608:
|}
|}


===SOURCE===
===SUB_TITLE===
Used in trophies
Data_Type: utf-8
Data_Size_Total: 128 bytes
Data_Size_Used: variable


===SUB_TITLE===
Used in SaveData. Secondary text line under the icon in XMB
Used in SaveData. Secondary text line under the icon in XMB


===TITLE & TITLE_xx===
===TITLE & TITLE_xx===
  <value name="TITLE" type="string">
Data_Type: utf-8
  Title of this Homebrew
Data_Size_Total: 128 bytes
  </value>
Data_Size_Used: variable


TITLE is the default title of the homebrew for all languages (usually in english). First line of text right to the icon in XMB
TITLE is the default title of the homebrew for all languages (usually in english). First line of text right to the icon in XMB
Line 574: Line 625:


The default name TITLE is always present when other localized TITLE_xx are used
The default name TITLE is always present when other localized TITLE_xx are used
===TITLEID0xx===
Data_Type: utf-8
Data_Size_Total: 16 bytes
Data_Size_Used: 9
Used in trophies, where the xx is a number that defines a specific language from 00 to 15
The SFO contains the full list of 15 TITLEID0xx parameters for all languages, all them can contain data... or only the default one (00). The ones without data are marked in the '''Definition_Table''' as ''' Data_Size_Used" = 0
00 = default
others = localized languages
The string is in the format: ABCD12345 and matches the [[TITLE ID]] of the game
===TITLE_ID===
Data_Type: utf-8
Data_Size_Total: 16 bytes
Data_Size_Used: 10
[[TITLE ID]] of the title


Depends on fews parameters,Category as DG or HG and regions or type.<br>
Depends on fews parameters,Category as DG or HG and regions or type.<br>
Line 596: Line 670:
Others examples:<br>
Others examples:<br>


===TITLEID000 & TITLEID0xx===
===VERSION===
Used in trophies, where the xx is a number that defines a specific language
Data_Type: utf-8
 
Data_Size_Total: 8 bytes
00 = default
Data_Size_Used: 6 bytes (or 3 bytes when used in trophies)
 
others = localized languages


===TITLE_ID===
[[TITLE ID]] of the title
===VERSION===
*When used in trophies it has a Data_Used of 3 bytes.... the other formats uses 6 bytes
*When used in trophies it has a Data_Used of 3 bytes.... the other formats uses 6 bytes


Line 622: Line 690:
*Sources
*Sources
http://www.ps3hax.net/showthread.php?t=28704
http://www.ps3hax.net/showthread.php?t=28704
http://ps3dev.wikispaces.com/PARAM.SFO
http://ps3dev.wikispaces.com/PARAM.SFO


==Suggestions... (this will be erased later)==
==Suggestions... (this will be erased later)==

Revision as of 09:00, 18 January 2012


SFO (System File O???) are used in folders wich content needs to be displayed in the XMB. In the same folder are the Content Information Files and for speciall content (like savegames) there is a PARAM.PFD for security reasons.

The parameters SFO contains can be simplyfied as imputs and outputs of the content:

  • Contains the information strings needed to display the content in the XMB and his restrictions (e.g. name and version of a game).
  • When executing the content, the SFO is sending "boot modifyers" (or flags) to the content to activate "speciall modes" (e.g. audio and video modes of a game).


SFX (System File in XML format) are used to create SFO's. Additionally SFX files are used in Blue-Ray disc games inside PS3_EXTRA folder to display content in XMB. In fact the values contained in both formats are the same and the conversion is easy from one format to the other

SFO and SFX can be "chained" in a structure of subfolders with a maximun of 3 levels (SFX format is used in level3).

Level2 SFO's can contain specific values than cant be used in Level1 (e.g. CATEGORY when used in level2 has lot of different and specific values). In the same way when ATTRIBUTE is used in level2 his valid values are completly different than when used in level1.


Internal Structure

Header

 typdef struct Header
 {
 uint32_t Signature; /* Always PSF */
 uint32_t Version; /* Usually 1.1 */
 uint32_t Name_Table_Start; /* Start position of the Name_Table */
 uint32_t Data_Table_Start; /* Start position of the Data_Table */
 uint32_t Entries_Number; /* Number of entries */
 };

Definition_Table

This structure repeats one time for every Entries_Number defined in the header. All values are in Little Endian

 typedef struct Definition_Table
 {
 uint16_t Name_Table_Offset; /* Offset of the Name of the entry, from start of Name_Table */
 uint16_t Data_Type; /* Type of data of the entry in the Data_Table */
 uint32_t Data_Size_Used; /* Used Bytes by the entry in the Data_Table */
 uint32_t Data_Size_Total; /* Total bytes reserved for the entry in the Data_Table */
 uint32_t Data_Table_Offset; /* Offset of the Data of the entry, from start of Data_Table */
 };
Valid Data Types Description Notes
04 00 Present but filled with zeroes In ACCOUNT_ID when not registered in PSN
04 02 utf-8
04 04 integer

Name_Table

The entries of this table (and the next table) can vary depending of the kind of content displayed in the XMB (in other words... are defined by CATEGORY and restricted by the system).

Each entry of the table needs 1 blank byte after the name to separate them

The table has padding at the end to fit the total size in bytes to a multiplier or 4, this padding is added after the last blank byte of the last entry. If the last entry (included his blank byte) matches with a multiplier of 4 this padding doesn't exist

Data_Table

This table has no padding between entries neither at the end, padding is not supported in any way, "Data_Size_Total" for each entry is in the "Definition_Table" and the space can be considered reserved, even when is not used or filled with zeroes

The number of Data_Size_Used bytes for each entry is in the Definition_Table, it matches the Data_Size_Total when the entry is an integer (integer entries uses all the reserved bytes) but can vary with utf-8 entries (e.g. TITLE of a game), additionally utf-8 entries needs 1 blank byte after the last character of the text string, this byte can be considered part of the string to count the Data_Size_Total bytes for this entry in the Definition_Table

Internall Structure Examples

SFO

This is an example of a hand made SFO structure, it contains only 1 entry (TITLE_ID), i choosed this one because his Data_Size_Total is short enought (16 bytes) to build the full structure in a minimall size, needs padding at the end of the Name_Table, and the Data_Size_Used is smaller than Data_Size_Total

0x0000  00 50 53 46  01 01 00 00  24 00 00 00  30 00 00 00 | .PSF....$...0... |
0x0010  01 00 00 00  00 00 04 02  0A 00 00 00  0F 00 00 00 | ................ |
0x0020  00 00 00 00  54 49 54 4C  45 5F 49 44  00 00 00 00 | ....TITLE_ID.... |
0x0030  41 42 43 44  31 32 33 34  35 00 00 00  00 00 00 00 | ABCD12345....... |

All the blocks of the file are explained in the next list, it has separated sections for header and the three tables.

Offset Size Content Conversion Value Notes
Header
0x0000 0x04 00 50 53 46 To utf-8 PSF Signature
0x0004 0x04 01 01 00 00 Big endian, decimal 1.1 Version (the point is added by the system)
0x0008 0x04 24 00 00 00 Big endian 0x0024 Start of Name_Table
0x000C 0x04 30 00 00 00 Big endian 0x0030 Start of Data_Table
0x0010 0x04 01 00 00 00 Big endian, decimal 1 Number of entries in the tables
Definition_Table
0x0014 0x02 0000 Big endian 0 (Start of Name) - (Start of Name_Table) = 0x0024-0x0024 = 0
0x0016 0x02 0402 Unknown Data_Type
0x0018 0x04 0A000000 Big endian, decimal 10 Data_Size_Used (ABCD12345 are 9 bytes + 1 blank = 10)
0x001C 0x04 0F000000 Big endian, decimal 16 Data_Size_Total (TITLE_ID Data_Size_Total is always 16 bytes)
0x0020 0x04 00000000 Big endian 0 (Start of Data) - (Start of Data_Table) = 0x0030-0x0030 = 0
Name_Table
0x0024 0x09 5449544C455F494400 To utf-8 TITLE_ID Name, included 1 blank byte at the end
0x002D 0x03 000000 Padding (9 from the previous entry + 3 padding = 12 bytes)
Data_Table
0x0030 0x0F 41424344313233343500000000000000 To utf-8 ABCD12345 Data. (Data_Size_Total=16 bytes. Data_Size_Used=10 bytes)
  • When you generate a non proper file playing with the flags, you can have a nice icon of "corrupted data", but in some cases the game will still boot normally. In other cases when adding or removing parameters the file is "partially" corrupted because a "break point" in the structure and the file is "partially" loaded (the PS3 loads the values before the structure "break point" normally, but after this point the values shown as corrupted or missed)
  • The corrupted icon is part of the firmware, in the path... (i dont remember)
  • When adding "non-stadard" parameters to a "standard" SFO the system (or firmware) blocks this "not-expected" parameter. The file loads normally, but the added parameter is ignored (e.g. when adding SUB_TITLE to a SFO for catergory "HG")
  • The minimall structure tested (and working) for a hombrew can be copied/downloaded at the bottom of the page, its not "standard" but the PS3 doesnt complains, and probably can be reduced even more

SFX

This is a PARAM.SFX from the Blue-Ray "move demo disc", the disc contains some installable demos in format .PKG in the paths /PS3_EXTRA/D000/DATA000.PKG controlled by a /PS3_EXTRA/D000/PARAM.SFX

The entries and values are self explanatory, this files can be created easily by hand

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<paramsfo add_hidden="false">
  <param key="ATTRIBUTE" fmt="int32" max_len="4">0</param>
  <param key="CATEGORY" fmt="utf8" max_len="4">IP</param>
  <param key="PARENTAL_LEVEL" fmt="int32" max_len="4">2</param>
  <param key="TITLE" fmt="utf8" max_len="128">Beat Sketcher™</param>
  <param key="TITLE_05" fmt="utf8" max_len="128">Beat Sketcher™ A mano libera</param>
</paramsfo>

Parameters Table

Parameters are ordered inside the SFO alphabetically (from A to Z)

This table contains all the parameters known/found of the standard formats used in PS3. Columns of the table are named to match this formats

Parameter Data_Type Data_Size_Total Data_Size_Used TR SD HG GP GD 1P 2P MN
ACCOUNTID utf-8 16 16 Yes No No ??? No No ??? No
ACCOUNT_ID integer 16 16 No Yes No ??? No No ??? No
ANALOG_MODE integer 4 4 No No No ??? No Yes ??? No
APP_VER utf-8 8 6 No No Opt ??? No No ??? Yes
ATTRIBUTE integer 4 4 No Yes Yes ??? No Yes ??? Yes
BOOTABLE integer 4 4 No No Yes ??? No Yes ??? Yes
CATEGORY utf-8 4 3 No Yes Yes ??? Yes Yes ??? Yes
DETAIL utf-8 1024 variable No Opt No ??? No No ??? No
LANG integer 4 4 Yes No No ??? No No ??? No
LICENSE utf-8 512 variable No No Yes ??? No No ??? No
NPCOMMID utf-8 16 12 Yes No No ??? No No ??? No
NP_COMMUNICATION_ID utf-8 16 variable No No Opt ??? No No ??? No
PADDING integer 8 0 Yes No No ??? No No ??? No
PARAMS integer 1024 1024 No Yes No ??? No No ??? No
PARAMS2 integer 12 12 No Yes No ??? No No ??? No
PARENTALLEVEL integer 4 4 Yes No No ??? No Yes ??? No
PARENTAL_LEVEL integer 4 4 No Yes Yes ??? Yes No ??? Yes
PS3_SYSTEM_VER utf-8 8 8 No No Yes ??? No Yes ??? Yes
RESOLUTION integer 4 4 No No Yes ??? No Yes ??? Yes
SAVEDATA_DIRECTORY utf-8 64 variable No Yes No ??? No No ??? No
SAVEDATA_LIST_PARAM utf-8 8 variable No Yes No ??? No No ??? No
SOURCE integer 4 4 Yes No No ??? No No ??? No
SOUND_FORMAT integer 4 4 No No Yes ??? No Yes ??? Yes
SUB_TITLE utf-8 128 variable No Opt No ??? No No ??? No
TITLE utf-8 128 variable No Yes Yes ??? Yes Yes ??? Yes
TITLEID0xx utf-8 16 9 Yes No No ??? No No ??? No
TITLE_xx utf-8 128 variable No No Opt ??? No No ??? No
TITLE_ID utf-8 16 10 No No Yes ??? Yes Yes ??? Yes
VERSION utf-8 8 6 (or 3) Yes No Yes ??? Yes Yes ??? Yes
  • Colored columns are named by his CATEGORY
    • TR.- Trophies (used "TR" for convenience, but is not a valid CATEGORY, actually trophies dont have CATEGORY)
    • SD.- Save Data
    • HG.- HDD Game (same SFO format than DG)
    • GP.- Game Patch <--- game patches uses GD category, needs verifycation
    • GD.- Game Data
    • 1P.- PS1 classics (PlayStation One games)
    • 2P.- PS2 Classics (PlayStation 2 games) <--- not verifyed
    • MN.- Mini

Parameters Descriptions

ACCOUNTID & ACCOUNT_ID

Data_Type: utf-8
Data_Size_Total: 16 bytes
Data_Size_Used: 16 bytes

PSN User Account (blank when not registered in PSN

ANALOG_MODE

Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes

Used in PS1 games to make them compatibles with the analog sticks of the Dualshock Controller

APP_VER

Data_Type: utf-8
Data_Size_Total: 8 bytes
Data_Size_Used: 6 bytes

Not used in old games

ATTRIBUTE

Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes

This parameter contains a maximun of 32 flags that can be turned on/off to activate/deactivate speciall boot modes for the content.

Values are stored in "Little Indian" format, by converting them to "Big Indian" and then to binary is easyer to see in a "human readable" format how are ordered from older to newer (note that the list separates them in 4 blocks, each of this blocks are "filled" from top to bottom). The older flags are related to PSP in the first block because PSP is older than PS3.

Flags can be used in groups, to remove or add a flag from the group is needed to make an addition or a substraction of the values.

Little Endian Big Endian Flags (Binary ) Description
01 00 00 00 00 00 00 01 00000000 00000000 00000000 00000001 PSP Remote Play in MPEG4 SP/ATRAC
02 00 00 00 00 00 00 02 00000000 00000000 00000000 00000010 PSP Export
04 00 00 00 00 00 00 04 00000000 00000000 00000000 00000100 PSP Remote Play in MPEG4 AVC/AAC
08 00 00 00 00 00 00 08 00000000 00000000 00000000 00001000 Unknown !
10 00 00 00 00 00 00 10 00000000 00000000 00000000 00010000 Unknown !
20 00 00 00 00 00 00 20 00000000 00000000 00000000 00100000 "XMB in-game"
40 00 00 00 00 00 00 40 00000000 00000000 00000000 01000000 Not used yet ?
80 00 00 00 00 00 00 80 00000000 00000000 00000000 10000000 Not used yet ?
00 01 00 00 00 00 01 00 00000000 00000000 00000001 00000000 Move Controller Warning Screen
00 02 00 00 00 00 02 00 00000000 00000000 00000010 00000000 Navigation Controller Warning Screen
00 04 00 00 00 00 04 00 00000000 00000000 00000100 00000000 Eye Cam Warning Screen
00 08 00 00 00 00 08 00 00000000 00000000 00001000 00000000 Calibration Notification
00 10 00 00 00 00 10 00 00000000 00000000 00010000 00000000 Stereoscopic 3D Warning Screen
00 20 00 00 00 00 20 00 00000000 00000000 00100000 00000000 Not used yet ?
00 40 00 00 00 00 40 00 00000000 00000000 01000000 00000000 Not used yet ?
00 80 00 00 00 00 80 00 00000000 00000000 10000000 00000000 Not used yet ?
00 00 01 00 00 01 00 00 00000000 00000001 00000000 00000000 Unknown !
00 00 02 00 00 02 00 00 00000000 00000010 00000000 00000000 Installable Packages in path PS3_GAME\PKGDIR\PKG**
00 00 04 00 00 04 00 00 00000000 00000100 00000000 00000000 Game patch overwrite atribute (resolution, sound format, remote play)
00 00 08 00 00 08 00 00 00000000 00001000 00000000 00000000 Enable game purchase (depends of variable "CONTENT_ID")
00 00 10 00 00 10 00 00 00000000 00010000 00000000 00000000 Game patch overwrite atribute (XMB in-game)
00 00 20 00 00 20 00 00 00000000 00100000 00000000 00000000 Game patch overwrite atribute (move screen)
00 00 40 00 00 40 00 00 00000000 01000000 00000000 00000000 Game patch overwrite atribute (3D screen)
00 00 80 00 00 80 00 00 00000000 10000000 00000000 00000000 Move compatible / Game patch overwrite atribute (Move controller)
00 00 00 01 01 00 00 00 00000001 00000000 00000000 00000000 Not used yet ?
00 00 00 02 02 00 00 00 00000010 00000000 00000000 00000000 Not used yet ?
00 00 00 04 04 00 00 00 00000100 00000000 00000000 00000000 Not used yet ?
00 00 00 08 08 00 00 00 00001000 00000000 00000000 00000000 Not used yet ?
00 00 00 10 10 00 00 00 00010000 00000000 00000000 00000000 Not used yet ?
00 00 00 20 20 00 00 00 00100000 00000000 00000000 00000000 Not used yet ?
00 00 00 40 40 00 00 00 01000000 00000000 00000000 00000000 Not used yet ?
00 00 00 80 80 00 00 00 10000000 00000000 00000000 00000000 Not used yet ?

Some examples. If you find a game with a flag in his ATTRIBUTE that is not yet in the table, please add it

Little Endian Big Endian Flags (Binary ) Game Flags Description
05 17 80 00 00 80 17 05 00000000 10000000 00010111 00000101 killzone 3 7 Move compatible + 3D screen + 3 move screens + 2 Remote Play modes
20 00 02 00 00 02 00 20 00000000 00000010 00000000 00100000 Dead Space 2 2 Installable Packages + "XMB in-game"
  • PSP Remote Play

The format "MPEG4 AVC/AAC" only works when the other format "MPEG4 SP/ATRAC" is activated

  • PSP Export

Can be activate depend to CATEGORY (HG and others?) and works only if "feel free to fill" checked by "feel free to fill"

  • XMB In-game

Is a feature that lets you pause the game (with the PS button) and play your own music from the files stored in your HDD The formats supported are the same than the native ones, it support playlists and all the normall functions of the music player. It was introduced in firmware 2.40

  • Move Controller warning screen

This screen (and the other warning screens) are displayed before the game is launched, them explains the correct way to use the move controller, navigation controller, and eye cam respectively

Each of this screens are displayed around 3 seconds, the game waits for them to appear so is a good idea to remove them to improve the loading time, the removing of any of the 3 screens has no effect of the controller support and the controller will work without them

A example of a bad use of this screens is "3.56 FJW cfw" that patches all SFO's to activate 2 of this flags to force all his users to see 2 logos (i cant comment one of them, and the other the gargoile) causing a delay in the timing to boot a game or program >:P

  • Navigation Controller, and Eye Cam warning screens

Only works when "Move Controller" warning screen is activated

  • Calibration Notification

This flag makes appear a calibration screen, but only when the controller has not been calibrated previously (or when is missconfigured)

  • Stereoscopic 3D Warning Screen

This is a warning screen similar than the ones related with move peripherals, but only appear when you are using a 3D compatible TV (is intended to give you some seconds to catch your 3D glasses)

  • Installable Packages

In path PS3_GAME\PKGDIR\PKG** (where ** is a number from 00 to 99) This is one of the 2 ways to install packages (used in Blue-Ray discs), it can be said that the flags is "activating" the sub-folder PKGDIR, inside PKGDIR there is another SFO that can be considered an "Level2 SFO"

The ATTRIBUTE of this "Level2 SFO" is always an "1" (different of the values explained in this table that are only applicables to "Level1 SFO's"

  • Enable game purchase

Only works if the category is a DG/HD and checked by "feel free to fill". Can change somes settings as titles, parental lock level, resolutions, and others Content Informations Files (probably related to expirations and such) after you purchased the game.

  • Move compatible

Enables support for the Move Controller (Navigation Controller and Eye Cam are activated at the same time that the Move Controller and doesn't have/need a flag)

BOOTABLE

Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes
Little Endian Big Endian Flags (Binary ) Description
00 00 00 00 00 00 00 00 00000000 00000000 00000000 00000000 Not bootable
01 00 00 00 00 00 00 01 00000000 00000000 00000000 00000001 Bootable

CATEGORY

Data_Type: utf-8
Data_Size_Total: 4 bytes
Data_Size_Used: 3 bytes



LANG

Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes

The language used when the trophy file was installed.

DETAIL

Data_Type: utf-8
Data_Size_Total: 1024 bytes
Data_Size_Used: variable

Third and next lines of text under the icon in XMB

LICENSE

Data_Type: utf-8
Data_Size_Total: 512 bytes
Data_Size_Used: variable

NP_COMMUNICATION_ID

Data_Type: utf-8
Data_Size_Total: 16 bytes
Data_Size_Used: variable

Comm ID for Bootable message

NPCOMMID

Data_Type: utf-8
Data_Size_Total: 16 bytes
Data_Size_Used: 12 bytes

Used in trophies with the format NPWRxxyyy_zz (e.g. NPWR00153_00)

PADDING

Data_Type: uint64_t
Data_Size_Total: 8 bytes
Data_Size_Used: 0 bytes

PARAMS

Data_Type: ?
Data_Size_Total: 1024 bytes
Data_Size_Used: ? bytes
Sections length (in bytes) Example Content Notes
Section 1 24 030401020300000000000000 0800000000000000 03000000 Unknown (3 sections, divided in 12+8+4 bytes ?)
Section 2 4 01000000 User Account nº
Section 3 16 123456789ABCDEF123456789ABCDEF Console ID Not PSID nor IDPS (needs verification)
Section 4 4 01000000 User Account nº
Section 5 16 123456789ABCDEF123456789ABCDEF PSN User account ID Blanked if the account has not been registered in PSN
Section 6 960 00000000........ Unknown Big chunk of zeroes, probably used or reserved for other formats

Used in Games, CATEGORY type: "SD" SaveData

Most of the values of this parameter are verified against the info contained in XRegistry.sys

Is the most weird parameter of all the list, because is the only one that contains severall strings, one of this strings is another parameter (ACCOUNT_ID), and his size is huge for being an integer.

Based in the name... the way it works can be related with other parameters like: PARAMS2, HYBRID_PARAM, and COMMERCE_PARAM (all this parameters can be considered unknown by now)

PARENTALLEVEL, PARENTAL_LEVEL & PARENTAL_LEVEL_x

Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes

PARENTAL_LEVEL is a scale from 0 to 11 to restrict the access to the content for the different users of the console (can be configured for kids in his user profile).

PARENTALLEVEL is specific to trophies and ps1 (the missing "_" seems to be a typo of the developers)... both are similar and uses the values from the next table.

Little Endian Big Endian Decimal Description
00 00 00 00 00 00 00 00 0 Disabled
01 00 00 00 00 00 00 01 1 Smaller
02 00 00 00 00 00 00 02 2
03 00 00 00 00 00 00 03 3
04 00 00 00 00 00 00 04 4
05 00 00 00 00 00 00 05 5
06 00 00 00 00 00 00 06 6
07 00 00 00 00 00 00 07 7
08 00 00 00 00 00 00 08 8
09 00 00 00 00 00 00 09 9
0A 00 00 00 00 00 00 0A 10
0B 00 00 00 00 00 00 0B 11 Higher

PARENTAL_LEVEL_x is used to define specific restrictions to a region, where the "x" is a letter of the next list

Parameter Internall code Region
PARENTAL_LEVEL_A SCEA America
PARENTAL_LEVEL_C SCH China
PARENTAL_LEVEL_E SCEE Europe
PARENTAL_LEVEL_H SCEH Hong Kong
PARENTAL_LEVEL_J SCEJ Japan
PARENTAL_LEVEL_K SCEK Korea

The valid values for PARENTAL_LEVEL_x are... ??? (added to the previous table if possible)

PS3_SYSTEM_VER

Data_Type: utf-8
Data_Size_Total: 8 bytes
Data_Size_Used: 8 bytes

Minimun firmware required to run the Game/App

RESOLUTION

Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes

Video modes flags

Little Endian Big Endian Flags (Binary ) Description
01 00 00 00 00 00 00 01 00000000 00000000 00000000 00000001 480 (4:3)
02 00 00 00 00 00 00 02 00000000 00000000 00000000 00000010 576 (4:3)
04 00 00 00 00 00 00 04 00000000 00000000 00000000 00000100 720 (16:9)
08 00 00 00 00 00 00 08 00000000 00000000 00000000 00001000 1080 (16:9)
10 00 00 00 00 00 00 10 00000000 00000000 00000000 00010000 480 (16:9)
20 00 00 00 00 00 00 20 00000000 00000000 00000000 00100000 576 (16:9)
40 00 00 00 00 00 00 40 00000000 00000000 00000000 01000000 Not used yet ?
80 00 00 00 00 00 00 80 00000000 00000000 00000000 10000000 Not used yet ?

SAVEDATA_DIRECTORY

Data_Type: utf-8
Data_Size_Total: 64 bytes
Data_Size_Used: variable

Name of the folder for store SaveData (game saves)

SAVEDATA_LIST_PARAM

Data_Type: utf-8
Data_Size_Total: 8 bytes
Data_Size_Used: variable

SOURCE

Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes

Used in trophies

SOUND_FORMAT

Data_Type: uint32_t
Data_Size_Total: 4 bytes
Data_Size_Used: 4 bytes

Sound modes flags

Little Endian Big Endian Flags (Binary ) Description
01 00 00 00 00 00 00 01 00000000 00000000 00000000 00000001 LPCM 2.0
04 00 00 00 00 00 00 04 00000000 00000000 00000000 00000100 LPCM 5.1
10 00 00 00 00 00 00 10 00000000 00000000 00000000 00010000 LPCM 7.1
02 01 00 00 00 00 01 02 00000000 00000000 00000001 00000010 Dolby Digital 5.1 ???
02 02 00 00 00 00 02 02 00000000 00000000 00000010 00000010 DTS Digital Surround ???

SUB_TITLE

Data_Type: utf-8
Data_Size_Total: 128 bytes
Data_Size_Used: variable

Used in SaveData. Secondary text line under the icon in XMB

TITLE & TITLE_xx

Data_Type: utf-8
Data_Size_Total: 128 bytes
Data_Size_Used: variable

TITLE is the default title of the homebrew for all languages (usually in english). First line of text right to the icon in XMB

For localized languages can be added severall TITLE_xx (where "xx" is a number that correspond to languages) e.g: TITLE_08 is the title of the hombrew in russian

The default name TITLE is always present when other localized TITLE_xx are used

TITLEID0xx

Data_Type: utf-8
Data_Size_Total: 16 bytes
Data_Size_Used: 9

Used in trophies, where the xx is a number that defines a specific language from 00 to 15

The SFO contains the full list of 15 TITLEID0xx parameters for all languages, all them can contain data... or only the default one (00). The ones without data are marked in the Definition_Table as Data_Size_Used" = 0

00 = default

others = localized languages

The string is in the format: ABCD12345 and matches the TITLE ID of the game


TITLE_ID

Data_Type: utf-8
Data_Size_Total: 16 bytes
Data_Size_Used: 10

TITLE ID of the title

Depends on fews parameters,Category as DG or HG and regions or type.
Examples:

BCAS23005 Asian version of FF XIII
BLJM60362 Japanese version of FF XIII-2

Same game (Dead Space) but for differents market with differents languages files:
BLES00308
BLES00309

Most of the Bd games will start by BLES (European Market), BLUS (US market) or BLJM/BC.. '(Asian market) +5 digits (Chronological order)

Hdd games or apps will start by NP

Fews title_id names are reserved/restricted and don t apply to this classic way and used By Sony for certains purposes.
Examples:

Title ID as TEST-xxxxx (x as a number) with disc version set as 00.00

Others examples:

VERSION

Data_Type: utf-8
Data_Size_Total: 8 bytes
Data_Size_Used: 6 bytes (or 3 bytes when used in trophies)
  • When used in trophies it has a Data_Used of 3 bytes.... the other formats uses 6 bytes

Tools, manuals and sources

  • Tools

SFO_tools_-_linux-64bit-compiles.rar (23.61 KB)

https://github.com/an0nym0u5/PSL1GHT/commit/75013299710d2bde224e2052284461a665a071bf

read_sfo.tar.bz2 (6.33 KB)

PS3SFOEdit.zip (47.59 KB)

  • Sources

http://www.ps3hax.net/showthread.php?t=28704

http://ps3dev.wikispaces.com/PARAM.SFO

Suggestions... (this will be erased later)

This section will be long, we need to reuse the old texts as most as possible but making the explains more "generall"

To separate PSL1GHT PARAM.SFO & PS3SYS PARAM.SFO part for an other page (under Talk page) to gain spaces. Also if you have an idea about what is HYBRID_PARAM or COMMERCE_PARAM thanks you.


We can also delete all the references of ps3sys and psl1ght since is the ps3 that reads the SFO. We can make it more generall