Filesystem services: Difference between revisions

TimmSkiller (talk | contribs)
 
(85 intermediate revisions by 13 users not shown)
Line 1: Line 1:
[[Category:Services]]
= Services =
= Services =
{{Anchor|FS}}{{Anchor|FSUSER}}{{Anchor|fs:USER}}
== Filesystem service "fs:USER" ==
== Filesystem service "fs:USER" ==
You can at most have 32 FS archive handles.
You can at most have 32 FS archive handles.
Line 554: Line 553:
| 0x086B00C2
| 0x086B00C2
|?
|?
|?
| [[FS:SetOtherSaveDataSecureValue|SetOtherSaveDataSecureValue]]
| 00121004
| 0x121004
|-
|-
| 0x086C00C2
| 0x086C00C2
|?
|?
|?
| [[FS:GetOtherSaveDataSecureValue|GetOtherSaveDataSecureValue]]
| 00121004
| 0x121004
|-
|-
| 0x086D0040
| 0x086D0080
|?
|?
|?
| 00020004
| [[FS:BeginSaveDataMove|BeginSaveDataMove]]
| 0x20004
|-
|-
| 0x086E00C0
| 0x086E00C0
|?
|?
|?
| [[FS:SetThisSaveDataSecureValue|SetThisSaveDataSecureValue]]
|None?
|None
|-
|-
| 0x086F0040
| 0x086F0040
|?
|?
|?
| [[FS:GetThisSaveDataSecureValue|GetThisSaveDataSecureValue]]
| 0xE
| None
|-
|-
| 0x087000C2
| 0x087000C2
|?
|?
|?
| [[FS:CheckArchive|CheckArchive]]
|None?
|None
|-
|-
| 0x08710100
| 0x08710140
|?
| ?
|?
| [[FS:TransferSaveDataCMAC|TransferSaveDataCMAC]]
| 0xC
| 0x20004
|-
|-
| 0x087201C0
| 0x08720200
|?
|?
|?
| 00080004
| [[FS:RegisterTitleContentOverlay|RegisterTitleContentOverlay]]
| 0x80004
|-
|-
| 0x087300C0
| 0x08730100
|?
|?
|?
| [[FS:UnregisterTitleContentOverlay|UnregisterTitleContentOverlay]]
| 00080004
| 0x80004
|-
|-
| 0x08740000
| 0x08740000
|?
|?
|?
| [[FS:UnregisterAllTitleContentOverlays|UnregisterAllTitleContentOverlays]]
| 00080004
| 0x80004
|-
|-
| 0x08750140
| 0x08750140
|?
|?
|?
| [[FS:SetSaveArchiveSecureValue|SetSaveArchiveSecureValue]]
|None?
|None
|-
|-
| 0x087600C0
| 0x087600C0
|?
|?
|?
| [[FS:GetSaveArchiveSecureValue|GetSaveArchiveSecureValue]]
|None?
|None
|-
|-
| 0x08770100
| 0x08770140
|?
|?
|?
|?
| [[FS:RegisterSpecialTitleContent|RegisterSpecialTitleContent]]
| 0x80004
|-
|-
| 0x087800C0
| 0x08780100
|?
|?
|?
|?
| [[FS:UnregisterSpecialTitleContent|UnregisterSpecialTitleContent]]
| 0x80004
|-
|-
| 0x087900C2
| 0x087900C2
| ?
| ?
| Same as GetLegacyBannerData, except for the last parameter this passes u8 value 0x1 instead of 0x0, for the FSPXI command.
| Same as [[FS:GetLegacyBannerData|GetLegacyBannerData]], except for the last parameter this internally passes u8 value 0x1 instead of 0x0, for the FSPXI command.
| 0x00101015
| 0x101015
|-
|-
| 0x087A0180
| 0x087A0180
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| [[FS:AddSeed|AddSeed]]
| [[FS:AddSeed|AddSeed]]
| 0x00200000
| 0x200000
|-
|-
| 0x087B....
| 0x087B0080
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| Wrapper for the code internally used for command <0x087A....>.
| [[FS:GetSeed|GetSeed]]
| 0x00200000
| 0x200000
|-
|-
| 0x087C....
| 0x087C0080
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| Eventually calls same code as command <0x087A....>.
| [[FS:DeleteSeed|DeleteSeed]]
| 0x00200000
| 0x200000
|-
|-
| 0x087D0000
| 0x087D0000
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| Writes an u32 from state to cmdreply[2]. Probably the total number of titles in the SEEDDB?
| [[FS:GetNumSeeds|GetNumSeeds]]
| 0x00200000
| 0x200000
|-
|-
| 0x087E0042
| 0x087E0042
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| Eventually calls same code as command <0x087A....>. Writes a list of titleIDs to the outbuf, this is for titles with content-lock-seed(s) stored in SEEDDB. (u32 total_titleids_probably, ((Size<<4)  <nowiki>|</nowiki> 12), outbufptr)
| [[FS:ListSeeds|ListSeeds]]
| 0x00200000
| 0x200000
|-
|-
| 0x087F....
| 0x087F0100
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| ?
| [[FS:TitleContentHasSeed|TitleContentHasSeed]]
| 0x00200000
| 0x200000
|-
|-
| 0x0880....
| 0x08800880
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| Eventually calls same code as command <0x087A....>.
| [[FS:AddTitleTag|AddTitleTag]]
| 0x00200000
| 0x200000
|-
|-
| 0x0881....
| 0x08810080
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| Eventually calls same code as command <0x087A....>.
| [[FS:GetTitleTag|GetTitleTag]]
| 0x00200000
| 0x200000
|-
|-
| 0x0882....
| 0x08820080
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| Eventually calls same code as command <0x087A....>.
| [[FS:DeleteTitleTag|DeleteTitleTag]]
| 0x00200000
| 0x200000
|-
|-
| 0x08830000
| 0x08830000
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| Writes an output value to cmdreply[2].
| [[FS:GetNumTitleTags|GetNumTitleTags]]
| 0x00200000
| 0x200000
|-
|-
| 0x08840042
| 0x08840042
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| Eventually calls same code as command <0x087A....>.
| [[FS:ListTitleTags|ListTitleTags]]
| 0x00200000
| 0x200000
|-
|-
| 0x0885....
| 0x088500C0
| [[9.6.0-24|9.6.0-X]]
| [[9.6.0-24|9.6.0-X]]
| ?
| [[FS:CheckTitleSeed|CheckTitleSeed]]
| 0x00200000
| 0x200000
|-
| 0x088600C0
| [[11.1.0-34|11.1.0-X]]
| [[FS:CheckUpdatedDat|CheckUpdatedDat]]
| 0x80000
|}
|}


