Difference between revisions of "Filesystem services"

From Nintendo Switch Brew
Jump to navigation Jump to search
(46 intermediate revisions by 5 users not shown)
Line 4: Line 4:
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name || Arguments || Notes
+
! Cmd || Name
 
|-
 
|-
| 0 || OpenCodeFileSystem || u64 TitleId + X descriptor [[#ContentPath]] || Returns an [[#IFileSystem]].
+
| 0 || [[#OpenCodeFileSystem]]
 
|-
 
|-
| 1 || IsArchivedProgram || u64 ProcessId || Returns a bool (1 if the process id's [[#ContentPath]] ends in ".nca").
+
| 1 || [[#IsArchivedProgram]]
 
|-
 
|-
| 2 || [4.0.0+] SetCurrentProcess || PID descriptor ||
+
| 2 || [4.0.0+] [[#SetCurrentProcess]]
 
|}
 
|}
 +
 +
== OpenCodeFileSystem ==
 +
Takes an [[NCM_services#ProgramId|ProgramId]] and a [[#ContentPath]]. Returns an [[#IFileSystem]].
 +
 +
[10.0.0+] This now takes an additional type-0x1A output buffer.
 +
 +
== IsArchivedProgram ==
 +
Takes an u64 ProcessId. Returns a bool (1 if the process id's [[#ContentPath]] ends in ".nca").
 +
 +
== SetCurrentProcess ==
 +
Takes a ProcessId descriptor.
  
 
= fsp-pr =
 
= fsp-pr =
Line 18: Line 29:
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name || Notes
+
! Cmd || Name
 
|-
 
|-
| 0 || [[#RegisterProgram]] ||
+
| 0 || [[#RegisterProgram]]
 
|-
 
|-
| 1 || [[#UnregisterProgram]] ||
+
| 1 || [[#UnregisterProgram]]
 
|-
 
|-
| 2 || [4.0.0+] SetCurrentProcess ||
+
| 2 || [4.0.0+] [[#SetCurrentProcess]]
 
|-
 
|-
| 256 || [[#SetEnabledProgramVerification]] ||
+
| 256 || [1.0.0-9.2.0] [[#SetEnabledProgramVerification]]
 
|}
 
|}
  
 
== RegisterProgram ==
 
== RegisterProgram ==
Takes a storageID, a pid, a titleID, a 0x1C type-A buffer for the [[NPDM#FS_Access_Header| FS Access Header]], and a 0x2C type-A buffer for the [[NPDM#FS_Access_Control| FS Access Control]]
+
Takes a [[NCM_services#StorageId|StorageId]], an u64 ProcessId, a [[NCM_services#ProgramId|ProgramId]], a 0x1C type-A buffer for the [[NPDM#FS_Access_Header| FS Access Header]], and a 0x2C type-A buffer for the [[NPDM#FS_Access_Control| FS Access Control]]
  
 
Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.
 
Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.
Line 41: Line 52:
  
 
When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.
 
When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.
 +
 +
[10.0.0+] This was moved to [[Loader_services|Loader]].
  
 
= fsp-srv =
 
= fsp-srv =
Line 59: Line 72:
 
| 8 || [2.0.0+] [[#OpenFileSystemWithId]]
 
| 8 || [2.0.0+] [[#OpenFileSystemWithId]]
 
|-
 
|-
| 9 || [3.0.0+] OpenDataFileSystemByApplicationId
+
| 9 || [3.0.0+] OpenDataFileSystemByProgramId
 
|-
 
|-
 
| 11 || [[#OpenBisFileSystem]]
 
| 11 || [[#OpenBisFileSystem]]
Line 99: Line 112:
 
| 34 || [5.0.0+] GetCacheStorageSize
 
| 34 || [5.0.0+] GetCacheStorageSize
 
|-
 
|-
| 35 || [6.0.0+] CreateSaveDataFileSystemByHashSalt (Unofficial name, takes a total of 0xB0-bytes of input, no output)
+
| 35 || [6.0.0+] [[#CreateSaveDataFileSystemWithHashSalt]]
 +
|-
 +
| 36 || [9.0.0+] OpenHostFileSystemWithOption
 
|-
 
|-
 
| 51 || [[#OpenSaveDataFileSystem]]
 
| 51 || [[#OpenSaveDataFileSystem]]
Line 105: Line 120:
 
| 52 || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
 
| 52 || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
 
|-
 
|-
| 53 || [2.0.0+] OpenReadOnlySaveDataFileSystem
+
| 53 || [2.0.0+] [[#OpenReadOnlySaveDataFileSystem]]
 
|-
 
|-
 
| 57 || [3.0.0+] [[#ReadSaveDataFileSystemExtraDataBySaveDataSpaceId]]
 
| 57 || [3.0.0+] [[#ReadSaveDataFileSystemExtraDataBySaveDataSpaceId]]
Line 117: Line 132:
 
| 61 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]]
 
| 61 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]]
 
|-
 
|-
| 62 || [5.0.0+] OpenCacheStorageList
+
| 62 || [5.0.0+] OpenSaveDataInfoReaderOnlyCacheStorage
 
|-
 
|-
 
| 64 || [5.0.0+] OpenSaveDataInternalStorageFileSystem
 
| 64 || [5.0.0+] OpenSaveDataInternalStorageFileSystem
Line 123: Line 138:
 
| 65 || [5.0.0+] UpdateSaveDataMacForDebug
 
| 65 || [5.0.0+] UpdateSaveDataMacForDebug
 
|-
 
|-
| 66 || [5.0.0+] WriteSaveDataFileSystemExtraData2
+
| 66 || [5.0.0+] WriteSaveDataFileSystemExtraDataWithMask
 
|-
 
|-
| 67 || [6.0.0+] FindSaveDataWithFilter (Takes a total of 0x50-bytes of input, returns 8-bytes of output, and a type-0x6 output buffer)
+
| 67 || [6.0.0+] [[#FindSaveDataWithFilter]]
 
|-
 
|-
| 68 || [6.0.0+] OpenSaveDataIterator (Takes a total of 0x50-bytes of input, returns an #ISaveDataInfoReader)
+
| 68 || [6.0.0+] [[#OpenSaveDataInfoReaderWithFilter]]
 
|-
 
|-
 
| 69 || [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute
 
| 69 || [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute
 
|-
 
|-
| 70 || [8.0.0+] WriteSaveDataFileSystemExtraDataBySaveDataAttribute
+
| 70 || [8.0.0+] WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute
 +
|-
 +
| 71 || [10.0.0+] ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute
 
|-
 
|-
 
| 80 || OpenSaveDataMetaFile
 
| 80 || OpenSaveDataMetaFile
 
|-
 
|-
| 81 || [4.0.0+] OpenSaveDataTransferManager (No input, returns an [[#ISaveDataTransferManager]])
+
| 81 || [4.0.0+] [[#OpenSaveDataTransferManager]]
 
|-
 
|-
| 82 || [5.0.0+] OpenSaveDataTransferManagerVersion2 (No input, returns an [[#ISaveDataTransferManagerWithDivision]])
+
| 82 || [5.0.0+] [[#OpenSaveDataTransferManagerVersion2]]
 
|-
 
|-
| 83 || [6.0.0+] OpenSaveDataTransferProhibiterForCloudBackUp (Takes an input u64, returns an [[#ISaveDataTransferProhibiter]])
+
| 83 || [6.0.0+] [[#OpenSaveDataTransferProhibiter]]
 
|-
 
|-
| 84 || [6.0.0+] ListApplicationAccessibleSaveDataOwnerId (Takes a total of 0x10-bytes of input, returns 4-bytes of output, and a type-0x6 output buffer)
+
| 84 || [6.0.0+] [[#ListAccessibleSaveDataOwnerId]]
 +
|-
 +
| 85 || [9.0.0+] [[#OpenSaveDataTransferManagerForSaveDataRepair]]
 +
|-
 +
| 86 || [10.0.0+] [[#OpenSaveDataMover]]
 
|-
 
|-
 
| 100 || OpenImageDirectoryFileSystem
 
| 100 || OpenImageDirectoryFileSystem
Line 147: Line 168:
 
| 110 || [[#OpenContentStorageFileSystem]]
 
| 110 || [[#OpenContentStorageFileSystem]]
 
|-
 
|-
| 120 || [6.0.0+] OpenCloudBackupWorkStorageFileSystem (Takes 4-bytes of input, returns an [[#IFileSystem]])
+
| 120 || [6.0.0-9.2.0] [[#OpenCloudBackupWorkStorageFileSystem]]
 
|-
 
|-
| 130 || [7.0.0+] OpenCustomStorageFileSystem (Takes 4-bytes of input, returns an [[#IFileSystem]])
+
| 130 || [7.0.0+] [[#OpenCustomStorageFileSystem]]
 
|-
 
|-
 
| 200 || OpenDataStorageByCurrentProcess
 
| 200 || OpenDataStorageByCurrentProcess
Line 159: Line 180:
 
| 203 || OpenPatchDataStorageByCurrentProcess
 
| 203 || OpenPatchDataStorageByCurrentProcess
 
|-
 
|-
| 204 || [7.0.0+] OpenDataFileSystemByProgramIndex (Takes an input u8, returns an [[#IFileSystem]])
+
| 204 || [7.0.0+] [[#OpenDataFileSystemWithProgramIndex]]
 
|-
 
|-
| 205 || [7.0.0+] OpenDataStorageByProgramIndex (Takes an input u8, returns an [[#IStorage]])
+
| 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]]
 
|-
 
|-
 
| 400 || [[#OpenDeviceOperator]]
 
| 400 || [[#OpenDeviceOperator]]
Line 173: Line 194:
 
| 511 || [5.0.0+] NotifySystemDataUpdateEvent
 
| 511 || [5.0.0+] NotifySystemDataUpdateEvent
 
|-
 
|-
| 520 || [6.0.0+] SimulateGameCardDetectionEvent (Takes a total of 0xC-bytes of input, no output)
+
| 520 || [6.0.0+] [[#SimulateDeviceDetectionEvent]]
 
|-
 
|-
 
| 600 || [1.0.0-3.0.2] SetCurrentPosixTime
 
| 600 || [1.0.0-3.0.2] SetCurrentPosixTime
Line 219: Line 240:
 
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid
 
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid
 
|-
 
|-
| 700 || [5.0.0+] [[#OpenAccessFailureResolver]]
+
| 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]]
 
|-
 
|-
 
| 701 || [5.0.0+] GetAccessFailureDetectionEvent
 
| 701 || [5.0.0+] GetAccessFailureDetectionEvent
Line 229: Line 250:
 
| 720 || [5.0.0+] AbandonAccessFailure
 
| 720 || [5.0.0+] AbandonAccessFailure
 
|-
 
|-
| 800 || [2.0.0+] GetAndClearFileSystemProxyErrorInfo
+
| 800 || [2.0.0+] GetAndClearErrorInfo
 
|-
 
|-
 
| 810 || [7.0.0+] RegisterProgramIndexMapInfo
 
| 810 || [7.0.0+] RegisterProgramIndexMapInfo
 
|-
 
|-
| 1000 || SetBisRootForHost
+
| 1000 || [1.0.0-9.2.0] SetBisRootForHost
 
|-
 
|-
 
| 1001 || [[#SetSaveDataSize]]
 
| 1001 || [[#SetSaveDataSize]]
Line 255: Line 276:
 
| 1010 || [5.1.0-6.2.0] SetDataStorageRedirectTarget
 
| 1010 || [5.1.0-6.2.0] SetDataStorageRedirectTarget
 
|-
 
|-
| 1011 || [7.0.0+] GetAccessLogVersionInfo (Unofficial name, no input, returns two 32-bit values "version" and "program_index")
+
| 1011 || [7.0.0+] [[#GetProgramIndexForAccessLog]]
 +
|-
 +
| 1012 || [9.0.0+] GetFsStackUsage
 +
|-
 +
| 1013 || [9.0.0+] UnsetSaveDataRootPath
 +
|-
 +
| 1014 || [10.0.0+] OutputMultiProgramTagAccessLog
 
|-
 
|-
 
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey
 
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey
 
|-
 
|-
| 1110 || [6.0.0+] CorruptSaveDataFileSystemBySaveDataSpaceId2
+
| 1110 || [6.0.0+] CorruptSaveDataFileSystemByOffset
 +
|-
 +
| 1200 || [6.0.0+] [[#OpenMultiCommitManager]]
 
|-
 
|-
| 1200 || [6.0.0+] OpenMultiCommitManager (No input, returns an output #IMultiCommitManager)
+
| 1300 || [10.0.0+] [[#OpenBisWiper]]
 
|}
 
|}
  
Line 273: Line 302:
 
If the code were to request an invalid input type, panic. But this never happens.
 
If the code were to request an invalid input type, panic. But this never happens.
  
=== RwPermissions ===
+
The output values for [[#ReadWrite]] CanMountRegisteredUpdatePartition and [[#Call]] CanRegisterUpdatePartition are masked with the cached value of [[SMC#IsDebugMode|DebugMode]].
 +
 
 +
=== ReadWrite ===
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Type(s) || Mask || Name || Value || Used by
+
! AccessibilityType || Name || Mask || Permission || Used by
 
|-
 
|-
| 0x0 || 0x8000000000000801 || CanMountLogo || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
+
| 0x0 || CanMountLogo || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 
|-
 
|-
| 0x1 || 0x8000000000000801 || CanMountContentMeta || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
+
| 0x1 || CanMountContentMeta || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 
|-
 
|-
| 0x2 || 0x8000000000000801 || CanMountContentControl || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
+
| 0x2 || CanMountContentControl || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 
|-
 
|-
| 0x3 || 0x8000000000000801 || CanMountContentManual || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
+
| 0x3 || CanMountContentManual || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 
|-
 
|-
| 0x4 || 0x8000000000000801 || CanMountContentData || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
+
| 0x4 || CanMountContentData || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 
|-
 
|-
| 0x5 || 0x8000000000000801 || CanMountApplicationPackage || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
+
| 0x5 || CanMountApplicationPackage || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 
|-
 
|-
| 0x6 || 0x8000000000000000 || CanMountSaveDataStorage || 3 ||
+
| 0x6 || CanMountSaveDataStorage || 0x8000000000000000 || RW ||
 
|-
 
|-
| 0x7 || 0x8000000000000800 || CanMountContentStorage || 3 || [[#OpenContentStorageFileSystem]]
+
| 0x7 || CanMountContentStorage || 0x8000000000000800 || RW || [[#OpenContentStorageFileSystem]]
 
|-
 
|-
| 0x8 || 0x8000000000001000 || CanMountImageAndVideoStorage || 3 || [[#OpenImageDirectoryFileSystem]]
+
| 0x8 || CanMountImageAndVideoStorage ||0x8000000000001000 || RW || [[#OpenImageDirectoryFileSystem]]
 
|-
 
|-
| 0x9 || 0x8000000200000000<br/>([1.0.0-5.1.0] 0x8000000000000084) || CanMountCloudBackupWorkStorage || 3 || OpenCloudBackupWorkStorageFileSystem
+
| ([1.0.0-5.1.0] 0x9) || || 0x8000000000000084 || ||  
 
|-
 
|-
| 0xA || 0x8000000000000000<br/>([7.0.0-7.0.1] 0x4000000000000000)<br/>([6.0.0-6.2.0] 0x8000000000000084)<br/>([1.0.0-5.1.0] 0x8000000000000080) || CanMountCustomStorage || 3 || OpenCustomStorageFileSystem
+
| ([6.0.0-9.2.0] 0x9) || CanMountCloudBackupWorkStorage || 0x8000000200000000 || RW || OpenCloudBackupWorkStorageFileSystem
 
|-
 
|-
| 0xB || 0x8000000000000084<br/>([6.0.0-6.2.0] 0x8000000000000080)<br/>([1.0.0-5.1.0] 0x8000000000008080) || CanMountBisCalibrationFile || 3 || [[#OpenBisFileSystem]]
+
| 0x9 || CanMountCustomStorage0 || 0x8000000000000000 || RW || OpenCustomStorageFileSystem
 
|-
 
|-
| 0xC || 0x8000000000000080<br/>([1.0.0-6.2.0] 0x8000000000008080) || CanMountBisSafeMode || 3 || [[#OpenBisFileSystem]]
+
| ([1.0.0-5.1.0] 0xA) || || 0x8000000000000080 || ||
 
|-
 
|-
| 0xD || 0x8000000000008080<br/>([1.0.0-5.1.0] 0x8000000000000080) || CanMountBisUser || 3 || [[#OpenBisFileSystem]]
+
| ([6.0.0-6.2.0] 0xA) || || 0x8000000000000084 || ||
 
|-
 
|-
| 0xE || 0x8000000000008080<br/>([3.0.0-6.2.0] 0x8000000000000080)<br/>([1.0.0-2.3.0] 0xC000000000200000) || CanMountBisSystem || 3 || [[#OpenBisFileSystem]]
+
| ([7.0.0-7.0.1] 0xA) || || 0x4000000000000000 || ||
 
|-
 
|-
| 0xF || 0x8000000000000080<br/>([3.0.0-5.1.0] 0xC000000000200000)<br/>([1.0.0-2.3.0] 0x8000000000000010) || CanMountBisSystemProperEncryption || 3 || [[#OpenBisFileSystem]]
+
| ([8.0.0-9.2.0] 0xA) || || 0x8000000000000000 || ||
 
|-
 
|-
| 0x10 || 0x8000000000000080<br/>([6.0.0-6.2.0] 0xC000000000200000<br/>([3.0.0-5.1.0] 0x8000000000000010)<br/>([1.0.0-2.3.0] 0x8000000000040020) || CanMountBisSystemProperPartition || 3 || [[#OpenBisFileSystem]]
+
| 0xA || CanMountBisCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x11 || 0xC000000000200000<br/>([6.0.0-6.2.0] 0x8000000000000010)<br/>([3.0.0-5.1.0] 0x8000000000040020)<br/>([1.0.0-2.3.0] 0x8000000000000028) || CanMountSdCard || 3 || [[#OpenSdCardFileSystem]]
+
| ([1.0.0-5.1.0] 0xB) || || 0x8000000000008080 || ||
 
|-
 
|-
| 0x12 || 0x8000000000000010<br/>([6.0.0-6.2.0] 0x8000000000040020)<br/>([3.0.0-5.1.0] 0x8000000000000028)<br/>([1.0.0-2.3.0] 0x8000000000000020) || CanMountGameCard || 3 || [[#OpenGameCardFileSystem]]
+
| ([6.0.0-6.2.0] 0xB) || || 0x8000000000000080 || ||
 
|-
 
|-
| 0x13 || 0x8000000000040020<br/>([6.0.0-6.2.0] 0x8000000000000028)<br/>([1.0.0-5.1.0] 0x8000000000000020) || CanMountDeviceSaveData || 3 || [[#OpenSaveDataFileSystem]]
+
| ([7.0.0-9.2.0] 0xB) || || 0x8000000000000084 || ||
 
|-
 
|-
| 0x14 || 0x8000000000000028<br/>([3.0.0-6.2.0] 0x8000000000000020)<br/>([1.0.0-2.3.0] 0x8000000000010082) || CanMountSystemSaveData || 3 || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
+
| 0xB || CanMountBisSafeMode || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x15 || 0x8000000000000020<br/>([3.0.0-5.1.0] 0x8000000000010082)<br/>([1.0.0-2.3.0] 0x8000000000010080) || CanMountOthersSaveData || 3 || [[#OpenSaveDataFileSystem]]
+
| ([1.0.0-6.2.0] 0xC) || || 0x8000000000008080 || ||
 
|-
 
|-
| 0x16 || 0x8000000000000020<br/>([6.0.0-6.2.0] 0x8000000000010082)<br/>([1.0.0-5.1.0] 0x8000000000010080) || CanMountOthersSystemSaveData || 3 || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
+
| ([7.0.0-9.2.0] 0xC) || || 0x8000000000000080 || ||
 
|-
 
|-
| 0x17 || 0x8000000000010082<br/>([6.0.0-6.2.0] 0x8000000000010080)<br/>([3.0.0-5.1.0] 0x8000000000000080)<br/>([1.0.0-2.3.0] 0x8000000000010080) || CanOpenBisPartitionBootPartition1Root || 3 || [[#OpenBisStorage]]
+
| 0xC || CanMountBisUser || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x18 || 0x8000000000010080<br/>([6.0.0-6.2.0] 0x8000000000000080)<br/>([1.0.0-5.1.0] 0x8000000000010080) || CanOpenBisPartitionBootPartition2Root || 3 || [[#OpenBisStorage]]
+
| ([1.0.0-5.1.0] 0xD) || || 0x8000000000000080 || ||
 
|-
 
|-
| 0x19 || 0x8000000000000080<br/>([6.0.0-6.2.0] 0x8000000000010080) || CanOpenBisPartitionUserDataRoot || 3 || [[#OpenBisStorage]]
+
| ([6.0.0-9.2.0] 0xD) || || 0x8000000000008080 || ||
 
|-
 
|-
| 0x1A || 0x8000000000010080 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 3 || [[#OpenBisStorage]]
+
| 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x1B || 0x8000000000010080 || CanOpenBisPartitionBootConfigAndPackage2Part2 || 3 || [[#OpenBisStorage]]
+
| ([1.0.0-2.3.0] 0xE) || || 0xC000000000200000 || ||
 
|-
 
|-
| 0x1C || 0x8000000000010080 || CanOpenBisPartitionBootConfigAndPackage2Part3 || 3 || [[#OpenBisStorage]]
+
| ([3.0.0-6.2.0] 0xE) || || 0x8000000000000080 || ||
 
|-
 
|-
| 0x1D || 0x8000000000010080<br/>([1.0.0-2.3.0] 0x8000000000000084) || CanOpenBisPartitionBootConfigAndPackage2Part4 || 3 || [[#OpenBisStorage]]
+
| ([7.0.0-9.2.0] 0xE) || || 0x8000000000008080 || ||
 
|-
 
|-
| 0x1E || 0x8000000000010080<br/>([1.0.0-5.1.0] 0x8000000000000084) || CanOpenBisPartitionBootConfigAndPackage2Part5 || 3 || [[#OpenBisStorage]]
+
| 0xE || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x1F || 0x8000000000010080<br/>([6.0.0-6.2.0] 0x8000000000000084)<br/>([1.0.0-2.3.0] 0x8000000000000080) || CanOpenBisPartitionBootConfigAndPackage2Part6 || 3 || [[#OpenBisStorage]]
+
| ([1.0.0-2.3.0] 0xF) || || 0x8000000000000010 || ||
 
|-
 
|-
| 0x20 || 0x8000000000000084<br/>([1.0.0-5.1.0] 0x8000000000000080) || CanOpenBisPartitionCalibrationBinary || 3 || [[#OpenBisStorage]]
+
| ([3.0.0-5.1.0] 0xF) || || 0xC000000000200000 || ||
 
|-
 
|-
| 0x21 || 0x8000000000000084<br/>([6.0.0-6.2.0] 0x8000000000000080) || CanOpenBisPartitionCalibrationFile || 3 || [[#OpenBisStorage]]
+
| ([6.0.0-9.2.0] 0xF) || || 0x8000000000000080 || ||
 
|-
 
|-
| 0x22 || 0x8000000000000080 || CanOpenBisPartitionSafeMode || 3 || [[#OpenBisStorage]]
+
| 0xF || CanMountBisSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x23 || 0x8000000000000080<br/>([1.0.0-2.3.0] 0xC000000000200000) || CanOpenBisPartitionUser || 3 || [[#OpenBisStorage]]
+
| ([1.0.0-2.3.0] 0x10) || || 0x8000000000040020 || ||
 
|-
 
|-
| 0x24 || 0x8000000000000080<br/>([1.0.0-2.3.0] 0x8000000000000100) || CanOpenBisPartitionSystem || 3 || [[#OpenBisStorage]]
+
| ([3.0.0-5.1.0] 0x10) || || 0x8000000000000010 || ||
 
|-
 
|-
| 0x25 || 0x8000000000000080<br/>([3.0.0-5.1.0] 0xC000000000200000)<br/>([1.0.0-2.3.0] 0x8000000000100008) || CanOpenBisPartitionSystemProperEncryption || 3 || [[#OpenBisStorage]]
+
| ([6.0.0-6.2.0] 0x10) || || 0xC000000000200000 || ||
 
|-
 
|-
| 0x26 || 0x8000000000000080<br/>([6.0.0-6.2.0] 0xC000000000200000)<br/>([3.0.0-5.1.0] 0x8000000000000100)<br/>([1.0.0-2.3.0] 0xC000000000400000) || CanOpenBisPartitionSystemProperPartition || 3 || [[#OpenBisStorage]]
+
| ([7.0.0-9.2.0] 0x10) || || 0x8000000000000080 || ||
 
|-
 
|-
| [3.0.0+] 0x27 || 0xC000000000200000<br/>([6.0.0-6.2.0] 0x8000000000000100)<br/>([1.0.0-5.1.0] 0x8000000000100008) || CanOpenSdCardStorage || ||
+
| 0x10 || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]]
 
|-
 
|-
| [3.0.0+] 0x28 || 0x8000000000000100<br/>([6.0.0-6.2.0] 0x8000000000100008)<br/>([1.0.0-5.1.0] 0xC000000000400000) || CanOpenGameCardStorage || 3 || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)
+
| ([1.0.0-2.3.0] 0x11) || || 0x8000000000000028 || ||
 
|-
 
|-
| [4.0.0+] 0x29 || 0x8000000000100008<br/>([6.0.0-6.2.0] 0xC000000000400000)<br/>([1.0.0-5.1.0] 0x8000000000010000) || CanMountSystemDataPrivate || 1 || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
+
| ([3.0.0-5.1.0] 0x11) || || 0x8000000000040020 || ||
 
|-
 
|-
| [5.0.0+] 0x2A || 0xC000000000400000<br/>([6.0.0-6.2.0] 0x8000000000010000)<br/>([1.0.0-5.1.0] 0x8000000000000000) || CanMountHost || 3 || [[#OpenHostFileSystem]]
+
| ([6.0.0-6.2.0] 0x11) || || 0x8000000000000010 || ||
 
|-
 
|-
| [6.0.0+] 0x2B || 0x8000000000010000<br/>([1.0.0-6.2.0]0x8000000000000000) || CanMountRegisteredUpdatePartition || 1 || [[#OpenRegisteredUpdatePartition]]
+
| ([7.0.0-9.2.0] 0x11) || || 0xC000000000200000 || ||
 
|-
 
|-
| [7.0.0+] 0x2C || 0x8000000000000000 || CanOpenSaveDataInternalStorage || 3 || [[#OpenSaveDataInternalStorageFileSystem]]
+
| 0x11 || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]]
 
|-
 
|-
| [7.0.0+] 0x2D || 0x0000000000000000 || CanNotMountCustomStorage || 3 || OpenCustomStorageFileSystem
+
| ([1.0.0-2.3.0] 0x12) || || 0x8000000000000020 || ||
|}
+
|-
 
+
| ([3.0.0-5.1.0] 0x12) || || 0x8000000000000028 || ||
=== BoolPermissions ===
+
|-
{| class="wikitable" border="1"
+
| ([6.0.0-6.2.0] 0x12) || || 0x8000000000040020 || ||
 +
|-
 +
| ([7.0.0-9.2.0] 0x12) || || 0x8000000000000010 || ||
 +
|-
 +
| 0x12 || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]]
 
|-
 
|-
! Type(s) || Mask || Name || Used by
+
| ([1.0.0-5.1.0] 0x13) || || 0x8000000000000020 || ||
 
|-
 
|-
| 0x0 || 0x8000000000000080 || CanInvalidateBisCache || [[#InvalidateBisCache]]
+
| ([6.0.0-6.2.0] 0x13) || || 0x8000000000000028 || ||
 
|-
 
|-
| 0x1 || 0x8000000000000080 || CanEraseMmc || [[#EraseMmc]]
+
| ([7.0.0-9.2.0] 0x13) || || 0x8000000000040020 || ||
 
|-
 
|-
| 0x2 || 0x8000000000000010 || CanGetGameCardDeviceCertificate || [[#GetGameCardDeviceCertificate]]
+
| 0x13 || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
 
|-
 
|-
| 0x3 || 0x8000000000000010 || CanGetGameCardIdSet || [[#GetGameCardIdSet]]
+
| ([1.0.0-2.3.0] 0x14) || || 0x8000000000010082 || ||
 
|-
 
|-
| 0x4 || 0x8000000000000200 || CanFinalizeGameCardDriver || [[#FinalizeGameCardDriver]]
+
| ([3.0.0-6.2.0] 0x14) || || 0x8000000000000020 || ||
 
|-
 
|-
| 0x5 || 0x8000000000000200 || CanGetGameCardAsicInfo || [[#GetGameCardAsicInfo]]
+
| ([7.0.0-9.2.0] 0x14) || || 0x8000000000000028 || ||
 
|-
 
|-
| 0x6 || 0x8000000000002020 || CanCreateSaveData || [[#CreateSaveDataFileSystem]]
+
| 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]]
 
|-
 
|-
| 0x7 || 0x8000000000000060 || CanDeleteSaveData || [[#DeleteSaveDataFileSystem]], [[#RegisterSaveDataFileSystemAtomicDeletion]]
+
| ([1.0.0-2.3.0] 0x15) || || 0x8000000000010080 || ||
 
|-
 
|-
| 0x8 || 0x8000000000000028 || CanCreateSystemSaveData || [[#CreateSaveDataFileSystemBySystemSaveDataId]]
+
| ([3.0.0-5.1.0] 0x15) || || 0x8000000000010082 || ||
 
|-
 
|-
| 0x9 || 0x8000000000000020 || CanCreateOthersSystemSaveData || [[#CreateSaveDataFileSystemBySystemSaveDataId]]
+
| ([6.0.0-9.2.0] 0x15) || || 0x8000000000000020 || ||
 
|-
 
|-
| 0xA || 0x8000000000004028 || CanDeleteSystemSaveData || [[#DeleteSaveDataFileSystem]], [[#RegisterSaveDataFileSystemAtomicDeletion]]
+
| 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
 
|-
 
|-
| 0xB || 0x8000000000000060 || CanOpenSaveDataInfoReader || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
+
| ([1.0.0-5.1.0] 0x16) || || 0x8000000000010080 || ||
 
|-
 
|-
| 0xC || 0x8000000000004020 || CanOpenSaveDataInfoReaderForSystem || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
+
| ([6.0.0-6.2.0] 0x16) || || 0x8000000000010082 || ||
 
|-
 
|-
| 0xD || 0x8000000000000040<br/>([1.0.0-5.1.0] 0x8000000000020000) || CanOpenSaveDataIterator || OpenSaveDataIterator
+
| ([7.0.0-9.2.0] 0x16) || || 0x8000000000000020 || ||
 
|-
 
|-
| 0xE || 0x8000000000020000<br/>([1.0.0-5.1.0] 0x8000000000000400) || CanOpenSaveDataMetaFile || [[#OpenSaveDataMetaFile]]
+
| 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| 0xF || 0x8000000000000400<br/>([1.0.0-5.1.0] 0x8000000000004060) || CanSetCurrentPosixTime || [[#SetCurrentPosixTime]], [[#SetCurrentPosixTimeWithTimeDifference]]
+
| ([1.0.0-2.3.0] 0x17) || || 0x8000000000010080 || ||
 
|-
 
|-
| 0x10 || 0x8000000000004060<br/>([1.0.0-5.1.0] 0x8000000000080000) || CanReadSaveDataFileSystemExtraData || [[#ReadSaveDataFileSystemExtraData]]
+
| ([3.0.0-5.1.0] 0x17) || || 0x8000000000000080 || ||
 
|-
 
|-
| 0x11 || 0x8000000000080000 || CanSetGlobalAccessLogMode || [[#SetGlobalAccessMode]]
+
| ([6.0.0-6.2.0] 0x17) || || 0x8000000000010080 || ||
 
|-
 
|-
| 0x12 || 0x8000000000080000<br/>([1.0.0-5.1.0] Invalid) || CanSetSpeedEmulationMode || [[#SetSpeedEmulationMode]]
+
| ([7.0.0-9.2.0] 0x17) || || 0x8000000000010082 || ||
 
|-
 
|-
| 0x13 || Invalid<br/>([1.0.0-5.1.0] 0xC000000000800000) || ||  
+
| 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| 0x14 || 0xC000000000800000<br/>([1.0.0-5.1.0] 0xC000000001000000) || CanFillBis || [[#CreatePaddingFile]], [[#DeleteAllPaddingFiles]]
+
| ([1.0.0-5.1.0] 0x18) || || 0x8000000000010080 || ||
 
|-
 
|-
| 0x15 || 0xC000000001000000<br/>([5.0.0-5.1.0] 0x8000000001000060)<br/>([1.0.0-4.1.0] 0xC000000002000000) || CanCorruptSaveData || [[#CorruptSaveDataFileSystem]], [[#CorruptSaveDataFileSystemBySaveDataSpaceId]]
+
| ([6.0.0-6.2.0] 0x18) || || 0x8000000000000080 || ||
 
|-
 
|-
| [2.0.0+] 0x16 || 0x8000000001000060<br/>([5.0.0-5.1.0] 0x8000000000000060)<br/>([1.0.0-4.1.0] 0x8000000004000000) || CanCorruptSystemSaveData || [[#CorruptSaveDataFileSystem]], [[#CorruptSaveDataFileSystemBySaveDataSpaceId]]
+
| ([7.0.0-9.2.0] 0x18) || || 0x8000000000010080 || ||
 
|-
 
|-
| [2.0.0+] 0x17 || 0x8000000000000060<br/>([5.0.0-5.1.0] 0xC000000002000000)<br/>([1.0.0-4.1.0] 0x8000000008000000) || CanVerifySaveData || [[#VerifySaveDataFileSystem]], [[#VerifySaveDataFileSystemBySaveDataSpaceId]]
+
| 0x18 || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [2.0.0+] 0x18 || 0xC000000002000000<br/>([5.0.0-5.1.0] 0x8000000004000000)<br/>([1.0.0-4.1.0] 0x8000000010000000) || CanDebugSaveData || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
+
| ([6.0.0-6.2.0] 0x19) || || 0x8000000000010080 || ||
 
|-
 
|-
| [2.0.0+] 0x19 || 0x8000000004000000<br/>([5.0.0-5.1.0] 0x8000000008000000)<br/>([1.0.0-4.1.0] 0x8000000000000800) || CanFormatSdCard || [[#FormatSdCardFileSystem]]
+
| ([7.0.0-9.2.0] 0x19) || || 0x8000000000000080 || ||
 
|-
 
|-
| [2.0.0+] 0x1A || 0x8000000008000000<br/>([5.0.0-5.1.0] 0x8000000010000000)<br/>([1.0.0-4.1.0] 0x8000000000004020) || CanGetRightsId || [[#GetRightsId]], [[#GetRightsIdAndKeyGenerationByPath]], [[#GetRightsIdByPath]]
+
| 0x19 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [3.0.0+] 0x1B || 0x8000000010000000<br/>([5.0.0-5.1.0] 0x8000000000000800)<br/>([1.0.0-4.1.0] 0x8000000000002020) || CanRegisterExternalKey || [[#RegisterExternalKey]], [[#UnregisterAllExternalKey]]
+
| ([1.0.0-9.2.0] 0x1A) || || 0x8000000000010080 || ||
 
|-
 
|-
| [3.0.0+] 0x1C || 0x8000000000000800<br/>([5.0.0-5.1.0] 0x8000000000004020)<br/>([1.0.0-4.1.0] 0x8000000000000028) || CanSetEncryptionSeed || [[#SetSdCardEncryptionSeed]]
+
| 0x1A || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [4.0.0+] 0x1D || 0x8000000000000020<br/>([5.0.0-5.1.0] 0x8000000000000000)<br/>([1.0.0-4.1.0] 0x8000000020000000) || SaveDataExtraData_Write0 || [[#WriteSaveDataFileSystemExtraData]], [[#WriteSaveDataFileSystemExtraData2]]
+
| ([1.0.0-9.2.0] 0x1B) || || 0x8000000000010080 || ||
 
|-
 
|-
| [4.0.0+] 0x1E || 0x8000000000004020<br/>([5.0.0-5.1.0] 0x8000000000002020)<br/>([1.0.0-4.1.0] 0x8000000040000000) || CanWriteSaveDataFileSystemExtraDataFlags || [[#WriteSaveDataFileSystemExtraData]], [[#WriteSaveDataFileSystemExtraData2]]
+
| 0x1B || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [4.0.0+] 0x1F || 0x8000000000000020<br/>([5.0.0-5.1.0] 0x8000000000000028)<br/>([1.0.0-4.1.0] 0x8000000000000000) || SaveDataExtraData_Write1 || [[#WriteSaveDataFileSystemExtraData]], [[#WriteSaveDataFileSystemExtraData2]]
+
| ([1.0.0-9.2.0] 0x1C) || || 0x8000000000010080 || ||
 
|-
 
|-
| [4.0.0+] 0x20 || 0x8000000000000000<br/>([5.0.0-5.1.0] 0x8000000020000000)<br/>([1.0.0-4.1.0] 0x8000000000000000) || CanWriteSaveDataFileSystemExtraDataAll || [[#WriteSaveDataFileSystemExtraData]], [[#WriteSaveDataFileSystemExtraData2]]
+
| 0x1C || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [5.0.0+] 0x21 || 0x8000000000002020<br/>([1.0.0-5.1.0] 0x8000000040000000) || CanExtendSaveData || [[#ExtendSaveDataFileSystem]]
+
| ([1.0.0-2.3.0] 0x1D) || || 0x8000000000000084 || ||
 
|-
 
|-
| [5.0.0+] 0x22 || 0x8000000000000028<br/>([1.0.0-5.1.0] 0x0000000080000002) || CanExtendSystemSaveData || [[#ExtendSaveDataFileSystem]]
+
| ([3.0.0-9.2.0] 0x1D) || || 0x8000000000010080 || ||
 
|-
 
|-
| [5.0.0+] 0x23 || 0x8000000020000000<br/>([1.0.0-5.1.0] 0x8000000000000000) || CanRegisterUpdatePartition || [[#RegisterUpdatePartition]]
+
| 0x1D || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [5.0.0+] 0x24 || 0x8000000040000000<br/>([1.0.0-5.1.0] 0x8000000000000000) || CanOpenSaveDataTransferManager || [[#OpenSaveDataTransferManager]]
+
| ([1.0.0-5.1.0] 0x1E) || || 0x8000000000000084 || ||
 
|-
 
|-
| [5.0.0+] 0x25 || 0x8000000200000000<br/>([1.0.0-5.1.0] 0x8000000080200000) || CanOpenSaveDataTransferManagerVersion2 || [[#OpenSaveDataTransferManagerVersion2]]
+
| ([6.0.0-9.2.0] 0x1E) || || 0x8000000000010080 || ||
 
|-
 
|-
| [5.0.0+] 0x26 || 0x8000000200002000<br/>([1.0.0-5.1.0] 0x8000000080000110) || CanOpenSaveDataTransferProhibiterForCloudBackUp || [[#OpenSaveDataTransferProhibiterForCloudBackUp]]
+
| 0x1E || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [5.0.0+] 0x27 || 0x8000000240002000 <br/>([6.0.0-7.0.1] 0x8000000200002000)<br/>([1.0.0-5.1.0] 0x8000000000100008) || CanListApplicationAccessibleSaveDataOwnerId || ListApplicationAccessibleSaveDataOwnerId
+
| ([1.0.0-5.1.0] 0x1F) || || 0x8000000000000080 || ||
 
|-
 
|-
| [5.0.0+] 0x28 || 0x8000000000000000<br/>([1.0.0-5.1.0] 0x8000000080010000) || CanControlMmcPatrol || [[#SuspendMmcPatrol]], [[#ResumeMmcPatrol]]
+
| ([6.0.0-6.2.0] 0x1F) || || 0x8000000000000084 || ||
 
|-
 
|-
| [5.0.0+] 0x29 || 0x8000000000000000<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanOverrideSaveDataTransferTokenSignVerificationKey || [[#OverrideSaveDataTransferTokenSignVerificationKey]]
+
| ([7.0.0-9.2.0] 0x1F) || || 0x8000000000010080 || ||
 
|-
 
|-
| [5.0.0+] 0x2A || 0x8000000080200000<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanOpenSdCardDetectionEventNotifier || [[#OpenSdCardDetectionEventNotifier]]
+
| 0x1F || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [5.0.0+] 0x2B || 0x8000000080000110<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanOpenGameCardDetectionEventNotifier || [[#OpenGameCardDetectionEventNotifier]]
+
| ([1.0.0-5.1.0] 0x20) || || 0x8000000000000080 || ||
 
|-
 
|-
| [5.0.0+] 0x2C || 0x8000000000100008<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanOpenSystemDataUpdateEventNotifier || [[#OpenSystemDataUpdateEventNotifier]]
+
| ([6.0.0-9.2.0] 0x20) || || 0x8000000000000084 || ||
 
|-
 
|-
| [5.0.0+] 0x2D || 0x8000000000010000<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanNotifySystemDataUpdateEvent || [[#NotifySystemDataUpdateEvent]]
+
| 0x20 || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [5.0.0+] 0x2E || 0x8000000100000000<br/>([1.0.0-5.1.0] 0x8000000040000000) || CanOpenAccessFailureDetectionEventNotifier || [[#OpenAccessFailureResolver]]
+
| ([6.0.0-6.2.0] 0x21) || || 0x8000000000000080 || ||
 
|-
 
|-
| [5.0.0+] 0x2F || 0x8000000100000000<br/>([1.0.0-5.1.0] 0x8000000080200000) || CanGetAccessFailureDetectionEvent || [[#GetAccessFailureDetectionEvent]]
+
| ([7.0.0-9.2.0] 0x21) || || 0x8000000000000084 || ||
 
|-
 
|-
| [5.1.0+] 0x30 || 0x8000000100000000<br/>([1.0.0-5.1.0] 0x8000000080080000) || CanIsAccessFailureDetected || [[#IsAccessFailureDetected]]  
+
| 0x21 || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [6.0.0+] 0x31 || 0x8000000100000000 || CanResolveAccessFailure || [[#ResolveAccessFailure]]
+
| ([1.0.0-9.2.0] 0x22) || || 0x8000000000000080 || ||
 
|-
 
|-
| [6.0.0+] 0x32 || 0x8000000100000000 || CanAbandonAccessFailure || [[#AbandonAccessFailure]]
+
| 0x22 || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [6.0.0+] 0x33 || 0x8000000040000000 || CanQuerySaveDataInternalStorageTotalSize || [[#QuerySaveDataInternalStorageTotalSize]]
+
| ([1.0.0-2.3.0] 0x23) || || 0xC000000000200000 || ||
 
|-
 
|-
| [6.0.0+] 0x34 || 0x8000000200000020 || CanGetSaveDataCommitId || [[#GetSaveDataCommitId]]
+
| ([3.0.0-9.2.0] 0x23) || || 0x8000000000000080 || ||
 
|-
 
|-
| [6.0.0+] 0x35 || 0x8000000000200000 || CanSetSdCardAccessibility || [[#SetSdCardAccessibility]]
+
| 0x23 || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [6.0.0+] 0x36 || 0x4000000000000000 || CanSimulateGameCardDetectionEvent || SimulateGameCardDetectionEvent, SetSimulationEvent, ClearSimulationEvent
+
| ([1.0.0-2.3.0] 0x24) || || 0x8000000000000100 || ||
 
|-
 
|-
| [6.0.0+] 0x37 || 0x8000000000000000<br/>([6.0.0-6.2.0] 0x8000000000080000) || CanSetDataStorageRedirectTarget || SetDataStorageRedirectTarget
+
| ([3.0.0-9.2.0] 0x24) || || 0x8000000000000080 || ||
 
|-
 
|-
| [6.0.0+] 0x38 || 0x8000000400000000<br/>([6.0.0-6.2.0] 0x8000000000000000) || || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemByHashSalt
+
| 0x24 || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| [8.0.0+] 0x39 || 0x8000000000000010 || CanChallengeCardExistence || ChallengeCardExistence
+
| ([1.0.0-2.3.0] 0x25) || || 0x8000000000100008 || ||
|}
+
|-
 
+
| ([3.0.0-5.1.0] 0x25) || || 0xC000000000200000 || ||
== OpenFileSystem ==
+
|-
Takes a type-0x19 input buffer (ContentPath) and a [[#FileSystemType]] as parameters. Returns an [[#IFileSystem]].
+
| ([6.0.0-9.2.0] 0x25) || || 0x8000000000000080 || ||
 
+
|-
[2.0.0+] This function was removed.
+
| 0x25 || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
+
|-
== SetCurrentProcess ==
+
| ([1.0.0-2.3.0] 0x26) || || 0xC000000000400000 || ||
Takes a pid-descriptor.
+
|-
 
+
| ([3.0.0-5.1.0] 0x26) || || 0x8000000000000100 || ||
== OpenFileSystemWithPatch ==
+
|-
Takes an input [[#FileSystemType]] and an u64 title-id. Returns an [[#IFileSystem]].
+
| ([6.0.0-6.2.0] 0x26) || || 0xC000000000200000 || ||
 
+
|-
Web-applet loads the [[#FileSystemType]] (which must be '''ContentManual''') from u32_table[inparam].
+
| ([7.0.0-9.2.0] 0x26) || || 0x8000000000000080 || ||
 
+
|-
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
+
| 0x26 || CanOpenSdCardStorage || 0xC000000000200000 || RW ||
 
+
|-
== OpenFileSystemWithId ==
+
| ([3.0.0-5.1.0] 0x27) || || 0x8000000000100008 || ||
Takes a type-0x19 input buffer, an [[#FileSystemType]] and an u64 title-id. Returns an [[#IFileSystem]].
+
|-
 
+
| ([6.0.0-6.2.0] 0x27) || || 0x8000000000000100 || ||
The [[#IFileSystem]] must be '''ContentMeta''' if the NCA type is 0 (control).
+
|-
 +
| ([7.0.0-9.2.0] 0x27) || || 0xC000000000200000 || ||
 +
|-
 +
| [3.0.0+] 0x27 || CanOpenGameCardStorage || 0x8000000000000100 || RW || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)
 +
|-
 +
| ([3.0.0-5.1.0] 0x28) || || 0xC000000000400000 || ||
 +
|-
 +
| ([6.0.0-6.2.0] 0x28) || || 0x8000000000100008 || ||
 +
|-
 +
| ([7.0.0-9.2.0] 0x28) || || 0x8000000000000100 || ||
 +
|-
 +
| [3.0.0+] 0x28 || CanMountSystemDataPrivate || 0x8000000000100008 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
 +
|-
 +
| ([4.0.0-5.1.0] 0x29) || || 0x8000000000010000 || ||
 +
|-
 +
| ([6.0.0-6.2.0] 0x29) || || 0xC000000000400000 || ||
 +
|-
 +
| ([7.0.0-9.2.0] 0x29) || || 0x8000000000100008 || ||
 +
|-
 +
| [4.0.0+] 0x29 || CanMountHost || 0xC000000000400000 || RW || [[#OpenHostFileSystem]]
 +
|-
 +
| ([5.0.0-5.1.0] 0x2A) || || 0x8000000000000000 || ||
 +
|-
 +
| ([6.0.0-6.2.0] 0x2A) || || 0x8000000000010000 || ||
 +
|-
 +
| ([7.0.0-9.2.0] 0x2A) || || 0xC000000000400000 || ||
 +
|-
 +
| [5.0.0+] 0x2A || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]]
 +
|-
 +
| ([6.0.0-6.2.0] 0x2B) || || 0x8000000000000000 || ||
 +
|-
 +
| ([7.0.0-9.2.0] 0x2B) || || 0x8000000000010000 || ||
 +
|-
 +
| [6.0.0+] 0x2B || CanOpenSaveDataInternalStorage || 0x8000000000000000 || RW || [[#OpenSaveDataInternalStorageFileSystem]]
 +
|-
 +
| ([7.0.0-9.2.0] 0x2C) || || 0x8000000000000000 || ||
 +
|-
 +
| [7.0.0+] 0x2C || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem
 +
|-
 +
| ([7.0.0-9.2.0] 0x2D) || || 0x0000000000000000 || ||
 +
|}
  
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
+
=== Call ===
 
+
{| class="wikitable" border="1"
May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn't inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.
+
|-
 
+
! OperationType || Name || Mask || Used by
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemType]] '''ApplicationPackage'''.
+
|-
 
+
| 0x0 || CanInvalidateBisCache || 0x8000000000000080 || [[#InvalidateBisCache]]
After the [[#FileSystemType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.
+
|-
 
+
| 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc
When [[#FileSystemType]] is '''ContentMeta''', it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it's compared with the NCA titleID, then an error is thrown on mismatch.
+
|-
 
+
| 0x2 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate
== OpenBisFileSystem ==
+
|-
Takes a type-0x19 input buffer string and a u32 [[Flash_Filesystem|Bis partitionID]]. Official user-process code sets instr[0] = 0 normally. Returns an [[#IFileSystem]].
+
| 0x3 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet
 
+
|-
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisStorage]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.
+
| 0x4 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver
 
+
|-
== OpenBisStorage ==
+
| 0x5 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo
Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid [[#IStorage]] handle otherwise.
+
|-
 
+
| 0x6 || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]]
== InvalidateBisCache ==
+
|-
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]].
+
| 0x7 || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
 
+
|-
== DeleteSaveDataFileSystem ==
+
| 0x8 || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId
Takes an input u64.
+
|-
 
+
| 0x9 || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId
== CreateSaveDataFileSystem ==
+
|-
Takes a 0x40-byte Save-struct entry, a 0x40-byte SaveCreate-struct entry, and a 0x10-byte input struct.
+
| 0xA || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
 
+
|-
Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1.
+
| 0xB || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
 
+
|-
Creates regular savedata.
+
| 0xC || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
 
+
|-
== CreateSaveDataFileSystemBySystemSaveDataId ==
+
| ([1.0.0-5.1.0] 0xD) || || 0x8000000000020000 ||
Takes a 0x40-byte Save-struct entry and a 0x40-byte SaveCreate-struct entry.
+
|-
 
+
| 0xD || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]]
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
+
|-
 
+
| ([1.0.0-5.1.0] 0xE) || || 0x8000000000000400 ||
== OpenGameCardStorage ==
+
|-
Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].
+
| 0xE || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile
 
+
|-
== OpenGameCardFileSystem ==
+
| ([1.0.0-5.1.0] 0xF) || || 0x8000000000004060 ||
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]].
+
|-
 
+
| 0xF || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
Mounts a [[Gamecard_Partition|gamecard partition]].
+
|-
 
+
| ([1.0.0-5.1.0] 0x10) || || 0x8000000000080000 ||
== OpenSaveDataFileSystem ==
+
|-
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte Save-struct entry. Official user-process code is only known to use value 1 for the u8.
+
| 0x10 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]]
 
+
|-
Returns an [[#IFileSystem]].
+
| 0x11 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]]
 
+
|-
Permissions aren't checked until the specified save is successfully found.
+
| ([1.0.0-5.1.0] 0x12) || CanDebug || 0xC000000000000000 ||
 
+
|-
Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData).
+
| 0x12 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode
 
+
|-
== OpenSaveDataFileSystemBySystemSaveDataId ==
+
| ([1.0.0-5.1.0] 0x13) || || 0xC000000000800000 ||
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte Save-struct entry. Web-applet only uses value0 for the input u8.
+
|-
 
+
| 0x13 || CanDebug || 0xC000000000000000 ||
Returns an [[#IFileSystem]].
+
|-
 
+
| ([1.0.0-5.1.0] 0x14) || || 0xC000000001000000 ||
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
+
|-
 
+
| 0x14 || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles
== ReadSaveDataFileSystemExtraDataBySaveDataSpaceId ==
+
|-
Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
+
| ([1.0.0-4.1.0] 0x15) || || 0xC000000002000000 ||
 
+
|-
== ReadSaveDataFileSystemExtraData ==
+
| ([5.0.0-5.1.0] 0x15) || || 0x8000000001000060 ||
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
+
|-
 
+
| 0x15 || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
== OpenSaveDataInfoReader ==
+
|-
No input, returns an output [[#ISaveDataInfoReader]].
+
| ([2.0.0-4.1.0] 0x16) || || 0x8000000004000000 ||
 
+
|-
== OpenSaveDataInfoReaderBySaveDataSpaceId ==
+
| ([5.0.0-5.1.0] 0x16) || || 0x8000000000000060 ||
Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]].
+
|-
 
+
| [2.0.0+] 0x16 || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
== OpenContentStorageFileSystem ==
+
|-
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.
+
| ([2.0.0-4.1.0] 0x17) || || 0x8000000008000000 ||
 
+
|-
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]].
+
| ([5.0.0-5.1.0] 0x17) || || 0xC000000002000000 ||
 
+
|-
== OpenCustomStorageFileSystem ==
+
| [2.0.0+] 0x17 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId
Takes a [[#CustomStorageId]]. Invalid values return 0x2EE202.
+
|-
 
+
| ([2.0.0-4.1.0] 0x18) || || 0x8000000010000000 ||
Returns an [[#IFileSystem]] from either User:/CustomStorage0 or Sdcard:/Nintendo/CustomStorage0. If on the SD card, an AesXtsFileSystem is created using a key source specifically for custom storage.
+
|-
 
+
| ([5.0.0-5.1.0] 0x18) || || 0x8000000004000000 ||
== OpenDataStorageByDataId ==
+
|-
Takes a [[#StorageId]] and a TitleID.
+
| [2.0.0+] 0x18 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
 
+
|-
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.
+
| ([2.0.0-4.1.0] 0x19) || || 0x8000000000000800 ||
 
+
|-
== OpenDeviceOperator ==
+
| ([5.0.0-5.1.0] 0x19) || || 0x8000000008000000 ||
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.
+
|-
 
+
| [2.0.0+] 0x19 || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem
== OpenSdCardDetectionEventNotifier ==
+
|-
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
+
| ([2.0.0-4.1.0] 0x1A) || || 0x8000000000004020 ||
 
+
|-
== OpenGameCardDetectionEventNotifier ==
+
| ([5.0.0-5.1.0] 0x1A) || || 0x8000000010000000 ||
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
+
|-
 
+
| [2.0.0+] 0x1A || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
== VerifySaveDataFileSystem ==
+
|-
Takes an unknown input u64 and a type-0x6 output buffer.
+
| ([3.0.0-4.1.0] 0x1B) || || 0x8000000000002020 ||
 
+
|-
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).
+
| ([5.0.0-5.1.0] 0x1B) || || 0x8000000000000800 ||
 
+
|-
== GetSaveDataCommitId ==
+
| [3.0.0+] 0x1B || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey
Takes an input u8 and u64, returns an output u64.
+
|-
 
+
| ([3.0.0-4.1.0] 0x1C) || || 0x8000000000000028 ||
== SetSdCardEncryptionSeed ==
+
|-
Takes in the 0x10 byte SD card encryption seed, and loads it into FS-module state.
+
| ([5.0.0-5.1.0] 0x1C) || || 0x8000000000004020 ||
 
+
|-
[[NS_Services|NS]]-module reads the 0x10 bytes from SdCard:/Nintendo/Contents/private, and compares them to the first 0x10 bytes of the ns_appman:/private (in [[Flash_Filesystem#System_Savegames|system savedata]] 0x8000000000000043). If they match, NS calls this command using bytes 0x10-0x20 from ns_appman:/private. The rest of this file (0x1F0 bytes total) is (usually/always?) all-zero (however in some cases the byte at offset 0x20 is value 0x1).
+
| [3.0.0+] 0x1C || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]]
 
+
|-
== OpenAccessFailureResolver ==
+
| ([4.0.0-4.1.0] 0x1D) || || 0x8000000020000000 ||
Takes 8-bytes of input and returns an [[#IEventNotifier]].
+
|-
 
+
| ([5.0.0-5.1.0] 0x1D) || || 0x8000000000000000 ||
[8.0.0+] Now takes an additional 8-bytes of input.
+
|-
 
+
| [4.0.0+] 0x1D || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
== SetSaveDataSize ==
+
|-
Takes two input u64s "size" and "journal_size", and writes them to fsp-srv object member variables.
+
| ([4.0.0-4.1.0] 0x1E) || || 0x8000000040000000 ||
 
+
|-
These variables are normally initialized with 32 MiB (0x2000000) and 16 MiB (0x1000000), respectively.
+
| ([5.0.0-5.1.0] 0x1E) || || 0x8000000000002020 ||
 
+
|-
These variables don't seem to be actually used anywhere else (?)
+
| [4.0.0+] 0x1E || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 
+
|-
== SetSaveDataRootPath ==
+
| ([4.0.0-4.1.0] 0x1F) || || 0x8000000000000000 ||
Takes an input path, and does snprintf(<fsp-srv object>->m_save_data_root_path, FS_MAX_PATH-1, "/%s", input_path);
+
|-
 
+
| ([5.0.0-5.1.0] 0x1F) || || 0x8000000000000028 ||
This path is normally all-zero. When this path is non-zero, the internal OpenSaveDataFileSystem function will create a DirectorySaveDataFileSystem if the target save is a user-save + a directory exists, instead of the normal savedata filesystem object.
+
|-
 
+
| [4.0.0+] 0x1F || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
== SetGlobalAccessLogMode ==
+
|-
Takes an input u32.
+
| ([4.0.0-4.1.0] 0x20) || || 0x8000000000000000 ||
 
+
|-
== SetGlobalAccessLogMode ==
+
| ([5.0.0-5.1.0] 0x20) || || 0x8000000020000000 ||
Takes an input u32.
+
|-
 
+
| [4.0.0+] 0x20 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
== GetGlobalAccessLogMode ==
+
|-
Returns an output u32.
+
| ([5.0.0-5.1.0] 0x21) || || 0x8000000040000000 ||
 
+
|-
GlobalAccessLogMode is normally 0.
+
| [5.0.0+] 0x21 || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem
 
+
|-
== OutputAccessLogToSdCard ==
+
| ([5.0.0-5.1.0] 0x22) || || 0x0000000080000002 ||
Takes a type-0x5 input buffer.
+
|-
 
+
| [5.0.0+] 0x22 || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem
The input buffer is the string to output to the log. User-processes normally include a newline at the end.
+
|-
 
+
| ([5.0.0-5.1.0] 0x23) || || 0x8000000000000000 ||
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.
+
|-
 
+
| ([6.0.0-9.2.0] 0x23) || || 0x8000000020000000 ||
When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn't show up SD, unknown why.
+
|-
 
+
| [5.0.0+] 0x23 || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem
The input buffer is written to the "$FsAccessLog:/FsAccessLog.txt" file, where "$FsAccessLog" is the SD-card mount-name. It's written to the current end of the file(appended).
+
|-
 
+
| ([5.0.0-5.1.0] 0x24) || || 0x8000000000000000 ||
= IStorage =
+
|-
This is "nn::fssrv::sf::IStorage".
+
| ([6.0.0-9.2.0] 0x24) || || 0x8000000040000000 ||
 
+
|-
This is the interface for a raw device, usually a block device.
+
| [5.0.0+] 0x24 || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition
 
+
|-
{| class="wikitable" border="1"
+
| ([5.0.0-5.1.0] 0x25) || || 0x8000000080200000 ||
 +
|-
 +
| ([6.0.0-9.2.0] 0x25) || || 0x8000000200000000 ||
 +
|-
 +
| [5.0.0+] 0x25 || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]]
 +
|-
 +
| ([5.0.0-5.1.0] 0x26) || || 0x8000000080000110 ||
 +
|-
 +
| ([6.0.0-8.1.0] 0x26) || || 0x8000000200002000 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x26) || || 0x8000000200000000 ||
 +
|-
 +
| [5.0.0+] 0x26 || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]]
 +
|-
 +
| ([5.0.0-5.1.0] 0x27) || || 0x8000000000100008 ||
 +
|-
 +
| ([6.0.0-7.0.1] 0x27) || || 0x8000000200002000 ||
 +
|-
 +
| ([8.0.0-8.1.0] 0x27) || || 0x8000000240002000 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x27) || || 0x8000000000000000 ||
 +
|-
 +
| [5.0.0+] 0x27 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair
 +
|-
 +
| ([5.0.0-5.1.0] 0x28) || || 0x8000000080010000 ||
 +
|-
 +
| ([6.0.0-8.1.0] 0x28) || || 0x8000000000000000 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x28) || || 0x8000000200002000 ||
 +
|-
 +
| [5.0.0+] 0x28 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair
 +
|-
 +
| ([5.0.0-5.1.0] 0x29) || || 0x0000000080000001 ||
 +
|-
 +
| ([6.0.0-8.1.0] 0x29) || || 0x8000000000000000 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x29) || || 0x8000000240002000 ||
 +
|-
 +
| [5.0.0+] 0x29 || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]]
 +
|-
 +
| ([5.0.0-5.1.0] 0x2A) || || 0x0000000080000001 ||
 +
|-
 +
| ([6.0.0-8.1.0] 0x2A) || || 0x8000000080200000 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x2A) || || 0x8000000000000000 ||
 +
|-
 +
| [5.0.0+] 0x2A || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]]
 +
|-
 +
| ([5.0.0-5.1.0] 0x2B) || || 0x0000000080000001 ||
 +
|-
 +
| ([6.0.0-8.1.0] 0x2B) || || 0x8000000080000110 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x2B) || || 0x8000000000000000 ||
 +
|-
 +
| [5.0.0+] 0x2B || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]]
 +
|-
 +
| ([5.0.0-5.1.0] 0x2C) || || 0x0000000080000001 ||
 +
|-
 +
| ([6.0.0-8.1.0] 0x2C) || || 0x8000000000100008 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x2C) || || 0x8000000080200000 ||
 +
|-
 +
| [5.0.0+] 0x2C || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]]
 +
|-
 +
| ([5.0.0-5.1.0] 0x2D) || || 0x0000000080000001 ||
 +
|-
 +
| ([6.0.0-8.1.0] 0x2D) || || 0x8000000000010000 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x2D) || || 0x8000000080000110 ||
 +
|-
 +
| [5.0.0+] 0x2D || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol
 +
|-
 +
| ([5.0.0-5.1.0] 0x2E) || || 0x8000000040000000 ||
 +
|-
 +
| ([6.0.0-8.1.0] 0x2E) || || 0x8000000100000000 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x2E) || || 0x8000000000100008 ||
 +
|-
 +
| [5.0.0+] 0x2E || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey
 +
|-
 +
| ([5.0.0-5.1.0] 0x2F) || || 0x8000000080200000 ||
 +
|-
 +
| ([6.0.0-8.1.0] 0x2F) || || 0x8000000100000000 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x2F) || || 0x8000000000010000 ||
 +
|-
 +
| [5.0.0+] 0x2F || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]]
 +
|-
 +
| ([5.1.0-6.0.0] 0x30) || || 0x8000000080080000 ||
 +
|-
 +
| ([6.0.1-9.2.0] 0x30) || || 0x8000000100000000 ||
 +
|-
 +
| [5.1.0+] 0x30 || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]]
 +
|-
 +
| ([6.0.0-9.2.0] 0x31) || || 0x8000000100000000 ||
 +
|-
 +
| [6.0.0+] 0x31 || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier
 +
|-
 +
| ([6.0.0-9.2.0] 0x32) || || 0x8000000100000000 ||
 +
|-
 +
| [6.0.0+] 0x32 || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent
 +
|-
 +
| ([6.0.0-8.1.0] 0x33) || || 0x8000000040000000 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x33) || || 0x8000000100000000 ||
 +
|-
 +
| [6.0.0+] 0x33 || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]]
 +
|-
 +
| ([6.0.0-8.1.0] 0x34) || || 0x8000000200000020 ||
 +
|-
 +
| ([9.0.0-9.2.0] 0x34) || || 0x8000000100000000 ||
 +
|-
 +
| [6.0.0+] 0x34 || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent
 +
|-
 +
| ([6.0.0-8.1.0] 0x35) || || 0x8000000000200000 ||
 
|-
 
|-
! Cmd || Name || Arguments
+
| ([9.0.0-9.2.0] 0x35) || || 0x8000000040000000 ||
 
|-
 
|-
| 0 || Read || Takes a type-0x46 buffer, an offset and length
+
| [6.0.0+] 0x35 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected
 
|-
 
|-
| 1 || Write || Takes a type-0x45 buffer, an offset and length
+
| ([6.0.0-8.1.0] 0x36) || || 0x4000000000000000 ||
 
|-
 
|-
| 2 || Flush || None
+
| ([9.0.0-9.2.0] 0x36) || || 0x8000000200000020 ||
 
|-
 
|-
| 3 || SetSize || Takes a size
+
| [6.0.0+] 0x36 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure
 
|-
 
|-
| 4 || GetSize || None
+
| ([6.0.0-6.2.0] 0x37) || || 0x8000000000080000 ||
 
|-
 
|-
| 5 || [4.0.0+] OperateRange ||
+
| ([7.0.0-8.1.0] 0x37) || || 0x8000000000000000 ||
|}
+
|-
 
+
| ([9.0.0-9.2.0] 0x37) || || 0x8000000000200000 ||
= IFileSystem =
+
|-
This is "nn::fssrv::sf::IFileSystem".
+
| [6.0.0+] 0x37 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure
 
 
There are two main implementations of this interface:
 
 
 
* '''RomFS''': Filesystem implementation statically linked in the binary. Uses an [[#IStorage]] interface as underlying raw device.
 
* '''IPC proxy''': Used for all non-RomFS filesystems. In this case, actual filesystem implementation is in the FS process.
 
 
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Cmd || Name
+
| ([6.0.0-6.2.0] 0x38) || || 0x8000000000000000 ||
 
|-
 
|-
| 0 || CreateFile
+
| ([7.0.0-8.1.0] 0x38) || || 0x8000000400000000 ||
 
|-
 
|-
| 1 || DeleteFile
+
| ([9.0.0-9.2.0] 0x38) || || 0x4000000000000000 ||
 
|-
 
|-
| 2 || CreateDirectory
+
| [6.0.0+] 0x38 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize
 
|-
 
|-
| 3 || DeleteDirectory
+
| ([8.0.0-8.1.0] 0x39) || || 0x8000000000000010 ||
 
|-
 
|-
| 4 || DeleteDirectoryRecursively
+
| ([9.0.0-9.2.0] 0x39) || || 0x8000000000000000 ||
 
|-
 
|-
| 5 || RenameFile
+
| [8.0.0+] 0x39 || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]]
 
|-
 
|-
| 6 || RenameDirectory
+
| ([9.0.0-9.2.0] 0x3A) || || 0x8000000400000000 ||
 
|-
 
|-
| 7 || [[#GetEntryType]]
+
| [9.0.0+] 0x3A || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility
 
|-
 
|-
| 8 || [[#OpenFile]]
+
| ([9.0.0-9.2.0] 0x3B) || || 0x8000000000000010 ||
 
|-
 
|-
| 9 || [[#OpenDirectory]]
+
| [9.0.0+] 0x3B || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent
 
|-
 
|-
| 10 || [[#Commit]]
+
| ([9.0.0-9.2.0] 0x3C) || || 0x8000000800000000 ||
 
|-
 
|-
| 11 || [[#GetFreeSpaceSize]]
+
| [9.0.0+] 0x3C || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]
 
|-
 
|-
| 12 || [[#GetTotalSpaceSize]]
+
| ([9.0.0-9.2.0] 0x3D) || || 0x8000000800000000 ||
 
|-
 
|-
| 13 || [3.0.0+] [[#CleanDirectoryRecursively]]
+
| [9.0.0+] 0x3D || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo
 
|-
 
|-
| 14 || [3.0.0+] [[#GetFileTimeStampRaw]]
+
| ([9.0.0-9.2.0] 0x3E) || || 0x8000000800000000 ||
 
|-
 
|-
| 15 || [4.0.0+] QueryEntry
+
| [9.0.0+] 0x3E || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence
|}
+
|-
 +
| ([9.0.0-9.2.0] 0x3F) || || 0x8000000800000000 ||
 +
|-
 +
| [9.0.0+] 0x3F || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt
 +
|-
 +
| ([9.0.0-9.2.0] 0x40) || || 0x8000000800000000 ||
 +
|-
 +
| [9.0.0+] 0x40 || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]]
 +
|-
 +
| [10.0.0+] 0x41 || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem
 +
|-
 +
| [10.0.0+] 0x42 || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]]
 +
|-
 +
| [10.0.0+] 0x43 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]]
 +
|}
  
== GetEntryType ==
+
== OpenFileSystem ==
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.
+
Takes a type-0x19 input [[#ContentPath]] and a [[#FileSystemProxyType]] as parameters. Returns an [[#IFileSystem]].
  
== OpenFile ==
+
[2.0.0+] This function was removed.
Takes a type-0x19 input buffer for the path, and an u32 '''mode'''. '''mode''' controls how the file is opened, based on which bits are set:
 
  
* When bit 0 is set, the file is Readable: you can use the Read operation.
+
== SetCurrentProcess ==
* When bit 1 is set, the file is Writable: you can use the Write operation.
+
Takes a pid-descriptor.
* When bit 2 is set, the file is Appendable: unless this bit is set, you will not be able to write beyond the end of a file (such writes will result in an error 0x307202)
 
  
== OpenDirectory ==
+
== OpenFileSystemWithPatch ==
Takes a type-0x9 input buffer for the path and an u64 '''filter_flags'''. '''filter_flags''' controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files.
+
Takes an input [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
  
== Commit ==
+
Web-applet loads the [[#FileSystemProxyType]] (which must be '''Manual''') from u32_table[inparam].
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.
 
  
== GetFreeSpaceSize ==
+
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.
 
  
== GetTotalSpaceSize ==
+
== OpenFileSystemWithId ==
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used).
+
Takes a type-0x19 input buffer, an [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
  
== CleanDirectoryRecursively ==
+
The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.
 
  
== GetFileTimeStampRaw ==
+
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.
 
  
= IDirectory =
+
May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn't inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.
This is "nn::fssrv::sf::IDirectory".
 
  
{| class="wikitable" border="1"
+
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.
|-
 
! Cmd || Name
 
|-
 
| 0 || [[#Read]]
 
|-
 
| 1 || [[#GetEntryCount]]
 
|}
 
  
== Read ==
+
After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.
Takes a type-0x6 output buffer. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available.
 
  
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..".
+
When [[#FileSystemProxyType]] is '''Meta''', it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it's compared with the NCA [[NCM_services#ProgramId|ProgramId]], then an error is thrown on mismatch.
  
== GetEntryCount ==
+
== OpenBisFileSystem ==
Returns an u64 for the total number of readable entries.
+
Takes a type-0x19 input buffer string and a [[#BisPartitionId]]. Official user-process code sets instr[0] = 0 normally. Returns an [[#IFileSystem]].
  
= DirectoryEntry =
+
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisStorage]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.
This is "nn::fs::DirectoryEntry".
 
  
{| class="wikitable" border="1"
+
== OpenBisStorage ==
|-
+
Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid [[#IStorage]] handle otherwise.
! Offset || Size || Description
 
|-
 
| 0x0 || 0x301 || Path
 
|-
 
| 0x301 || 0x1 || File attributes (bit 0 = is directory; bit 1 = archive bit)
 
|-
 
| 0x302 || 0x2 || Padding?
 
|-
 
| 0x304 || 0x1 || [[#DirectoryEntryType]]
 
|-
 
| 0x305 || 0x3 || Padding?
 
|-
 
| 0x308 || 0x8 || Filesize, 0 for directories.
 
|}
 
  
= DirectoryEntryType =
+
== InvalidateBisCache ==
This is "nn::fs::DirectoryEntryType".
+
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]].
  
An s8 value indicating a directory entry type. The current values are:
+
== DeleteSaveDataFileSystem ==
 +
Takes an input u64.
  
{| class="wikitable" border="1"
+
== CreateSaveDataFileSystem ==
|-
+
Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct.
! Value || Description
+
 
|-
+
Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1.
| 0 || Directory
+
 
|-
+
Creates regular savedata.
| 1 || File
+
 
|}
+
== CreateSaveDataFileSystemBySystemSaveDataId ==
 +
Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]].
  
= IFile =
+
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
This is "nn::fssrv::sf::IFile".
 
  
{| class="wikitable" border="1"
+
== OpenGameCardStorage ==
|-
+
Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].
! Cmd || Name
 
|-
 
| 0 || Read
 
|-
 
| 1 || Write
 
|-
 
| 2 || Flush
 
|-
 
| 3 || SetSize
 
|-
 
| 4 || GetSize
 
|-
 
| 5 || [4.0.0+] OperateRange
 
|}
 
  
= ISaveDataInfoReader =
+
== OpenGameCardFileSystem ==
This is "nn::fssrv::sf::ISaveDataInfoReader".
+
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]].
  
{| class="wikitable" border="1"
+
Mounts a [[Gamecard_Partition|gamecard partition]].
|-
 
! Cmd || Name
 
|-
 
| 0 || [[#ReadSaveDataInfo]]
 
|}
 
  
== ReadSaveDataInfo ==
+
== CreateSaveDataFileSystemWithHashSalt ==
Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]].
+
Takes a total of 0xB0-bytes of input, no output.
  
This is used to get [[#SaveDataInfo]] for all savedata on the system (or all savedata for the current [[#SaveDataSpaceId]]). When used multiple times, it will resume reading where it left off, until no more entries are available (in that case the out u64 is value 0).
+
== OpenSaveDataFileSystem ==
 +
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8.
  
= IDeviceOperator =
+
Returns an [[#IFileSystem]].
This is "nn::fssrv::sf::IDeviceOperator".
 
  
{| class="wikitable" border="1"
+
Permissions aren't checked until the specified save is successfully found.
|-
+
 
! Cmd || Name
+
Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData).
|-
+
 
| 0 || IsSdCardInserted
+
== OpenSaveDataFileSystemBySystemSaveDataId ==
|-
+
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8.
| 1 || GetSdCardSpeedMode
+
 
|-
+
Returns an [[#IFileSystem]].
| 2 || [2.0.0+] GetSdCardCid
+
 
|-
+
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
| 3 || [2.0.0+] GetSdCardUserAreaSize
+
 
|-
+
== OpenReadOnlySaveDataFileSystem ==
| 4 || [2.0.0+] GetSdCardProtectedAreaSize
+
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]], and returns an [[#IFileSystem]].
|-
+
 
| 5 || [2.0.0+] GetAndClearSdCardErrorInfo
+
Mounts SaveData as ReadOnly.
|-
+
 
| 100 || GetMmcCid
+
== ReadSaveDataFileSystemExtraDataBySaveDataSpaceId ==
|-
+
Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
| 101 || GetMmcSpeedMode
+
 
|-
+
== ReadSaveDataFileSystemExtraData ==
| 110 || EraseMmc
+
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
|-
+
 
| 111 || GetMmcPartitionSize
+
== OpenSaveDataInfoReader ==
|-
+
No input, returns an output [[#ISaveDataInfoReader]].
| 112 || [2.0.0+] GetMmcPatrolCount
+
 
|-
+
== OpenSaveDataInfoReaderBySaveDataSpaceId ==
| 113 || [2.0.0+] GetAndClearMmcErrorInfo
+
Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]].
|-
+
 
| 114 || [2.0.0+] GetMmcExtendedCsd
+
== FindSaveDataWithFilter ==
|-
+
Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer.
| 115 || [4.0.0+] SuspendMmcPatrol
+
 
|-
+
== OpenSaveDataInfoReaderWithFilter ==
| 116 || [4.0.0+] ResumeMmcPatrol
+
Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]].
|-
+
 
| 200 || IsGameCardInserted
+
== OpenSaveDataTransferManager ==
|-
+
No input, returns an [[#ISaveDataTransferManager]].
| 201 || EraseGameCard
+
 
|-
+
== OpenSaveDataTransferManagerVersion2 ==
| 202 || GetGameCardHandle
+
No input, returns an [[#ISaveDataTransferManagerWithDivision]].
|-
+
 
| 203 || [[#GetGameCardUpdatePartitionInfo]]
+
== OpenSaveDataTransferProhibiter ==
|-
+
Takes an input u64, returns an [[#ISaveDataTransferProhibiter]].
| 204 || FinalizeGameCardDriver
+
 
|-
+
== ListAccessibleSaveDataOwnerId ==
| 205 || GetGameCardAttribute
+
Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer.
|-
+
 
| 206 || GetGameCardDeviceCertificate
+
== OpenSaveDataTransferManagerForSaveDataRepair ==
|-
+
No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]].
| 207 || GetGameCardAsicInfo
+
 
|-
+
== OpenSaveDataMover ==
| 208 || GetGameCardIdSet
+
Takes 2 input [[#SaveDataSpaceId]], an input u64 size and a TransferMemory handle. Returns an output [[#ISaveDataMover]].
|-
+
 
| 209 || WriteToGameCard
+
== OpenContentStorageFileSystem ==
|-
+
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.
| 210 || SetVerifyWriteEnalbleFlag
+
 
|-
+
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]].
| 211 || GetGameCardImageHash
+
 
|-
+
== OpenCloudBackupWorkStorageFileSystem ==
| 212 || [2.0.0+] GetGameCardDeviceIdForProdCard
+
Takes 4-bytes of input, returns an [[#IFileSystem]].
|-
+
 
| 213 || [2.0.0+] EraseAndWriteParamDirectly
+
== OpenCustomStorageFileSystem ==
|-
+
Takes a [[#CustomStorageId]]. Invalid values return 0x2EE202.
| 214 || [2.0.0+] ReadParamDirectly
+
 
|-
+
Returns an [[#IFileSystem]] from either User:/CustomStorage0 or Sdcard:/Nintendo/CustomStorage0. If on the SD card, an AesXtsFileSystem is created using a key source specifically for custom storage.
| 215 || [2.0.0+] ForceEraseGameCard
+
 
|-
+
== OpenDataStorageByDataId ==
| 216 || [2.0.0+] GetGameCardErrorInfo
+
Takes a [[NCM_services#StorageId|StorageID]] and a [[NCM_services#DataId|DataId]].
|-
+
 
| 217 || [2.1.0+] GetGameCardErrorReportInfo
+
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.
|-
+
 
| 218 || [3.0.0+] GetGameCardDeviceId
+
== OpenDataFileSystemWithProgramIndex ==
|-
+
Takes an input u8, returns an [[#IFileSystem]].
| 219 || [8.0.0+] ChallengeCardExistence
+
 
|-
+
== OpenDataStorageWithProgramIndex ==
| 300 || SetSpeedEmulationMode
+
Takes an input u8, returns an [[#IStorage]].
|-
+
 
| 301 || GetSpeedEmulationMode
+
== OpenDeviceOperator ==
|-
+
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.
| 400 || [5.0.0+] SuspendSdmmcControl
+
 
|-
+
== OpenSdCardDetectionEventNotifier ==
| 401 || [5.0.0+] ResumeSdmmcControl
+
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
|-
+
 
| 402 || [6.0.0+] GetSdmmcConnectionStatus (Takes a total of 4-bytes of input, returns a total of 8-bytes of output)
+
== OpenGameCardDetectionEventNotifier ==
|-
+
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
| 500 || [6.0.0+] SetSimulationEvent (Takes a total of 0x14-bytes of input, no output)
+
 
|-
+
== SimulateDeviceDetectionEvent ==
| 501 || [6.0.0+] ClearSimulationEvent (Takes a total of 4-bytes of input, no output)
+
Takes a total of 0xC-bytes of input, no output.
|}
+
 
 +
== VerifySaveDataFileSystem ==
 +
Takes an unknown input u64 and a type-0x6 output buffer.
 +
 
 +
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).
 +
 
 +
== GetSaveDataCommitId ==
 +
Takes an input u8 and u64, returns an output u64.
 +
 
 +
== SetSdCardEncryptionSeed ==
 +
Takes in the 0x10 byte SD card encryption seed, and loads it into FS-module state.
 +
 
 +
[[NS_Services|NS]]-module reads the 0x10 bytes from SdCard:/Nintendo/Contents/private, and compares them to the first 0x10 bytes of the ns_appman:/private (in [[Flash_Filesystem#System_Savegames|system savedata]] 0x8000000000000043). If they match, NS calls this command using bytes 0x10-0x20 from ns_appman:/private. The rest of this file (0x1F0 bytes total) is (usually/always?) all-zero (however in some cases the byte at offset 0x20 is value 0x1).
 +
 
 +
== OpenAccessFailureDetectionEventNotifier ==
 +
Takes 8-bytes of input and returns an [[#IEventNotifier]].
  
== GetGameCardUpdatePartitionInfo ==
+
[8.0.0+] Now takes an additional 8-bytes of input.
Returns a titleID and the title-version for it.
 
  
* Output u32 with ARMS-gamecard: title-version v131162. This is the title-version for [[2.1.0]], which is the sysupdate included with this gamecard. Launch-day gamecards return title-version v450.
+
== SetSaveDataSize ==
* Output u64 with ARMS-gamecard: titleID 0100000000000816.
+
Takes two input u64s "size" and "journal_size", and writes them to fsp-srv object member variables.
  
[[NS_Services|NS]] appears to only use this with [[Content_Manager_services#GetTitleIdInfo]] and [[Content_Manager_services#GetUpdateTitleList]] with storageid=nandsys, for checking whether a sysupdate is required.
+
These variables are normally initialized with 32 MiB (0x2000000) and 16 MiB (0x1000000), respectively.
  
= IEventNotifier =
+
These variables don't seem to be actually used anywhere else (?)
This is "nn::fssrv::sf::IEventNotifier".
 
  
{| class="wikitable" border="1"
+
== SetSaveDataRootPath ==
|-
+
Takes an input path, and does snprintf(<fsp-srv object>->m_save_data_root_path, FS_MAX_PATH-1, "/%s", input_path);
! Cmd || Name
 
|-
 
| 0 || GetEventHandle
 
|}
 
  
= ISaveDataTransferManager =
+
This path is normally all-zero. When this path is non-zero, the internal OpenSaveDataFileSystem function will create a DirectorySaveDataFileSystem if the target save is a user-save + a directory exists, instead of the normal savedata filesystem object.
This is "nn::fssrv::sf::ISaveDataTransferManager".
 
  
{| class="wikitable" border="1"
+
== SetGlobalAccessLogMode ==
|-
+
Takes an input u32.
! Cmd || Name
 
|-
 
| 0 || [[#GetChallenge]]
 
|-
 
| 16 || [[#SetToken]]
 
|-
 
| 32 || [[#OpenSaveDataExporter]]
 
|-
 
| 64 || [[#OpenSaveDataImporter]]
 
|}
 
  
This was added with [[4.0.0]].
+
== SetGlobalAccessLogMode ==
 +
Takes an input u32.
  
== GetChallenge ==
+
== GetGlobalAccessLogMode ==
No input/output, takes a type-0x6 output buffer.
+
Returns an output u32.
 +
 
 +
GlobalAccessLogMode is normally 0.
 +
 
 +
== OutputAccessLogToSdCard ==
 +
Takes a type-0x5 input buffer.
 +
 
 +
The input buffer is the string to output to the log. User-processes normally include a newline at the end.
 +
 
 +
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.
  
== SetToken ==
+
When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn't show up SD, unknown why.
No input/output, takes a type-0x5 input buffer.
 
  
== OpenSaveDataExporter ==
+
The input buffer is written to the "$FsAccessLog:/FsAccessLog.txt" file, where "$FsAccessLog" is the SD-card mount-name. It's written to the current end of the file(appended).
Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]].
 
  
== OpenSaveDataImporter ==
+
== GetProgramIndexForAccessLog ==
Takes an input u8 [[#SaveDataSpaceId]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]].
+
No input, returns two 32-bit values "version" and "program_index".
  
= ISaveDataExporter =
+
== OpenMultiCommitManager ==
This is "nn::fssrv::sf::ISaveDataExporter".
+
No input, returns an output [[#IMultiCommitManager]].
  
{| class="wikitable" border="1"
+
== OpenBisWiper ==
|-
+
Takes an input u64 size and a TransferMemory handle. Returns an output [[#IWiper]].
! Cmd || Name
+
 
|-
+
= IStorage =
| 0 || [[#Initialize]]
+
This is "nn::fssrv::sf::IStorage".
|-
+
 
| 1 || [[#GetRestSize]]
+
This is the interface for a raw device, usually a block device.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#Read]]
 +
|-
 +
| 1 || [[#Write]]
 +
|-
 +
| 2 || [[#Flush]]
 +
|-
 +
| 3 || [[#SetSize]]
 
|-
 
|-
| 16 || [[#Pull]]
+
| 4 || [[#GetSize]]
 
|-
 
|-
| 17 || [[#PullInitialData]]
+
| 5 || [4.0.0+] OperateRange
 
|}
 
|}
  
This was added with [[4.0.0]].
+
== Read ==
 +
Takes a type-0x46 buffer, an offset and length.
  
== Initialize ==
+
== Write ==
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.
+
Takes a type-0x45 buffer, an offset and length.
  
The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw.
+
== Flush ==
 +
No input.
  
== GetRestSize ==
+
== SetSize ==
No input, returns an output u64.
+
Takes a size.
  
== Pull ==
+
== GetSize ==
Takes a type-0x6 output buffer, returns an output u64.
+
Returns a size.
  
== PullInitialData ==
+
= IFileSystem =
No input/output, takes a type-0x6 output buffer.
+
This is "nn::fssrv::sf::IFileSystem".
 +
 
 +
There are two main implementations of this interface:
 +
 
 +
* '''nn::fs::fsa::IFileSystem''': The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface.
 +
* '''nn::fssrv::sf::IFileSystem''': Used for sending an IFileSystem over IPC. Not used outside of IPC code.
 +
 
 +
There are two adapter classes to convert between these interfaces:
 +
 
 +
* '''nn::fssrv::detail::FileSystemInterfaceAdapter''': Allows access to an nn::fs::fsa::IFileSystem via the nn::fssrv::sf::IFileSystem interface.
 +
* '''nn::fs::detail::FileSystemServiceObjectAdapter''': Allows access to an nn::fssrv::sf::IFileSystem via the nn::fs::fsa::IFileSystem interface.
  
= ISaveDataImporter =
+
When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC.
This is "nn::fssrv::sf::ISaveDataImporter".
+
Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it.
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,024: Line 1,202:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#Initialize]]
+
| 0 || CreateFile
 
|-
 
|-
| 1 || [[#GetRestSize]]
+
| 1 || DeleteFile
 +
|-
 +
| 2 || CreateDirectory
 +
|-
 +
| 3 || DeleteDirectory
 +
|-
 +
| 4 || DeleteDirectoryRecursively
 
|-
 
|-
| 16 || [[#Push]]
+
| 5 || RenameFile
 
|-
 
|-
| 17 || [[#Finalize]]
+
| 6 || RenameDirectory
|}
 
 
 
This was added with [[4.0.0]].
 
 
 
== Initialize ==
 
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.
 
 
 
The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.
 
 
 
== GetRestSize ==
 
No input, returns an output u64.
 
 
 
== Push ==
 
No input/output, takes a type-0x5 input buffer.
 
 
 
== Finalize ==
 
No input/output.
 
 
 
= ISaveDataTransferManagerWithDivision =
 
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".
 
 
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Cmd || Name
+
| 7 || [[#GetEntryType]]
 
|-
 
|-
| 0 || [[#GetChallenge]]
+
| 8 || [[#OpenFile]]
 
|-
 
|-
| 16 || [[#SetKeySeedPackage]]
+
| 9 || [[#OpenDirectory]]
 
|-
 
|-
| 32 || [[#OpenSaveDataFullExporter]]
+
| 10 || [[#Commit]]
 
|-
 
|-
| 33 || [[#OpenSaveDataDiffExporter]]
+
| 11 || [[#GetFreeSpaceSize]]
 
|-
 
|-
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
+
| 12 || [[#GetTotalSpaceSize]]
 
|-
 
|-
| 64 || [[#OpenSaveDataFullImporter]]
+
| 13 || [3.0.0+] [[#CleanDirectoryRecursively]]
 
|-
 
|-
| 65 || [[#OpenSaveDataDiffImporter]]
+
| 14 || [3.0.0+] [[#GetFileTimeStampRaw]]
 
|-
 
|-
| 66 || [6.0.0+] [[#OpenSaveDataDuplicateDiffImporter]]
+
| 15 || [4.0.0+] QueryEntry
|-
 
| 67 || [6.0.0+] [[#OpenSaveDataImporter]]
 
|-
 
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]]
 
|-
 
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
 
 
|}
 
|}
  
This was added with [[5.0.0]].
+
== GetEntryType ==
 +
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.
  
== GetChallenge ==
+
== OpenFile ==
No input/output, takes a type-0x6 output buffer containing the '''Challenge'''.
+
Takes a type-0x19 input buffer for the path, and an u32 '''mode'''. '''mode''' controls how the file is opened, based on which bits are set:
  
== SetKeySeedPackage ==
+
* When bit 0 is set, the file is Readable: you can use the Read operation.
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.
+
* When bit 1 is set, the file is Writable: you can use the Write operation.
 +
* When bit 2 is set, the file is Appendable: unless this bit is set, you will not be able to write beyond the end of a file (such writes will result in an error 0x307202)
  
== OpenSaveDataFullExporter ==
+
== OpenDirectory ==
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
+
Takes a type-0x9 input buffer for the path and an u64 '''filter_flags'''. '''filter_flags''' controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files.
  
== OpenSaveDataDiffExporter ==
+
== Commit ==
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]].
+
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.
  
== OpenSaveDataExporterByContext ==
+
== GetFreeSpaceSize ==
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].
+
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.
  
== OpenSaveDataFullImporter ==
+
== GetTotalSpaceSize ==
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].
+
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used).
  
== OpenSaveDataDiffImporter ==
+
== CleanDirectoryRecursively ==
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]].
+
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.
  
== OpenSaveDataDuplicateDiffImporter ==
+
== GetFileTimeStampRaw ==
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
+
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.
  
== OpenSaveDataImporter ==
+
= IDirectory =
Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
+
This is "nn::fssrv::sf::IDirectory".
 
 
== OpenSaveDataImporterByContext ==
 
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 
 
 
== CancelSuspendingImport ==
 
Takes an input u64 and a 0x10-byte struct, no output.
 
 
 
= ISaveDataDivisionExporter =
 
This is "nn::fssrv::sf::ISaveDataDivisionExporter".
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,121: Line 1,270:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || SetDivisionCount (Takes an input u32, no output)
+
| 0 || [[#Read]]
 
|-
 
|-
| 1 || [6.0.0+] GetSaveDataInfo (No input/output, takes a type-0x6 output buffer)
+
| 1 || [[#GetEntryCount]]
 +
|}
 +
 
 +
== Read ==
 +
Takes a type-0x6 output buffer. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available.
 +
 
 +
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..".
 +
 
 +
== GetEntryCount ==
 +
Returns an u64 for the total number of readable entries.
 +
 
 +
= DirectoryEntry =
 +
This is "nn::fs::DirectoryEntry".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 16 || OpenSaveDataDiffChunkIterator (No input, returns an [[#ISaveDataChunkIterator]])
+
! Offset || Size || Description
 
|-
 
|-
| 48 || OpenSaveDataChunkExporter (Takes an input u32, returns an [[#ISaveDataChunkExporter]])
+
| 0x0 || 0x301 || Path
 
|-
 
|-
| 64 || [6.0.0+] FinalizeFullExport (No input, returns two 0x10-byte output structs)
+
| 0x301 || 0x1 || File attributes (bit 0 = is directory; bit 1 = archive bit)
 
|-
 
|-
| 65 || [6.0.0+] FinalizeDiffExport (No input, returns an output 0x10-byte struct)
+
| 0x302 || 0x2 || Padding?
 
|-
 
|-
| 66 || [6.0.0+] CancelExport (No input/output)
+
| 0x304 || 0x1 || [[#DirectoryEntryType]]
 
|-
 
|-
| 67 || [6.0.0+] SuspendExport (No input/output, takes a type-0x6 output buffer)
+
| 0x305 || 0x3 || Padding?
 
|-
 
|-
| 70 || [6.0.0+] GetKeySeed (No input, returns an output 0x10-byte struct)
+
| 0x308 || 0x8 || Filesize, 0 for directories.
|-
 
| 71 || [6.0.0+] GetInitialDataMac (No input, returns an output 0x10-byte struct)
 
|-
 
| 72 || [6.0.0+] FinalizeExport (No input/output)
 
|-
 
| 80 || [6.0.0+] GetImportInitialDataAad (No input, returns an output 0x20-byte struct)
 
|-
 
| 81 || [6.0.0+] SetExportInitialDataAad (Takes an input 0x20-byte struct, no output)
 
|-
 
| 96 || [6.0.0+] GetReportInfo (No input, returns an output 0x20-byte struct)
 
 
|}
 
|}
  
This was added with [[5.0.0]].
+
= DirectoryEntryType =
 +
This is "nn::fs::DirectoryEntryType".
  
= ISaveDataDivisionImporter =
+
An s8 value indicating a directory entry type. The current values are:
This is "nn::fssrv::sf::ISaveDataDivisionImporter".
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name
+
! Value || Description
 
|-
 
|-
| 0 || [6.0.0+] GetSaveDataInfo (No input/output, takes a type-0x6 output buffer)
+
| 0 || Directory
 
|-
 
|-
| 16 || OpenSaveDataDiffChunkIterator (No input, returns an [[#ISaveDataChunkIterator]])
+
| 1 || File
 +
|}
 +
 
 +
= IFile =
 +
This is "nn::fssrv::sf::IFile".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 32 || InitializeImport (No input, returns an output u64)
+
! Cmd || Name
 
|-
 
|-
| 33 || FinalizeImport (No input/output)
+
| 0 || Read
 
|-
 
|-
| 34 || [6.0.0+] CancelImport (No input/output)
+
| 1 || Write
 
|-
 
|-
| 35 || [6.0.0+] GetImportContext (No input/output, takes a type-0x6 output buffer)
+
| 2 || Flush
 
|-
 
|-
| 36 || [6.0.0+] SuspendImport (No input/output)
+
| 3 || SetSize
 
|-
 
|-
| 48 || OpenSaveDataChunkImporter (Takes an input u32, returns an [[#ISaveDataChunkImporter]])
+
| 4 || GetSize
 
|-
 
|-
| 64 || [6.0.0+] GetImportInitialDataAad (No input, returns an output 0x20-byte struct)
+
| 5 || [4.0.0+] OperateRange
|-
 
| 80 || [6.0.0+] GetReportInfo (No input, returns an output 0x20-byte struct)
 
 
|}
 
|}
  
This was added with [[5.0.0]].
+
= ISaveDataInfoReader =
 
+
This is "nn::fssrv::sf::ISaveDataInfoReader".
= ISaveDataChunkIterator =
 
This is "nn::fssrv::sf::ISaveDataChunkIterator".
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,189: Line 1,344:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || Next (No input/output)
+
| 0 || [[#ReadSaveDataInfo]]
|-
 
| 1 || IsEnd (No input, returns an output u8)
 
|-
 
| 16 || GetId (No input, returns an output u32)
 
 
|}
 
|}
  
This was added with [[5.0.0]].
+
== ReadSaveDataInfo ==
 +
Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]].
 +
 
 +
This is used to get [[#SaveDataInfo]] for all savedata on the system (or all savedata for the current [[#SaveDataSpaceId]]). When used multiple times, it will resume reading where it left off, until no more entries are available (in that case the out u64 is value 0).
  
= ISaveDataChunkExporter =
+
= IDeviceOperator =
This is "nn::fssrv::sf::ISaveDataChunkExporter".
+
This is "nn::fssrv::sf::IDeviceOperator".
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,205: Line 1,359:
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || Pull (Takes an input u64 and a type-0x6 output buffer, returns an output u64)
+
| 0 || IsSdCardInserted
 
|-
 
|-
| 16 || [6.0.0+] GetRestRawDataSize (No input, returns an output u64)
+
| 1 || GetSdCardSpeedMode
 
|-
 
|-
|}
+
| 2 || [2.0.0+] GetSdCardCid
 
 
This was added with [[5.0.0]].
 
 
 
= ISaveDataChunkImporter =
 
This is "nn::fssrv::sf::ISaveDataChunkImporter".
 
 
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Cmd || Name
+
| 3 || [2.0.0+] GetSdCardUserAreaSize
 
|-
 
|-
| 0 || Push (Takes an input u64 and a type-0x5 input buffer, no output)
+
| 4 || [2.0.0+] GetSdCardProtectedAreaSize
|}
 
 
 
This was added with [[5.0.0]].
 
 
 
= ISaveDataTransferProhibiter =
 
This was added with [[6.0.0]].
 
 
 
This doesn't seem to handle any commands (?).
 
 
 
= IMultiCommitManager =
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Cmd || Name
+
| 5 || [2.0.0+] GetAndClearSdCardErrorInfo
 
|-
 
|-
| 1 || ? (Takes an input [[#IFilesystem]], no output)
+
| 100 || GetMmcCid
 
|-
 
|-
| 2 || ? (No input/output)
+
| 101 || GetMmcSpeedMode
|}
 
 
 
This was added with [[6.0.0]].
 
 
 
= FileSystemType =
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Value || Name
+
| 110 || EraseMmc
 
|-
 
|-
| 0 || Code
+
| 111 || GetMmcPartitionSize
 
|-
 
|-
| 1 || Data
+
| 112 || [2.0.0+] GetMmcPatrolCount
 
|-
 
|-
| 2 || Logo
+
| 113 || [2.0.0+] GetAndClearMmcErrorInfo
 
|-
 
|-
| 3 || ContentControl
+
| 114 || [2.0.0+] GetMmcExtendedCsd
 
|-
 
|-
| 4 || ContentManual
+
| 115 || [4.0.0+] SuspendMmcPatrol
 
|-
 
|-
| 5 || ContentMeta
+
| 116 || [4.0.0+] ResumeMmcPatrol
 
|-
 
|-
| 6 || ContentData
+
| 200 || [[#IsGameCardInserted]]
 
|-
 
|-
| 7 || ApplicationPackage
+
| 201 || EraseGameCard
 
|-
 
|-
| 8 || RegisteredUpdate
+
| 202 || [[#GetGameCardHandle]]
|}
 
 
 
= StorageId =
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Value || Name
+
| 203 || [[#GetGameCardUpdatePartitionInfo]]
 
|-
 
|-
| 0 || None
+
| 204 || FinalizeGameCardDriver
 
|-
 
|-
| 1 || Host
+
| 205 || GetGameCardAttribute
 
|-
 
|-
| 2 || GameCard
+
| 206 || [[#GetGameCardDeviceCertificate]]
 
|-
 
|-
| 3 || NandSystem
+
| 207 || GetGameCardAsicInfo
 
|-
 
|-
| 4 || NandUser
+
| 208 || GetGameCardIdSet
 
|-
 
|-
| 5 || SdCard
+
| 209 || WriteToGameCardDirectly
|}
 
 
 
= ContentStorageId =
 
This is "nn::fs::ContentStorageId".
 
 
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Value || Name
+
| 210 || SetVerifyWriteEnalbleFlag
 
|-
 
|-
| 0 || System
+
| 211 || GetGameCardImageHash
 
|-
 
|-
| 1 || User
+
| 212 || [2.0.0+] GetGameCardDeviceIdForProdCard
 
|-
 
|-
| 2 || SdCard
+
| 213 || [2.0.0+] EraseAndWriteParamDirectly
|}
 
 
 
= SaveDataSpaceId =
 
This is "nn::fs::SaveDataSpaceId".
 
 
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Value || Name
+
| 214 || [2.0.0+] ReadParamDirectly
 
|-
 
|-
| 0 || System
+
| 215 || [2.0.0+] ForceEraseGameCard
 
|-
 
|-
| 1 || User
+
| 216 || [2.0.0+] GetGameCardErrorInfo
 
|-
 
|-
| 2 || SdSystem
+
| 217 || [2.1.0+] GetGameCardErrorReportInfo
 
|-
 
|-
| 100 || [3.0.0+] ProperSystem
+
| 218 || [3.0.0+] GetGameCardDeviceId
|}
 
 
 
Determines the storage where the savedata is stored.
 
 
 
= SaveDataType =
 
{| class="wikitable" border="1"
 
 
|-
 
|-
! Value || Name
+
| 219 || [8.0.0+] [[#ChallengeCardExistence]]
 
|-
 
|-
| 0 || SystemSaveData
+
| 220 || [9.0.0+] [[#GetGameCardCompatibilityType]]
 
|-
 
|-
| 1 || SaveData
+
| 300 || SetSpeedEmulationMode
 
|-
 
|-
| 2 || BcatDeliveryCacheStorage
+
| 301 || GetSpeedEmulationMode
 
|-
 
|-
| 3 || DeviceSaveData
+
| 400 || [5.0.0+] SuspendSdmmcControl
 
|-
 
|-
| 4 || [3.0.0+] TemporaryStorage
+
| 401 || [5.0.0+] ResumeSdmmcControl
 
|-
 
|-
| 5 || [3.0.0+] CacheStorage
+
| 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]]
 +
|-
 +
| 500 || [6.0.0+] [[#SetDeviceSimulationEvent]]
 +
|-
 +
| 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]]
 
|}
 
|}
  
= ImageDirectoryId =
+
== IsGameCardInserted ==
This is "nn::fs::ImageDirectoryId".
+
No input, returns a bool.
 +
 
 +
== GetGameCardHandle ==
 +
No input, returns an u32 '''GameCardHandle'''.
 +
 
 +
== GetGameCardUpdatePartitionInfo ==
 +
Returns a [[NCM_services#ProgramId|ProgramId]] and the title-version for it.
 +
 
 +
* Output u32 with ARMS-gamecard: title-version v131162. This is the title-version for [[2.1.0]], which is the sysupdate included with this gamecard. Launch-day gamecards return title-version v450.
 +
* Output u64 with ARMS-gamecard: [[NCM_services#ProgramId|ProgramId]] 0100000000000816.
 +
 
 +
[[NS_Services|NS]] appears to only use this with [[NCM_services|NCM]] for checking whether a sysupdate is required.
 +
 
 +
== GetGameCardDeviceCertificate ==
 +
Takes a type-0x6 output buffer, an u32 '''GameCardHandle''' and an u64 '''DeviceCertificateBufferSize'''. No output.
 +
 
 +
== ChallengeCardExistence ==
 +
Takes a type-0x6 output buffer, two type-0x5 input buffers and an u32 '''GameCardHandle'''. No output.
 +
 
 +
[9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]].
 +
 
 +
== GetGameCardCompatibilityType ==
 +
Takes an u32 '''GameCardHandle''', returns an u8 '''CompatibilityType''' (0x00 = Global, 0x01 = China) from [[Gamecard_Format#Gamecard_Info|Gamecard Info]].
 +
 
 +
== GetSdmmcConnectionStatus ==
 +
Takes a total of 4-bytes of input, returns a total of 8-bytes of output.
 +
 
 +
== SetDeviceSimulationEvent ==
 +
Takes a total of 0x14-bytes of input, no output.
 +
 
 +
== ClearDeviceSimulationEvent ==
 +
Takes a total of 4-bytes of input, no output.
 +
 
 +
= IEventNotifier =
 +
This is "nn::fssrv::sf::IEventNotifier".
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Value || Name
+
! Cmd || Name
 
|-
 
|-
| 0 || Nand
+
| 0 || [[#GetEventHandle]]
|-
 
| 1 || SdCard
 
 
|}
 
|}
  
= CloudBackupWorkStorageId =
+
== GetEventHandle ==
This is "nn::fs::CloudBackupWorkStorageId".
+
No input, returns an output Event handle. With official sw the EventClearMode is user-specified.
 +
 
 +
= ISaveDataTransferManager =
 +
This is "nn::fssrv::sf::ISaveDataTransferManager".
 +
 
 +
This was added with [[4.0.0]].
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Value || Name
+
! Cmd || Name
 +
|-
 +
| 0 || [[#GetChallenge]]
 +
|-
 +
| 16 || [[#SetToken]]
 
|-
 
|-
| 0 || Nand
+
| 32 || [[#OpenSaveDataExporter]]
 
|-
 
|-
| 1 || SdCard
+
| 64 || [[#OpenSaveDataImporter]]
 
|}
 
|}
  
= CustomStorageId =
+
== GetChallenge ==
This is "nn::fs::CustomStorageId".
+
No input/output, takes a type-0x6 output buffer.
  
{| class="wikitable" border="1"
+
== SetToken ==
|-
+
No input/output, takes a type-0x5 input buffer.
! Value || Name
+
 
|-
+
== OpenSaveDataExporter ==
| 0 || Nand
+
Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]].
|-
+
 
| 1 || SdCard
+
== OpenSaveDataImporter ==
|}
+
Takes an input u8 [[#SaveDataSpaceId]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]].
 +
 
 +
= ISaveDataTransferManagerForSaveDataRepair =
 +
This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair".
  
= ContentPath =
+
This was added with [[9.0.0]].
These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They're passed via X descriptors, and returned via various [[Location Resolver services|ncm/lr]] commands.
 
  
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Path || Notes
+
! Cmd || Name
 
|-
 
|-
| @SystemContent ||
+
| 0 || [[#GetChallenge]]
|-
 
| @UserContent ||
 
 
|-
 
|-
| @SdCardContent ||
+
| 16 || [[#SetKeyPackage]]
 
|-
 
|-
| @CalibFile ||
+
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]
 
|-
 
|-
| @Safe ||
+
| 81 || [[#PrepareOpenSaveDataImporter]]
 
|-
 
|-
| @User ||
+
| 90 || [[#OpenSaveDataImporter]]
 
|-
 
|-
| @System ||
+
| 91 || [[#OpenSaveDataImporter2]]
 
|-
 
|-
| @Sdcard ||
+
| 100 || [[#OpenSaveDataExporterWithKey]]
 
|-
 
|-
| @Host ||
+
| 110 || [[#OpenSaveDataImporterWithKey]]
 +
|}
 +
 
 +
== SetKeyPackage ==
 +
No input/output, takes a type-0x5 input buffer.
 +
 
 +
== OpenSaveDataExporterAndGetEncryptedKey ==
 +
Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an [[#ISaveDataDivisionExporter]].
 +
 
 +
== PrepareOpenSaveDataImporter ==
 +
Takes a type-0x1A output buffer to receive a RsaEncryptedKey.
 +
 
 +
== OpenSaveDataImporter ==
 +
Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
== OpenSaveDataImporter2 ==
 +
Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
== OpenSaveDataExporterWithKey ==
 +
Takes a total of 0x20-bytes of input, returns an [[#ISaveDataDivisionExporter]].
 +
 
 +
== OpenSaveDataImporterWithKey ==
 +
Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
= ISaveDataMover =
 +
This is "nn::fssrv::sf::ISaveDataMover".
 +
 
 +
This was added with [[10.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| @GcApp || Gamecard App partition (Partition 2)
+
! Cmd || Name
 
|-
 
|-
| @GcS00000001 || Gamecard Contents.
+
| 8 || [[#Register]]
 
|-
 
|-
| @upp || Gamecard update partition (Partition 0)
+
| 16 || [[#Process]]
 
|-
 
|-
| [4.0.0+] @RegUpdate || Registered update partition
+
| 18 || [[#Cancel]]
 
|}
 
|}
  
= Save Struct =
+
== Register ==
This is "nn::fs::SaveDataAttribute".
+
Takes an input u64, no output.
 +
 
 +
== Process ==
 +
Takes an input u64, returns an output u64.
  
{| class="wikitable" border="1"
+
== Cancel ==
|-
+
No input/output.
! Offset
+
 
! Size
+
= ISaveDataExporter =
! Description
+
This is "nn::fssrv::sf::ISaveDataExporter".
 +
 
 +
This was added with [[4.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 0x0
+
! Cmd || Name
| 0x8
 
| 0 for SystemSaveData. SaveData: 0 can be used for accessing the savedata associated with the current FS session titleID, otherwise when set this is the titleID associated with the savedata to access.
 
 
|-
 
|-
| 0x8
+
| 0 || [[#GetSaveDataInfo]]
| 0x10
 
| userID for user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].
 
 
|-
 
|-
| 0x18
+
| 1 || [[#GetRestSize]]
| 0x8
 
| u64 [[Flash_Filesystem|saveID]]. 0 for SaveData.
 
 
|-
 
|-
| 0x20
+
| 16 || [[#Pull]]
| 0x1
 
| [[#SaveDataType]]
 
 
|-
 
|-
| 0x21
+
| 17 || [[#PullInitialData]]
| 0x1
+
|}
| Save data 'rank' or 'precedence'. 0 if this save data is considered the primary save data. 1 if it's considered the secondary save data.
+
 
|-
+
== GetSaveDataInfo ==
| 0x22
+
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.
| 0x2
+
 
| Save data index
+
The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw.
|-
 
| 0x24
 
| 0x4
 
| Padding
 
|-
 
| 0x28
 
| 0x8
 
| 0 for SystemSaveData/SaveData.
 
|-
 
| 0x30
 
| 0x8
 
| 0 for SystemSaveData/SaveData.
 
|-
 
| 0x38
 
| 0x8
 
| 0 for SystemSaveData/SaveData.
 
|}
 
  
Total size is 0x40-bytes.
+
== GetRestSize ==
 +
No input, returns an output u64.
  
For DeviceSaveData, this struct is all-zero except for the [[#SaveDataType]] field.
+
== Pull ==
 +
Takes a type-0x6 output buffer, returns an output u64.
  
= SaveCreate Struct =
+
== PullInitialData ==
{| class="wikitable" border="1"
+
No input/output, takes a type-0x6 output buffer.
 +
 
 +
= ISaveDataImporter =
 +
This is "nn::fssrv::sf::ISaveDataImporter".
 +
 
 +
This was added with [[4.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 
|-
 
|-
! Offset
+
| 0 || [[#GetSaveDataInfo]]
! Size
 
! Description
 
 
|-
 
|-
| 0x0
+
| 1 || [[#GetRestSize]]
| 0x8
 
| Save data size.
 
 
|-
 
|-
| 0x8
+
| 16 || [[#Push]]
| 0x8
 
| Save data journal size.
 
 
|-
 
|-
| 0x10
+
| 17 || [[#Finalize]]
 +
|}
 +
 
 +
== GetSaveDataInfo ==
 +
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.
 +
 
 +
The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.
 +
 
 +
== GetRestSize ==
 +
No input, returns an output u64.
 +
 
 +
== Push ==
 +
No input/output, takes a type-0x5 input buffer.
 +
 
 +
== Finalize ==
 +
No input/output.
 +
 
 +
= ISaveDataTransferManagerWithDivision =
 +
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".
 +
 
 +
This was added with [[5.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#GetChallenge]]
 +
|-
 +
| 16 || [[#SetKeySeedPackage]]
 +
|-
 +
| 32 || [[#OpenSaveDataExporter]]
 +
|-
 +
| 33 || [[#OpenSaveDataExporterForDiffExport]]
 +
|-
 +
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
 +
|-
 +
|rowspan="2"| 64 || [5.0.0-5.1.0] OpenSaveDataImporter
 +
|-
 +
| [6.0.0+] [[#OpenSaveDataImporterDeprecated]]
 +
|-
 +
| 65 || [[#OpenSaveDataImporterForDiffImport]]
 +
|-
 +
| 66 || [6.0.0+] [[#OpenSaveDataImporterForDuplicateDiffImport]]
 +
|-
 +
| 67 || [6.0.0+] [[#OpenSaveDataImporter]]
 +
|-
 +
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]]
 +
|-
 +
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
 +
|-
 +
| 70 || [10.0.0+] DecryptAndVerifyInitialData
 +
|}
 +
 
 +
== GetChallenge ==
 +
No input/output, takes a type-0x6 output buffer containing the '''Challenge'''.
 +
 
 +
== SetKeySeedPackage ==
 +
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.
 +
 
 +
== OpenSaveDataExporter ==
 +
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
 +
 
 +
== OpenSaveDataExporterForDiffExport ==
 +
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]].
 +
 
 +
== OpenSaveDataExporterByContext ==
 +
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].
 +
 
 +
== OpenSaveDataImporterDeprecated ==
 +
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
== OpenSaveDataImporterForDiffImport ==
 +
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
== OpenSaveDataImporterForDuplicateDiffImport ==
 +
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
== OpenSaveDataImporter ==
 +
Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
== OpenSaveDataImporterByContext ==
 +
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
== CancelSuspendingImport ==
 +
Takes an input u64 and a 0x10-byte struct, no output.
 +
 
 +
= ISaveDataDivisionExporter =
 +
This is "nn::fssrv::sf::ISaveDataDivisionExporter".
 +
 
 +
This was added with [[5.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#SetDivisionCount]]
 +
|-
 +
| 1 || [6.0.0+] [[#GetSaveDataInfo]]
 +
|-
 +
| 16 || [[#OpenSaveDataDiffChunkIterator]]
 +
|-
 +
| 48 || [[#OpenSaveDataChunkExporter]]
 +
|-
 +
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
 +
|-
 +
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
 +
|-
 +
| 66 || [6.0.0+] [[#CancelExport]]
 +
|-
 +
| 67 || [6.0.0+] [[#SuspendExport]]
 +
|-
 +
| 70 || [6.0.0+] [[#GetKeySeed]]
 +
|-
 +
| 71 || [6.0.0+] [[#GetInitialDataMac]]
 +
|-
 +
| 72 || [6.0.0+] [[#FinalizeExport]]
 +
|-
 +
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
 +
|-
 +
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
 +
|-
 +
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
 +
|-
 +
| 96 || [6.0.0+] [[#GetReportInfo]]
 +
|}
 +
 
 +
== SetDivisionCount ==
 +
Takes an input u32, no output.
 +
 
 +
== OpenSaveDataChunkExporter ==
 +
Takes an input u32, returns an [[#ISaveDataChunkExporter]].
 +
 
 +
== FinalizeFullExport ==
 +
No input, returns two 0x10-byte output structs.
 +
 
 +
== FinalizeDiffExport ==
 +
No input, returns an output 0x10-byte struct.
 +
 
 +
== CancelExport ==
 +
No input/output.
 +
 
 +
== SuspendExport ==
 +
No input/output, takes a type-0x6 output buffer.
 +
 
 +
== GetKeySeed ==
 +
No input, returns an output 0x10-byte struct.
 +
 
 +
== GetInitialDataMac ==
 +
No input, returns an output 0x10-byte struct.
 +
 
 +
== FinalizeExport ==
 +
No input/output.
 +
 
 +
== SetExportInitialDataAad ==
 +
Takes an input 0x20-byte struct, no output.
 +
 
 +
= ISaveDataDivisionImporter =
 +
This is "nn::fssrv::sf::ISaveDataDivisionImporter".
 +
 
 +
This was added with [[5.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [6.0.0+] [[#GetSaveDataInfo]]
 +
|-
 +
| 16 || [[#OpenSaveDataDiffChunkIterator]]
 +
|-
 +
| 32 || [[#InitializeImport]]
 +
|-
 +
| 33 || [[#FinalizeImport]]
 +
|-
 +
| 34 || [6.0.0+] [[#CancelImport]]
 +
|-
 +
| 35 || [6.0.0+] [[#GetImportContext]]
 +
|-
 +
| 36 || [6.0.0+] [[#SuspendImport]]
 +
|-
 +
| 48 || [[#OpenSaveDataChunkImporter]]
 +
|-
 +
| 64 || [6.0.0+] [[#GetImportInitialDataAad]]
 +
|-
 +
| 80 || [6.0.0+] [[#GetReportInfo]]
 +
|}
 +
 
 +
== GetSaveDataInfo ==
 +
No input/output, takes a type-0x6 output buffer.
 +
 
 +
== OpenSaveDataDiffChunkIterator ==
 +
No input, returns an [[#ISaveDataChunkIterator]].
 +
 
 +
== InitializeImport ==
 +
No input, returns an output u64.
 +
 
 +
== FinalizeImport ==
 +
No input/output.
 +
 
 +
== CancelImport ==
 +
No input/output.
 +
 
 +
== GetImportContext ==
 +
No input/output, takes a type-0x6 output buffer.
 +
 
 +
== SuspendImport ==
 +
No input/output.
 +
 
 +
== OpenSaveDataChunkImporter ==
 +
Takes an input u32, returns an [[#ISaveDataChunkImporter]].
 +
 
 +
== GetImportInitialDataAad ==
 +
No input, returns an output 0x20-byte struct.
 +
 
 +
== GetReportInfo ==
 +
No input, returns an output 0x20-byte struct.
 +
 
 +
= ISaveDataChunkIterator =
 +
This is "nn::fssrv::sf::ISaveDataChunkIterator".
 +
 
 +
This was added with [[5.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#Next]]
 +
|-
 +
| 1 || [[#IsEnd]]
 +
|-
 +
| 16 || [[#GetId]]
 +
|}
 +
 
 +
== Next ==
 +
No input/output.
 +
 
 +
== IsEnd ==
 +
No input, returns an output u8.
 +
 
 +
== GetId ==
 +
No input, returns an output u32.
 +
 
 +
= ISaveDataChunkExporter =
 +
This is "nn::fssrv::sf::ISaveDataChunkExporter".
 +
 
 +
This was added with [[5.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#Pull]]
 +
|-
 +
| 16 || [6.0.0+] [[#GetRestRawDataSize]]
 +
|}
 +
 
 +
== Pull ==
 +
Takes an input u64 and a type-0x6 output buffer, returns an output u64.
 +
 
 +
== GetRestRawDataSize ==
 +
No input, returns an output u64.
 +
 
 +
= ISaveDataChunkImporter =
 +
This is "nn::fssrv::sf::ISaveDataChunkImporter".
 +
 
 +
This was added with [[5.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#Push]]
 +
|}
 +
 
 +
== Push ==
 +
Takes an input u64 and a type-0x5 input buffer, no output.
 +
 
 +
= ISaveDataTransferProhibiter =
 +
This was added with [[6.0.0]].
 +
 
 +
This doesn't seem to handle any commands (?).
 +
 
 +
= IMultiCommitManager =
 +
This was added with [[6.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 1 || [[#Add]]
 +
|-
 +
| 2 || [[#Commit]]
 +
|}
 +
 
 +
== Add ==
 +
Takes an input [[#IFilesystem]], no output.
 +
 
 +
== Commit ==
 +
No input/output.
 +
 
 +
= IWiper =
 +
This is "nn::fs::IWiper".
 +
 
 +
This was added with [[10.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#Startup|Startup]]
 +
|-
 +
| 16 || [[#Process_2|Process]]
 +
|}
 +
 
 +
== Startup ==
 +
No input. Returns an u64.
 +
 
 +
== Process ==
 +
No input. Returns an u64.
 +
 
 +
= FileSystemProxyType =
 +
This is "nn::fs::FileSystemProxyType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Code
 +
|-
 +
| 1 || Rom
 +
|-
 +
| 2 || Logo
 +
|-
 +
| 3 || Control
 +
|-
 +
| 4 || Manual
 +
|-
 +
| 5 || Meta
 +
|-
 +
| 6 || Data
 +
|-
 +
| 7 || Package
 +
|-
 +
| 8 || [4.0.0+] RegisteredUpdate
 +
|}
 +
 
 +
= ContentType =
 +
This is "nn::fs::ContentType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Meta
 +
|-
 +
| 1 || Control
 +
|-
 +
| 2 || Manual
 +
|-
 +
| 3 || Logo
 +
|-
 +
| 4 || Data
 +
|}
 +
 
 +
= ContentStorageId =
 +
This is "nn::fs::ContentStorageId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || System
 +
|-
 +
| 1 || User
 +
|-
 +
| 2 || SdCard
 +
|}
 +
 
 +
= SaveDataSpaceId =
 +
This is "nn::fs::SaveDataSpaceId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || System
 +
|-
 +
| 1 || User
 +
|-
 +
| 2 || SdSystem
 +
|-
 +
| 3 || [3.0.0+] Temporary
 +
|-
 +
| 4 || [4.0.0+] SdUser
 +
|-
 +
| 100 || [3.0.0+] ProperSystem
 +
|-
 +
| 101 || [3.0.0+] SafeMode
 +
|}
 +
 
 +
Determines the storage where the savedata is stored.
 +
 
 +
= SaveDataType =
 +
This is "nn::fs::SaveDataType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || System
 +
|-
 +
| 1 || Account
 +
|-
 +
| 2 || Bcat
 +
|-
 +
| 3 || Device
 +
|-
 +
| 4 || [3.0.0+] Temporary
 +
|-
 +
| 5 || [3.0.0+] Cache
 +
|-
 +
| 6 || [4.0.0+] SystemBcat
 +
|}
 +
 
 +
= SaveDataRank =
 +
This is "nn::fs::SaveDataRank".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Primary
 +
|-
 +
| 1 || Secondary
 +
|}
 +
 
 +
= SaveDataEnumerateOption =
 +
This is "nn::fs::SaveDataEnumerateOption".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || AllRank
 +
|}
 +
 
 +
= SaveDataFlags =
 +
This is "nn::fs::SaveDataFlags".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || KeepAfterResettingSystemSaveData
 +
|-
 +
| 2 || KeepAfterRefurbishment
 +
|-
 +
| 4 || KeepAfterResettingSystemSaveDataWithoutUserSaveData
 +
|-
 +
| 8 || NeedsSecureDelete
 +
|}
 +
 
 +
= SaveDataMetaType =
 +
This is "nn::fs::SaveDataMetaType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || None
 +
|-
 +
| 1 || Thumbnail
 +
|-
 +
| 2 || ExtensionContext
 +
|}
 +
 
 +
= ImageDirectoryId =
 +
This is "nn::fs::ImageDirectoryId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Nand
 +
|-
 +
| 1 || SdCard
 +
|}
 +
 
 +
= CloudBackupWorkStorageId =
 +
This is "nn::fs::CloudBackupWorkStorageId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Nand
 +
|-
 +
| 1 || SdCard
 +
|}
 +
 
 +
= CustomStorageId =
 +
This is "nn::fs::CustomStorageId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || System
 +
|-
 +
| 1 || SdCard
 +
|}
 +
 
 +
= Priority =
 +
This is "nn::fs::Priority".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Realtime
 +
|-
 +
| 1 || Normal
 +
|-
 +
| 2 || Low
 +
|}
 +
 
 +
= PriorityRaw =
 +
This is "nn::fs::PriorityRaw".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Realtime
 +
|-
 +
| 1 || Normal
 +
|-
 +
| 2 || Low
 +
|-
 +
| 3 || Background
 +
|}
 +
 
 +
= AbortSpecifier =
 +
This is "nn::fs::AbortSpecifier".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Default
 +
|-
 +
| 1 || Abort
 +
|-
 +
| 2 || ReturnResult
 +
|}
 +
 
 +
= OperationId =
 +
This is "nn::fs::OperationId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Clear
 +
|-
 +
| 1 || ClearSignature
 +
|-
 +
| 2 || InvalidateCache
 +
|-
 +
| 3 || QueryRange
 +
|}
 +
 
 +
= MountHostOption =
 +
This is "nn::fs::MountHostOption".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || PseudoCaseSensitive
 +
|}
 +
 
 +
= BisPartitionId =
 +
This is "nn::fs::BisPartitionId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || BootPartition1Root
 +
|-
 +
| 10 || BootPartition2Root
 +
|-
 +
| 20 || UserDataRoot
 +
|-
 +
| 21 || BootConfigAndPackage2Part1
 +
|-
 +
| 22 || BootConfigAndPackage2Part2
 +
|-
 +
| 23 || BootConfigAndPackage2Part3
 +
|-
 +
| 24 || BootConfigAndPackage2Part4
 +
|-
 +
| 25 || BootConfigAndPackage2Part5
 +
|-
 +
| 26 || BootConfigAndPackage2Part6
 +
|-
 +
| 27 || CalibrationBinary
 +
|-
 +
| 28 || CalibrationFile
 +
|-
 +
| 29 || SafeMode
 +
|-
 +
| 30 || User
 +
|-
 +
| 31 || System
 +
|-
 +
| 32 || SystemProperEncryption
 +
|-
 +
| 33 || SystemProperPartition
 +
|-
 +
| 34 || SignedSystemPartitionOnSafeMode
 +
|}
 +
 
 +
= MmcSpeedMode =
 +
This is "nn::fs::MmcSpeedMode".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Identification
 +
|-
 +
| 1 || LegacySpeed
 +
|-
 +
| 2 || HighSpeed
 +
|-
 +
| 3 || Hs200
 +
|-
 +
| 4 || Hs400
 +
|-
 +
| 5 || Unknown
 +
|}
 +
 
 +
= MmcPartition =
 +
This is "nn::fs::MmcPartition".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || UserData
 +
|-
 +
| 1 || BootPartition1
 +
|-
 +
| 2 || BootPartition2
 +
|}
 +
 
 +
= GameCardPartition =
 +
This is "nn::fs::GameCardPartition".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Update
 +
|-
 +
| 1 || Normal
 +
|-
 +
| 2 || Secure
 +
|-
 +
| 3 || [4.0.0+] Logo
 +
|}
 +
 
 +
= GameCardPartitionRaw =
 +
This is "nn::fs::GameCardPartitionRaw".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || NormalReadOnly
 +
|-
 +
| 1 || SecureReadOnly
 +
|-
 +
| 2 || RootWriteOnly
 +
|}
 +
 
 +
= GameCardAttribute =
 +
This is "nn::fs::GameCardAttribute".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || AutoBootFlag
 +
|-
 +
| 2 || HistoryEraseFlag
 +
|-
 +
| 4 || [4.0.0+] RepairToolFlag
 +
|-
 +
| 8 || [9.0.0+] DifferentRegionCupToTerraDeviceFlag
 +
|-
 +
| 16 || [9.0.0+] DifferentRegionCupToGlobalDeviceFlag
 +
|}
 +
 
 +
= GameCardSize =
 +
This is "nn::fs::GameCardSize".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || Size1GB
 +
|-
 +
| 2 || Size2GB
 +
|-
 +
| 4 || Size4GB
 +
|-
 +
| 8 || Size8GB
 +
|-
 +
| 16 || Size16GB
 +
|-
 +
| 32 || Size32GB
 +
|}
 +
 
 +
= GameCardClockRate =
 +
This is "nn::fs::GameCardClockRate".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 25 || ClockRate25MHz
 +
|-
 +
| 50 || ClockRate50MHz
 +
|}
 +
 
 +
= SimulatingDeviceType =
 +
This is "nn::fs::SimulatingDeviceType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || eMMC
 +
|-
 +
| 1 || SdCard
 +
|-
 +
| 2 || GameCard
 +
|}
 +
 
 +
= SimulatingDeviceDetectionMode =
 +
This is "nn::fs::SimulatingDeviceDetectionMode".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || NoSimulation
 +
|-
 +
| 1 || DeviceAttached
 +
|-
 +
| 2 || DeviceRemoved
 +
|}
 +
 
 +
= SimulatingDeviceAccessFailureEventType =
 +
This is "nn::fs::SimulatingDeviceAccessFailureEventType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || None
 +
|-
 +
| 1 || AccessTimeoutFailure
 +
|-
 +
| 2 || AccessFailure
 +
|-
 +
| 3 || DataCorruption
 +
|}
 +
 
 +
= SimulatingDeviceTargetOperation =
 +
This is "nn::fs::SimulatingDeviceTargetOperation".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || Read
 +
|-
 +
| 2 || Write
 +
|}
 +
 
 +
= SpeedEmulationMode =
 +
This is "nn::fs::SpeedEmulationMode".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || None
 +
|-
 +
| 1 || Faster
 +
|-
 +
| 2 || Slower
 +
|-
 +
| 3 || Random
 +
|}
 +
 
 +
= ContentPath =
 +
These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They're passed via X descriptors, and returned via various [[Location Resolver services|ncm/lr]] commands.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Path || Notes
 +
|-
 +
| @SystemContent ||
 +
|-
 +
| @UserContent ||
 +
|-
 +
| @SdCardContent ||
 +
|-
 +
| @CalibFile ||
 +
|-
 +
| @Safe ||
 +
|-
 +
| @User ||
 +
|-
 +
| @System ||
 +
|-
 +
| @Sdcard ||
 +
|-
 +
| @Host ||
 +
|-
 +
| @GcApp || Gamecard App partition (Partition 2)
 +
|-
 +
| @GcXYYYYYYYY || Gamecard Contents. X is the partition type (U - Update, N - Normal, S - Secure). Y is the gamecard handle as a 32-bit hex value
 +
|-
 +
| @upp || Gamecard update partition (Partition 0)
 +
|-
 +
| [4.0.0+] @RegUpdate || Registered update partition
 +
|}
 +
 
 +
= SaveDataAttribute =
 +
This is "nn::fs::SaveDataAttribute".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| [[NCM_services#ApplicationId|ApplicationId]] (0 for SystemSaveData)</br>SaveData: 0 can be used for accessing the savedata associated with the current FS session [[NCM_services#ApplicationId|ApplicationId]], otherwise when set this is the [[NCM_services#ApplicationId|ApplicationId]] associated with the savedata to access.
 +
|-
 +
| 0x8
 +
| 0x10
 +
| UserId</br>For user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].
 +
|-
 +
| 0x18
 
| 0x8
 
| 0x8
| Save data block size. 0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData.
+
| [[Flash_Filesystem|SystemSaveDataId]] (0 for SaveData)
|-
+
|-
| 0x18
+
| 0x20
| 0x8
+
| 0x1
| Save data owner id. Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[Title_list|titleID]] of the bcat-sysmodule.
+
| [[#SaveDataType]]
|-
+
|-
| 0x20
+
| 0x21
| 0x4
+
| 0x1
| Save data flags. Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.
+
| [[#SaveDataRank]]
|-
+
|-
| 0x24
+
| 0x22
| 0x1
+
| 0x2
| [[#SaveDataSpaceId]]. Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.
+
| SaveDataIndex
|-
+
|-
| 0x25
+
| 0x24
| 0x1
+
| 0x4
| Unknown. 0 for SystemSaveData/SaveData.
+
| Padding
|-
+
|-
| 0x26
+
| 0x28
| 0x1A
+
| 0x8
| Not initialized for SystemSaveData/SaveData.
+
| 0 for SystemSaveData/SaveData.
|}
+
|-
 +
| 0x30
 +
| 0x8
 +
| 0 for SystemSaveData/SaveData.
 +
|-
 +
| 0x38
 +
| 0x8
 +
| 0 for SystemSaveData/SaveData.
 +
|}
 +
 
 +
Total size is 0x40-bytes.
 +
 
 +
For DeviceSaveData, this struct is all-zero except for the [[#SaveDataType]] field (and optionally the ApplicationId if specified).
 +
 
 +
= SaveDataCreationInfo =
 +
This is "nn::fs::SaveDataCreationInfo".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| SaveDataSize
 +
|-
 +
| 0x8
 +
| 0x8
 +
| JournalSize
 +
|-
 +
| 0x10
 +
| 0x8
 +
| AvailableSize</br>0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData.
 +
|-
 +
| 0x18
 +
| 0x8
 +
| OwnerId</br>Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[NCM_services#ProgramId|ProgramId]] of the bcat-sysmodule.
 +
|-
 +
| 0x20
 +
| 0x4
 +
| [[#SaveDataFlags]]</br>Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.
 +
|-
 +
| 0x24
 +
| 0x1
 +
| [[#SaveDataSpaceId]]</br>Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.
 +
|-
 +
| 0x25
 +
| 0x1
 +
| Unknown. 0 for SystemSaveData/SaveData.
 +
|-
 +
| 0x26
 +
| 0x1A
 +
| Not initialized for SystemSaveData/SaveData.
 +
|}
 +
 
 +
Total size is 0x40-bytes.
 +
 
 +
= DeviceSaveData =
 +
This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the [[#SaveDataAttribute]].
 +
 
 +
= BcatSaveData =
 +
This is accessed using the same commands for SaveData with the same input u8. The [[#SaveDataAttribute]] is the same as DeviceSaveData (besides the SaveDataType), except that the [[NCM_services#ApplicationId|ApplicationId]] field is always set to <input ApplicationId> (unlike DeviceSaveData where it's optional). See above regarding [[#SaveDataCreationInfo]].
 +
 
 +
The 0x10-byte struct passed to [[#CreateSaveDataFileSystem]] has the first 0x5-bytes set to all-zero.
 +
 
 +
MountSystemBcatSaveData uses [[#OpenSaveDataFileSystemBySystemSaveDataId]] with [[#SaveDataSpaceId]] System. The [[#SaveDataAttribute]] is all-zero, except for the SaveDataType, and SystemSaveDataId is set to the input param.
 +
 
 +
= SaveDataInfo =
 +
This is "nn::fs::SaveDataInfo".
  
Total size is 0x40-bytes.
 
 
= DeviceSaveData =
 
This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the Save-struct.
 
 
= BcatSaveData =
 
This is accessed using the same commands for SaveData with the same input u8. The Save-struct is the same as DeviceSaveData, except that the titleID field is set to <input titleID>. See above regarding SaveCreate-struct.
 
 
The 0x10-byte struct passed to [[#CreateSaveDataFileSystem]] has the first 0x5-bytes set to all-zero.
 
 
= SaveDataInfo =
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 1,516: Line 2,604:
 
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Unknown saveID
+
| SaveDataId
 
|-
 
|-
 
| 0x8
 
| 0x8
Line 1,532: Line 2,620:
 
| 0x10
 
| 0x10
 
| 0x10
 
| 0x10
| userID
+
| UserId
 
|-
 
|-
 
| 0x20
 
| 0x20
 
| 0x8
 
| 0x8
| saveID, 0 for regular SaveData.
+
| SystemSaveDataId (0 for regular SaveData)
 
|-
 
|-
 
| 0x28
 
| 0x28
 
| 0x8
 
| 0x8
| Application titleID, for regular SaveData.
+
| [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData)
 
|-
 
|-
 
| 0x30
 
| 0x30
Line 1,548: Line 2,636:
 
| 0x38
 
| 0x38
 
| 0x2
 
| 0x2
| Save data index
+
| SaveDataIndex
 
|-
 
|-
 
| 0x3A
 
| 0x3A
 
| 0x1
 
| 0x1
| Save data 'rank' or 'precedence'. 0 if this save data is considered the primary save data. 1 if it's considered the secondary save data.
+
| [[#SaveDataRank]]
 
|-
 
|-
 
| 0x3B
 
| 0x3B

Revision as of 16:46, 1 May 2020

fsp-ldr

This is "nn::fssrv::sf::IFileSystemProxyForLoader".

Cmd Name
0 #OpenCodeFileSystem
1 #IsArchivedProgram
2 [4.0.0+] #SetCurrentProcess

OpenCodeFileSystem

Takes an ProgramId and a #ContentPath. Returns an #IFileSystem.

[10.0.0+] This now takes an additional type-0x1A output buffer.

IsArchivedProgram

Takes an u64 ProcessId. Returns a bool (1 if the process id's #ContentPath ends in ".nca").

SetCurrentProcess

Takes a ProcessId descriptor.

fsp-pr

This is "nn::fssrv::sf::IProgramRegistry".

Cmd Name
0 #RegisterProgram
1 #UnregisterProgram
2 [4.0.0+] #SetCurrentProcess
256 [1.0.0-9.2.0] #SetEnabledProgramVerification

RegisterProgram

Takes a StorageId, an u64 ProcessId, a ProgramId, a 0x1C type-A buffer for the FS Access Header, and a 0x2C type-A buffer for the FS Access Control

Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.

UnregisterProgram

Takes a pid. Removes registered FS permissions for that PID.

SetEnabledProgramVerification

Seems to sets a global flag to inputval & 1.

When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key NPDM ACID signature fails. This also skips verifying the NCA Header signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.

[10.0.0+] This was moved to Loader.

fsp-srv

This is "nn::fssrv::sf::IFileSystemProxy".

Cmd Name
0 [1.0.0] #OpenFileSystem
1 #SetCurrentProcess
2 OpenDataFileSystemByCurrentProcess
7 [2.0.0+] #OpenFileSystemWithPatch
8 [2.0.0+] #OpenFileSystemWithId
9 [3.0.0+] OpenDataFileSystemByProgramId
11 #OpenBisFileSystem
12 #OpenBisStorage
13 InvalidateBisCache
17 OpenHostFileSystem
18 OpenSdCardFileSystem
19 [2.0.0+] FormatSdCardFileSystem
21 #DeleteSaveDataFileSystem
22 #CreateSaveDataFileSystem
23 #CreateSaveDataFileSystemBySystemSaveDataId
24 RegisterSaveDataFileSystemAtomicDeletion
25 [2.0.0+] DeleteSaveDataFileSystemBySaveDataSpaceId
26 [2.0.0+] FormatSdCardDryRun
27 [2.0.0+] IsExFatSupported
28 [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute
30 #OpenGameCardStorage
31 #OpenGameCardFileSystem
32 [3.0.0+] ExtendSaveDataFileSystem
33 [5.0.0+] DeleteCacheStorage
34 [5.0.0+] GetCacheStorageSize
35 [6.0.0+] #CreateSaveDataFileSystemWithHashSalt
36 [9.0.0+] OpenHostFileSystemWithOption
51 #OpenSaveDataFileSystem
52 #OpenSaveDataFileSystemBySystemSaveDataId
53 [2.0.0+] #OpenReadOnlySaveDataFileSystem
57 [3.0.0+] #ReadSaveDataFileSystemExtraDataBySaveDataSpaceId
58 #ReadSaveDataFileSystemExtraData
59 [2.0.0+] WriteSaveDataFileSystemExtraData
60 #OpenSaveDataInfoReader
61 #OpenSaveDataInfoReaderBySaveDataSpaceId
62 [5.0.0+] OpenSaveDataInfoReaderOnlyCacheStorage
64 [5.0.0+] OpenSaveDataInternalStorageFileSystem
65 [5.0.0+] UpdateSaveDataMacForDebug
66 [5.0.0+] WriteSaveDataFileSystemExtraDataWithMask
67 [6.0.0+] #FindSaveDataWithFilter
68 [6.0.0+] #OpenSaveDataInfoReaderWithFilter
69 [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute
70 [8.0.0+] WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute
71 [10.0.0+] ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute
80 OpenSaveDataMetaFile
81 [4.0.0+] #OpenSaveDataTransferManager
82 [5.0.0+] #OpenSaveDataTransferManagerVersion2
83 [6.0.0+] #OpenSaveDataTransferProhibiter
84 [6.0.0+] #ListAccessibleSaveDataOwnerId
85 [9.0.0+] #OpenSaveDataTransferManagerForSaveDataRepair
86 [10.0.0+] #OpenSaveDataMover
100 OpenImageDirectoryFileSystem
110 #OpenContentStorageFileSystem
120 [6.0.0-9.2.0] #OpenCloudBackupWorkStorageFileSystem
130 [7.0.0+] #OpenCustomStorageFileSystem
200 OpenDataStorageByCurrentProcess
201 [3.0.0+] OpenDataStorageByProgramId
202 #OpenDataStorageByDataId
203 OpenPatchDataStorageByCurrentProcess
204 [7.0.0+] #OpenDataFileSystemWithProgramIndex
205 [7.0.0+] #OpenDataStorageWithProgramIndex
400 #OpenDeviceOperator
500 #OpenSdCardDetectionEventNotifier
501 #OpenGameCardDetectionEventNotifier
510 [5.0.0+] OpenSystemDataUpdateEventNotifier
511 [5.0.0+] NotifySystemDataUpdateEvent
520 [6.0.0+] #SimulateDeviceDetectionEvent
600 [1.0.0-3.0.2] SetCurrentPosixTime
601 QuerySaveDataTotalSize
602 #VerifySaveDataFileSystem
603 CorruptSaveDataFileSystem
604 CreatePaddingFile
605 DeleteAllPaddingFiles
606 [2.0.0+] GetRightsId
607 [2.0.0+] RegisterExternalKey
608 [2.0.0+] UnregisterAllExternalKey
609 [2.0.0+] GetRightsIdByPath
610 [3.0.0+] GetRightsIdAndKeyGenerationByPath
611 [4.0.0+] SetCurrentPosixTimeWithTimeDifference
612 [4.0.0+] GetFreeSpaceSizeForSaveData
613 [4.0.0+] VerifySaveDataFileSystemBySaveDataSpaceId
614 [4.0.0+] CorruptSaveDataFileSystemBySaveDataSpaceId
615 [5.0.0+] QuerySaveDataInternalStorageTotalSize
616 [6.0.0+] #GetSaveDataCommitId
617 [7.0.0+] UnregisterExternalKey
620 [2.0.0+] #SetSdCardEncryptionSeed
630 [4.0.0+] SetSdCardAccessibility
631 [4.0.0+] IsSdCardAccessible
640 [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid
700 [5.0.0+] #OpenAccessFailureDetectionEventNotifier
701 [5.0.0+] GetAccessFailureDetectionEvent
702 [5.0.0+] IsAccessFailureDetected
710 [5.0.0+] ResolveAccessFailure
720 [5.0.0+] AbandonAccessFailure
800 [2.0.0+] GetAndClearErrorInfo
810 [7.0.0+] RegisterProgramIndexMapInfo
1000 [1.0.0-9.2.0] SetBisRootForHost
1001 #SetSaveDataSize
1002 #SetSaveDataRootPath
1003 DisableAutoSaveDataCreation
1004 #SetGlobalAccessLogMode
1005 #GetGlobalAccessLogMode
1006 #OutputAccessLogToSdCard
1007 [4.0.0+] RegisterUpdatePartition
1008 [4.0.0+] OpenRegisteredUpdatePartition
1009 [4.0.0+] GetAndClearMemoryReportInfo
1010 [5.1.0-6.2.0] SetDataStorageRedirectTarget
1011 [7.0.0+] #GetProgramIndexForAccessLog
1012 [9.0.0+] GetFsStackUsage
1013 [9.0.0+] UnsetSaveDataRootPath
1014 [10.0.0+] OutputMultiProgramTagAccessLog
1100 [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey
1110 [6.0.0+] CorruptSaveDataFileSystemByOffset
1200 [6.0.0+] #OpenMultiCommitManager
1300 [10.0.0+] #OpenBisWiper

Permissions

Every time permissions are checked, the process registration #fsp-pr is loaded using the session processID. The permission data is populated with data from the NPDM.

If the processID is <= 6 (which happens only for built-in sysmodules), it will use a hardcoded registration data. The default mask in this case is 0x8000000000000000.

Note that the functions check whether or not at least one bit is set in the mask. This means that, you don't need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000.

If the code were to request an invalid input type, panic. But this never happens.

The output values for #ReadWrite CanMountRegisteredUpdatePartition and #Call CanRegisterUpdatePartition are masked with the cached value of DebugMode.

ReadWrite

AccessibilityType Name Mask Permission Used by
0x0 CanMountLogo 0x8000000000000801 R- #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId
0x1 CanMountContentMeta 0x8000000000000801 R- #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId
0x2 CanMountContentControl 0x8000000000000801 R- #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId
0x3 CanMountContentManual 0x8000000000000801 R- #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId
0x4 CanMountContentData 0x8000000000000801 R- #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId
0x5 CanMountApplicationPackage 0x8000000000000801 R- #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId
0x6 CanMountSaveDataStorage 0x8000000000000000 RW
0x7 CanMountContentStorage 0x8000000000000800 RW #OpenContentStorageFileSystem
0x8 CanMountImageAndVideoStorage 0x8000000000001000 RW #OpenImageDirectoryFileSystem
([1.0.0-5.1.0] 0x9) 0x8000000000000084
([6.0.0-9.2.0] 0x9) CanMountCloudBackupWorkStorage 0x8000000200000000 RW OpenCloudBackupWorkStorageFileSystem
0x9 CanMountCustomStorage0 0x8000000000000000 RW OpenCustomStorageFileSystem
([1.0.0-5.1.0] 0xA) 0x8000000000000080
([6.0.0-6.2.0] 0xA) 0x8000000000000084
([7.0.0-7.0.1] 0xA) 0x4000000000000000
([8.0.0-9.2.0] 0xA) 0x8000000000000000
0xA CanMountBisCalibrationFile 0x8000000000000084 RW #OpenBisFileSystem
([1.0.0-5.1.0] 0xB) 0x8000000000008080
([6.0.0-6.2.0] 0xB) 0x8000000000000080
([7.0.0-9.2.0] 0xB) 0x8000000000000084
0xB CanMountBisSafeMode 0x8000000000000080 RW #OpenBisFileSystem
([1.0.0-6.2.0] 0xC) 0x8000000000008080
([7.0.0-9.2.0] 0xC) 0x8000000000000080
0xC CanMountBisUser 0x8000000000008080 RW #OpenBisFileSystem
([1.0.0-5.1.0] 0xD) 0x8000000000000080
([6.0.0-9.2.0] 0xD) 0x8000000000008080
0xD CanMountBisSystem 0x8000000000008080 RW #OpenBisFileSystem
([1.0.0-2.3.0] 0xE) 0xC000000000200000
([3.0.0-6.2.0] 0xE) 0x8000000000000080
([7.0.0-9.2.0] 0xE) 0x8000000000008080
0xE CanMountBisSystemProperEncryption 0x8000000000000080 RW #OpenBisFileSystem
([1.0.0-2.3.0] 0xF) 0x8000000000000010
([3.0.0-5.1.0] 0xF) 0xC000000000200000
([6.0.0-9.2.0] 0xF) 0x8000000000000080
0xF CanMountBisSystemProperPartition 0x8000000000000080 RW #OpenBisFileSystem
([1.0.0-2.3.0] 0x10) 0x8000000000040020
([3.0.0-5.1.0] 0x10) 0x8000000000000010
([6.0.0-6.2.0] 0x10) 0xC000000000200000
([7.0.0-9.2.0] 0x10) 0x8000000000000080
0x10 CanMountSdCard 0xC000000000200000 RW #OpenSdCardFileSystem
([1.0.0-2.3.0] 0x11) 0x8000000000000028
([3.0.0-5.1.0] 0x11) 0x8000000000040020
([6.0.0-6.2.0] 0x11) 0x8000000000000010
([7.0.0-9.2.0] 0x11) 0xC000000000200000
0x11 CanMountGameCard 0x8000000000000010 R- #OpenGameCardFileSystem
([1.0.0-2.3.0] 0x12) 0x8000000000000020
([3.0.0-5.1.0] 0x12) 0x8000000000000028
([6.0.0-6.2.0] 0x12) 0x8000000000040020
([7.0.0-9.2.0] 0x12) 0x8000000000000010
0x12 CanMountDeviceSaveData 0x8000000000040020 RW #OpenSaveDataFileSystem
([1.0.0-5.1.0] 0x13) 0x8000000000000020
([6.0.0-6.2.0] 0x13) 0x8000000000000028
([7.0.0-9.2.0] 0x13) 0x8000000000040020
0x13 CanMountSystemSaveData 0x8000000000000028 RW #OpenSaveDataFileSystemBySystemSaveDataId
([1.0.0-2.3.0] 0x14) 0x8000000000010082
([3.0.0-6.2.0] 0x14) 0x8000000000000020
([7.0.0-9.2.0] 0x14) 0x8000000000000028
0x14 CanMountOthersSaveData 0x8000000000000020 RW #OpenSaveDataFileSystem
([1.0.0-2.3.0] 0x15) 0x8000000000010080
([3.0.0-5.1.0] 0x15) 0x8000000000010082
([6.0.0-9.2.0] 0x15) 0x8000000000000020
0x15 CanMountOthersSystemSaveData 0x8000000000000020 RW #OpenSaveDataFileSystemBySystemSaveDataId
([1.0.0-5.1.0] 0x16) 0x8000000000010080
([6.0.0-6.2.0] 0x16) 0x8000000000010082
([7.0.0-9.2.0] 0x16) 0x8000000000000020
0x16 CanOpenBisPartitionBootPartition1Root 0x8000000000010082 RW #OpenBisStorage
([1.0.0-2.3.0] 0x17) 0x8000000000010080
([3.0.0-5.1.0] 0x17) 0x8000000000000080
([6.0.0-6.2.0] 0x17) 0x8000000000010080
([7.0.0-9.2.0] 0x17) 0x8000000000010082
0x17 CanOpenBisPartitionBootPartition2Root 0x8000000000010080 RW #OpenBisStorage
([1.0.0-5.1.0] 0x18) 0x8000000000010080
([6.0.0-6.2.0] 0x18) 0x8000000000000080
([7.0.0-9.2.0] 0x18) 0x8000000000010080
0x18 CanOpenBisPartitionUserDataRoot 0x8000000000000080 RW #OpenBisStorage
([6.0.0-6.2.0] 0x19) 0x8000000000010080
([7.0.0-9.2.0] 0x19) 0x8000000000000080
0x19 CanOpenBisPartitionBootConfigAndPackage2Part1 0x8000000000010080 RW #OpenBisStorage
([1.0.0-9.2.0] 0x1A) 0x8000000000010080
0x1A CanOpenBisPartitionBootConfigAndPackage2Part2 0x8000000000010080 RW #OpenBisStorage
([1.0.0-9.2.0] 0x1B) 0x8000000000010080
0x1B CanOpenBisPartitionBootConfigAndPackage2Part3 0x8000000000010080 RW #OpenBisStorage
([1.0.0-9.2.0] 0x1C) 0x8000000000010080
0x1C CanOpenBisPartitionBootConfigAndPackage2Part4 0x8000000000010080 RW #OpenBisStorage
([1.0.0-2.3.0] 0x1D) 0x8000000000000084
([3.0.0-9.2.0] 0x1D) 0x8000000000010080
0x1D CanOpenBisPartitionBootConfigAndPackage2Part5 0x8000000000010080 RW #OpenBisStorage
([1.0.0-5.1.0] 0x1E) 0x8000000000000084
([6.0.0-9.2.0] 0x1E) 0x8000000000010080
0x1E CanOpenBisPartitionBootConfigAndPackage2Part6 0x8000000000010080 RW #OpenBisStorage
([1.0.0-5.1.0] 0x1F) 0x8000000000000080
([6.0.0-6.2.0] 0x1F) 0x8000000000000084
([7.0.0-9.2.0] 0x1F) 0x8000000000010080
0x1F CanOpenBisPartitionCalibrationBinary 0x8000000000000084 RW #OpenBisStorage
([1.0.0-5.1.0] 0x20) 0x8000000000000080
([6.0.0-9.2.0] 0x20) 0x8000000000000084
0x20 CanOpenBisPartitionCalibrationFile 0x8000000000000084 RW #OpenBisStorage
([6.0.0-6.2.0] 0x21) 0x8000000000000080
([7.0.0-9.2.0] 0x21) 0x8000000000000084
0x21 CanOpenBisPartitionSafeMode 0x8000000000000080 RW #OpenBisStorage
([1.0.0-9.2.0] 0x22) 0x8000000000000080
0x22 CanOpenBisPartitionUser 0x8000000000000080 RW #OpenBisStorage
([1.0.0-2.3.0] 0x23) 0xC000000000200000
([3.0.0-9.2.0] 0x23) 0x8000000000000080
0x23 CanOpenBisPartitionSystem 0x8000000000000080 RW #OpenBisStorage
([1.0.0-2.3.0] 0x24) 0x8000000000000100
([3.0.0-9.2.0] 0x24) 0x8000000000000080
0x24 CanOpenBisPartitionSystemProperEncryption 0x8000000000000080 RW #OpenBisStorage
([1.0.0-2.3.0] 0x25) 0x8000000000100008
([3.0.0-5.1.0] 0x25) 0xC000000000200000
([6.0.0-9.2.0] 0x25) 0x8000000000000080
0x25 CanOpenBisPartitionSystemProperPartition 0x8000000000000080 RW #OpenBisStorage
([1.0.0-2.3.0] 0x26) 0xC000000000400000
([3.0.0-5.1.0] 0x26) 0x8000000000000100
([6.0.0-6.2.0] 0x26) 0xC000000000200000
([7.0.0-9.2.0] 0x26) 0x8000000000000080
0x26 CanOpenSdCardStorage 0xC000000000200000 RW
([3.0.0-5.1.0] 0x27) 0x8000000000100008
([6.0.0-6.2.0] 0x27) 0x8000000000000100
([7.0.0-9.2.0] 0x27) 0xC000000000200000
[3.0.0+] 0x27 CanOpenGameCardStorage 0x8000000000000100 RW #OpenGameCardStorage, #EraseGameCard (bit1), #WriteToGameCard (bit1), #GetGameCardErrorInfo (bit1), #EraseAndWriteParamDirectly (bit1), #ReadParamDirectly (bit1), #ForceEraseGameCard (bit1)
([3.0.0-5.1.0] 0x28) 0xC000000000400000
([6.0.0-6.2.0] 0x28) 0x8000000000100008
([7.0.0-9.2.0] 0x28) 0x8000000000000100
[3.0.0+] 0x28 CanMountSystemDataPrivate 0x8000000000100008 R- #OpenFileSystem, #OpenDataStorageByDataId
([4.0.0-5.1.0] 0x29) 0x8000000000010000
([6.0.0-6.2.0] 0x29) 0xC000000000400000
([7.0.0-9.2.0] 0x29) 0x8000000000100008
[4.0.0+] 0x29 CanMountHost 0xC000000000400000 RW #OpenHostFileSystem
([5.0.0-5.1.0] 0x2A) 0x8000000000000000
([6.0.0-6.2.0] 0x2A) 0x8000000000010000
([7.0.0-9.2.0] 0x2A) 0xC000000000400000
[5.0.0+] 0x2A CanMountRegisteredUpdatePartition 0x8000000000010000 R- #OpenRegisteredUpdatePartition
([6.0.0-6.2.0] 0x2B) 0x8000000000000000
([7.0.0-9.2.0] 0x2B) 0x8000000000010000
[6.0.0+] 0x2B CanOpenSaveDataInternalStorage 0x8000000000000000 RW #OpenSaveDataInternalStorageFileSystem
([7.0.0-9.2.0] 0x2C) 0x8000000000000000
[7.0.0+] 0x2C CanNotMount 0x0000000000000000 -- OpenCustomStorageFileSystem
([7.0.0-9.2.0] 0x2D) 0x0000000000000000

Call

OperationType Name Mask Used by
0x0 CanInvalidateBisCache 0x8000000000000080 #InvalidateBisCache
0x1 CanEraseMmc 0x8000000000000080 EraseMmc
0x2 CanGetGameCardDeviceCertificate 0x8000000000000010 GetGameCardDeviceCertificate
0x3 CanGetGameCardIdSet 0x8000000000000010 GetGameCardIdSet
0x4 CanFinalizeGameCardDriver 0x8000000000000200 FinalizeGameCardDriver
0x5 CanGetGameCardAsicInfo 0x8000000000000200 GetGameCardAsicInfo
0x6 CanCreateSaveData 0x8000000000002020 #CreateSaveDataFileSystem
0x7 CanDeleteSaveData 0x8000000000000060 #DeleteSaveDataFileSystem, RegisterSaveDataFileSystemAtomicDeletion
0x8 CanCreateSystemSaveData 0x8000000000000028 CreateSaveDataFileSystemBySystemSaveDataId
0x9 CanCreateOthersSystemSaveData 0x8000000000000020 CreateSaveDataFileSystemBySystemSaveDataId
0xA CanDeleteSystemSaveData 0x8000000000004028 #DeleteSaveDataFileSystem, RegisterSaveDataFileSystemAtomicDeletion
0xB CanOpenSaveDataInfoReader 0x8000000000000060 #OpenSaveDataInfoReaderBySaveDataSpaceId, #OpenSaveDataInfoReader
0xC CanOpenSaveDataInfoReaderForSystem 0x8000000000004020 #OpenSaveDataInfoReaderBySaveDataSpaceId, #OpenSaveDataInfoReader
([1.0.0-5.1.0] 0xD) 0x8000000000020000
0xD CanOpenSaveDataInfoReaderForInternal 0x8000000000000040 #OpenSaveDataInfoReaderWithFilter
([1.0.0-5.1.0] 0xE) 0x8000000000000400
0xE CanOpenSaveDataMetaFile 0x8000000000020000 OpenSaveDataMetaFile
([1.0.0-5.1.0] 0xF) 0x8000000000004060
0xF CanSetCurrentPosixTime 0x8000000000000400 SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
([1.0.0-5.1.0] 0x10) 0x8000000000080000
0x10 CanReadSaveDataFileSystemExtraData 0x8000000000004060 #ReadSaveDataFileSystemExtraData
0x11 CanSetGlobalAccessLogMode 0x8000000000080000 #SetGlobalAccessLogMode
([1.0.0-5.1.0] 0x12) CanDebug 0xC000000000000000
0x12 CanSetSpeedEmulationMode 0x8000000000080000 SetSpeedEmulationMode
([1.0.0-5.1.0] 0x13) 0xC000000000800000
0x13 CanDebug 0xC000000000000000
([1.0.0-5.1.0] 0x14) 0xC000000001000000
0x14 CanFillBis 0xC000000000800000 CreatePaddingFile, DeleteAllPaddingFiles
([1.0.0-4.1.0] 0x15) 0xC000000002000000
([5.0.0-5.1.0] 0x15) 0x8000000001000060
0x15 CanCorruptSaveData 0xC000000001000000 CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
([2.0.0-4.1.0] 0x16) 0x8000000004000000
([5.0.0-5.1.0] 0x16) 0x8000000000000060
[2.0.0+] 0x16 CanCorruptSystemSaveData 0x8000000001000060 CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
([2.0.0-4.1.0] 0x17) 0x8000000008000000
([5.0.0-5.1.0] 0x17) 0xC000000002000000
[2.0.0+] 0x17 CanVerifySaveData 0x8000000000000060 #VerifySaveDataFileSystem, VerifySaveDataFileSystemBySaveDataSpaceId
([2.0.0-4.1.0] 0x18) 0x8000000010000000
([5.0.0-5.1.0] 0x18) 0x8000000004000000
[2.0.0+] 0x18 CanDebugSaveData 0xC000000002000000 #CreateSaveDataFileSystem, #OpenSaveDataFileSystem, #SetSaveDataRootPath
([2.0.0-4.1.0] 0x19) 0x8000000000000800
([5.0.0-5.1.0] 0x19) 0x8000000008000000
[2.0.0+] 0x19 CanFormatSdCard 0x8000000004000000 FormatSdCardFileSystem
([2.0.0-4.1.0] 0x1A) 0x8000000000004020
([5.0.0-5.1.0] 0x1A) 0x8000000010000000
[2.0.0+] 0x1A CanGetRightsId 0x8000000008000000 GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
([3.0.0-4.1.0] 0x1B) 0x8000000000002020
([5.0.0-5.1.0] 0x1B) 0x8000000000000800
[3.0.0+] 0x1B CanRegisterExternalKey 0x8000000010000000 RegisterExternalKey, UnregisterAllExternalKey
([3.0.0-4.1.0] 0x1C) 0x8000000000000028
([5.0.0-5.1.0] 0x1C) 0x8000000000004020
[3.0.0+] 0x1C CanSetEncryptionSeed 0x8000000000000800 #SetSdCardEncryptionSeed
([4.0.0-4.1.0] 0x1D) 0x8000000020000000
([5.0.0-5.1.0] 0x1D) 0x8000000000000000
[4.0.0+] 0x1D CanWriteSaveDataFileSystemExtraDataTimeStamp 0x8000000000000020 WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
([4.0.0-4.1.0] 0x1E) 0x8000000040000000
([5.0.0-5.1.0] 0x1E) 0x8000000000002020
[4.0.0+] 0x1E CanWriteSaveDataFileSystemExtraDataFlags 0x8000000000004020 WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
([4.0.0-4.1.0] 0x1F) 0x8000000000000000
([5.0.0-5.1.0] 0x1F) 0x8000000000000028
[4.0.0+] 0x1F CanWriteSaveDataFileSystemExtraDataCommitId 0x8000000000000020 WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
([4.0.0-4.1.0] 0x20) 0x8000000000000000
([5.0.0-5.1.0] 0x20) 0x8000000020000000
[4.0.0+] 0x20 CanWriteSaveDataFileSystemExtraDataAll 0x8000000000000000 WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
([5.0.0-5.1.0] 0x21) 0x8000000040000000
[5.0.0+] 0x21 CanExtendSaveData 0x8000000000002020 ExtendSaveDataFileSystem
([5.0.0-5.1.0] 0x22) 0x0000000080000002
[5.0.0+] 0x22 CanExtendSystemSaveData 0x8000000000000028 ExtendSaveDataFileSystem
([5.0.0-5.1.0] 0x23) 0x8000000000000000
([6.0.0-9.2.0] 0x23) 0x8000000020000000
[5.0.0+] 0x23 CanExtendOthersSystemSaveData 0x8000000000000020 ExtendSaveDataFileSystem
([5.0.0-5.1.0] 0x24) 0x8000000000000000
([6.0.0-9.2.0] 0x24) 0x8000000040000000
[5.0.0+] 0x24 CanRegisterUpdatePartition 0x8000000020000000 RegisterUpdatePartition
([5.0.0-5.1.0] 0x25) 0x8000000080200000
([6.0.0-9.2.0] 0x25) 0x8000000200000000
[5.0.0+] 0x25 CanOpenSaveDataTransferManager 0x8000000040000000 #OpenSaveDataTransferManager
([5.0.0-5.1.0] 0x26) 0x8000000080000110
([6.0.0-8.1.0] 0x26) 0x8000000200002000
([9.0.0-9.2.0] 0x26) 0x8000000200000000
[5.0.0+] 0x26 CanOpenSaveDataTransferManagerVersion2 0x8000000200000000 #OpenSaveDataTransferManagerVersion2
([5.0.0-5.1.0] 0x27) 0x8000000000100008
([6.0.0-7.0.1] 0x27) 0x8000000200002000
([8.0.0-8.1.0] 0x27) 0x8000000240002000
([9.0.0-9.2.0] 0x27) 0x8000000000000000
[5.0.0+] 0x27 CanOpenSaveDataTransferManagerForSaveDataRepair 0x8000000200000000 OpenSaveDataTransferManagerForSaveDataRepair
([5.0.0-5.1.0] 0x28) 0x8000000080010000
([6.0.0-8.1.0] 0x28) 0x8000000000000000
([9.0.0-9.2.0] 0x28) 0x8000000200002000
[5.0.0+] 0x28 CanOpenSaveDataTransferManagerForSaveDataRepairTool 0x8000000000000000 OpenSaveDataTransferManagerForSaveDataRepair
([5.0.0-5.1.0] 0x29) 0x0000000080000001
([6.0.0-8.1.0] 0x29) 0x8000000000000000
([9.0.0-9.2.0] 0x29) 0x8000000240002000
[5.0.0+] 0x29 CanOpenOpenSaveDataTransferProhibiter 0x8000000200002000 #OpenSaveDataTransferProhibiter
([5.0.0-5.1.0] 0x2A) 0x0000000080000001
([6.0.0-8.1.0] 0x2A) 0x8000000080200000
([9.0.0-9.2.0] 0x2A) 0x8000000000000000
[5.0.0+] 0x2A CanOpenSaveDataMover 0x8000001000000000 #OpenSaveDataMover
([5.0.0-5.1.0] 0x2B) 0x0000000080000001
([6.0.0-8.1.0] 0x2B) 0x8000000080000110
([9.0.0-9.2.0] 0x2B) 0x8000000000000000
[5.0.0+] 0x2B CanOpenBisWiper 0x8000000000000800 #OpenBisWiper
([5.0.0-5.1.0] 0x2C) 0x0000000080000001
([6.0.0-8.1.0] 0x2C) 0x8000000000100008
([9.0.0-9.2.0] 0x2C) 0x8000000080200000
[5.0.0+] 0x2C CanListAccessibleSaveDataOwnerId 0x8000000240002000 #ListAccessibleSaveDataOwnerId
([5.0.0-5.1.0] 0x2D) 0x0000000080000001
([6.0.0-8.1.0] 0x2D) 0x8000000000010000
([9.0.0-9.2.0] 0x2D) 0x8000000080000110
[5.0.0+] 0x2D CanControlMmcPatrol 0x8000000000000000 SuspendMmcPatrol, ResumeMmcPatrol
([5.0.0-5.1.0] 0x2E) 0x8000000040000000
([6.0.0-8.1.0] 0x2E) 0x8000000100000000
([9.0.0-9.2.0] 0x2E) 0x8000000000100008
[5.0.0+] 0x2E CanOverrideSaveDataTransferTokenSignVerificationKey 0x8000000000000000 OverrideSaveDataTransferTokenSignVerificationKey
([5.0.0-5.1.0] 0x2F) 0x8000000080200000
([6.0.0-8.1.0] 0x2F) 0x8000000100000000
([9.0.0-9.2.0] 0x2F) 0x8000000000010000
[5.0.0+] 0x2F CanOpenSdCardDetectionEventNotifier 0x8000000080200000 #OpenSdCardDetectionEventNotifier
([5.1.0-6.0.0] 0x30) 0x8000000080080000
([6.0.1-9.2.0] 0x30) 0x8000000100000000
[5.1.0+] 0x30 CanOpenGameCardDetectionEventNotifier 0x8000000080000110 #OpenGameCardDetectionEventNotifier
([6.0.0-9.2.0] 0x31) 0x8000000100000000
[6.0.0+] 0x31 CanOpenSystemDataUpdateEventNotifier 0x8000000000100008 OpenSystemDataUpdateEventNotifier
([6.0.0-9.2.0] 0x32) 0x8000000100000000
[6.0.0+] 0x32 CanNotifySystemDataUpdateEvent 0x8000000000010000 NotifySystemDataUpdateEvent
([6.0.0-8.1.0] 0x33) 0x8000000040000000
([9.0.0-9.2.0] 0x33) 0x8000000100000000
[6.0.0+] 0x33 CanOpenAccessFailureDetectionEventNotifier 0x8000000100000000 #OpenAccessFailureDetectionEventNotifier
([6.0.0-8.1.0] 0x34) 0x8000000200000020
([9.0.0-9.2.0] 0x34) 0x8000000100000000
[6.0.0+] 0x34 CanGetAccessFailureDetectionEvent 0x8000000100000000 GetAccessFailureDetectionEvent
([6.0.0-8.1.0] 0x35) 0x8000000000200000
([9.0.0-9.2.0] 0x35) 0x8000000040000000
[6.0.0+] 0x35 CanIsAccessFailureDetected 0x8000000100000000 IsAccessFailureDetected
([6.0.0-8.1.0] 0x36) 0x4000000000000000
([9.0.0-9.2.0] 0x36) 0x8000000200000020
[6.0.0+] 0x36 CanResolveAccessFailure 0x8000000100000000 ResolveAccessFailure
([6.0.0-6.2.0] 0x37) 0x8000000000080000
([7.0.0-8.1.0] 0x37) 0x8000000000000000
([9.0.0-9.2.0] 0x37) 0x8000000000200000
[6.0.0+] 0x37 CanAbandonAccessFailure 0x8000000100000000 AbandonAccessFailure
([6.0.0-6.2.0] 0x38) 0x8000000000000000
([7.0.0-8.1.0] 0x38) 0x8000000400000000
([9.0.0-9.2.0] 0x38) 0x4000000000000000
[6.0.0+] 0x38 CanQuerySaveDataInternalStorageTotalSize 0x8000000040000000 QuerySaveDataInternalStorageTotalSize
([8.0.0-8.1.0] 0x39) 0x8000000000000010
([9.0.0-9.2.0] 0x39) 0x8000000000000000
[8.0.0+] 0x39 CanGetSaveDataCommitId 0x8000000200000020 #GetSaveDataCommitId
([9.0.0-9.2.0] 0x3A) 0x8000000400000000
[9.0.0+] 0x3A CanSetSdCardAccessibility 0x8000000000200000 SetSdCardAccessibility
([9.0.0-9.2.0] 0x3B) 0x8000000000000010
[9.0.0+] 0x3B CanSimulateDevice 0x4000000000000000 SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent
([9.0.0-9.2.0] 0x3C) 0x8000000800000000
[9.0.0+] 0x3C CanCreateSaveDataWithHashSalt 0x8000000000000000 #CreateSaveDataFileSystem, #CreateSaveDataFileSystemWithHashSalt
([9.0.0-9.2.0] 0x3D) 0x8000000800000000
[9.0.0+] 0x3D CanRegisterProgramIndexMapInfo 0x8000000400000000 RegisterProgramIndexMapInfo
([9.0.0-9.2.0] 0x3E) 0x8000000800000000
[9.0.0+] 0x3E CanChallengeCardExistence 0x8000000000000010 ChallengeCardExistence
([9.0.0-9.2.0] 0x3F) 0x8000000800000000
[9.0.0+] 0x3F CanCreateOwnSaveData 0x8000000800000000 #CreateSaveDataFileSystem, CreateSaveDataFileSystemWithHashSalt
([9.0.0-9.2.0] 0x40) 0x8000000800000000
[9.0.0+] 0x40 CanReadOwnSaveDataFileSystemExtraData 0x8000000800000000 #ReadSaveDataFileSystemExtraData
[10.0.0+] 0x41 CanExtendOwnSaveData 0x8000000800000000 ExtendSaveDataFileSystem
[10.0.0+] 0x42 CanOpenOwnSaveDataTransferProhibiter 0x8000000800000000 #OpenSaveDataTransferProhibiter
[10.0.0+] 0x43 CanFindOwnSaveDataWithFilter 0x8000000800000000 #FindSaveDataWithFilter

OpenFileSystem

Takes a type-0x19 input #ContentPath and a #FileSystemProxyType as parameters. Returns an #IFileSystem.

[2.0.0+] This function was removed.

SetCurrentProcess

Takes a pid-descriptor.

OpenFileSystemWithPatch

Takes an input #FileSystemProxyType and an u64 title-id. Returns an #IFileSystem.

Web-applet loads the #FileSystemProxyType (which must be Manual) from u32_table[inparam].

Note: web-applet strings refer to both this cmd and #OpenFileSystemWithId as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.

OpenFileSystemWithId

Takes a type-0x19 input buffer, an #FileSystemProxyType and an u64 title-id. Returns an #IFileSystem.

The #IFileSystem must be Meta if the NCA type is 0.

The input buffer is the output string path from GetApplicationContentPath.

May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn't inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.

The official "MountApplicationPackage" func uses this with in64=0 and #FileSystemProxyType Package.

After the #FileSystemProxyType specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.

When #FileSystemProxyType is Meta, it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it's compared with the NCA ProgramId, then an error is thrown on mismatch.

OpenBisFileSystem

Takes a type-0x19 input buffer string and a #BisPartitionId. Official user-process code sets instr[0] = 0 normally. Returns an #IFileSystem.

Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as #OpenBisStorage except this mounts the partition filesystem instead of allowing direct access to the partition sectors.

OpenBisStorage

Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid #IStorage handle otherwise.

InvalidateBisCache

Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by SystemInitializer.

DeleteSaveDataFileSystem

Takes an input u64.

CreateSaveDataFileSystem

Takes a 0x40-byte #SaveDataAttribute, a 0x40-byte #SaveDataCreationInfo, and a 0x10-byte input struct.

Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1.

Creates regular savedata.

CreateSaveDataFileSystemBySystemSaveDataId

Takes a 0x40-byte #SaveDataAttribute and a 0x40-byte #SaveDataCreationInfo.

Creates savedata in the SYSTEM NAND partition.

OpenGameCardStorage

Takes two input u32s (gamecard handle, partition ID), and returns an #IStorage for the partition.

OpenGameCardFileSystem

Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an #IFileSystem.

Mounts a gamecard partition.

CreateSaveDataFileSystemWithHashSalt

Takes a total of 0xB0-bytes of input, no output.

OpenSaveDataFileSystem

Takes an input u8 #SaveDataSpaceId and a 0x40-byte #SaveDataAttribute. Official user-process code is only known to use value 1 for the u8.

Returns an #IFileSystem.

Permissions aren't checked until the specified save is successfully found.

Only one process (specifically only one #IFileSystem session) can mount a given savedata at any given time (this includes SystemSaveData).

OpenSaveDataFileSystemBySystemSaveDataId

Takes an input u8 #SaveDataSpaceId and a 0x40-byte #SaveDataAttribute. Web-applet only uses value0 for the input u8.

Returns an #IFileSystem.

Mounts savedata in the SYSTEM NAND partition.

OpenReadOnlySaveDataFileSystem

Takes an input u8 #SaveDataSpaceId and a 0x40-byte #SaveDataAttribute, and returns an #IFileSystem.

Mounts SaveData as ReadOnly.

ReadSaveDataFileSystemExtraDataBySaveDataSpaceId

Takes an input u8 #SaveDataSpaceId, an input u64 saveID, and a type-0x6 output buffer containing the #SaveDataFileSystemExtraData.

ReadSaveDataFileSystemExtraData

Takes an input u64 saveID and a type-0x6 output buffer containing the #SaveDataFileSystemExtraData.

OpenSaveDataInfoReader

No input, returns an output #ISaveDataInfoReader.

OpenSaveDataInfoReaderBySaveDataSpaceId

Takes an input u8 #SaveDataSpaceId, returns an output #ISaveDataInfoReader.

FindSaveDataWithFilter

Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer.

OpenSaveDataInfoReaderWithFilter

Takes a total of 0x50-bytes of input, returns an #ISaveDataInfoReader.

OpenSaveDataTransferManager

No input, returns an #ISaveDataTransferManager.

OpenSaveDataTransferManagerVersion2

No input, returns an #ISaveDataTransferManagerWithDivision.

OpenSaveDataTransferProhibiter

Takes an input u64, returns an #ISaveDataTransferProhibiter.

ListAccessibleSaveDataOwnerId

Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer.

OpenSaveDataTransferManagerForSaveDataRepair

No input, returns an output #ISaveDataTransferManagerForSaveDataRepair.

OpenSaveDataMover

Takes 2 input #SaveDataSpaceId, an input u64 size and a TransferMemory handle. Returns an output #ISaveDataMover.

OpenContentStorageFileSystem

Takes a #ContentStorageId. Invalid values return 0x2EE202.

Returns an #IFileSystem with NCA files. The read data from these files is identical to the data read by NCM_services#ReadContentIdFile.

OpenCloudBackupWorkStorageFileSystem

Takes 4-bytes of input, returns an #IFileSystem.

OpenCustomStorageFileSystem

Takes a #CustomStorageId. Invalid values return 0x2EE202.

Returns an #IFileSystem from either User:/CustomStorage0 or Sdcard:/Nintendo/CustomStorage0. If on the SD card, an AesXtsFileSystem is created using a key source specifically for custom storage.

OpenDataStorageByDataId

Takes a StorageID and a DataId.

Returns a domain object ID implementing the #IStorage interface for data archives.

OpenDataFileSystemWithProgramIndex

Takes an input u8, returns an #IFileSystem.

OpenDataStorageWithProgramIndex

Takes an input u8, returns an #IStorage.

OpenDeviceOperator

This command returns a session to a port implementing the #IDeviceOperator interface.

OpenSdCardDetectionEventNotifier

This command returns a session to a port implementing the #IEventNotifier interface.

OpenGameCardDetectionEventNotifier

This command returns a session to a port implementing the #IEventNotifier interface.

SimulateDeviceDetectionEvent

Takes a total of 0xC-bytes of input, no output.

VerifySaveDataFileSystem

Takes an unknown input u64 and a type-0x6 output buffer.

The input u64 high-byte must be non-zero, otherwise an error is returned(0xE02).

GetSaveDataCommitId

Takes an input u8 and u64, returns an output u64.

SetSdCardEncryptionSeed

Takes in the 0x10 byte SD card encryption seed, and loads it into FS-module state.

NS-module reads the 0x10 bytes from SdCard:/Nintendo/Contents/private, and compares them to the first 0x10 bytes of the ns_appman:/private (in system savedata 0x8000000000000043). If they match, NS calls this command using bytes 0x10-0x20 from ns_appman:/private. The rest of this file (0x1F0 bytes total) is (usually/always?) all-zero (however in some cases the byte at offset 0x20 is value 0x1).

OpenAccessFailureDetectionEventNotifier

Takes 8-bytes of input and returns an #IEventNotifier.

[8.0.0+] Now takes an additional 8-bytes of input.

SetSaveDataSize

Takes two input u64s "size" and "journal_size", and writes them to fsp-srv object member variables.

These variables are normally initialized with 32 MiB (0x2000000) and 16 MiB (0x1000000), respectively.

These variables don't seem to be actually used anywhere else (?)

SetSaveDataRootPath

Takes an input path, and does snprintf(<fsp-srv object>->m_save_data_root_path, FS_MAX_PATH-1, "/%s", input_path);

This path is normally all-zero. When this path is non-zero, the internal OpenSaveDataFileSystem function will create a DirectorySaveDataFileSystem if the target save is a user-save + a directory exists, instead of the normal savedata filesystem object.

SetGlobalAccessLogMode

Takes an input u32.

SetGlobalAccessLogMode

Takes an input u32.

GetGlobalAccessLogMode

Returns an output u32.

GlobalAccessLogMode is normally 0.

OutputAccessLogToSdCard

Takes a type-0x5 input buffer.

The input buffer is the string to output to the log. User-processes normally include a newline at the end.

User-processes only use this when the value previously loaded from #GetGlobalAccessLogMode has bit1 set.

When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn't show up SD, unknown why.

The input buffer is written to the "$FsAccessLog:/FsAccessLog.txt" file, where "$FsAccessLog" is the SD-card mount-name. It's written to the current end of the file(appended).

GetProgramIndexForAccessLog

No input, returns two 32-bit values "version" and "program_index".

OpenMultiCommitManager

No input, returns an output #IMultiCommitManager.

OpenBisWiper

Takes an input u64 size and a TransferMemory handle. Returns an output #IWiper.

IStorage

This is "nn::fssrv::sf::IStorage".

This is the interface for a raw device, usually a block device.

Cmd Name
0 #Read
1 #Write
2 #Flush
3 #SetSize
4 #GetSize
5 [4.0.0+] OperateRange

Read

Takes a type-0x46 buffer, an offset and length.

Write

Takes a type-0x45 buffer, an offset and length.

Flush

No input.

SetSize

Takes a size.

GetSize

Returns a size.

IFileSystem

This is "nn::fssrv::sf::IFileSystem".

There are two main implementations of this interface:

  • nn::fs::fsa::IFileSystem: The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface.
  • nn::fssrv::sf::IFileSystem: Used for sending an IFileSystem over IPC. Not used outside of IPC code.

There are two adapter classes to convert between these interfaces:

  • nn::fssrv::detail::FileSystemInterfaceAdapter: Allows access to an nn::fs::fsa::IFileSystem via the nn::fssrv::sf::IFileSystem interface.
  • nn::fs::detail::FileSystemServiceObjectAdapter: Allows access to an nn::fssrv::sf::IFileSystem via the nn::fs::fsa::IFileSystem interface.

When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC. Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it.

Cmd Name
0 CreateFile
1 DeleteFile
2 CreateDirectory
3 DeleteDirectory
4 DeleteDirectoryRecursively
5 RenameFile
6 RenameDirectory
7 #GetEntryType
8 #OpenFile
9 #OpenDirectory
10 #Commit
11 #GetFreeSpaceSize
12 #GetTotalSpaceSize
13 [3.0.0+] #CleanDirectoryRecursively
14 [3.0.0+] #GetFileTimeStampRaw
15 [4.0.0+] QueryEntry

GetEntryType

Takes a type-0x9 input buffer for the path and returns #DirectoryEntryType as an output u32.

OpenFile

Takes a type-0x19 input buffer for the path, and an u32 mode. mode controls how the file is opened, based on which bits are set:

  • When bit 0 is set, the file is Readable: you can use the Read operation.
  • When bit 1 is set, the file is Writable: you can use the Write operation.
  • When bit 2 is set, the file is Appendable: unless this bit is set, you will not be able to write beyond the end of a file (such writes will result in an error 0x307202)

OpenDirectory

Takes a type-0x9 input buffer for the path and an u64 filter_flags. filter_flags controls what type of entries are read by the #IDirectory: bitmask 0x1 = directories, bitmask 0x2 = files.

Commit

Like 3DS, this has to be used after writing to savedata for the changes to take affect.

GetFreeSpaceSize

Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.

GetTotalSpaceSize

Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used).

CleanDirectoryRecursively

Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.

GetFileTimeStampRaw

Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.

IDirectory

This is "nn::fssrv::sf::IDirectory".

Cmd Name
0 #Read
1 #GetEntryCount

Read

Takes a type-0x6 output buffer. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available.

The output buffer contains the read array of #DirectoryEntry. This doesn't include entries for "." and "..".

GetEntryCount

Returns an u64 for the total number of readable entries.

DirectoryEntry

This is "nn::fs::DirectoryEntry".

Offset Size Description
0x0 0x301 Path
0x301 0x1 File attributes (bit 0 = is directory; bit 1 = archive bit)
0x302 0x2 Padding?
0x304 0x1 #DirectoryEntryType
0x305 0x3 Padding?
0x308 0x8 Filesize, 0 for directories.

DirectoryEntryType

This is "nn::fs::DirectoryEntryType".

An s8 value indicating a directory entry type. The current values are:

Value Description
0 Directory
1 File

IFile

This is "nn::fssrv::sf::IFile".

Cmd Name
0 Read
1 Write
2 Flush
3 SetSize
4 GetSize
5 [4.0.0+] OperateRange

ISaveDataInfoReader

This is "nn::fssrv::sf::ISaveDataInfoReader".

Cmd Name
0 #ReadSaveDataInfo

ReadSaveDataInfo

Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of #SaveDataInfo.

This is used to get #SaveDataInfo for all savedata on the system (or all savedata for the current #SaveDataSpaceId). When used multiple times, it will resume reading where it left off, until no more entries are available (in that case the out u64 is value 0).

IDeviceOperator

This is "nn::fssrv::sf::IDeviceOperator".

Cmd Name
0 IsSdCardInserted
1 GetSdCardSpeedMode
2 [2.0.0+] GetSdCardCid
3 [2.0.0+] GetSdCardUserAreaSize
4 [2.0.0+] GetSdCardProtectedAreaSize
5 [2.0.0+] GetAndClearSdCardErrorInfo
100 GetMmcCid
101 GetMmcSpeedMode
110 EraseMmc
111 GetMmcPartitionSize
112 [2.0.0+] GetMmcPatrolCount
113 [2.0.0+] GetAndClearMmcErrorInfo
114 [2.0.0+] GetMmcExtendedCsd
115 [4.0.0+] SuspendMmcPatrol
116 [4.0.0+] ResumeMmcPatrol
200 #IsGameCardInserted
201 EraseGameCard
202 #GetGameCardHandle
203 #GetGameCardUpdatePartitionInfo
204 FinalizeGameCardDriver
205 GetGameCardAttribute
206 #GetGameCardDeviceCertificate
207 GetGameCardAsicInfo
208 GetGameCardIdSet
209 WriteToGameCardDirectly
210 SetVerifyWriteEnalbleFlag
211 GetGameCardImageHash
212 [2.0.0+] GetGameCardDeviceIdForProdCard
213 [2.0.0+] EraseAndWriteParamDirectly
214 [2.0.0+] ReadParamDirectly
215 [2.0.0+] ForceEraseGameCard
216 [2.0.0+] GetGameCardErrorInfo
217 [2.1.0+] GetGameCardErrorReportInfo
218 [3.0.0+] GetGameCardDeviceId
219 [8.0.0+] #ChallengeCardExistence
220 [9.0.0+] #GetGameCardCompatibilityType
300 SetSpeedEmulationMode
301 GetSpeedEmulationMode
400 [5.0.0+] SuspendSdmmcControl
401 [5.0.0+] ResumeSdmmcControl
402 [6.0.0+] #GetSdmmcConnectionStatus
500 [6.0.0+] #SetDeviceSimulationEvent
501 [6.0.0+] #ClearDeviceSimulationEvent

IsGameCardInserted

No input, returns a bool.

GetGameCardHandle

No input, returns an u32 GameCardHandle.

GetGameCardUpdatePartitionInfo

Returns a ProgramId and the title-version for it.

  • Output u32 with ARMS-gamecard: title-version v131162. This is the title-version for 2.1.0, which is the sysupdate included with this gamecard. Launch-day gamecards return title-version v450.
  • Output u64 with ARMS-gamecard: ProgramId 0100000000000816.

NS appears to only use this with NCM for checking whether a sysupdate is required.

GetGameCardDeviceCertificate

Takes a type-0x6 output buffer, an u32 GameCardHandle and an u64 DeviceCertificateBufferSize. No output.

ChallengeCardExistence

Takes a type-0x6 output buffer, two type-0x5 input buffers and an u32 GameCardHandle. No output.

[9.0.0+] The account system module uses this as part of a new challenge-response mechanism for application authentication.

GetGameCardCompatibilityType

Takes an u32 GameCardHandle, returns an u8 CompatibilityType (0x00 = Global, 0x01 = China) from Gamecard Info.

GetSdmmcConnectionStatus

Takes a total of 4-bytes of input, returns a total of 8-bytes of output.

SetDeviceSimulationEvent

Takes a total of 0x14-bytes of input, no output.

ClearDeviceSimulationEvent

Takes a total of 4-bytes of input, no output.

IEventNotifier

This is "nn::fssrv::sf::IEventNotifier".

Cmd Name
0 #GetEventHandle

GetEventHandle

No input, returns an output Event handle. With official sw the EventClearMode is user-specified.

ISaveDataTransferManager

This is "nn::fssrv::sf::ISaveDataTransferManager".

This was added with 4.0.0.

Cmd Name
0 #GetChallenge
16 #SetToken
32 #OpenSaveDataExporter
64 #OpenSaveDataImporter

GetChallenge

No input/output, takes a type-0x6 output buffer.

SetToken

No input/output, takes a type-0x5 input buffer.

OpenSaveDataExporter

Takes an input u8 #SaveDataSpaceId and u64, returns an #ISaveDataExporter.

OpenSaveDataImporter

Takes an input u8 #SaveDataSpaceId and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an #ISaveDataImporter.

ISaveDataTransferManagerForSaveDataRepair

This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair".

This was added with 9.0.0.

Cmd Name
0 #GetChallenge
16 #SetKeyPackage
80 #OpenSaveDataExporterAndGetEncryptedKey
81 #PrepareOpenSaveDataImporter
90 #OpenSaveDataImporter
91 #OpenSaveDataImporter2
100 #OpenSaveDataExporterWithKey
110 #OpenSaveDataImporterWithKey

SetKeyPackage

No input/output, takes a type-0x5 input buffer.

OpenSaveDataExporterAndGetEncryptedKey

Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an #ISaveDataDivisionExporter.

PrepareOpenSaveDataImporter

Takes a type-0x1A output buffer to receive a RsaEncryptedKey.

OpenSaveDataImporter

Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an #ISaveDataDivisionImporter.

OpenSaveDataImporter2

Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.

OpenSaveDataExporterWithKey

Takes a total of 0x20-bytes of input, returns an #ISaveDataDivisionExporter.

OpenSaveDataImporterWithKey

Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.

ISaveDataMover

This is "nn::fssrv::sf::ISaveDataMover".

This was added with 10.0.0.

Cmd Name
8 #Register
16 #Process
18 #Cancel

Register

Takes an input u64, no output.

Process

Takes an input u64, returns an output u64.

Cancel

No input/output.

ISaveDataExporter

This is "nn::fssrv::sf::ISaveDataExporter".

This was added with 4.0.0.

Cmd Name
0 #GetSaveDataInfo
1 #GetRestSize
16 #Pull
17 #PullInitialData

GetSaveDataInfo

No input/output, takes a type-0x1A #SaveDataInfo output buffer.

The actual name for this is the SaveDataExporter constructor. This is used automatically after #OpenSaveDataExporter by official sw.

GetRestSize

No input, returns an output u64.

Pull

Takes a type-0x6 output buffer, returns an output u64.

PullInitialData

No input/output, takes a type-0x6 output buffer.

ISaveDataImporter

This is "nn::fssrv::sf::ISaveDataImporter".

This was added with 4.0.0.

Cmd Name
0 #GetSaveDataInfo
1 #GetRestSize
16 #Push
17 #Finalize

GetSaveDataInfo

No input/output, takes a type-0x1A #GetSaveDataInfo output buffer.

The actual name for this is the SaveDataImporter constructor. This is used automatically after #OpenSaveDataImporter by official sw.

GetRestSize

No input, returns an output u64.

Push

No input/output, takes a type-0x5 input buffer.

Finalize

No input/output.

ISaveDataTransferManagerWithDivision

This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".

This was added with 5.0.0.

Cmd Name
0 #GetChallenge
16 #SetKeySeedPackage
32 #OpenSaveDataExporter
33 #OpenSaveDataExporterForDiffExport
34 [6.0.0+] #OpenSaveDataExporterByContext
64 [5.0.0-5.1.0] OpenSaveDataImporter
[6.0.0+] #OpenSaveDataImporterDeprecated
65 #OpenSaveDataImporterForDiffImport
66 [6.0.0+] #OpenSaveDataImporterForDuplicateDiffImport
67 [6.0.0+] #OpenSaveDataImporter
68 [6.0.0+] #OpenSaveDataImporterByContext
69 [6.0.0+] #CancelSuspendingImport
70 [10.0.0+] DecryptAndVerifyInitialData

GetChallenge

No input/output, takes a type-0x6 output buffer containing the Challenge.

SetKeySeedPackage

No input/output, takes a type-0x5 input buffer containing the KeySeedPackage.

OpenSaveDataExporter

Takes an input u8 #SaveDataSpaceId and u64. Returns an #ISaveDataDivisionExporter.

OpenSaveDataExporterForDiffExport

Takes an input u8 #SaveDataSpaceId, an u64, and a type-0x5 input buffer #InitialDataVersion2. Returns an #ISaveDataDivisionExporter.

OpenSaveDataExporterByContext

No input/output, takes a type-0x5 input buffer, returns an #ISaveDataDivisionExporter.

OpenSaveDataImporterDeprecated

Takes an input u8 #SaveDataSpaceId, a 0x10-byte userID, and a type-0x5 input buffer #InitialDataVersion2. Returns an #ISaveDataDivisionImporter.

OpenSaveDataImporterForDiffImport

Takes an input u8 #SaveDataSpaceId, an u64, and a type-0x5 input buffer #InitialDataVersion2, returns an #ISaveDataDivisionImporter.

OpenSaveDataImporterForDuplicateDiffImport

Takes an input u8 and an u64, and a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.

OpenSaveDataImporter

Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.

OpenSaveDataImporterByContext

No input/output, takes a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.

CancelSuspendingImport

Takes an input u64 and a 0x10-byte struct, no output.

ISaveDataDivisionExporter

This is "nn::fssrv::sf::ISaveDataDivisionExporter".

This was added with 5.0.0.

Cmd Name
0 #SetDivisionCount
1 [6.0.0+] #GetSaveDataInfo
16 #OpenSaveDataDiffChunkIterator
48 #OpenSaveDataChunkExporter
64 [6.0.0-8.1.0] #FinalizeFullExport
65 [6.0.0-8.1.0] #FinalizeDiffExport
66 [6.0.0+] #CancelExport
67 [6.0.0+] #SuspendExport
70 [6.0.0+] #GetKeySeed
71 [6.0.0+] #GetInitialDataMac
72 [6.0.0+] #FinalizeExport
73 [9.0.0+] #GetInitialDataMacKeyGeneration
80 [6.0.0+] #GetImportInitialDataAad
81 [6.0.0+] #SetExportInitialDataAad
96 [6.0.0+] #GetReportInfo

SetDivisionCount

Takes an input u32, no output.

OpenSaveDataChunkExporter

Takes an input u32, returns an #ISaveDataChunkExporter.

FinalizeFullExport

No input, returns two 0x10-byte output structs.

FinalizeDiffExport

No input, returns an output 0x10-byte struct.

CancelExport

No input/output.

SuspendExport

No input/output, takes a type-0x6 output buffer.

GetKeySeed

No input, returns an output 0x10-byte struct.

GetInitialDataMac

No input, returns an output 0x10-byte struct.

FinalizeExport

No input/output.

SetExportInitialDataAad

Takes an input 0x20-byte struct, no output.

ISaveDataDivisionImporter

This is "nn::fssrv::sf::ISaveDataDivisionImporter".

This was added with 5.0.0.

Cmd Name
0 [6.0.0+] #GetSaveDataInfo
16 #OpenSaveDataDiffChunkIterator
32 #InitializeImport
33 #FinalizeImport
34 [6.0.0+] #CancelImport
35 [6.0.0+] #GetImportContext
36 [6.0.0+] #SuspendImport
48 #OpenSaveDataChunkImporter
64 [6.0.0+] #GetImportInitialDataAad
80 [6.0.0+] #GetReportInfo

GetSaveDataInfo

No input/output, takes a type-0x6 output buffer.

OpenSaveDataDiffChunkIterator

No input, returns an #ISaveDataChunkIterator.

InitializeImport

No input, returns an output u64.

FinalizeImport

No input/output.

CancelImport

No input/output.

GetImportContext

No input/output, takes a type-0x6 output buffer.

SuspendImport

No input/output.

OpenSaveDataChunkImporter

Takes an input u32, returns an #ISaveDataChunkImporter.

GetImportInitialDataAad

No input, returns an output 0x20-byte struct.

GetReportInfo

No input, returns an output 0x20-byte struct.

ISaveDataChunkIterator

This is "nn::fssrv::sf::ISaveDataChunkIterator".

This was added with 5.0.0.

Cmd Name
0 #Next
1 #IsEnd
16 #GetId

Next

No input/output.

IsEnd

No input, returns an output u8.

GetId

No input, returns an output u32.

ISaveDataChunkExporter

This is "nn::fssrv::sf::ISaveDataChunkExporter".

This was added with 5.0.0.

Cmd Name
0 #Pull
16 [6.0.0+] #GetRestRawDataSize

Pull

Takes an input u64 and a type-0x6 output buffer, returns an output u64.

GetRestRawDataSize

No input, returns an output u64.

ISaveDataChunkImporter

This is "nn::fssrv::sf::ISaveDataChunkImporter".

This was added with 5.0.0.

Cmd Name
0 #Push

Push

Takes an input u64 and a type-0x5 input buffer, no output.

ISaveDataTransferProhibiter

This was added with 6.0.0.

This doesn't seem to handle any commands (?).

IMultiCommitManager

This was added with 6.0.0.

Cmd Name
1 #Add
2 #Commit

Add

Takes an input #IFilesystem, no output.

Commit

No input/output.

IWiper

This is "nn::fs::IWiper".

This was added with 10.0.0.

Cmd Name
0 Startup
16 Process

Startup

No input. Returns an u64.

Process

No input. Returns an u64.

FileSystemProxyType

This is "nn::fs::FileSystemProxyType".

Value Name
0 Code
1 Rom
2 Logo
3 Control
4 Manual
5 Meta
6 Data
7 Package
8 [4.0.0+] RegisteredUpdate

ContentType

This is "nn::fs::ContentType".

Value Name
0 Meta
1 Control
2 Manual
3 Logo
4 Data

ContentStorageId

This is "nn::fs::ContentStorageId".

Value Name
0 System
1 User
2 SdCard

SaveDataSpaceId

This is "nn::fs::SaveDataSpaceId".

Value Name
0 System
1 User
2 SdSystem
3 [3.0.0+] Temporary
4 [4.0.0+] SdUser
100 [3.0.0+] ProperSystem
101 [3.0.0+] SafeMode

Determines the storage where the savedata is stored.

SaveDataType

This is "nn::fs::SaveDataType".

Value Name
0 System
1 Account
2 Bcat
3 Device
4 [3.0.0+] Temporary
5 [3.0.0+] Cache
6 [4.0.0+] SystemBcat

SaveDataRank

This is "nn::fs::SaveDataRank".

Value Name
0 Primary
1 Secondary

SaveDataEnumerateOption

This is "nn::fs::SaveDataEnumerateOption".

Value Name
1 AllRank

SaveDataFlags

This is "nn::fs::SaveDataFlags".

Value Name
1 KeepAfterResettingSystemSaveData
2 KeepAfterRefurbishment
4 KeepAfterResettingSystemSaveDataWithoutUserSaveData
8 NeedsSecureDelete

SaveDataMetaType

This is "nn::fs::SaveDataMetaType".

Value Name
0 None
1 Thumbnail
2 ExtensionContext

ImageDirectoryId

This is "nn::fs::ImageDirectoryId".

Value Name
0 Nand
1 SdCard

CloudBackupWorkStorageId

This is "nn::fs::CloudBackupWorkStorageId".

Value Name
0 Nand
1 SdCard

CustomStorageId

This is "nn::fs::CustomStorageId".

Value Name
0 System
1 SdCard

Priority

This is "nn::fs::Priority".

Value Name
0 Realtime
1 Normal
2 Low

PriorityRaw

This is "nn::fs::PriorityRaw".

Value Name
0 Realtime
1 Normal
2 Low
3 Background

AbortSpecifier

This is "nn::fs::AbortSpecifier".

Value Name
0 Default
1 Abort
2 ReturnResult

OperationId

This is "nn::fs::OperationId".

Value Name
0 Clear
1 ClearSignature
2 InvalidateCache
3 QueryRange

MountHostOption

This is "nn::fs::MountHostOption".

Value Name
1 PseudoCaseSensitive

BisPartitionId

This is "nn::fs::BisPartitionId".

Value Name
0 BootPartition1Root
10 BootPartition2Root
20 UserDataRoot
21 BootConfigAndPackage2Part1
22 BootConfigAndPackage2Part2
23 BootConfigAndPackage2Part3
24 BootConfigAndPackage2Part4
25 BootConfigAndPackage2Part5
26 BootConfigAndPackage2Part6
27 CalibrationBinary
28 CalibrationFile
29 SafeMode
30 User
31 System
32 SystemProperEncryption
33 SystemProperPartition
34 SignedSystemPartitionOnSafeMode

MmcSpeedMode

This is "nn::fs::MmcSpeedMode".

Value Name
0 Identification
1 LegacySpeed
2 HighSpeed
3 Hs200
4 Hs400
5 Unknown

MmcPartition

This is "nn::fs::MmcPartition".

Value Name
0 UserData
1 BootPartition1
2 BootPartition2

GameCardPartition

This is "nn::fs::GameCardPartition".

Value Name
0 Update
1 Normal
2 Secure
3 [4.0.0+] Logo

GameCardPartitionRaw

This is "nn::fs::GameCardPartitionRaw".

Value Name
0 NormalReadOnly
1 SecureReadOnly
2 RootWriteOnly

GameCardAttribute

This is "nn::fs::GameCardAttribute".

Value Name
1 AutoBootFlag
2 HistoryEraseFlag
4 [4.0.0+] RepairToolFlag
8 [9.0.0+] DifferentRegionCupToTerraDeviceFlag
16 [9.0.0+] DifferentRegionCupToGlobalDeviceFlag

GameCardSize

This is "nn::fs::GameCardSize".

Value Name
1 Size1GB
2 Size2GB
4 Size4GB
8 Size8GB
16 Size16GB
32 Size32GB

GameCardClockRate

This is "nn::fs::GameCardClockRate".

Value Name
25 ClockRate25MHz
50 ClockRate50MHz

SimulatingDeviceType

This is "nn::fs::SimulatingDeviceType".

Value Name
0 eMMC
1 SdCard
2 GameCard

SimulatingDeviceDetectionMode

This is "nn::fs::SimulatingDeviceDetectionMode".

Value Name
0 NoSimulation
1 DeviceAttached
2 DeviceRemoved

SimulatingDeviceAccessFailureEventType

This is "nn::fs::SimulatingDeviceAccessFailureEventType".

Value Name
0 None
1 AccessTimeoutFailure
2 AccessFailure
3 DataCorruption

SimulatingDeviceTargetOperation

This is "nn::fs::SimulatingDeviceTargetOperation".

Value Name
1 Read
2 Write

SpeedEmulationMode

This is "nn::fs::SpeedEmulationMode".

Value Name
0 None
1 Faster
2 Slower
3 Random

ContentPath

These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They're passed via X descriptors, and returned via various ncm/lr commands.

Path Notes
@SystemContent
@UserContent
@SdCardContent
@CalibFile
@Safe
@User
@System
@Sdcard
@Host
@GcApp Gamecard App partition (Partition 2)
@GcXYYYYYYYY Gamecard Contents. X is the partition type (U - Update, N - Normal, S - Secure). Y is the gamecard handle as a 32-bit hex value
@upp Gamecard update partition (Partition 0)
[4.0.0+] @RegUpdate Registered update partition

SaveDataAttribute

This is "nn::fs::SaveDataAttribute".

Offset Size Description
0x0 0x8 ApplicationId (0 for SystemSaveData)
SaveData: 0 can be used for accessing the savedata associated with the current FS session ApplicationId, otherwise when set this is the ApplicationId associated with the savedata to access.
0x8 0x10 UserId
For user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from Account_services.
0x18 0x8 SystemSaveDataId (0 for SaveData)
0x20 0x1 #SaveDataType
0x21 0x1 #SaveDataRank
0x22 0x2 SaveDataIndex
0x24 0x4 Padding
0x28 0x8 0 for SystemSaveData/SaveData.
0x30 0x8 0 for SystemSaveData/SaveData.
0x38 0x8 0 for SystemSaveData/SaveData.

Total size is 0x40-bytes.

For DeviceSaveData, this struct is all-zero except for the #SaveDataType field (and optionally the ApplicationId if specified).

SaveDataCreationInfo

This is "nn::fs::SaveDataCreationInfo".

Offset Size Description
0x0 0x8 SaveDataSize
0x8 0x8 JournalSize
0x10 0x8 AvailableSize
0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData.
0x18 0x8 OwnerId
Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded ProgramId of the bcat-sysmodule.
0x20 0x4 #SaveDataFlags
Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.
0x24 0x1 #SaveDataSpaceId
Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.
0x25 0x1 Unknown. 0 for SystemSaveData/SaveData.
0x26 0x1A Not initialized for SystemSaveData/SaveData.

Total size is 0x40-bytes.

DeviceSaveData

This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the #SaveDataAttribute.

BcatSaveData

This is accessed using the same commands for SaveData with the same input u8. The #SaveDataAttribute is the same as DeviceSaveData (besides the SaveDataType), except that the ApplicationId field is always set to <input ApplicationId> (unlike DeviceSaveData where it's optional). See above regarding #SaveDataCreationInfo.

The 0x10-byte struct passed to #CreateSaveDataFileSystem has the first 0x5-bytes set to all-zero.

MountSystemBcatSaveData uses #OpenSaveDataFileSystemBySystemSaveDataId with #SaveDataSpaceId System. The #SaveDataAttribute is all-zero, except for the SaveDataType, and SystemSaveDataId is set to the input param.

SaveDataInfo

This is "nn::fs::SaveDataInfo".

Offset Size Description
0x0 0x8 SaveDataId
0x8 0x1 #SaveDataSpaceId
0x9 0x1 #SaveDataType
0xA 0x6 Padding?
0x10 0x10 UserId
0x20 0x8 SystemSaveDataId (0 for regular SaveData)
0x28 0x8 ApplicationId (for regular SaveData)
0x30 0x8 Raw saveimage size
0x38 0x2 SaveDataIndex
0x3A 0x1 #SaveDataRank
0x3B 0x25 Unknown. Usually zeros?

This is a 0x60-byte struct.

SaveDataFileSystemExtraData

This is a 0x200-byte struct. Appears to match Savegames#Extra_data.

InitialDataVersion2

This is a 0x8210-byte struct used by #ISaveDataTransferManagerWithDivision.