Filesystem services: Difference between revisions
m not a service. |
|||
(33 intermediate revisions by 11 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:Services]] | [[Category:Services]] | ||
= Filesystem service "fs:USER" = | = Services = | ||
== Filesystem service "fs:USER" == | |||
You can at most have 32 FS archive handles. | You can at most have 32 FS archive handles. | ||
Line 553: | Line 554: | ||
| 0x086B00C2 | | 0x086B00C2 | ||
|? | |? | ||
| | |SetOtherSaveDataSecureValue | ||
| 00121004 | | 00121004 | ||
|- | |- | ||
| 0x086C00C2 | | 0x086C00C2 | ||
|? | |? | ||
| | |GetOtherSaveDataSecureValue | ||
| 00121004 | | 00121004 | ||
|- | |- | ||
Line 567: | Line 568: | ||
|- | |- | ||
| 0x086E00C0 | | 0x086E00C0 | ||
|? | |Related to Secure Value? Used in Pokemon Sun/Moon. | ||
| | |SetThisSaveDataSecureValue | ||
|None? | |None? | ||
|- | |- | ||
| 0x086F0040 | | 0x086F0040 | ||
|? | |Related to Secure Value? Used in Pokemon Sun/Moon. | ||
| | |GetThisSaveDataSecureValue | ||
| 0xE | | 0xE | ||
|- | |- | ||
Line 643: | Line 644: | ||
| 0x087D0000 | | 0x087D0000 | ||
| [[9.6.0-24|9.6.0-X]] | | [[9.6.0-24|9.6.0-X]] | ||
| Writes | | GetNumSeeds. Writes the number of seeds to cmdreply[2] | ||
| 0x00200000 | | 0x00200000 | ||
|- | |- | ||
Line 685: | Line 686: | ||
| ? | | ? | ||
| 0x00200000 | | 0x00200000 | ||
|- | |||
| 0x088600C0 | |||
| [[11.1.0-34|11.1.0-X]] | |||
| [[FS:CheckUpdatedDat|CheckUpdatedDat]] | |||
| 0x00080000 | |||
|} | |} | ||
Line 693: | Line 699: | ||
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). | ||
=File access= | == Filesystem service "fs:LDR" == | ||
File session handles obtained via [[FS:OpenFile]] | This service is identical to fs:USER, except [[FS:OpenArchive]] archive 0x2345678E can only be accessed with fs:LDR. | ||
== ProgramRegistry service "fs:REG" == | |||
{| class="wikitable" border="1" | |||
|- | |||
! Command Header | |||
! Description | |||
|- | |||
| 0x000100C6 | |||
| [[FSReg:Dummy1|Dummy1]] | |||
|- | |||
| 0x040103C0 | |||
| [[FSReg:Register|Register]] | |||
|- | |||
| 0x04020040 | |||
| [[FSReg:Unregister|Unregister]] | |||
|- | |||
| 0x040300C0 | |||
| [[FSReg:GetProgramInfo|GetProgramInfo]] | |||
|- | |||
| 0x04040100 | |||
| [[FSReg:LoadProgram|LoadProgram]] | |||
|- | |||
| 0x04050080 | |||
| [[FSReg:UnloadProgram|UnloadProgram]] | |||
|- | |||
| 0x04060080 | |||
| [[FSReg:CheckHostLoadId|CheckHostLoadId]] | |||
|} | |||
Only two sessions can be opened for this service at a time, hence no other processes can use this due to [[Process_Manager_Services|pm-module]] and [[Loader_Services|loader]] using this. | |||
=File and directory access= | |||
==Files== | |||
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 747: | Line 787: | ||
|} | |} | ||
=Directory service | ==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 778: | Line 819: | ||
| [[FSDir:GetPriority|GetPriority]] | | [[FSDir:GetPriority|GetPriority]] | ||
|} | |} | ||
= Archives = | = Archives = | ||
Line 819: | Line 827: | ||
! 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 | |||
|- | |- | ||
| 0x00000003 | | 0x00000003 | ||
| | | SelfNCCH (including [[#RomFS|RomFS]]) | ||
| Yes | | Yes | ||
| No | | No | ||
| No | | No | ||
| No | |||
| None | |||
|- | |- | ||
| 0x00000004 | | 0x00000004 | ||
Line 832: | Line 844: | ||
| No | | No | ||
| No | | No | ||
| No | |||
| None | |||
|- | |- | ||
| 0x00000006 | | 0x00000006 | ||
| ExtSaveData | | ExtSaveData | ||
| Yes | | Yes | ||
| No | |||
| No | | No | ||
| Yes | | Yes | ||
| 0x100D, when the input extdataID isn't listed in the exheader. | |||
|- | |- | ||
| 0x00000007 | | 0x00000007 | ||
| Shared ExtSaveData | | Shared ExtSaveData | ||
| Yes | | Yes | ||
| No | |||
| No | | No | ||
| Yes | | Yes | ||
| None | |||
|- | |- | ||
| 0x00000008 | | 0x00000008 | ||
| SystemSaveData | | SystemSaveData | ||
| Yes | | Yes | ||
| No | |||
| No | | No | ||
| Yes | | Yes | ||
| 0x4, when the input saveID doesn't match the exheader system-saveID. | |||
|- | |- | ||
| 0x00000009 | | 0x00000009 | ||
Line 856: | Line 876: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| 0x8E | |||
|- | |- | ||
| 0x0000000A | | 0x0000000A | ||
Line 862: | Line 884: | ||
| No | | No | ||
| No | | No | ||
| No | |||
| 0x808E | |||
|- | |- | ||
| 0x12345678 | | 0x12345678 | ||
| ExtSaveData for BOSS | | ExtSaveData for BOSS | ||
| Yes | | Yes | ||
| No | |||
| No | | No | ||
| Yes | | Yes | ||
| 0x44 | |||
|- | |- | ||
| 0x12345679 | | 0x12345679 | ||
Line 874: | Line 900: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| 0x16 | |||
|- | |- | ||
| 0x1234567B | | 0x1234567B | ||
Line 879: | Line 907: | ||
| No | | No | ||
| Yes | | Yes | ||
| No | |||
| Yes | | Yes | ||
| | |||
|- | |- | ||
| 0x1234567C | | 0x1234567C | ||
Line 885: | Line 915: | ||
| No | | No | ||
| Yes | | Yes | ||
| No | |||
| Yes | | Yes | ||
| | |||
|- | |- | ||
| 0x1234567D | | 0x1234567D | ||
Line 892: | Line 924: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| 0x800 | |||
|- | |- | ||
| 0x1234567E | | 0x1234567E | ||
Line 898: | Line 932: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| 0x200 | |||
|- | |- | ||
| 0x1234567F | | 0x1234567F | ||
Line 904: | Line 940: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| ? | |||
|- | |- | ||
| 0x12345680 | | 0x12345680 | ||
Line 909: | Line 947: | ||
| Yes | | Yes | ||
| ? | | ? | ||
| No | |||
| Yes | | Yes | ||
| ? | |||
|- | |- | ||
| 0x12345681 | | 0x12345681 | ||
| Unknown. Accessed by FS service. | | Unknown. Accessed by FS service. | ||
| ? | | ? | ||
| ? | |||
| No | |||
| ? | | ? | ||
| ? | | ? | ||
Line 921: | Line 963: | ||
| Yes | | Yes | ||
| ? | | ? | ||
| No | |||
| Yes | | Yes | ||
| ? | |||
|- | |- | ||
| 0x2345678A | | 0x2345678A | ||
Line 927: | Line 971: | ||
| Yes | | Yes | ||
| Yes | | Yes | ||
| No | |||
| Yes | | Yes | ||
| 0x1005 | |||
|- | |- | ||
| 0x2345678B | | 0x2345678B | ||
Line 934: | Line 980: | ||
| No | | No | ||
| Yes | | Yes | ||
| Yes | |||
| | |||
|- | |- | ||
| 0x2345678C | | 0x2345678C | ||
Line 940: | Line 988: | ||
| No | | No | ||
| Yes | | Yes | ||
| Yes | |||
| | |||
|- | |- | ||
| 0x2345678D | | 0x2345678D | ||
Line 945: | Line 995: | ||
| No | | No | ||
| No | | No | ||
| Yes | |||
| No | | No | ||
| | |||
|- | |- | ||
| 0x2345678E | | 0x2345678E | ||
Line 951: | Line 1,003: | ||
| Yes | | Yes | ||
| Yes | | Yes | ||
| No | |||
| Yes | | Yes | ||
| None, see description. | |||
|- | |- | ||
| 0x567890AB | | 0x567890AB | ||
Line 958: | Line 1,012: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| ? | |||
|- | |- | ||
| 0x567890AC | | 0x567890AC | ||
Line 964: | Line 1,020: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| ? | |||
|- | |- | ||
| 0x567890AD | | 0x567890AD | ||
Line 970: | Line 1,028: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| ? | |||
|- | |- | ||
| 0x567890AE | | 0x567890AE | ||
Line 976: | Line 1,036: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| 0x100 | |||
|- | |- | ||
| 0x567890AF | | 0x567890AF | ||
Line 982: | Line 1,044: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| 0x100 | |||
|- | |- | ||
| 0x567890B0 | | 0x567890B0 | ||
Line 988: | Line 1,052: | ||
| Yes | | Yes | ||
| No | | No | ||
| No | |||
| | |||
|- | |- | ||
| 0x567890B1 | | 0x567890B1 | ||
Line 994: | Line 1,060: | ||
| No | | No | ||
| No | | No | ||
| No | |||
| 0x6 | |||
|- | |- | ||
| 0x567890B2 | | 0x567890B2 | ||
| 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 | |||
|- | |- | ||
| 0x567890B4 | | 0x567890B4 | ||
| ? | | Similar to 0x567890B2 but can only access Accessible Save specified in [[NCCH/Extended_Header#Storage_Info|exheader]]? | ||
| Yes | | Yes | ||
| No | | No | ||
| No | | No | ||
| Yes | |||
| ? | |||
|} | |} | ||
Archives listed as not requiring a binary lowpath, use lowpath type [[FS:OpenFile|empty]]. | Archives listed as not requiring a binary lowpath, use lowpath type [[FS:OpenFile|empty]]. | ||
The above permission bitmasks are from v2.x, see the above Services section for how these are handled. | |||
Archives CTR NAND, NAND RO Write FS, TWL NAND, NAND W FS, and CARD SPI FS require the corresponding process exheader access control mount flag to be set, in the exheader for any of the currently running ARM11 processes, for [[Filesystem_services_PXI|FSPXI]]. The access rights checked by [[Filesystem services|FS]] module for archive mounting with fs:USER, are stored in the process' exheader accessinfo. | Archives CTR NAND, NAND RO Write FS, TWL NAND, NAND W FS, and CARD SPI FS require the corresponding process exheader access control mount flag to be set, in the exheader for any of the currently running ARM11 processes, for [[Filesystem_services_PXI|FSPXI]]. The access rights checked by [[Filesystem services|FS]] module for archive mounting with fs:USER, are stored in the process' exheader accessinfo. | ||
Line 1,020: | Line 1,094: | ||
! 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 | ||
| | | ASCII - Text-based path with 7-bit ASCII characters padded to 8-bits each (signed char) | ||
|- | |- | ||
| 0x4 | | 0x4 | ||
| | | 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. | ||
=== SelfNCCH File Path Data Format === | |||
{| class="wikitable" border="1" | |||
|- | |||
! Index word | |||
! Description | |||
|- | |||
| 0 | |||
| Type: | |||
* 0x0: RomFS | |||
* 0x1: error 0xD9004676 | |||
* 0x2: ExeFS | |||
* 0x3: Error 0xE0E046BE. | |||
* 0x4: FS-module crashes on this | |||
* 0x5: Update RomFS? | |||
|- | |||
| 1-2 | |||
| File name for ExeFS ("icon"/"banner"/"logo"). ".code" is not allowed | |||
|} | |||
Note that ExeFS files only support reading from offset=0 and with size=file_size. | |||
=== SystemSaveData Archive Path Data Format === | === SystemSaveData Archive Path Data Format === | ||
Line 1,082: | Line 1,182: | ||
|} | |} | ||
The file/directory lowpath for this FS archive is a text path in the [[Savegames|savegame]] filesystem. | The file/directory lowpath for this FS archive is a text path in the [[Savegames|savegame]] filesystem. | ||
=== 0x567890B4 Archive Path Data Format === | |||
{| class="wikitable" border="1" | |||
|- | |||
! Index word | |||
! Description | |||
|- | |||
| 0 | |||
| [[Mediatypes|Mediatype]] | |||
|- | |||
| 1 | |||
| <code><nowiki>Lower_word_saveid >> 8</nowiki></code> ? | |||
|- | |||
| 2 | |||
| Unknown. Game calculate this using formula <code><nowiki>0xFFFFFF00 | unknown_b</nowiki></code> | |||
|} | |||
=== ExtSaveData Archive Path Data Format === | === ExtSaveData Archive Path Data Format === | ||
Line 1,113: | Line 1,229: | ||
|- | |- | ||
| 2 | | 2 | ||
| [[Mediatypes|Mediatype]] | | ([[Mediatypes|Mediatype]] & 0xFF) | (uninitialized_data? & 0xFFFFFF00) | ||
|- | |- | ||
| 3 | | 3 | ||
| | | Number of something? Hardcoded per-archive, 0 for ExeFS, 200 for area:, 100 for rate:, 40 for eula:, etc. | ||
|} | |} | ||
Line 1,143: | Line 1,259: | ||
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. | 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: | 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: | ||
Line 1,197: | Line 1,315: | ||
| SD | | SD | ||
|- | |- | ||
| | | 3 | ||
| TWL Photo | | TWL Photo | ||
|} | |} | ||
Line 1,378: | Line 1,496: | ||
| 0x10 | | 0x10 | ||
| 0x120 | | 0x120 | ||
| The [[nand/private/movable.sed]], encrypted with AES- | | The [[nand/private/movable.sed]], encrypted with AES-CBC using the above MAC for the counter. | ||
|} | |} | ||