Line 693: Line 697:


Each session for fs:USER has separate permissions, initially these are set to all zero's for new fs:USER sessions. The permissions/etc for fs:USER sessions are initialized via [[FS:Initialize]](loaded from the user process exheader).
Each session for fs:USER has separate permissions, initially these are set to all zero's for new fs:USER sessions. The permissions/etc for fs:USER sessions are initialized via [[FS:Initialize]](loaded from the user process exheader).
{{Anchor|FSLDR}}{{Anchor|fs:LDR}}


== Filesystem service "fs:LDR" ==
== Filesystem service "fs:LDR" ==
This service is identical to fs:USER, except [[FS:OpenArchive]] archive 0x2345678E can only be accessed with fs:LDR.
This service is identical to fs:USER, except [[FS:OpenArchive]] archive 0x2345678E can only be accessed with fs:LDR.


{{Anchor|FSReg}}{{Anchor|FSREG}}{{Anchor|fs:REG}}
== ProgramRegistry service "fs:REG" ==
== ProgramRegistry service "fs:REG" ==
{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 729: Line 736:
=File and directory access=
=File and directory access=
==Files==
==Files==
File session handles obtained via [[FS:OpenFile]] et al can be used to access files through a service-like interface, despite not being an actual service registered using [[SRV:RegisterService]].
File session handles obtained via [[FS:OpenFile]] and [[FS:OpenFileDirectly]] can be used to access files through a service-like interface, despite not being an actual service registered using [[SRV:RegisterService]]. To use this service-like interface, simply call the SendSyncRequest SVC with a file session handle, using the IPC buffer in thread-local storage for parameters and responses, just like you would with a proper service.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 783: Line 790:


==Directories==
==Directories==
Directory session handles obtained via [[FS:OpenDirectory]] are usable via a service-like interface, following the exact same procedure described above for file sessions.
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 821: Line 829:
!  Accessible via [[Filesystem_services|FS]]
!  Accessible via [[Filesystem_services|FS]]
!  Accessible via [[Filesystem_services_PXI|FSPXI]]
!  Accessible via [[Filesystem_services_PXI|FSPXI]]
!  Only accessible by Process9 internally
!  Requires binary [[FS:OpenFile|Lowpath]]
!  Requires binary [[FS:OpenFile|Lowpath]]
!  Required exheader FS access info bitmask
!  Required exheader FS access info bitmask
|-
|-
| 0x00000003
| 0x00000003
| Application [[#RomFS|RomFS]]
| SelfNCCH (including [[#RomFS|RomFS]])
| Yes
| Yes
| No
| No
| No
| No
| No
Line 834: Line 844:
| SaveData (the saveID/mediatype for this is loaded from data originally from the user process' exheader)
| SaveData (the saveID/mediatype for this is loaded from data originally from the user process' exheader)
| Yes
| Yes
| No
| No
| No
| No
| No
Line 841: Line 852:
| ExtSaveData
| ExtSaveData
| Yes
| Yes
| No
| No
| No
| Yes
| Yes
Line 848: Line 860:
| Shared ExtSaveData
| Shared ExtSaveData
| Yes
| Yes
| No
| No
| No
| Yes
| Yes
Line 855: Line 868:
| SystemSaveData
| SystemSaveData
| Yes
| Yes
| No
| No
| No
| Yes
| Yes
Line 863: Line 877:
| Yes
| Yes
| Yes
| Yes
| No
| No
| No
| 0x8E
| 0x8E
Line 869: Line 884:
| SDMC Write-Only
| SDMC Write-Only
| Yes
| Yes
| No
| No
| No
| No
| No
Line 876: Line 892:
| ExtSaveData for BOSS
| ExtSaveData for BOSS
| Yes
| Yes
| No
| No
| No
| Yes
| Yes
Line 884: Line 901:
| Yes
| Yes
| Yes
| Yes
| No
| No
| No
| 0x16
| 0x16
Line 891: Line 909:
| No
| No
| Yes
| Yes
| No
| Yes
| Yes
|  
|  
Line 898: Line 917:
| No
| No
| Yes
| Yes
| No
| Yes
| Yes
|  
|  
Line 905: Line 925:
| Yes
| Yes
| Yes
| Yes
| No
| No
| No
| 0x800
| 0x800
Line 912: Line 933:
| Yes
| Yes
| Yes
| Yes
| No
| No
| No
| 0x200
| 0x200
Line 919: Line 941:
| No
| No
| Yes
| Yes
| No
| No
| No
| ?
| ?
|-
|-
| 0x12345680
| 0x12345680
| Unknown. There's code for this in spider v9.9, but that code isn't actually used.
| Extdata transfer. Used for transferring [[Extdata#NAND_Shared_Extdata|NAND Shared Extdata]] during [[System_Transfer#System_Save_Data_/_Shared_Extdata_Transfer|system tranfers]].
| Yes
| Yes
| Yes
| ?
| No
| Yes
| Yes
| ?
| ?
|-
|-
| 0x12345681
| 0x12345681
| Unknown. Accessed by FS service.
| System Savedata transfer. Used for transferring [[System_SaveData|System Save Data]] during [[System_Transfer#System_Save_Data_/_Shared_Extdata_Transfer|system tranfers]].
| ?
| Yes
| ?
| Yes
| ?
| No
| Yes
| ?
| ?
|-
|-
Line 939: Line 964:
| Unknown. There's code for this in spider v9.9, but that code isn't actually used.
| Unknown. There's code for this in spider v9.9, but that code isn't actually used.
| Yes
| Yes
| ?
| No
| No
| Yes
| Yes
| ?
| ?
|-
|-
| 0x2345678A
| 0x2345678A
| Used for accessing general NCCH data. With FSPXI this also allows savedata access.
| Title access. With FS, this allows accessing NCCH/NCSD contents (ExeFS, RomFS, checking if a content uses a seed, checking the validity of the installed seed). FSPXI, additionally, allows opening raw NCCH/NCSD NCCH contents and DSiWare contents for reading, along with encrypted save data.
| Yes
| Yes
| Yes
| Yes
| No
| Yes
| Yes
| 0x1005
| 0x1005
|-
|-
| 0x2345678B
| 0x2345678B
| ?
| Used internally by Process9 as the lowest level title access archive. Allows for opening various sections of a title (TMD, CMD, raw contents, DLC contents, raw save data (including public/private/banner saves for DSiWare), title and/or content import context files and /data directories for save data.
| No
| No
| No
| No
| Yes
| Yes
| Yes
|  
|  
|-
|-
| 0x2345678C
| 0x2345678C
| Used internally to access [[Title_Database|/dbs]] files?
| Used internally to access [[Title_Database|Title Database (/dbs)]] files. For SD, <code>title.db</code> and <code>import.db</code>. For NAND, <code>title.db</code>, <code>import.db</code>, <code>tmp_t.db</code>, <code>tmp_i.db</code>, and <code>jumpid.db</code>.
| No
| No
| No
| No
| Yes
| Yes
| Yes
|  
|  
|-
|-
| 0x2345678D
| 0x2345678D
| ?
| Used internally to access non-title /dbs files on the NAND: <code>certs.db</code> and <code>ticket.db</code>.
| No
| No
| No
| No
| Yes
| No
| No
|  
|  
|-
|-
| 0x2345678E
| 0x2345678E
| FSPXI: Similar to archive 0x2345678A. For fs:LDR(used by the "loader" FIRM ARM11-process), only ExeFS. Not accessible with fs:USER.
| FSPXI: Program Access (limited subset of merged main title + update/patch title access). For fs:LDR(used by the "loader" FIRM ARM11-process), only <code>exefs:/.code</code>. Not accessible with fs:USER.
| Yes
| Yes
| Yes
| Yes
| No
| Yes
| Yes
| None, see description.
| None, see description.
Line 982: Line 1,013:
| No
| No
| Yes
| Yes
| No
| No
| No
| ?
| ?
Line 989: Line 1,021:
| Yes
| Yes
| Yes
| Yes
| No
| No
| No
| ?
| ?
Line 996: Line 1,029:
| No
| No
| Yes
| Yes
| No
| No
| No
| ?
| ?
Line 1,003: Line 1,037:
| Yes
| Yes
| Yes
| Yes
| No
| No
| No
| 0x100
| 0x100
Line 1,010: Line 1,045:
| Yes
| Yes
| Yes
| Yes
| No
| No
| No
| 0x100
| 0x100
|-
|-
| 0x567890B0
| 0x567890B0
| ?
| Internally creates the same "ID Storage" wrapper over the NAND that is used for SystemSaveData and Shared ExtData, but all operations are stubbed and return 0xE0C046F8.
| No
| No
| Yes
| Yes
| No
| No
| No
|  
|  
Line 1,023: Line 1,060:
| Gamecard SaveData (for check). This is a wrapper for UserSaveDataForCheck: the OpenArchive code for that is called with archive-lowpath TID=0/mediatype=2(gamecard).
| Gamecard SaveData (for check). This is a wrapper for UserSaveDataForCheck: the OpenArchive code for that is called with archive-lowpath TID=0/mediatype=2(gamecard).
| Yes
| Yes
| No
| No
| No
| No
| No
Line 1,030: Line 1,068:
| UserSaveData (for check). This is the same as the regular SaveData archive, except with this the savedata ID and mediatype is loaded from the input archive lowpath.
| UserSaveData (for check). This is the same as the regular SaveData archive, except with this the savedata ID and mediatype is loaded from the input archive lowpath.
| Yes
| Yes
| No
| No
| No
| Yes
| Yes
| 0x6
| 0x6
|-
| 0x567890B3
| [[3DS_Virtual_Console#NAND_Savegame|AGB Save Data]]
| No
| No
| Yes
| No
| -
|-
|-
| 0x567890B4
| 0x567890B4
| ? SaveData from Demo Version of Retail Game
| Similar to 0x567890B2 but can only access Accessible Save specified in [[NCCH/Extended_Header#Storage_Info|exheader]]?
| Yes
| Yes
| No
| No
| No
| No
| Yes
| ?
| ?
|}
|}
Line 1,051: Line 1,099:


= Filenames and Paths =
= Filenames and Paths =
PathType:
{{Anchor|PathType}}
==PathType==
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
!  Value
!  Value
!  Description
!  Description
|-
| -1
| Returned internally by Process9, when errors occur it seems(in particular when no nul-terminator was found in the input path). The data ptr is set to NULL.
|-
|-
| 0x0
| 0x0
| INVALID - Specifies an invalid path.
| INVALID - Specifies an invalid path
|-
|-
| 0x1
| 0x1
| EMPTY - Specifies an empty path.
| EMPTY - Specifies an empty path
|-
|-
| 0x2
| 0x2
| BINARY - Non-text based path. Meaning is per-archive.
| BINARY - Non-text based path. Meaning is per-archive
|-
|-
| 0x3
| 0x3
| CHAR - Text-based path with 8-bit characters.
| ASCII - Text-based path with 7-bit ASCII characters padded to 8-bits each (signed char)
|-
|-
| 0x4
| 0x4
| WCHAR - Text-based path with 16-bit characters.
| UTF16 - Text-based path with UTF-16 characters
|}
|}
In IPC requests, sizes of ASCII and UTF16 paths must include space for the null-terminator.


== Binary LowPath ==
== Binary LowPath ==
The format of the data that a binary LowPath points to is custom per archive.
The format of the data that a binary LowPath points to is custom per archive.


=== SystemSaveData Archive Path Data Format ===
=== SystemSaveData / Extdata / Shared Extdata Archive Path Data Format ===
==== FS ====
 
==== DataAccessPath ====
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Index word
Offset !! Size !! Description
! Description
|-
|-
| 0
| 0x0 || 0x1 || u8 [[Mediatypes|Mediatype]]
| [[Mediatypes|Mediatype]] (must be zero for NAND)
|-
|-
| 1
| 0x1 || 0x1 || only for NAND data (System Savedata / Shared Extdata), otherwise left 0:
| saveid
|}
The file/directory lowpath is a text lowpath in the [[Savegames|savegame]] filesystem.
 
==== FSPXI ====
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Index word
! Value !! Description
! Description
|-
| 0 || Accesses from/to <code>nand:/data/<ID0 of current system></code>
|-
| 1 || Accesses from/to <code>nand:/fixdata</code>
|-
| 2 || Accesses from/to <code>nand:/data/<ID0 from [[Filesystem_services#DeviceMoveContext|Device Move Context]]></code>
|}
|-
|-
| 0
| 0x2 || 0x2 || padding
| u8 [[Mediatypes|Mediatype]] (must be zero for NAND)
|}
|}
The file lowpath is a binary lowpath containing the u64 saveid, however the high word of the saveid is always zero. The mounted file is the cleartext savegame image. Up to 32 SystemSaveData image files can be opened under a single mounted FSPXI archive.


=== UserSaveDataForCheck Archive Path Data Format ===
==== SystemSaveData ====
 
===== FS =====
 
====== Archive Path ======
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 1,109: Line 1,166:
|-
|-
| 0  
| 0  
| [[Mediatypes|Mediatype]] (must be non-zero)
| [[Filesystem_services#DataAccessPath|DataAccessPath]]
|-
|-
| 1
| 1
| Lower word saveid
| save ID low (save ID high is 0)
|-
| 2
| Upper word saveid
|}
|}
The file/directory lowpath for this FS archive is a text path in the [[Savegames|savegame]] filesystem.


=== ExtSaveData Archive Path Data Format ===
====== File Path ======
The file path is a cleartext ASCII or UTF16 file path (<code><file path></code>).
 
The file path would access the file at <code><base path>/sysdata/<save ID low>/<save ID high>/<file path></code>.
Note that <code>/<file path></code> refers to the virtual file system inside the </code><save ID high></code> file.
 
===== FSPXI / FS System Savedata Transfer / FSPXI System Savedata Transfer =====
 
====== Archive Path ======
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 1,126: Line 1,187:
|-
|-
| 0  
| 0  
| [[Mediatypes|Mediatype]]
| [[Filesystem_services#DataAccessPath|DataAccessPath]]
|-
| 1
| Lower word saveid
|-
| 2
| Upper word saveid
|}
|}
For FS, the file/directory lowpath is a text path in the [[extdata]] filesystem. For FSPXI, the file lowpath is a text path relative to the "/extdata/<ExtdataIDHigh>/<ExtdataIDLow>" directory on SD/NAND, for the cleartext extdata image to mount.


=== 0x2345678A Archive Path Data Format ===
====== File Path ======
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Index word
! Index word !! Description
! Description
|-
|-
| 0
| 0 || save ID low
| Lower word programID
|-
|-
| 1
| 1 || save ID high
| Upper word programID
|-
| 2
| [[Mediatypes|Mediatype]]
|-
| 3
| Reserved
|}
|}


File lowpath:
The file path would access the file at <code><base path>/sysdata/<save ID low>/<save ID high></code>.
 
==== Extdata / Shared Extdata ====
 
===== FS / FS Extdata Transfer / FSPXI Extdata Transfer =====
 
====== Archive Path ======
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 1,161: Line 1,212:
!  Description
!  Description
|-
|-
| 0
| 0  
| 0 for NCCH data, 1 for savedata. The latter is only valid for FSPXI. Value 2 is allowed via archive 0x3, it's unknown what this is.
| [[Filesystem_services#DataAccessPath|DataAccessPath]]
|-
|-
| 1
| 1
| TMD content index / NCSD partition index.
| ext save ID low
|-
|-
| 2
| 2
| Type: 0=romfs(0 for non-NCCH as well), 1=exefs ".code"(?), 2=exefs "icon"/"banner"/"logo", 3=unknown, 4=unknown, 5=unknown.
| ext save ID high
|-
| 3-4
| Filename for ExeFS.
|}
|}


The 0x14-byte lowpath is all-zero for accessing the title's main RomFS.
This refers to the extdata filesystem structure's base directory at <code><base path>/extdata/<ext save ID low>/<ext save ID high></code>.  


=== [[RomFS]] ===
====== File Path ======
The file path is a cleartext ASCII or UTF16 file path (<code><file path></code>).
 
For FS Extdata, this would acccess <code><base path>/extdata/<save ID low>/<save ID high>/<directory ID>/<file ID>/<file path></code>, and <code>/<file path></code> refers to the virtual file system inside the </code><file ID></code> file.


Archives 0x3 and 0x2345678E both allow for accessing the [[RomFS#Level_3_Format|level-3 IVFC images]] for RomFS access. The main CXI RomFS is accessible via an all-zero 0xc-byte binary file-lowpath. The update RomFS can be accessed with the first u32 in the binary file-lowpath being set to 0x5. The user must handle parsing the filesystem used in the exposed image itself.
For FS / FSPXI Extdata Transfer, this accesses <code><base path>/extdata/<save ID low>/<save ID high>/<file path></code>.


The 0x3 archive is an interface for the 0x2345678E archive with the current process programID+mediatype. The file lowpath is 3-words. These words are written to 0x2345678E-archive file_lowpath+0, with the rest of that lowpath set to all-zero(lowpath is different from archive 0x2345678A). File lowpath:
=== UserSaveDataForCheck Archive Path Data Format ===
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 1,186: Line 1,237:
!  Description
!  Description
|-
|-
| 0
| 0  
| See above. The only values which FS-module doesn't allow to be used here are:
| [[Mediatypes|Mediatype]] (must be non-zero)
* 0x1: Error 0xE0E046BE.
|-
* 0x3: Error 0xE0E046BE.
| 1
* 0x4: FS-module executes svcBreak when using this.
| Lower word saveid
|-
|-
| 1-2
| 2
| See above. Not validated by FS-module.
| Upper word saveid
|}
|}


=SEEDDB=
The file/directory lowpath for this FS archive is a text path in the [[Savegames|savegame]] filesystem.
With [[9.6.0-24|9.6.0-X]] new [[System_SaveData]] with saveID 0001000F was added, this seems to be handled by FS-module itself, probably via the new service-cmds added to fsuser. [[Home Menu]] and [[NIM_Services|NIM]] module have access to those commands.
 
The SEEDDB savedata contains the title-unique seed-data used for the new [[NCCH]] keyY generation added with FIRM [[9.6.0-24|9.6.0-X]].


= Common Types =
=== 0x567890B4 Archive Path Data Format ===
== MediaType ==
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Value
Index word
!  Description
!  Description
|-
|-
| 0
| 0  
| NAND
| [[Mediatypes|Mediatype]]
|-
|-
| 1
| 1
| SD
| <code><nowiki>Lower_word_saveid >> 8</nowiki></code> ?
|-
|-
| 2
| 2
| Game Card
| Unknown. Game calculate this using formula <code><nowiki>0xFFFFFF00 | unknown_b</nowiki></code>
|}
|}


== SystemMediaType ==
=== Title Access Archive Path Data Format ===
==== Title Access Type ====
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value
! Value !! Description
! Description
|-
| 0 || High-level NCCH content access
|-
| 1 || Save data access (high-level, decrypted)
|-
|-
| 0
| 2 || Raw content (low-level NCCH/SRL) access
| CTR NAND
|-
|-
| 1
| 3 || Banner save data access (for DSiWare titles)
| TWL NAND
|-
|-
| 2
| 4 || FS only: Save data transfer (internally uses generated data from [[FS:BeginSaveDataMove]] as the IV for "Save data access (low-level, encrypted)")
| SD
|-
|-
| 2
| 5 || Save data access (low-level, encrypted)
| TWL Photo
|}
|}


== OpenFlags ==
==== NCCH Access Type ====
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Bit
! Value !! Description
! Description
|-
| 0 || RomFS
|-
| 1 || <code>exefs:/.code</code>
|-
| 2 || System Menu Data (<code>exefs:/icon</code>, <code>exefs:/banner</code>, <code>exefs:/logo</code>)
|-
|-
| 0
| 3 || NCCH Header(s)
| Read
|-
|-
| 1
| 4 || "is seeded" check
| Write
|-
|-
| 2
| 5 || Seed verify/validate
| Create
|}
|}


== Attributes ==
==== NCCH Header Access Type ====
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value !! Description
! Size
|-
! Description
| 0 || [[NCCH/Extended_Header|Extheader]] (0x0-0x400)
|-
| 1 || [[NCCH/Extended_Header|Extheader]] AccessDesc (0x400-0x800)
|-
| 2 || Raw [[NCCH#NCCH_Header|NCCH Header]]
|}
 
==== Archive Path ====
 
{| class="wikitable" border="1"
|-
|-
| 0x0
! Offset !! Size !! Description
| 0x1
| Is Directory
|-
|-
| 0x1
| 0x0 || 0x8 || Program ID (Title ID)
| 0x1
| Is Hidden
|-
|-
| 0x2
| 0x9 || 0x1 || [[Mediatypes|Media Type]]
| 0x1
| Is Archive
|-
|-
| 0x3
| 0xA || 0x7 || padding
| 0x1
| Is Read-Only
|}
|}


== WriteOption ==
==== File Path ====
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset !! Size !! Description
! Size
|-
! Description
| 0x0 || 0x4 || [[Filesystem_services#Title_Access_Type|Title Access Type]]
|-
|-
| 0x0
| 0x4 || 0x10 || Dynamic data depending on [[Filesystem_services#Title_Access_Type|Title Access Type]]:
| 0x1
 
| Flush
{| class="wikitable" border="1"
|-
! High Level NCCH Access !! Save Data Access (high level) !! Raw Content !! FS only: Save Data Transfer
|-
|
{| class="wikitable" border="1"
|-
! Offset !! Size !! Description
|-
|-
| 0x1
| 0x0 || 0x4 || Content index from TMD for NAND/SD titles
| 0x1
NCSD partition index for gamecards
| Update Time Stamp
|-
|-
| 0x2
| 0x4 || 0x4 || [[Filesystem_services#NCCH_Access_Type|NCCH Access Type]]
| 0x1
| Reserved
|-
|-
| 0x3
| 0x8 || 0x8 || Dynamic data depending on [[Filesystem_services#NCCH_Access_Type|NCCH Access Type]]:
| 0x1
For ExeFS, (System Menu Data / <code>exefs:/.code</code>),
| Reserved
 
{| class="wikitable" border="1"
| 8-byte ExeFS file name
|}
|}


== DirectoryEntry ==
For Header Access,
 
{| class="wikitable" border="1"
{| class="wikitable" border="1"
| [[Filesystem_services#NCCH_Header_Access_Type|u64, NCCH Header Access Type]]
|}
For RomFS,
{| class="wikitable" border="1"
| [[NCCH#Content_Types|u64, Allowed content types flag]]
(<code>(1 << allowed_type_a) |
(1 << allowed_type_b)...</code>)
|}
|}
|
{| class="wikitable" border="1"
|-
! Offset !! Size !! Description
|-
|-
!  Offset
| 0x0 || 0x10 || 16-byte IV for save data crypto
!  Size
|}
!  Description
|
|-
{| class="wikitable" border="1"
| 0x0
| 0x20C
| UTF-16 Entry Name
|-
| 0x20C
| 0xA
| 8.3 short filename name
|-
|-
| 0x216
! Offset !! Size !! Description
| 0x4
| 8.3 short filename extension
|-
|-
| 0x21A
| 0x0 || 0x4 || Content index from TMD for NAND/SD titles
| 0x1
NCSD partition index for gamecards
| Always 1
|-
|-
| 0x21B
| 0x4 || 0xC || padding
| 0x1
|}
| Reserved
|
{| class="wikitable" border="1"
|-
|-
| 0x21C
! Offset !! Size !! Description
| 0x4
| [[Filesystem_services#Attributes|Attributes]]
|-
|-
| 0x220
| 0x0 || 0x4 || Save data transfer key from [[FS:BeginSaveDataMove]]
| 0x8
|-
| Entry Size
| 0x4 || 0xC || padding
|}
|}
|-
| 0x14 || 0x10 || 16-byte seed for titles that require one, or for validating a seed against the check value in the [[NCCH#NCCH_Header|NCCH Header]]'s check value.
If the title does not use a seed, this should not be included and size 0x14 should be used instead of 0x24.
|}
|}


== ArchiveResource ==
For encrypted save data access and banner save data access, the entire 0x10 portion of the dynamic data is left blank.
 
The "is seeded check" NCCH access type opens a virtual 1-byte file that reads either 0 or 1; this value is generated on-the-fly and will be 1 if ncchflags[7] has bit5 set (content uses seed), and 0 otherwise.
 
For NCCH sections that require a seed (e.g. <code>.code</code>, RomFS, etc.), the additional seed portion of the low path must be populated with the correct seed.
 
The "Seed Verify/Validate" NCCH access type also requires the seed portion of the lowpath. The target NCCH content is opened (with the opened file interface being stubbed, meaning no real reads/writes can be performed on it), and the given seed is used to calculate the seed check hash, and part of it is compared to the check value in the NCCH header. If it matches, opening the "file" succeeds, otherwise 0xD900458C is returned. If attempt is made to use the seed validation type on a content that does not use a seed, error 0xC92044E6 is returned.
 
==== FS Limitations ====
 
For FS, this archive functions the same, except for the following limitations:
 
- Only the title access types "High Level NCCH Access" and "High Level Save Data Access", and "Save Data Transfer" are allowed.
 
- For high level NCCH access, the types "RomFS", "System Menu Data", "Seeded check", and "Seed Check/Verify" are allowed.
 
- For "Seed Check/Verify", rather than providing the title seed in the file path (as is the case for FSPXI), the seed is retrieved from the seed database (meaning the file lowpath size is always 0x14 for FS).
 
=== Program Access / SelfNCCH access ===
 
Provides access to a "merged" archive of a base title and, optionally, a separate update (patch) title.
 
If no patch title exists, the base title is considered to be the patch title, i.e. turning all "patch" accesses into accesses to the base title.
 
==== Program Access Type ====
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value !! Description !! Accesses
! Size
|-
! Description
| 0 || RomFS ("unspecified" [[NCCH#Content_Type|content type]], the default) || Base title
|-
|-
| 0x0
| 1 || <code>exefs:/.code</code> || Patch title
| 0x4
| Sector byte-size
|-
|-
| 0x4
| 2 || System Menu Data (<code>exefs:/icon</code>, <code>exefs:/banner</code>, <code>exefs:/logo</code>) || Base title
| 0x4
|-
| Cluster byte-size
| 3 || Save Data (high level, decrypted) || -
|-
|-
| 0x8
| 4 || RomFS (all [[NCCH#Content_Type|content types]]) || Base title
| 0x4
| Partition capacity in clusters
|-
|-
| 0xC
| 5 || RomFS ("unspecified" [[NCCH#Content_Type|content type]], the default) || Patch title
| 0x4
| Available free space in clusters
|}
|}


== ProgramInfo ==
==== Archive Path ====
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset !! Size !! Description
! Size
! Description
|-
|-
| 0x0
| 0x0 || 0x8 || u64, Program Handle from [[PXIPM:RegisterProgram]]
| 0x8
| Program ID
|-
| 0x8
| 0x1
| [[Filesystem_services#MediaType|Media Type]]
|-
| 0x9
| 0x7
| Padding
|}
|}


== ProductInfo ==
==== File Path ====
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset !! Size !! Description
! Size
|-
! Description
| 0x0 || 0x4 || [[Filesystem_services#Program_Access_Type|Program Access Type]]
|-
|-
| 0x0
| 0x4 || 0x8 || Dynamic data depending on [[Filesystem_services#Program_Access_Type|Program Access Type]]:
| 0x10
{| class="wikitable" border="1"
| Product Code
|-
|-
| 0x10
! ExeFS files (System Menu Data, etc.) !! RomFS of base title (all [[NCCH#Content_Type|content types]])
| 0x2
| Company Code
|-
|-
| 0x12
|
| 0x2
{| class="wikitable" border="1"
| Remaster Version
| 8-character ExeFS filename
|}
|}
 
|
== IntegrityVerificationSeed ==
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset !! Size !! Description
! Size
! Description
|-
|-
| 0x0
| 0x0 || 0x4 || u32, content index of target content
| 0x10
| AES-CBC MAC over a SHA256 hash, which hashes the first 0x110-bytes of the cleartext SEED.
|-
|-
| 0x10
| 0x4 || 0x4 || padding
| 0x120
|}
| The [[nand/private/movable.sed]], encrypted with AES-CTR using the above MAC for the counter.
|}
|}
|}


== ExtSaveDataInfo ==
==== FS Limitations ====
 
- FSPXI allows all access types.
 
- When used through fs:LDR by loader, FS only provides access to <code>exefs:/.code</code>.
 
- For SelfNCCH access, the only allowed access types are "RomFS ("unspecified" [[NCCH#Content_Type|content type]], the default)" of the Base or Patch title, and "System Menu Data". Attempting to access "Save Data" results in error 0xE0E046BE, "RomFS (all [[NCCH#Content_Type|content types]])" in 0xF9604784, and "<code>exefs:/.code</code>" in 0xD9004676.
 
=== [[RomFS]] ===
 
Archives 0x3 and 0x2345678E both allow for accessing the [[RomFS#Level_3_Format|level-3 IVFC images]] for RomFS access. The main CXI RomFS is accessible via an all-zero 0xc-byte binary file-lowpath. The update RomFS can be accessed with the first u32 in the binary file-lowpath being set to 0x5. The user must handle parsing the filesystem used in the exposed image itself.
 
With FSPXI the returned data for RomFS is the entire RomFS section from the NCCH, starting at the IVFC header.
 
The 0x3 archive is an interface for the 0x2345678E archive with the current process programID+mediatype. The file lowpath is 3-words. These words are written to 0x2345678E-archive file_lowpath+0, with the rest of that lowpath set to all-zero(lowpath is different from archive 0x2345678A). File lowpath:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Offset
Index word
!  Size
!  Description
!  Description
|-
|-
| 0x0
| 0
| 0x1
| See above. The only values which FS-module doesn't allow to be used here are:
| [[Filesystem_services#MediaType|Media Type]]
* 0x1: Error 0xE0E046BE.
* 0x3: Error 0xE0E046BE.
* 0x4: FS-module executes svcBreak when using this.
|-
|-
| 0x1
| 1-2
| 0x1
| See above. Not validated by FS-module.
| Unknown
|}
|-
 
| 0x2
=Anti Savegame Restore=
| 0x2
Anti Savegame Restore, internally referred to as ''Save Data Rollback Prevention'', is a feature originally implemented in the FS module with [[4.0.0-7]], which prevents the user from restoring previous versions of a savegame image. This feature is not used (in practice) for gamecard games. When an old version of the save is detected, the application will display an error regarding old savegame version, then delete and recreate the save data (similar to when it is corrupted).
| Reserved
 
==Implementation==
When creating the savedata, the application generates a secure value (a 64 bit unsigned integer), then stores it in either the [[DISA_and_DIFF#DISA_header|DISA save image header]] or the [[Filesystem_services#Anti_Savegame_Restore_Save_Data|Anti Savegame Restore Save Data]]. The application then uses the anti-savegame-restore commands ([[FS:SetSaveDataSecureValue]], [[FS:GetSaveDataSecureValue]], [[FS:SetOtherSaveDataSecureValue]], [[FS:GetOtherSaveDataSecureValue]], [[FS:SetThisSaveDataSecureValue]], [[FS:GetThisSaveDataSecureValue]], [[FS:SetSaveArchiveSecureValue]] and [[FS:GetSaveArchiveSecureValue]]) to verify the value known to the game for comparison with the value returned by FS, and to update the value in the corresponding storage location.
 
Each time the application writes to the savegame, the value should be updated by both the application and through FS. Usually, applications update this value by incrementing it. However, generating a new random-number or other methods of updating it can be used as well.
 
==Anti Savegame Restore Save Data==
The save data used for this feature is stored in [[System_SaveData|System Save Data]] ID 0x00010011 and contains only one file, named <code>DB</code>:
 
===Main Structure===
{| class="wikitable" border="1"
|-
|-
| 0x4
! Offset !! Size !! Description
| 0x8
| Save ID
|-
|-
| 0xC
| 0x0 || 0x1000 || Header
| 0x4
| Reserved
|}
 
== SystemSaveDataInfo ==
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset !! Size !! Description
! Size
|-
! Description
| 0x0 || 0x1 || u8, version (usually 0)
|-
|-
| 0x0
| 0x1 || 0x3 || padding
| 0x1
| [[Filesystem_services#MediaType|Media Type]]
|-
|-
| 0x1
| 0x4 || 0x4 || u32, number of secure value entries
| 0x1
| Unknown
|-
|-
| 0x2
| 0x8 || 0xFF8 || completely unused, padding
| 0x2
|}
| Reserved
|-
|-
| 0x1000 || 0x1C000 (8 * 14336) || [[Filesystem_services#SecureValueKey|Secure value keys]]
| 0x4
|-
| 0x4
| 0x1D000 || 0x1C000 (8 * 14336) || u64s, Secure values
| Save ID
|}
|}
 
 
===SecureValueKey===
== SecureValueSlot ==
Depending on which command is used, secure value keys can be interpreted as:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
!  Value
! Offset !! Size !! Description
!  Description
|-
|-
| 0x0 || 0x8 || u64, Title ID
| 0x1000
|}
| SD Application
or:
|}
{| class="wikitable" border="1"
 
|-
== CardSpiBaudRate ==
! Offset !! Size !! Description
{| class="wikitable" border="1"
|-
|-
| 0x0 || 0x4 || u32, [[Filesystem_services#SecureValueSlot|Secure Value Slot]]
!  Value
|-
!  Description
| 0x4 || 0x4 || u32, Unique ID
|-
|}
| 0x0
 
| 512KHz
==Applications using this feature==
|-
* Animal Crossing: New Leaf
| 0x1
* Pokemon X & Y
| 1MHz
* Pokemon Omega Ruby & Alpha Sapphire
|-
* Pokemon Omega Ruby & Alpha Sapphire Demo
| 0x2
* Pokemon Shuffle
* Super Smash Bros
* Pokemon Red,Blue and Yellow (GB(C) VC)
* Rusty's Real Deal Baseball
* Megami Meguri
 
=SEEDDB and TITLETAG=
With [[9.6.0-24|9.6.0-X]] new [[System_SaveData]] with save ID 0x0001000F was added. This save data contains both the NCCH seed database (SEEDDB) and the title tag database (TITLETAG).
 
These databases are managed by the commands [[FS:AddSeed]], [[FS:GetSeed]], [[FS:DeleteSeed]], [[FS:GetNumSeeds]] and [[FS:ListSeeds]] for SEEDDB, and [[FS:AddTitleTag]], [[FS:GetTitleTag]], [[FS:DeleteTitleTag]], [[FS:GetNumTitleTags]], and [[FS:ListTitleTags]] for TITLETAG respectively.
 
Both the [[Home_Menu|HOME Menu]] and the [[NIM_Services|NIM]] module have access to these commands.
 
==SEEDDB==
 
Stored in the system savedata archive 0x0001000F as a file named <code>SEEDDB</code>, it contains the title-unique seed-data used for the new [[NCCH]] keyY generation added with FIRM [[9.6.0-24|9.6.0-X]].
 
The file follows a simple key-value format allowing the storage of seed data for up to 2000 unique title IDs.
 
{| class="wikitable" border="1"
|-
! Offset !! Size !! Description
|-
| 0x0 || 0x1000 || Header
{| class="wikitable" border="1"
|-
! Offset !! Size !! Description
|-
| 0x0 || 0x1 || u8, version (usually 0)
|-
| 0x1 || 0x3 || padding
|-
| 0x4 || 0x4 || u32, number of seed entries
|-
| 0x8 || 0xFF8 || completely unused, padding
|}
|-
| 0x1000 || 0x3E80 (8 * 2000) || u64s, Title IDs
|-
| 0x4E80 || 0x7D00 (16 * 2000) || Seed data, 16 bytes per seed
|}
 
==TITLETAG Database==
 
Stored in the system savedata archive 0x0001000F as a file named <code>TITLETAG</code>, it contains information used by the [[Home_Menu|HOME Menu]] to handle cases when a to-be-released title has been purchased already, that is, to properly install the seed required for [[NCCH]] keyY generation added with FIRM [[9.6.0-24|9.6.0-X]].
 
When a to-be-released title is purchased, the [[NIM_Services|NIM]] module installs a [[Filesystem_services#TitleTag|title tag]] with enough information about the title for the [[Home_Menu|HOME Menu]] to be able to initiate a seed import once the title has been released (and thus, the title's NCCH content lock seed). Until the title's seed is released, and while the title tag remains in the database, the HOME Menu will prevent the user from launching the software as it would not run without the seed. Once released, information from the title tag is used to download the seed, and, if successful, the title tag is removed from the database, making the software playable.
 
The file follows a simple key-value format allowing the storage of title tag data for up to 2000 unique title IDs.
 
{| class="wikitable" border="1"
|-
! Offset !! Size !! Description
|-
| 0x0 || 0x1000 || Header
{| class="wikitable" border="1"
|-
! Offset !! Size !! Description
|-
| 0x0 || 0x1 || u8, version (usually 0)
|-
| 0x1 || 0x3 || padding
|-
| 0x4 || 0x4 || u32, number of entries
|-
| 0x8 || 0xFF8 || completely unused, padding
|}
|-
| 0x1000 || 0x3E80 (8 * 2000) || u64s, Title IDs
|-
| 0x4E80 || 0x3E800 (0x80 * 2000) || [[Filesystem_services#TitleTag|Title Tag]] data, 0x80 bytes per entry
|}
 
= Common Types =
== MediaType ==
{| class="wikitable" border="1"
|-
!  Value
!  Description
|-
| 0
| NAND
|-
| 1
| SD
|-
| 2
| Game Card
|}
 
== SystemMediaType ==
{| class="wikitable" border="1"
|-
!  Value
!  Description
|-
| 0
| CTR NAND
|-
| 1
| TWL NAND
|-
| 2
| SD
|-
| 3
| TWL Photo
|}
 
== OpenFlags ==
{| class="wikitable" border="1"
|-
!  Bit
!  Description
|-
| 0
| Read
|-
| 1
| Write
|-
| 2
| Create
|}
 
== Attributes ==
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x1
| Is Directory
|-
| 0x1
| 0x1
| Is Hidden
|-
| 0x2
| 0x1
| Is Archive
|-
| 0x3
| 0x1
| Is Read-Only
|}
 
== WriteOption ==
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x1
| Flush
|-
| 0x1
| 0x1
| Update Time Stamp
|-
| 0x2
| 0x1
| Reserved
|-
| 0x3
| 0x1
| Reserved
|}
 
== DirectoryEntry ==
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x20C
| UTF-16 Entry Name
|-
| 0x20C
| 0xA
| 8.3 short filename name
|-
| 0x216
| 0x4
| 8.3 short filename extension
|-
| 0x21A
| 0x1
| Always 1
|-
| 0x21B
| 0x1
| Reserved
|-
| 0x21C
| 0x4
| [[Filesystem_services#Attributes|Attributes]]
|-
| 0x220
| 0x8
| Entry Size
|}
 
== ArchiveResource ==
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x4
| Sector byte-size
|-
| 0x4
| 0x4
| Cluster byte-size
|-
| 0x8
| 0x4
| Partition capacity in clusters
|-
| 0xC
| 0x4
| Available free space in clusters
|}
 
== ProgramInfo ==
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x8
| Program ID
|-
| 0x8
| 0x1
| [[Filesystem_services#MediaType|Media Type]]
|-
| 0x9
| 0x7
| Padding
|}
 
== ProductInfo ==
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x10
| Product Code
|-
| 0x10
| 0x2
| Company Code
|-
| 0x12
| 0x2
| Remaster Version
|}
 
== IntegrityVerificationSeed ==
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
|  0x0
|  0x10
|  AES-CBC MAC over a SHA256 hash, which hashes the first 0x110-bytes of the cleartext SEED.
|-
|  0x10
|  0x120
|  The [[nand/private/movable.sed]], encrypted with AES-CBC using the above MAC for the counter.
|}
 
== ExtSaveDataInfo ==
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x4
| [[Filesystem_services#DataAccessPath|DataAccessPath]]
|-
| 0x4
| 0x8
| Save ID
|-
| 0xC
| 0x4
| Reserved
|}
 
== SystemSaveDataInfo ==
{| class="wikitable" border="1"
|-
!  Offset
!  Size
!  Description
|-
| 0x0
| 0x4
| [[Filesystem_services#DataAccessPath|DataAccessPath]]
|-
| 0x4
| 0x4
| Save ID
|}
 
== SecureValueSlot ==
{| class="wikitable" border="1"
|-
!  Value
!  Description
|-
| 0x1000
| SD Application
|}
 
== SecureValueEntry ==
{| class="wikitable" border="1"
|-
! Offset !! Size !! Description
|-
| 0x0 || 0x4 || u32, [[Filesystem_services#SecureValueSlot|Secure Value Slot]]
|-
| 0x4 || 0x1 || When used as an input entry:
{| class="wikitable" border="1"
|-
! Value !! Description
|-
| 0 || This entry should be removed.
|-
| 1 || This entry should be updated with the given value.
|}
When returned from a command:
{| class="wikitable" border="1"
|-
! Value !! Description
|-
| 0 || No entry with the given slot and title ID was found, or: this entry is unused.
|-
| 1 || The entry with the given slot and title ID was found, or: this entry is used.
|}
|-
| 0x5 || 0x3 || padding
|-
| 0x8 || 0x8 || u64, Secure Value
|}
 
== TitleTag ==
{| class="wikitable" border="1"
|-
! Offset !! Size !! Description
|-
| 0x0 || 0x4 || Magic, <code>PREP</code> (PREPurchase install)
|-
| 0x4 || 0x4 || s32, Release date year
|-
| 0x8 || 0x1 || u8, Release date month
|-
| 0x9 || 0x1 || u8, Release date day
|-
| 0xA || 0x2 || u16, Country code
|-
| 0xC || 0x4 || u32, Seed status (0: not downloaded yet, 1: last download attempt failed, 2: seed installed successfully)
|-
| 0x10 || 0x4 || Result code from last seed installation attempt
|-
| 0x14 || 0x4 || Support error code from last seed installation attempt
|-
| 0x18 || 0x68 || reserved padding (unused)
|}
 
== CardSpiBaudRate ==
{| class="wikitable" border="1"
|-
!  Value
!  Description
|-
| 0x0
| 512KHz
|-
| 0x1
| 1MHz
|-
| 0x2
| 2MHz
| 2MHz
|-
|-
Line 1,522: Line 2,005:
!  Value
!  Value
!  Description
!  Description
!  Found in
|-
|-
| 0x1
| 0x1
| Update
| CTR (Old3DS) Update Partition
| Gamecards
|-
|-
| 0x2
| 0x2
| Manual
| Manual
| Gamecards, Digital titles
|-
|-
| 0x3
| 0x3
| DLP Child
| DLP Child
| Gamecards, Digital titles
|-
| 0x4
| KTR (New3DS) Update Partition
| Gamecards
|-
|}
|}


Line 1,542: Line 2,034:
|  0x0
|  0x0
|  0x10
|  0x10
|  IVs
|  IVs (ID0 of source console)
|-
|-
|  0x10
|  0x10
|  0x10
|  0x10
|  Encrypt Parameter
|  Encrypt Parameter (used to calculate the IV for encryption)
|}
|}


=Errors=
=Errors=
See [[Filesystem_services_PXI]].
See [[Filesystem_services_PXI]].
[[Category:Services]]