Editing Save Data

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
=== Location ===
===Location===
Savegames are stored encrypted inside /user/home/[[User ID|user Id]]/[[NP Title ID|title Id]]/[[save data directory]]/[[sce_sys]]/


There is a mountpoint for the current application save data, usually "savedata0" but can be up to "savedata15".
files contained within:
 
Save Data are stored encrypted inside <code>/user/home/[[User ID|user Id]]/[[NP Title ID|title Id]]/savedata0/[[sce_sys]]/</code>.
 
==== External ====
 
Save data can be copied from PS4 to a USB mass storage device.
 
Files are exported to <code>USB:\PS4\SAVEDATA\[[User ID|user Id]]\[[NP Title ID|title Id]]\</code>.
 
File Format if dumped to usb will look like this:
'''savedata_10000000_CUSA09175_DaysGone0002'''
 
=== Files ===
 
Every savedata contains 4 files:
* [[param.sfo]]
* [[param.sfo]]
* [[icon0.png]]
* [[icon0.png]]
Line 22: Line 8:
* [[sealedkey / pfsSKKey|sealedkey]]
* [[sealedkey / pfsSKKey|sealedkey]]


=== Files (/user/home/[[User ID|user Id]]/[[NP Title ID|title Id]]/) ===
==== External ====
Savegames may be copied from PS4 to a USB mass storage device.


When dumping files using FTP you might see your files similar to this structure:
They will be located at USB:\PS4\SAVEDATA\[[User ID|user Id]]\[[NP Title ID|title Id]]\


    ├── Title ID                               
===Files===
    │  ├── SAVEDATA00.bin                      /*This File Holds the pfsSKKey*/
Every savegame contains 4 files:
    │  ├── sdimg_SAVEDATA00                    /*This is the encrypted save file*/


Somehow there is another structure (how? where?):
1) [[sdslot.dat|Data file]]


[Save Data Root Dir]
- size frequently 10.485.760 bytes (bf4 : 18.874.368 bytes)
├─ [User Id Directory]
│  └─ savedata/
│      └─ [Title Id Directory]
│          └─ [save data directory]
│              └─ sce_sys/
│                └─ param.sfo                                          /*sfo containing savedata info will be also shown in the savedata.db*/
│                └─ icon0.png                                          /*savedata icon file*/
│              └─ [save files here] e.g (bendsavegame.ps4.sav)         /*savedata file created by the developer e.g. is of days gone*/
│               


=== Accessing Save Data ===
{| class="wikitable"
|-
! From !! To !! Description
|-
| 0000 || 00AF || Header (176 bytes)
|-
| 00B0 || 00B7 || Magic Block (8 bytes)
|-
| 00B8 || 036F || Block (704 bytes)
|-
| 0370 || 039F || Block (48 bytes)
|-
| 03A0 || 7FFF || Empty Block (31.840 bytes)
|-
| 8000 || eof || Data Block (? bytes)
|}


The PS4 has a few API's for accessing save data one of which is for the VSH.
2) [[sealedkey / pfsSKKey|Key file]]


Below is a small example code:
3) [[param.sfo]]


'''C++ Example'''
4) [[icon0.png]]
<source lang="csharp">
//somehow Initialize user service,saveapi ect.
int ret = 0;
ret = SaveDataInitialize3(NULL);//Initialize save data


OrbisSaveDataMount mount;
memset(&mount, 0x00, sizeof (mount));


mount.userId = userId;
===Files(/user/home/[[User ID|user Id]]/[[NP Title ID|title Id]]/)===
mount.dirName = &dirName;
mount.fingerprint = &fingerprint;
mount.titleId = &titleId;
mount.blocks = 32768;
mount.mountMode = ORBIS_SAVE_DATA_MOUNT_MODE_RDONLY ;//(ORBIS_SAVE_DATA_MOUNT_MODE_DESTRUCT_OFF | ORBIS_SAVE_DATA_MOUNT_MODE_RDWR);


OrbisSaveDataMountResult mountResult;
When dumping files using FTP you might see your files similar to this structure
memset(&mountResult, 0x00, sizeof(mountResult));


ret = SaveDataMount(&mount, &mountResult);
</source>


=== Passcode and Fingerprint ===
    ├── Title ID                               
 
    │  ├── SAVEDATA00.bin                      /*This File Holds the pfsSKKey*/
Passcodes are set when creating your pkg with PKG Creation tools.
    │  ├── sdimg_SAVEDATA00                    /*This is the encrypted save file*/
 
To access a save from any other game/app that is not your own you will need to set the hashed passcode 'Fingerprint' as a parameter to mount the save
 
=== Number of Simultaneous Savedata Mounts ===
 
Up to 16 save data can be mounted at the same time.
 
(if you need more than that you will need to ask the user to select the ones he wants and do them one by one or do them in chuncks and save to usb)
 
=== Mount-enabled Period ===
 
If a save is mounted with the ORBIS_SAVE_DATA_MOUNT_MODE_RDWR flag it must be unmounted within 15 seconds. Or not but you can risk the save getting corrupted if a user logs out or terminates the application without unmounting saves first.
 
=== Data in Saves ===
 
There are some restrictions to what you can save in a savedir (someone can fill this in):
* sce_sys will be automatically created by the system (THIS IS A RESERVED NAME).
* You cannot save elf files or prx files in the save itself.
 
=== Save Data Limitations ===
 
* Saves can only be up to 1GB in size per save slot.
 
=== Save Data Database ===
 
System logs all save data info in each users directory under save data.
 
e.g./system_data/savedata/10000000/db/user/savedata.db


Savedata database is in sqlite so any sqlite editor can read and write on it. It is not protected in PS4 OS from modification.




{{File Formats}}<noinclude>[[Category:Main]]</noinclude>
{{File Formats}}
<noinclude>[[Category:Main]]</noinclude>
Please note that all contributions to PS4 Developer wiki are considered to be released under the GNU Free Documentation License 1.2 (see PS4 Developer wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

To protect the wiki against automated edit spam, we kindly ask you to solve the following hCaptcha:

Cancel Editing help (opens in new window)