Filesystem services: Difference between revisions

Shchmue (talk | contribs)
CreateSaveDataFileSystem: info about struct
(13 intermediate revisions by 2 users not shown)
Line 15: Line 15:
== OpenCodeFileSystem ==
== OpenCodeFileSystem ==
Takes an [[NCM_services#ProgramId|ProgramId]] and a [[#ContentPath]]. Returns an [[#IFileSystem]].
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 ==
== IsArchivedProgram ==
Line 35: Line 37:
| 2 || [4.0.0+] [[#SetCurrentProcess]]
| 2 || [4.0.0+] [[#SetCurrentProcess]]
|-
|-
| 256 || [[#SetEnabledProgramVerification]]
| 256 || [1.0.0-9.2.0] [[#SetEnabledProgramVerification]]
|}
|}


Line 50: 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 116: 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 142: Line 146:
| 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
Line 155: Line 161:
|-
|-
| 85 || [9.0.0+] [[#OpenSaveDataTransferManagerForSaveDataRepair]]
| 85 || [9.0.0+] [[#OpenSaveDataTransferManagerForSaveDataRepair]]
|-
| 86 || [10.0.0+] [[#OpenSaveDataMover]]
|-
|-
| 100 || OpenImageDirectoryFileSystem
| 100 || OpenImageDirectoryFileSystem
Line 160: Line 168:
| 110 || [[#OpenContentStorageFileSystem]]
| 110 || [[#OpenContentStorageFileSystem]]
|-
|-
| 120 || [6.0.0+] [[#OpenCloudBackupWorkStorageFileSystem]]
| 120 || [6.0.0-9.2.0] [[#OpenCloudBackupWorkStorageFileSystem]]
|-
|-
| 130 || [7.0.0+] [[#OpenCustomStorageFileSystem]]
| 130 || [7.0.0+] [[#OpenCustomStorageFileSystem]]
Line 246: Line 254:
| 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 273: Line 281:
|-
|-
| 1013 || [9.0.0+] UnsetSaveDataRootPath
| 1013 || [9.0.0+] UnsetSaveDataRootPath
|-
| 1014 || [10.0.0+] OutputMultiProgramTagAccessLog
|-
|-
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey
Line 279: Line 289:
|-
|-
| 1200 || [6.0.0+] [[#OpenMultiCommitManager]]
| 1200 || [6.0.0+] [[#OpenMultiCommitManager]]
|-
| 1300 || [10.0.0+] [[#OpenBisWiper]]
|}
|}


Line 295: Line 307:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! AccessibilityType || Mask || Name || Value || Used by
! 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]]
|-
|-
| 0x0 || 0x8000000000000801 || CanMountLogo || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
| 0x8 || CanMountImageAndVideoStorage ||0x8000000000001000 || RW || [[#OpenImageDirectoryFileSystem]]
|-
|-
| 0x1 || 0x8000000000000801 || CanMountContentMeta || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
| ([1.0.0-5.1.0] 0x9) || || 0x8000000000000084 || ||  
|-
|-
| 0x2 || 0x8000000000000801 || CanMountContentControl || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
| ([6.0.0-9.2.0] 0x9) || CanMountCloudBackupWorkStorage || 0x8000000200000000 || RW || OpenCloudBackupWorkStorageFileSystem
|-
|-
| 0x3 || 0x8000000000000801 || CanMountContentManual || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
| 0x9 || CanMountCustomStorage0 || 0x8000000000000000 || RW || OpenCustomStorageFileSystem
|-
|-
| 0x4 || 0x8000000000000801 || CanMountContentData || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
| ([1.0.0-5.1.0] 0xA) || || 0x8000000000000080 || ||
|-
|-
| 0x5 || 0x8000000000000801 || CanMountApplicationPackage || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
| ([6.0.0-6.2.0] 0xA) || || 0x8000000000000084 || ||
|-
|-
| 0x6 || 0x8000000000000000 || CanMountSaveDataStorage || 3 ||
| ([7.0.0-7.0.1] 0xA) || || 0x4000000000000000 || ||
|-
|-
| 0x7 || 0x8000000000000800 || CanMountContentStorage || 3 || [[#OpenContentStorageFileSystem]]
| ([8.0.0-9.2.0] 0xA) || || 0x8000000000000000 || ||
|-
|-
| 0x8 || 0x8000000000001000 || CanMountImageAndVideoStorage || 3 || [[#OpenImageDirectoryFileSystem]]
| 0xA || CanMountBisCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisFileSystem]]
|-
|-
| 0x9 || 0x8000000200000000<br/>([1.0.0-5.1.0] 0x8000000000000084) || CanMountCloudBackupWorkStorage || 3 || OpenCloudBackupWorkStorageFileSystem
| ([1.0.0-5.1.0] 0xB) || || 0x8000000000008080 || ||
|-
|-
| 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) || CanMountCustomStorage0 || 3 || OpenCustomStorageFileSystem
| ([6.0.0-6.2.0] 0xB) || || 0x8000000000000080 || ||
|-
|-
| 0xB || 0x8000000000000084<br/>([6.0.0-6.2.0] 0x8000000000000080)<br/>([1.0.0-5.1.0] 0x8000000000008080) || CanMountBisCalibrationFile || 3 || [[#OpenBisFileSystem]]
| ([7.0.0-9.2.0] 0xB) || || 0x8000000000000084 || ||
|-
|-
| 0xC || 0x8000000000000080<br/>([1.0.0-6.2.0] 0x8000000000008080) || CanMountBisSafeMode || 3 || [[#OpenBisFileSystem]]
| 0xB || CanMountBisSafeMode || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
|-
|-
| 0xD || 0x8000000000008080<br/>([1.0.0-5.1.0] 0x8000000000000080) || CanMountBisUser || 3 || [[#OpenBisFileSystem]]
| ([1.0.0-6.2.0] 0xC) || || 0x8000000000008080 || ||
|-
|-
| 0xE || 0x8000000000008080<br/>([3.0.0-6.2.0] 0x8000000000000080)<br/>([1.0.0-2.3.0] 0xC000000000200000) || CanMountBisSystem || 3 || [[#OpenBisFileSystem]]
| ([7.0.0-9.2.0] 0xC) || || 0x8000000000000080 || ||
|-
|-
| 0xF || 0x8000000000000080<br/>([3.0.0-5.1.0] 0xC000000000200000)<br/>([1.0.0-2.3.0] 0x8000000000000010) || CanMountBisSystemProperEncryption || 3 || [[#OpenBisFileSystem]]
| 0xC || CanMountBisUser || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
|-
|-
| 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]]
| ([1.0.0-5.1.0] 0xD) || || 0x8000000000000080 || ||
|-
|-
| 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]]
| ([6.0.0-9.2.0] 0xD) || || 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]]
| 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
|-
|-
| 0x13 || 0x8000000000040020<br/>([6.0.0-6.2.0] 0x8000000000000028)<br/>([1.0.0-5.1.0] 0x8000000000000020) || CanMountDeviceSaveData || 3 || [[#OpenSaveDataFileSystem]]
| ([1.0.0-2.3.0] 0xE) || || 0xC000000000200000 || ||
|-
|-
| 0x14 || 0x8000000000000028<br/>([3.0.0-6.2.0] 0x8000000000000020)<br/>([1.0.0-2.3.0] 0x8000000000010082) || CanMountSystemSaveData || 3 || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
| ([3.0.0-6.2.0] 0xE) || || 0x8000000000000080 || ||
|-
|-
| 0x15 || 0x8000000000000020<br/>([3.0.0-5.1.0] 0x8000000000010082)<br/>([1.0.0-2.3.0] 0x8000000000010080) || CanMountOthersSaveData || 3 || [[#OpenSaveDataFileSystem]]
| ([7.0.0-9.2.0] 0xE) || || 0x8000000000008080 || ||
|-
|-
| 0x16 || 0x8000000000000020<br/>([6.0.0-6.2.0] 0x8000000000010082)<br/>([1.0.0-5.1.0] 0x8000000000010080) || CanMountOthersSystemSaveData || 3 || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
| 0xE || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
|-
|-
| 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]]
| ([1.0.0-2.3.0] 0xF) || || 0x8000000000000010 || ||
|-
|-
| 0x18 || 0x8000000000010080<br/>([6.0.0-6.2.0] 0x8000000000000080)<br/>([1.0.0-5.1.0] 0x8000000000010080) || CanOpenBisPartitionBootPartition2Root || 3 || [[#OpenBisStorage]]
| ([3.0.0-5.1.0] 0xF) || || 0xC000000000200000 || ||
|-
|-
| 0x19 || 0x8000000000000080<br/>([6.0.0-6.2.0] 0x8000000000010080) || CanOpenBisPartitionUserDataRoot || 3 || [[#OpenBisStorage]]
| ([6.0.0-9.2.0] 0xF) || || 0x8000000000000080 || ||
|-
|-
| 0x1A || 0x8000000000010080 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 3 || [[#OpenBisStorage]]
| 0xF || CanMountBisSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
|-
|-
| 0x1B || 0x8000000000010080 || CanOpenBisPartitionBootConfigAndPackage2Part2 || 3 || [[#OpenBisStorage]]
| ([1.0.0-2.3.0] 0x10) || || 0x8000000000040020 || ||
|-
|-
| 0x1C || 0x8000000000010080 || CanOpenBisPartitionBootConfigAndPackage2Part3 || 3 || [[#OpenBisStorage]]
| ([3.0.0-5.1.0] 0x10) || || 0x8000000000000010 || ||
|-
|-
| 0x1D || 0x8000000000010080<br/>([1.0.0-2.3.0] 0x8000000000000084) || CanOpenBisPartitionBootConfigAndPackage2Part4 || 3 || [[#OpenBisStorage]]
| ([6.0.0-6.2.0] 0x10) || || 0xC000000000200000 || ||
|-
|-
| 0x1E || 0x8000000000010080<br/>([1.0.0-5.1.0] 0x8000000000000084) || CanOpenBisPartitionBootConfigAndPackage2Part5 || 3 || [[#OpenBisStorage]]
| ([7.0.0-9.2.0] 0x10) || || 0x8000000000000080 || ||
|-
|-
| 0x1F || 0x8000000000010080<br/>([6.0.0-6.2.0] 0x8000000000000084)<br/>([1.0.0-2.3.0] 0x8000000000000080) || CanOpenBisPartitionBootConfigAndPackage2Part6 || 3 || [[#OpenBisStorage]]
| 0x10 || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]]
|-
|-
| 0x20 || 0x8000000000000084<br/>([1.0.0-5.1.0] 0x8000000000000080) || CanOpenBisPartitionCalibrationBinary || 3 || [[#OpenBisStorage]]
| ([1.0.0-2.3.0] 0x11) || || 0x8000000000000028 || ||
|-
|-
| 0x21 || 0x8000000000000084<br/>([6.0.0-6.2.0] 0x8000000000000080) || CanOpenBisPartitionCalibrationFile || 3 || [[#OpenBisStorage]]
| ([3.0.0-5.1.0] 0x11) || || 0x8000000000040020 || ||
|-
|-
| 0x22 || 0x8000000000000080 || CanOpenBisPartitionSafeMode || 3 || [[#OpenBisStorage]]
| ([6.0.0-6.2.0] 0x11) || || 0x8000000000000010 || ||
|-
|-
| 0x23 || 0x8000000000000080<br/>([1.0.0-2.3.0] 0xC000000000200000) || CanOpenBisPartitionUser || 3 || [[#OpenBisStorage]]
| ([7.0.0-9.2.0] 0x11) || || 0xC000000000200000 || ||
|-
|-
| 0x24 || 0x8000000000000080<br/>([1.0.0-2.3.0] 0x8000000000000100) || CanOpenBisPartitionSystem || 3 || [[#OpenBisStorage]]
| 0x11 || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]]
|-
|-
| 0x25 || 0x8000000000000080<br/>([3.0.0-5.1.0] 0xC000000000200000)<br/>([1.0.0-2.3.0] 0x8000000000100008) || CanOpenBisPartitionSystemProperEncryption || 3 || [[#OpenBisStorage]]
| ([1.0.0-2.3.0] 0x12) || || 0x8000000000000020 || ||
|-
|-
| 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]]
| ([3.0.0-5.1.0] 0x12) || || 0x8000000000000028 || ||
|-
|-
| [3.0.0+] 0x27 || 0xC000000000200000<br/>([6.0.0-6.2.0] 0x8000000000000100)<br/>([3.0.0-5.1.0] 0x8000000000100008) || CanOpenSdCardStorage || ||
| ([6.0.0-6.2.0] 0x12) || || 0x8000000000040020 || ||
|-
|-
| [3.0.0+] 0x28 || 0x8000000000000100<br/>([6.0.0-6.2.0] 0x8000000000100008)<br/>([3.0.0-5.1.0] 0xC000000000400000) || CanOpenGameCardStorage || 3 || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)
| ([7.0.0-9.2.0] 0x12) || || 0x8000000000000010 || ||
|-
|-
| [4.0.0+] 0x29 || 0x8000000000100008<br/>([6.0.0-6.2.0] 0xC000000000400000)<br/>([4.0.0-5.1.0] 0x8000000000010000) || CanMountSystemDataPrivate || 1 || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
| 0x12 || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]]
|-
|-
| [5.0.0+] 0x2A || 0xC000000000400000<br/>([6.0.0-6.2.0] 0x8000000000010000)<br/>([5.0.0-5.1.0] 0x8000000000000000) || CanMountHost || 3 || [[#OpenHostFileSystem]]
| ([1.0.0-5.1.0] 0x13) || || 0x8000000000000020 || ||
|-
|-
| [6.0.0+] 0x2B || 0x8000000000010000<br/>([6.0.0-6.2.0] 0x8000000000000000) || CanMountRegisteredUpdatePartition || 1 || [[#OpenRegisteredUpdatePartition]]
| ([6.0.0-6.2.0] 0x13) || || 0x8000000000000028 || ||
|-
|-
| [7.0.0+] 0x2C || 0x8000000000000000 || CanOpenSaveDataInternalStorage || 3 || [[#OpenSaveDataInternalStorageFileSystem]]
| ([7.0.0-9.2.0] 0x13) || || 0x8000000000040020 || ||
|-
|-
| [7.0.0+] 0x2D || 0x0000000000000000 || CanNotMountCustomStorage || 3 || OpenCustomStorageFileSystem
| 0x13 || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
|}
 
=== Call ===
{| class="wikitable" border="1"
|-
|-
! OperationType || Mask || Name || Used by
| ([1.0.0-2.3.0] 0x14) || || 0x8000000000010082 || ||
|-
|-
| 0x0 || 0x8000000000000080 || CanInvalidateBisCache || [[#InvalidateBisCache]]
| ([3.0.0-6.2.0] 0x14) || || 0x8000000000000020 || ||
|-
|-
| 0x1 || 0x8000000000000080 || CanEraseMmc || EraseMmc
| ([7.0.0-9.2.0] 0x14) || || 0x8000000000000028 || ||
|-
|-
| 0x2 || 0x8000000000000010 || CanGetGameCardDeviceCertificate || GetGameCardDeviceCertificate
| 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]]
|-
|-
| 0x3 || 0x8000000000000010 || CanGetGameCardIdSet || GetGameCardIdSet
| ([1.0.0-2.3.0] 0x15) || || 0x8000000000010080 || ||
|-
|-
| 0x4 || 0x8000000000000200 || CanFinalizeGameCardDriver || FinalizeGameCardDriver
| ([3.0.0-5.1.0] 0x15) || || 0x8000000000010082 || ||
|-
|-
| 0x5 || 0x8000000000000200 || CanGetGameCardAsicInfo || GetGameCardAsicInfo
| ([6.0.0-9.2.0] 0x15) || || 0x8000000000000020 || ||
|-
|-
| 0x6 || 0x8000000000002020 || CanCreateSaveData || [[#CreateSaveDataFileSystem]]
| 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
|-
|-
| 0x7 || 0x8000000000000060 || CanDeleteSaveData || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
| ([1.0.0-5.1.0] 0x16) || || 0x8000000000010080 || ||
|-
|-
| 0x8 || 0x8000000000000028 || CanCreateSystemSaveData || CreateSaveDataFileSystemBySystemSaveDataId
| ([6.0.0-6.2.0] 0x16) || || 0x8000000000010082 || ||
|-
|-
| 0x9 || 0x8000000000000020 || CanCreateOthersSystemSaveData || CreateSaveDataFileSystemBySystemSaveDataId
| ([7.0.0-9.2.0] 0x16) || || 0x8000000000000020 || ||
|-
|-
| 0xA || 0x8000000000004028 || CanDeleteSystemSaveData || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
| 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]]
|-
|-
| 0xB || 0x8000000000000060 || CanOpenSaveDataInfoReader || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
| ([1.0.0-2.3.0] 0x17) || || 0x8000000000010080 || ||
|-
|-
| 0xC || 0x8000000000004020 || CanOpenSaveDataInfoReaderForSystem || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
| ([3.0.0-5.1.0] 0x17) || || 0x8000000000000080 || ||
|-
|-
| 0xD || 0x8000000000000040<br/>([1.0.0-5.1.0] 0x8000000000020000) || CanOpenSaveDataInfoReaderForInternal || [[#OpenSaveDataInfoReaderWithFilter]]
| ([6.0.0-6.2.0] 0x17) || || 0x8000000000010080 || ||
|-
|-
| 0xE || 0x8000000000020000<br/>([1.0.0-5.1.0] 0x8000000000000400) || CanOpenSaveDataMetaFile || OpenSaveDataMetaFile
| ([7.0.0-9.2.0] 0x17) || || 0x8000000000010082 || ||
|-
|-
| 0xF || 0x8000000000000400<br/>([1.0.0-5.1.0] 0x8000000000004060) || CanSetCurrentPosixTime || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
| 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x10 || 0x8000000000004060<br/>([1.0.0-5.1.0] 0x8000000000080000) || CanReadSaveDataFileSystemExtraData || [[#ReadSaveDataFileSystemExtraData]]
| ([1.0.0-5.1.0] 0x18) || || 0x8000000000010080 || ||
|-
|-
| 0x11 || 0x8000000000080000 || CanSetGlobalAccessLogMode || [[#SetGlobalAccessLogMode]]
| ([6.0.0-6.2.0] 0x18) || || 0x8000000000000080 || ||
|-
|-
| 0x12 || 0x8000000000080000<br/>([1.0.0-5.1.0] Invalid) || CanSetSpeedEmulationMode || SetSpeedEmulationMode
| ([7.0.0-9.2.0] 0x18) || || 0x8000000000010080 || ||
|-
|-
| 0x13 || Invalid<br/>([1.0.0-5.1.0] 0xC000000000800000) || ||  
| 0x18 || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x14 || 0xC000000000800000<br/>([1.0.0-5.1.0] 0xC000000001000000) || CanFillBis || CreatePaddingFile, DeleteAllPaddingFiles
| ([6.0.0-6.2.0] 0x19) || || 0x8000000000010080 || ||
|-
|-
| 0x15 || 0xC000000001000000<br/>([5.0.0-5.1.0] 0x8000000001000060)<br/>([1.0.0-4.1.0] 0xC000000002000000) || CanCorruptSaveData || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
| ([7.0.0-9.2.0] 0x19) || || 0x8000000000000080 || ||
|-
|-
| [2.0.0+] 0x16 || 0x8000000001000060<br/>([5.0.0-5.1.0] 0x8000000000000060)<br/>([2.0.0-4.1.0] 0x8000000004000000) || CanCorruptSystemSaveData || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
| 0x19 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| [2.0.0+] 0x17 || 0x8000000000000060<br/>([5.0.0-5.1.0] 0xC000000002000000)<br/>([2.0.0-4.1.0] 0x8000000008000000) || CanVerifySaveData || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId
| ([1.0.0-9.2.0] 0x1A) || || 0x8000000000010080 || ||
|-
|-
| [2.0.0+] 0x18 || 0xC000000002000000<br/>([5.0.0-5.1.0] 0x8000000004000000)<br/>([2.0.0-4.1.0] 0x8000000010000000) || CanDebugSaveData || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
| 0x1A || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| [2.0.0+] 0x19 || 0x8000000004000000<br/>([5.0.0-5.1.0] 0x8000000008000000)<br/>([2.0.0-4.1.0] 0x8000000000000800) || CanFormatSdCard || FormatSdCardFileSystem
| ([1.0.0-9.2.0] 0x1B) || || 0x8000000000010080 || ||
|-
|-
| [2.0.0+] 0x1A || 0x8000000008000000<br/>([5.0.0-5.1.0] 0x8000000010000000)<br/>([2.0.0-4.1.0] 0x8000000000004020) || CanGetRightsId || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
| 0x1B || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| [3.0.0+] 0x1B || 0x8000000010000000<br/>([5.0.0-5.1.0] 0x8000000000000800)<br/>([3.0.0-4.1.0] 0x8000000000002020) || CanRegisterExternalKey || RegisterExternalKey, UnregisterAllExternalKey
| ([1.0.0-9.2.0] 0x1C) || || 0x8000000000010080 || ||
|-
|-
| [3.0.0+] 0x1C || 0x8000000000000800<br/>([5.0.0-5.1.0] 0x8000000000004020)<br/>([3.0.0-4.1.0] 0x8000000000000028) || CanSetEncryptionSeed || [[#SetSdCardEncryptionSeed]]
| 0x1C || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| [4.0.0+] 0x1D || 0x8000000000000020<br/>([5.0.0-5.1.0] 0x8000000000000000)<br/>([4.0.0-4.1.0] 0x8000000020000000) || CanWriteSaveDataFileSystemExtraDataTimeStamp || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
| ([1.0.0-2.3.0] 0x1D) || || 0x8000000000000084 || ||
|-
|-
| [4.0.0+] 0x1E || 0x8000000000004020<br/>([5.0.0-5.1.0] 0x8000000000002020)<br/>([4.0.0-4.1.0] 0x8000000040000000) || CanWriteSaveDataFileSystemExtraDataFlags || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
| ([3.0.0-9.2.0] 0x1D) || || 0x8000000000010080 || ||
|-
|-
| [4.0.0+] 0x1F || 0x8000000000000020<br/>([5.0.0-5.1.0] 0x8000000000000028)<br/>([4.0.0-4.1.0] 0x8000000000000000) || CanWriteSaveDataFileSystemExtraDataCommitId || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
| 0x1D || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| [4.0.0+] 0x20 || 0x8000000000000000<br/>([5.0.0-5.1.0] 0x8000000020000000)<br/>([4.0.0-4.1.0] 0x8000000000000000) || CanWriteSaveDataFileSystemExtraDataAll || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
| ([1.0.0-5.1.0] 0x1E) || || 0x8000000000000084 || ||
|-
|-
| [5.0.0+] 0x21 || 0x8000000000002020<br/>([1.0.0-5.1.0] 0x8000000040000000) || CanExtendSaveData || ExtendSaveDataFileSystem
| ([6.0.0-9.2.0] 0x1E) || || 0x8000000000010080 || ||
|-
|-
| [5.0.0+] 0x22 || 0x8000000000000028<br/>([1.0.0-5.1.0] 0x0000000080000002) || CanExtendSystemSaveData || ExtendSaveDataFileSystem
| 0x1E || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| [5.0.0+] 0x23 || 0x8000000020000000<br/>([1.0.0-5.1.0] 0x8000000000000000) || CanRegisterUpdatePartition || RegisterUpdatePartition
| ([1.0.0-5.1.0] 0x1F) || || 0x8000000000000080 || ||
|-
|-
| [5.0.0+] 0x24 || 0x8000000040000000<br/>([1.0.0-5.1.0] 0x8000000000000000) || CanOpenSaveDataTransferManager || [[#OpenSaveDataTransferManager]]
| ([6.0.0-6.2.0] 0x1F) || || 0x8000000000000084 || ||
|-
|-
| [5.0.0+] 0x25 || 0x8000000200000000<br/>([1.0.0-5.1.0] 0x8000000080200000) || CanOpenSaveDataTransferManagerVersion2 || [[#OpenSaveDataTransferManagerVersion2]]
| ([7.0.0-9.2.0] 0x1F) || || 0x8000000000010080 || ||
|-
|-
| [5.0.0+] 0x26 || 0x8000000200000000<br/>([6.0.0-8.1.0] 0x8000000200002000)<br/>([5.0.0-5.1.0] 0x8000000080000110) || CanOpenSaveDataTransferManagerForSaveDataRepair || OpenSaveDataTransferManagerForSaveDataRepair
| 0x1F || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]]
|-
|-
| [5.0.0+] 0x27 || 0x8000000000000000<br/>([8.0.0-8.1.0] 0x8000000240002000)<br/>([6.0.0-7.0.1] 0x8000000200002000)<br/>([5.0.0-5.1.0] 0x8000000000100008) || CanOpenSaveDataTransferManagerForSaveDataRepairTool || OpenSaveDataTransferManagerForSaveDataRepair
| ([1.0.0-5.1.0] 0x20) || || 0x8000000000000080 || ||
|-
|-
| [5.0.0+] 0x28 || 0x8000000200002000<br/>([6.0.0-8.1.0] 0x8000000000000000)<br/>([5.0.0-5.1.0] 0x8000000080010000) || CanOpenOpenSaveDataTransferProhibiter || [[#OpenSaveDataTransferProhibiter]]
| ([6.0.0-9.2.0] 0x20) || || 0x8000000000000084 || ||
|-
|-
| [5.0.0+] 0x29 || 0x8000000240002000<br/>([6.0.0-8.1.0] 0x8000000000000000)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanListAccessibleSaveDataOwnerId || [[#ListAccessibleSaveDataOwnerId]]
| 0x20 || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]]
|-
|-
| [5.0.0+] 0x2A || 0x8000000000000000<br/>([6.0.0-8.1.0] 0x8000000080200000)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanControlMmcPatrol || SuspendMmcPatrol, ResumeMmcPatrol
| ([6.0.0-6.2.0] 0x21) || || 0x8000000000000080 || ||
|-
|-
| [5.0.0+] 0x2B || 0x8000000000000000<br/>([6.0.0-8.1.0] 0x8000000080000110)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanOverrideSaveDataTransferTokenSignVerificationKey || OverrideSaveDataTransferTokenSignVerificationKey
| ([7.0.0-9.2.0] 0x21) || || 0x8000000000000084 || ||
|-
|-
| [5.0.0+] 0x2C || 0x8000000080200000<br/>([6.0.0-8.1.0] 0x8000000000100008)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanOpenSdCardDetectionEventNotifier || [[#OpenSdCardDetectionEventNotifier]]
| 0x21 || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| [5.0.0+] 0x2D || 0x8000000080000110<br/>([6.0.0-8.1.0] 0x8000000000010000)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanOpenGameCardDetectionEventNotifier || [[#OpenGameCardDetectionEventNotifier]]
| ([1.0.0-9.2.0] 0x22) || || 0x8000000000000080 || ||
|-
|-
| [5.0.0+] 0x2E || 0x8000000000100008<br/>([6.0.0-8.1.0] 0x8000000100000000)<br/>([5.0.0-5.1.0] 0x8000000040000000) || CanOpenSystemDataUpdateEventNotifier || OpenSystemDataUpdateEventNotifier
| 0x22 || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| [5.0.0+] 0x2F || 0x8000000000010000<br/>([6.0.0-8.1.0] 0x8000000100000000)<br/>([5.0.0-5.1.0] 0x8000000080200000) || CanNotifySystemDataUpdateEvent || NotifySystemDataUpdateEvent
| ([1.0.0-2.3.0] 0x23) || || 0xC000000000200000 || ||
|-
|-
| [5.1.0+] 0x30 || 0x8000000100000000<br/>([5.1.0-6.0.0] 0x8000000080080000) || CanOpenAccessFailureDetectionEventNotifier || [[#OpenAccessFailureDetectionEventNotifier]]
| ([3.0.0-9.2.0] 0x23) || || 0x8000000000000080 || ||
|-
|-
| [6.0.0+] 0x31 || 0x8000000100000000 || CanGetAccessFailureDetectionEvent || GetAccessFailureDetectionEvent
| 0x23 || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| [6.0.0+] 0x32 || 0x8000000100000000 || CanIsAccessFailureDetected || IsAccessFailureDetected
| ([1.0.0-2.3.0] 0x24) || || 0x8000000000000100 || ||
|-
|-
| [6.0.0+] 0x33 || 0x8000000100000000<br/>([6.0.0-8.1.0] 0x8000000040000000) || CanResolveAccessFailure || ResolveAccessFailure
| ([3.0.0-9.2.0] 0x24) || || 0x8000000000000080 || ||
|-
|-
| [6.0.0+] 0x34 || 0x8000000100000000<br/>([6.0.0-8.1.0] 0x8000000200000020) || CanAbandonAccessFailure || AbandonAccessFailure
| 0x24 || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| [6.0.0+] 0x35 || 0x8000000040000000<br/>([6.0.0-8.1.0] 0x8000000000200000) || CanQuerySaveDataInternalStorageTotalSize || QuerySaveDataInternalStorageTotalSize
| ([1.0.0-2.3.0] 0x25) || || 0x8000000000100008 || ||
|-
|-
| [6.0.0+] 0x36 || 0x8000000200000020<br/>([6.0.0-8.1.0] 0x4000000000000000) || CanGetSaveDataCommitId || [[#GetSaveDataCommitId]]
| ([3.0.0-5.1.0] 0x25) || || 0xC000000000200000 || ||
|-
|-
| [6.0.0+] 0x37 || 0x8000000000200000<br/>([7.0.0-8.1.0] 0x8000000000000000)<br/>([6.0.0-6.2.0] 0x8000000000080000) || CanSetSdCardAccessibility || SetSdCardAccessibility
| ([6.0.0-9.2.0] 0x25) || || 0x8000000000000080 || ||
|-
|-
| [6.0.0+] 0x38 || 0x4000000000000000<br/>([7.0.0-8.1.0] 0x8000000400000000)<br/>([6.0.0-6.2.0] 0x8000000000000000) || CanSimulateDevice || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent
| 0x25 || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| [8.0.0+] 0x39 || 0x8000000000000000<br/>([8.0.0-8.1.0] 0x8000000000000010) || CanCreateSaveDataWithHashSalt || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]
| ([1.0.0-2.3.0] 0x26) || || 0xC000000000400000 || ||
|-
|-
| [9.0.0+] 0x3A || 0x8000000400000000 || CanRegisterProgramIndexMapInfo || RegisterProgramIndexMapInfo
| ([3.0.0-5.1.0] 0x26) || || 0x8000000000000100 || ||
|-
|-
| [9.0.0+] 0x3B || 0x8000000000000010 || CanChallengeCardExistence || ChallengeCardExistence
| ([6.0.0-6.2.0] 0x26) || || 0xC000000000200000 || ||
|-
|-
| [9.0.0+] 0x3C || 0x8000000800000000 || CanCreateOwnSaveData || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt
| ([7.0.0-9.2.0] 0x26) || || 0x8000000000000080 || ||
|-
|-
| [9.0.0+] 0x3D || 0x8000000800000000 || CanReadOwnSaveDataFileSystemExtraData || [[#ReadSaveDataFileSystemExtraData]]
| 0x26 || CanOpenSdCardStorage || 0xC000000000200000 || RW ||  
|-
|-
| [9.0.0+] 0x3E || 0x8000000800000000 || CanExtendOwnSaveData || ExtendSaveDataFileSystem
| ([3.0.0-5.1.0] 0x27) || || 0x8000000000100008 || ||
|-
|-
| [9.0.0+] 0x3F || 0x8000000800000000 || CanOpenOwnSaveDataTransferProhibiter || [[#OpenSaveDataTransferProhibiter]]
| ([6.0.0-6.2.0] 0x27) || || 0x8000000000000100 || ||
|-
|-
| [9.0.0+] 0x40 || 0x8000000800000000 || CanFindOwnSaveDataWithFilter || [[#FindSaveDataWithFilter]]
| ([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)
== OpenFileSystem ==
|-
Takes a type-0x19 input [[#ContentPath]] and a [[#FileSystemProxyType]] as parameters. Returns an [[#IFileSystem]].
| ([3.0.0-5.1.0] 0x28) || || 0xC000000000400000 || ||
 
|-
[2.0.0+] This function was removed.
| ([6.0.0-6.2.0] 0x28) || || 0x8000000000100008 || ||
 
|-
== SetCurrentProcess ==
| ([7.0.0-9.2.0] 0x28) || || 0x8000000000000100 || ||
Takes a pid-descriptor.
|-
| [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 || ||
|}


== OpenFileSystemWithPatch ==
=== Call ===
Takes an input [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
{| class="wikitable" border="1"
 
|-
Web-applet loads the [[#FileSystemProxyType]] (which must be '''Manual''') from u32_table[inparam].
! OperationType || Name || Mask || Used by
 
|-
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
| 0x0 || CanInvalidateBisCache || 0x8000000000000080 || [[#InvalidateBisCache]]
 
|-
== OpenFileSystemWithId ==
| 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc
Takes a type-0x19 input buffer, an [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
|-
 
| 0x2 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate
The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.
|-
 
| 0x3 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
|-
 
| 0x4 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver
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.
|-
 
| 0x5 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.
|-
 
| 0x6 || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]]
After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.
|-
 
| 0x7 || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
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.
|-
 
| 0x8 || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId
== OpenBisFileSystem ==
|-
Takes a type-0x19 input buffer string and a [[#BisPartitionId]]. Official user-process code sets instr[0] = 0 normally. Returns an [[#IFileSystem]].
| 0x9 || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId
 
|-
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.
| 0xA || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
 
|-
== OpenBisStorage ==
| 0xB || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
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.
|-
 
| 0xC || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
== InvalidateBisCache ==
|-
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]].
| ([1.0.0-5.1.0] 0xD) || || 0x8000000000020000 ||
 
|-
== DeleteSaveDataFileSystem ==
| 0xD || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]]
Takes an input u64.
|-
 
| ([1.0.0-5.1.0] 0xE) || || 0x8000000000000400 ||
== CreateSaveDataFileSystem ==
|-
Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct.
| 0xE || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile
 
|-
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.
| ([1.0.0-5.1.0] 0xF) || || 0x8000000000004060 ||
 
|-
Creates regular savedata.
| 0xF || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
 
|-
== CreateSaveDataFileSystemBySystemSaveDataId ==
| ([1.0.0-5.1.0] 0x10) || || 0x8000000000080000 ||
Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]].
|-
 
| 0x10 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]]
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
|-
 
| 0x11 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]]
== OpenGameCardStorage ==
|-
Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].
| ([1.0.0-5.1.0] 0x12) || CanDebug || 0xC000000000000000 ||
 
|-
== OpenGameCardFileSystem ==
| 0x12 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]].
|-
 
| ([1.0.0-5.1.0] 0x13) || || 0xC000000000800000 ||
Mounts a [[Gamecard_Partition|gamecard partition]].
|-
 
| 0x13 || CanDebug || 0xC000000000000000 ||
== CreateSaveDataFileSystemWithHashSalt ==
|-
Takes a total of 0xB0-bytes of input, no output.
| ([1.0.0-5.1.0] 0x14) || || 0xC000000001000000 ||
 
|-
== OpenSaveDataFileSystem ==
| 0x14 || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8.
|-
 
| ([1.0.0-4.1.0] 0x15) || || 0xC000000002000000 ||
Returns an [[#IFileSystem]].
|-
 
| ([5.0.0-5.1.0] 0x15) || || 0x8000000001000060 ||
Permissions aren't checked until the specified save is successfully found.
|-
 
| 0x15 || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData).
|-
 
| ([2.0.0-4.1.0] 0x16) || || 0x8000000004000000 ||
== OpenSaveDataFileSystemBySystemSaveDataId ==
|-
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8.
| ([5.0.0-5.1.0] 0x16) || || 0x8000000000000060 ||
 
|-
Returns an [[#IFileSystem]].
| [2.0.0+] 0x16 || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
 
|-
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
| ([2.0.0-4.1.0] 0x17) || || 0x8000000008000000 ||
 
|-
== ReadSaveDataFileSystemExtraDataBySaveDataSpaceId ==
| ([5.0.0-5.1.0] 0x17) || || 0xC000000002000000 ||
Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
|-
 
| [2.0.0+] 0x17 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId
== ReadSaveDataFileSystemExtraData ==
|-
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
| ([2.0.0-4.1.0] 0x18) || || 0x8000000010000000 ||
 
|-
== OpenSaveDataInfoReader ==
| ([5.0.0-5.1.0] 0x18) || || 0x8000000004000000 ||
No input, returns an output [[#ISaveDataInfoReader]].
|-
 
| [2.0.0+] 0x18 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
== OpenSaveDataInfoReaderBySaveDataSpaceId ==
|-
Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]].
| ([2.0.0-4.1.0] 0x19) || || 0x8000000000000800 ||
 
|-
== FindSaveDataWithFilter ==
| ([5.0.0-5.1.0] 0x19) || || 0x8000000008000000 ||
Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer.
|-
 
| [2.0.0+] 0x19 || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem
== OpenSaveDataInfoReaderWithFilter ==
|-
Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]].
| ([2.0.0-4.1.0] 0x1A) || || 0x8000000000004020 ||
 
|-
== OpenSaveDataTransferManager ==
| ([5.0.0-5.1.0] 0x1A) || || 0x8000000010000000 ||
No input, returns an [[#ISaveDataTransferManager]].
|-
 
| [2.0.0+] 0x1A || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
== OpenSaveDataTransferManagerVersion2 ==
|-
No input, returns an [[#ISaveDataTransferManagerWithDivision]].
| ([3.0.0-4.1.0] 0x1B) || || 0x8000000000002020 ||
 
|-
== OpenSaveDataTransferProhibiter ==
| ([5.0.0-5.1.0] 0x1B) || || 0x8000000000000800 ||
Takes an input u64, returns an [[#ISaveDataTransferProhibiter]].
|-
 
| [3.0.0+] 0x1B || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey
== ListAccessibleSaveDataOwnerId ==
|-
Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer.
| ([3.0.0-4.1.0] 0x1C) || || 0x8000000000000028 ||
 
|-
== OpenSaveDataTransferManagerForSaveDataRepair ==
| ([5.0.0-5.1.0] 0x1C) || || 0x8000000000004020 ||
No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]].
|-
 
| [3.0.0+] 0x1C || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]]
== OpenContentStorageFileSystem ==
|-
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.
| ([4.0.0-4.1.0] 0x1D) || || 0x8000000020000000 ||
 
|-
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] 0x1D) || || 0x8000000000000000 ||
 
|-
== OpenCloudBackupWorkStorageFileSystem ==
| [4.0.0+] 0x1D || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
Takes 4-bytes of input, returns an [[#IFileSystem]].
|-
 
| ([4.0.0-4.1.0] 0x1E) || || 0x8000000040000000 ||
== OpenCustomStorageFileSystem ==
|-
Takes a [[#CustomStorageId]]. Invalid values return 0x2EE202.
| ([5.0.0-5.1.0] 0x1E) || || 0x8000000000002020 ||
 
|-
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.
| [4.0.0+] 0x1E || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 
|-
== OpenDataStorageByDataId ==
| ([4.0.0-4.1.0] 0x1F) || || 0x8000000000000000 ||
Takes a [[NCM_services#StorageId|StorageID]] and a [[NCM_services#DataId|DataId]].
|-
 
| ([5.0.0-5.1.0] 0x1F) || || 0x8000000000000028 ||
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.
|-
 
| [4.0.0+] 0x1F || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
== OpenDataFileSystemWithProgramIndex ==
|-
Takes an input u8, returns an [[#IFileSystem]].
| ([4.0.0-4.1.0] 0x20) || || 0x8000000000000000 ||
 
|-
== OpenDataStorageWithProgramIndex ==
| ([5.0.0-5.1.0] 0x20) || || 0x8000000020000000 ||
Takes an input u8, returns an [[#IStorage]].
|-
 
| [4.0.0+] 0x20 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
== OpenDeviceOperator ==
|-
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.
| ([5.0.0-5.1.0] 0x21) || || 0x8000000040000000 ||
 
|-
== OpenSdCardDetectionEventNotifier ==
| [5.0.0+] 0x21 || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
|-
 
| ([5.0.0-5.1.0] 0x22) || || 0x0000000080000002 ||
== OpenGameCardDetectionEventNotifier ==
|-
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
| [5.0.0+] 0x22 || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem
 
|-
== SimulateDeviceDetectionEvent ==
| ([5.0.0-5.1.0] 0x23) || || 0x8000000000000000 ||
Takes a total of 0xC-bytes of input, no output.
|-
 
| ([6.0.0-9.2.0] 0x23) || || 0x8000000020000000 ||
== VerifySaveDataFileSystem ==
|-
Takes an unknown input u64 and a type-0x6 output buffer.
| [5.0.0+] 0x23 || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem
 
|-
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).
| ([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]]
|}


== GetSaveDataCommitId ==
== OpenFileSystem ==
Takes an input u8 and u64, returns an output u64.
Takes a type-0x19 input [[#ContentPath]] and a [[#FileSystemProxyType]] as parameters. Returns an [[#IFileSystem]].


== SetSdCardEncryptionSeed ==
[2.0.0+] This function was removed.
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).
== SetCurrentProcess ==
Takes a pid-descriptor.


== OpenAccessFailureDetectionEventNotifier ==
== OpenFileSystemWithPatch ==
Takes 8-bytes of input and returns an [[#IEventNotifier]].
Takes an input [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].


[8.0.0+] Now takes an additional 8-bytes of input.
Web-applet loads the [[#FileSystemProxyType]] (which must be '''Manual''') from u32_table[inparam].


== SetSaveDataSize ==
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
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.
== OpenFileSystemWithId ==
Takes a type-0x19 input buffer, an [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].


These variables don't seem to be actually used anywhere else (?)
The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.


== SetSaveDataRootPath ==
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
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.
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.


== SetGlobalAccessLogMode ==
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.
Takes an input u32.


== SetGlobalAccessLogMode ==
After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.
Takes an input u32.


== GetGlobalAccessLogMode ==
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.
Returns an output u32.


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


== OutputAccessLogToSdCard ==
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.
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.
== 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.


User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.
== InvalidateBisCache ==
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]].


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.
== DeleteSaveDataFileSystem ==
Takes an input u64.


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).
== CreateSaveDataFileSystem ==
Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct which governs creation of a saveMeta file.


== GetProgramIndexForAccessLog ==
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 meta file size, +4 u8 = 1 meta index which dictates meta file name.
No input, returns two 32-bit values "version" and "program_index".
 
Creates non-system savedata.
 
== CreateSaveDataFileSystemBySystemSaveDataId ==
Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]].
 
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.


== OpenMultiCommitManager ==
== OpenGameCardStorage ==
No input, returns an output [[#IMultiCommitManager]].
Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].


= IStorage =
== OpenGameCardFileSystem ==
This is "nn::fssrv::sf::IStorage".
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]].


This is the interface for a raw device, usually a block device.
Mounts a [[Gamecard_Partition|gamecard partition]].


{| class="wikitable" border="1"
== CreateSaveDataFileSystemWithHashSalt ==
|-
Takes a total of 0xB0-bytes of input, no output.
! Cmd || Name
|-
| 0 || [[#Read]]
|-
| 1 || [[#Write]]
|-
| 2 || [[#Flush]]
|-
| 3 || [[#SetSize]]
|-
| 4 || [[#GetSize]]
|-
| 5 || [4.0.0+] OperateRange
|}


== Read ==
== OpenSaveDataFileSystem ==
Takes a type-0x46 buffer, an offset and length.
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8.


== Write ==
Returns an [[#IFileSystem]].
Takes a type-0x45 buffer, an offset and length.


== Flush ==
Permissions aren't checked until the specified save is successfully found.
No input.


== SetSize ==
Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData).
Takes a size.


== GetSize ==
== OpenSaveDataFileSystemBySystemSaveDataId ==
Returns a size.
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8.
 
Returns an [[#IFileSystem]].


= IFileSystem =
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
This is "nn::fssrv::sf::IFileSystem".


There are two main implementations of this interface:
== OpenReadOnlySaveDataFileSystem ==
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]], and returns an [[#IFileSystem]].


* '''nn::fs::fsa::IFileSystem''': The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface.
Mounts SaveData as ReadOnly.
* '''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:
== ReadSaveDataFileSystemExtraDataBySaveDataSpaceId ==
Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].


* '''nn::fssrv::detail::FileSystemInterfaceAdapter''': Allows access to an nn::fs::fsa::IFileSystem via the nn::fssrv::sf::IFileSystem interface.
== ReadSaveDataFileSystemExtraData ==
* '''nn::fs::detail::FileSystemServiceObjectAdapter''': Allows access to an nn::fssrv::sf::IFileSystem via the nn::fs::fsa::IFileSystem interface.
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].


When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC.
== OpenSaveDataInfoReader ==
Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it.
No input, returns an output [[#ISaveDataInfoReader]].


{| class="wikitable" border="1"
== OpenSaveDataInfoReaderBySaveDataSpaceId ==
|-
Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]].
! Cmd || Name
 
|-
== FindSaveDataWithFilter ==
| 0 || CreateFile
Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer.
|-
 
| 1 || DeleteFile
== OpenSaveDataInfoReaderWithFilter ==
|-
Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]].
| 2 || CreateDirectory
 
|-
== OpenSaveDataTransferManager ==
| 3 || DeleteDirectory
No input, returns an [[#ISaveDataTransferManager]].
|-
 
| 4 || DeleteDirectoryRecursively
== OpenSaveDataTransferManagerVersion2 ==
|-
No input, returns an [[#ISaveDataTransferManagerWithDivision]].
| 5 || RenameFile
 
|-
== OpenSaveDataTransferProhibiter ==
| 6 || RenameDirectory
Takes an input u64, returns an [[#ISaveDataTransferProhibiter]].
|-
| 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 ==
== ListAccessibleSaveDataOwnerId ==
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.
Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer.


== OpenFile ==
== OpenSaveDataTransferManagerForSaveDataRepair ==
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:
No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]].


* When bit 0 is set, the file is Readable: you can use the Read operation.
== OpenSaveDataMover ==
* When bit 1 is set, the file is Writable: you can use the Write operation.
Takes 2 input [[#SaveDataSpaceId]], an input u64 size and a TransferMemory handle. Returns an output [[#ISaveDataMover]].
* 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 ==
== OpenContentStorageFileSystem ==
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 a [[#ContentStorageId]]. Invalid values return 0x2EE202.


== Commit ==
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]].
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.


== GetFreeSpaceSize ==
== OpenCloudBackupWorkStorageFileSystem ==
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.
Takes 4-bytes of input, returns an [[#IFileSystem]].


== GetTotalSpaceSize ==
== OpenCustomStorageFileSystem ==
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 [[#CustomStorageId]]. Invalid values return 0x2EE202.


== CleanDirectoryRecursively ==
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.
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.


== GetFileTimeStampRaw ==
== OpenDataStorageByDataId ==
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.
Takes a [[NCM_services#StorageId|StorageID]] and a [[NCM_services#DataId|DataId]].


= IDirectory =
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.
This is "nn::fssrv::sf::IDirectory".


{| class="wikitable" border="1"
== OpenDataFileSystemWithProgramIndex ==
|-
Takes an input u8, returns an [[#IFileSystem]].
! Cmd || Name
|-
| 0 || [[#Read]]
|-
| 1 || [[#GetEntryCount]]
|}


== Read ==
== OpenDataStorageWithProgramIndex ==
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.
Takes an input u8, returns an [[#IStorage]].


The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..".
== OpenDeviceOperator ==
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.


== GetEntryCount ==
== OpenSdCardDetectionEventNotifier ==
Returns an u64 for the total number of readable entries.
This command returns a session to a port implementing the [[#IEventNotifier]] interface.


= DirectoryEntry =
== OpenGameCardDetectionEventNotifier ==
This is "nn::fs::DirectoryEntry".
This command returns a session to a port implementing the [[#IEventNotifier]] interface.


{| class="wikitable" border="1"
== SimulateDeviceDetectionEvent ==
|-
Takes a total of 0xC-bytes of input, no output.
! 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 =
== VerifySaveDataFileSystem ==
This is "nn::fs::DirectoryEntryType".
Takes an unknown input u64 and a type-0x6 output buffer.


An s8 value indicating a directory entry type. The current values are:
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.


{| class="wikitable" border="1"
[[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).
|-
! Value || Description
|-
| 0 || Directory
|-
| 1 || File
|}


= IFile =
== OpenAccessFailureDetectionEventNotifier ==
This is "nn::fssrv::sf::IFile".
Takes 8-bytes of input and returns an [[#IEventNotifier]].


{| class="wikitable" border="1"
[8.0.0+] Now takes an additional 8-bytes of input.
|-
! Cmd || Name
|-
| 0 || Read
|-
| 1 || Write
|-
| 2 || Flush
|-
| 3 || SetSize
|-
| 4 || GetSize
|-
| 5 || [4.0.0+] OperateRange
|}


= ISaveDataInfoReader =
== SetSaveDataSize ==
This is "nn::fssrv::sf::ISaveDataInfoReader".
Takes two input u64s "size" and "journal_size", and writes them to fsp-srv object member variables.


{| class="wikitable" border="1"
These variables are normally initialized with 32 MiB (0x2000000) and 16 MiB (0x1000000), respectively.
|-
! Cmd || Name
|-
| 0 || [[#ReadSaveDataInfo]]
|}


== ReadSaveDataInfo ==
These variables don't seem to be actually used anywhere else (?)
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).
== 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.


= IDeviceOperator =
== GetGlobalAccessLogMode ==
This is "nn::fssrv::sf::IDeviceOperator".
Returns an output u32.


{| class="wikitable" border="1"
GlobalAccessLogMode is normally 0.
|-
 
! Cmd || Name
== OutputAccessLogToSdCard ==
|-
Takes a type-0x5 input buffer.
| 0 || IsSdCardInserted
 
|-
The input buffer is the string to output to the log. User-processes normally include a newline at the end.
| 1 || GetSdCardSpeedMode
 
|-
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.
| 2 || [2.0.0+] GetSdCardCid
 
|-
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.
| 3 || [2.0.0+] GetSdCardUserAreaSize
 
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.
 
{| class="wikitable" border="1"
|-
|-
| 4 || [2.0.0+] GetSdCardProtectedAreaSize
! Cmd || Name
|-
|-
| 5 || [2.0.0+] GetAndClearSdCardErrorInfo
| 0 || [[#Read]]
|-
|-
| 100 || GetMmcCid
| 1 || [[#Write]]
|-
|-
| 101 || GetMmcSpeedMode
| 2 || [[#Flush]]
|-
|-
| 110 || EraseMmc
| 3 || [[#SetSize]]
|-
|-
| 111 || GetMmcPartitionSize
| 4 || [[#GetSize]]
|-
|-
| 112 || [2.0.0+] GetMmcPatrolCount
| 5 || [4.0.0+] OperateRange
|-
|}
| 113 || [2.0.0+] GetAndClearMmcErrorInfo
 
|-
== Read ==
| 114 || [2.0.0+] GetMmcExtendedCsd
Takes a type-0x46 buffer, an offset and length.
|-
 
| 115 || [4.0.0+] SuspendMmcPatrol
== Write ==
|-
Takes a type-0x45 buffer, an offset and length.
| 116 || [4.0.0+] ResumeMmcPatrol
 
|-
== Flush ==
| 200 || [[#IsGameCardInserted]]
No input.
|-
 
| 201 || EraseGameCard
== SetSize ==
|-
Takes a size.
| 202 || [[#GetGameCardHandle]]
 
|-
== GetSize ==
| 203 || [[#GetGameCardUpdatePartitionInfo]]
Returns a size.
|-
 
| 204 || FinalizeGameCardDriver
= IFileSystem =
|-
This is "nn::fssrv::sf::IFileSystem".
| 205 || GetGameCardAttribute
 
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.
 
{| class="wikitable" border="1"
|-
|-
| 206 || [[#GetGameCardDeviceCertificate]]
! Cmd || Name
|-
|-
| 207 || GetGameCardAsicInfo
| 0 || CreateFile
|-
|-
| 208 || GetGameCardIdSet
| 1 || DeleteFile
|-
|-
| 209 || WriteToGameCardDirectly
| 2 || CreateDirectory
|-
|-
| 210 || SetVerifyWriteEnalbleFlag
| 3 || DeleteDirectory
|-
|-
| 211 || GetGameCardImageHash
| 4 || DeleteDirectoryRecursively
|-
|-
| 212 || [2.0.0+] GetGameCardDeviceIdForProdCard
| 5 || RenameFile
|-
|-
| 213 || [2.0.0+] EraseAndWriteParamDirectly
| 6 || RenameDirectory
|-
|-
| 214 || [2.0.0+] ReadParamDirectly
| 7 || [[#GetEntryType]]
|-
|-
| 215 || [2.0.0+] ForceEraseGameCard
| 8 || [[#OpenFile]]
|-
|-
| 216 || [2.0.0+] GetGameCardErrorInfo
| 9 || [[#OpenDirectory]]
|-
|-
| 217 || [2.1.0+] GetGameCardErrorReportInfo
| 10 || [[#Commit]]
|-
|-
| 218 || [3.0.0+] GetGameCardDeviceId
| 11 || [[#GetFreeSpaceSize]]
|-
|-
| 219 || [8.0.0+] [[#ChallengeCardExistence]]
| 12 || [[#GetTotalSpaceSize]]
|-
|-
| 220 || [9.0.0+] [[#GetGameCardCompatibilityType]]
| 13 || [3.0.0+] [[#CleanDirectoryRecursively]]
|-
|-
| 300 || SetSpeedEmulationMode
| 14 || [3.0.0+] [[#GetFileTimeStampRaw]]
|-
|-
| 301 || GetSpeedEmulationMode
| 15 || [4.0.0+] QueryEntry
|-
|}
| 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 ==
== GetEntryType ==
No input, returns a bool.
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.


== GetGameCardHandle ==
== OpenFile ==
No input, returns an u32 '''GameCardHandle'''.
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:


== GetGameCardUpdatePartitionInfo ==
* When bit 0 is set, the file is Readable: you can use the Read operation.
Returns a [[NCM_services#ProgramId|ProgramId]] and the title-version for it.
* 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)


* 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.
== OpenDirectory ==
* Output u64 with ARMS-gamecard: [[NCM_services#ProgramId|ProgramId]] 0100000000000816.
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.


[[NS_Services|NS]] appears to only use this with [[NCM_services|NCM]] for checking whether a sysupdate is required.
== Commit ==
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.


== GetGameCardDeviceCertificate ==
== GetFreeSpaceSize ==
Takes a type-0x6 output buffer, an u32 '''GameCardHandle''' and an u64 '''DeviceCertificateBufferSize'''. No output.
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.


== ChallengeCardExistence ==
== GetTotalSpaceSize ==
Takes a type-0x6 output buffer, two type-0x5 input buffers and an u32 '''GameCardHandle'''. No output.
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).


[9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]].
== CleanDirectoryRecursively ==
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.


== GetGameCardCompatibilityType ==
== GetFileTimeStampRaw ==
Takes an u32 '''GameCardHandle''', returns an u8 '''CompatibilityType''' (0x00 = Global, 0x01 = China) from [[Gamecard_Format#Gamecard_Info|Gamecard Info]].
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.


== GetSdmmcConnectionStatus ==
= IDirectory =
Takes a total of 4-bytes of input, returns a total of 8-bytes of output.
This is "nn::fssrv::sf::IDirectory".


== SetDeviceSimulationEvent ==
{| class="wikitable" border="1"
Takes a total of 0x14-bytes of input, no output.
|-
 
! Cmd || Name
== ClearDeviceSimulationEvent ==
Takes a total of 4-bytes of input, no output.
 
= IEventNotifier =
This is "nn::fssrv::sf::IEventNotifier".
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 0 || [[#Read]]
|-
|-
| 0 || [[#GetEventHandle]]
| 1 || [[#GetEntryCount]]
|}
|}


== GetEventHandle ==
== Read ==
No input, returns an output Event handle. With official sw the EventClearMode is user-specified.
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.


= ISaveDataTransferManager =
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..".
This is "nn::fssrv::sf::ISaveDataTransferManager".


This was added with [[4.0.0]].
== GetEntryCount ==
Returns an u64 for the total number of readable entries.


{| class="wikitable" border="1"
= DirectoryEntry =
This is "nn::fs::DirectoryEntry".
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
! Offset || Size || Description
|-
| 0x0 || 0x301 || Path
|-
| 0x301 || 0x1 || File attributes (bit 0 = is directory; bit 1 = archive bit)
|-
|-
| 0 || [[#GetChallenge]]
| 0x302 || 0x2 || Padding?
|-
|-
| 16 || [[#SetToken]]
| 0x304 || 0x1 || [[#DirectoryEntryType]]
|-
|-
| 32 || [[#OpenSaveDataExporter]]
| 0x305 || 0x3 || Padding?
|-
|-
| 64 || [[#OpenSaveDataImporter]]
| 0x308 || 0x8 || Filesize, 0 for directories.
|}
|}


== GetChallenge ==
= DirectoryEntryType =
No input/output, takes a type-0x6 output buffer.
This is "nn::fs::DirectoryEntryType".


== SetToken ==
An s8 value indicating a directory entry type. The current values are:
No input/output, takes a type-0x5 input buffer.


== OpenSaveDataExporter ==
{| class="wikitable" border="1"
Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]].
|-
! Value || Description
|-
| 0 || Directory
|-
| 1 || File
|}


== OpenSaveDataImporter ==
= IFile =
Takes an input u8 [[#SaveDataSpaceId]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]].
This is "nn::fssrv::sf::IFile".
 
= ISaveDataTransferManagerForSaveDataRepair =
This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair".
 
This was added with [[9.0.0]].


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,123: Line 1,324:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetChallenge]]
| 0 || Read
|-
|-
| 16 || [[#SetKeyPackage]]
| 1 || Write
|-
|-
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]
| 2 || Flush
|-
|-
| 81 || [[#PrepareOpenSaveDataImporter]]
| 3 || SetSize
|-
|-
| 90 || [[#OpenSaveDataImporter]]
| 4 || GetSize
|-
|-
| 91 || [[#OpenSaveDataImporter2]]
| 5 || [4.0.0+] OperateRange
|}
 
= ISaveDataInfoReader =
This is "nn::fssrv::sf::ISaveDataInfoReader".
 
{| class="wikitable" border="1"
|-
|-
| 100 || [[#OpenSaveDataExporterWithKey]]
! Cmd || Name
|-
|-
| 110 || [[#OpenSaveDataImporterWithKey]]
| 0 || [[#ReadSaveDataInfo]]
|}
|}


== SetKeyPackage ==
== ReadSaveDataInfo ==
No input/output, takes a type-0x5 input buffer.
Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]].


== OpenSaveDataExporterAndGetEncryptedKey ==
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).
Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an [[#ISaveDataDivisionExporter]].


== PrepareOpenSaveDataImporter ==
= IDeviceOperator =
Takes a type-0x1A output buffer to receive a RsaEncryptedKey.
This is "nn::fssrv::sf::IDeviceOperator".


== OpenSaveDataImporter ==
{| class="wikitable" border="1"
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]].
 
= ISaveDataExporter =
This is "nn::fssrv::sf::ISaveDataExporter".
 
This was added with [[4.0.0]].
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetSaveDataInfo]]
| 0 || IsSdCardInserted
|-
| 1 || GetSdCardSpeedMode
|-
|-
| 1 || [[#GetRestSize]]
| 2 || [2.0.0+] GetSdCardCid
|-
|-
| 16 || [[#Pull]]
| 3 || [2.0.0+] GetSdCardUserAreaSize
|-
|-
| 17 || [[#PullInitialData]]
| 4 || [2.0.0+] GetSdCardProtectedAreaSize
|}
 
== 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]].
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 5 || [2.0.0+] GetAndClearSdCardErrorInfo
|-
|-
| 0 || [[#GetSaveDataInfo]]
| 100 || GetMmcCid
|-
| 101 || GetMmcSpeedMode
|-
| 110 || EraseMmc
|-
| 111 || GetMmcPartitionSize
|-
| 112 || [2.0.0+] GetMmcPatrolCount
|-
| 113 || [2.0.0+] GetAndClearMmcErrorInfo
|-
|-
| 1 || [[#GetRestSize]]
| 114 || [2.0.0+] GetMmcExtendedCsd
|-
|-
| 16 || [[#Push]]
| 115 || [4.0.0+] SuspendMmcPatrol
|-
|-
| 17 || [[#Finalize]]
| 116 || [4.0.0+] ResumeMmcPatrol
|}
 
== 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
| 200 || [[#IsGameCardInserted]]
|-
|-
| 0 || [[#GetChallenge]]
| 201 || EraseGameCard
|-
|-
| 16 || [[#SetKeySeedPackage]]
| 202 || [[#GetGameCardHandle]]
|-
|-
| 32 || [[#OpenSaveDataExporter]]
| 203 || [[#GetGameCardUpdatePartitionInfo]]
|-
|-
| 33 || [[#OpenSaveDataExporterForDiffExport]]
| 204 || FinalizeGameCardDriver
|-
|-
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
| 205 || GetGameCardAttribute
|-
|-
|rowspan="2"| 64 || [5.0.0-5.1.0] OpenSaveDataImporter
| 206 || [[#GetGameCardDeviceCertificate]]
|-
| 207 || GetGameCardAsicInfo
|-
| 208 || GetGameCardIdSet
|-
| 209 || WriteToGameCardDirectly
|-
| 210 || SetVerifyWriteEnalbleFlag
|-
|-
| [6.0.0+] [[#OpenSaveDataImporterDeprecated]]
| 211 || GetGameCardImageHash
|-
|-
| 65 || [[#OpenSaveDataImporterForDiffImport]]
| 212 || [2.0.0+] GetGameCardDeviceIdForProdCard
|-
|-
| 66 || [6.0.0+] [[#OpenSaveDataImporterForDuplicateDiffImport]]
| 213 || [2.0.0+] EraseAndWriteParamDirectly
|-
|-
| 67 || [6.0.0+] [[#OpenSaveDataImporter]]
| 214 || [2.0.0+] ReadParamDirectly
|-
|-
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]]
| 215 || [2.0.0+] ForceEraseGameCard
|-
|-
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
| 216 || [2.0.0+] GetGameCardErrorInfo
|}
|-
 
| 217 || [2.1.0+] GetGameCardErrorReportInfo
== GetChallenge ==
|-
No input/output, takes a type-0x6 output buffer containing the '''Challenge'''.
| 218 || [3.0.0+] GetGameCardDeviceId
 
|-
== SetKeySeedPackage ==
| 219 || [8.0.0+] [[#ChallengeCardExistence]]
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.
|-
| 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]]
|}


== OpenSaveDataExporter ==
== IsGameCardInserted ==
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
No input, returns a bool.


== OpenSaveDataExporterForDiffExport ==
== GetGameCardHandle ==
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]].
No input, returns an u32 '''GameCardHandle'''.


== OpenSaveDataExporterByContext ==
== GetGameCardUpdatePartitionInfo ==
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].
Returns a [[NCM_services#ProgramId|ProgramId]] and the title-version for it.


== OpenSaveDataImporterDeprecated ==
* 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.
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].
* Output u64 with ARMS-gamecard: [[NCM_services#ProgramId|ProgramId]] 0100000000000816.


== OpenSaveDataImporterForDiffImport ==
[[NS_Services|NS]] appears to only use this with [[NCM_services|NCM]] for checking whether a sysupdate is required.
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]].


== OpenSaveDataImporterForDuplicateDiffImport ==
== GetGameCardDeviceCertificate ==
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
Takes a type-0x6 output buffer, an u32 '''GameCardHandle''' and an u64 '''DeviceCertificateBufferSize'''. No output.


== OpenSaveDataImporter ==
== ChallengeCardExistence ==
Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
Takes a type-0x6 output buffer, two type-0x5 input buffers and an u32 '''GameCardHandle'''. No output.


== OpenSaveDataImporterByContext ==
[9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]].
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 
== 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.


== CancelSuspendingImport ==
== SetDeviceSimulationEvent ==  
Takes an input u64 and a 0x10-byte struct, no output.
Takes a total of 0x14-bytes of input, no output.


= ISaveDataDivisionExporter =
== ClearDeviceSimulationEvent ==
This is "nn::fssrv::sf::ISaveDataDivisionExporter".
Takes a total of 4-bytes of input, no output.


This was added with [[5.0.0]].
= IEventNotifier =
This is "nn::fssrv::sf::IEventNotifier".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,301: Line 1,487:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#SetDivisionCount]]
| 0 || [[#GetEventHandle]]
|-
|}
| 1 || [6.0.0+] [[#GetSaveDataInfo]]
 
== 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]].
 
{| class="wikitable" border="1"
|-
|-
| 16 || [[#OpenSaveDataDiffChunkIterator]]
! Cmd || Name
|-
|-
| 48 || [[#OpenSaveDataChunkExporter]]
| 0 || [[#GetChallenge]]
|-
|-
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
| 16 || [[#SetToken]]
|-
|-
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
| 32 || [[#OpenSaveDataExporter]]
|-
|-
| 66 || [6.0.0+] [[#CancelExport]]
| 64 || [[#OpenSaveDataImporter]]
|-
|}
| 67 || [6.0.0+] [[#SuspendExport]]
 
|-
== GetChallenge ==
| 70 || [6.0.0+] [[#GetKeySeed]]
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]].
 
{| class="wikitable" border="1"
|-
|-
| 71 || [6.0.0+] [[#GetInitialDataMac]]
! Cmd || Name
|-
|-
| 72 || [6.0.0+] [[#FinalizeExport]]
| 0 || [[#GetChallenge]]
|-
|-
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
| 16 || [[#SetKeyPackage]]
|-
|-
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]
|-
|-
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
| 81 || [[#PrepareOpenSaveDataImporter]]
|-
| 90 || [[#OpenSaveDataImporter]]
|-
| 91 || [[#OpenSaveDataImporter2]]
|-
| 100 || [[#OpenSaveDataExporterWithKey]]
|-
|-
| 96 || [6.0.0+] [[#GetReportInfo]]
| 110 || [[#OpenSaveDataImporterWithKey]]
|}
|}


== SetDivisionCount ==
== SetKeyPackage ==
Takes an input u32, no output.
No input/output, takes a type-0x5 input buffer.


== OpenSaveDataChunkExporter ==
== OpenSaveDataExporterAndGetEncryptedKey ==
Takes an input u32, returns an [[#ISaveDataChunkExporter]].
Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an [[#ISaveDataDivisionExporter]].


== FinalizeFullExport ==
== PrepareOpenSaveDataImporter ==
No input, returns two 0x10-byte output structs.
Takes a type-0x1A output buffer to receive a RsaEncryptedKey.


== FinalizeDiffExport ==
== OpenSaveDataImporter ==
No input, returns an output 0x10-byte struct.
Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an [[#ISaveDataDivisionImporter]].


== CancelExport ==
== OpenSaveDataImporter2 ==
No input/output.
Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].


== SuspendExport ==
== OpenSaveDataExporterWithKey ==
No input/output, takes a type-0x6 output buffer.
Takes a total of 0x20-bytes of input, returns an [[#ISaveDataDivisionExporter]].


== GetKeySeed ==
== OpenSaveDataImporterWithKey ==
No input, returns an output 0x10-byte struct.
Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 
== GetInitialDataMac ==
No input, returns an output 0x10-byte struct.


== FinalizeExport ==
= ISaveDataMover =
No input/output.
This is "nn::fssrv::sf::ISaveDataMover".


== SetExportInitialDataAad ==
This was added with [[10.0.0]].
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"
{| class="wikitable" border="1"
Line 1,371: Line 1,579:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [6.0.0+] [[#GetSaveDataInfo]]
| 8 || [[#Register]]
|-
|-
| 16 || [[#OpenSaveDataDiffChunkIterator]]
| 16 || [[#Process]]
|-
|-
| 32 || [[#InitializeImport]]
| 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]].
 
{| class="wikitable" border="1"
|-
|-
| 33 || [[#FinalizeImport]]
! Cmd || Name
|-
|-
| 34 || [6.0.0+] [[#CancelImport]]
| 0 || [[#GetSaveDataInfo]]
|-
|-
| 35 || [6.0.0+] [[#GetImportContext]]
| 1 || [[#GetRestSize]]
|-
|-
| 36 || [6.0.0+] [[#SuspendImport]]
| 16 || [[#Pull]]
|-
|-
| 48 || [[#OpenSaveDataChunkImporter]]
| 17 || [[#PullInitialData]]
|-
| 64 || [6.0.0+] [[#GetImportInitialDataAad]]
|-
| 80 || [6.0.0+] [[#GetReportInfo]]
|}
|}


== GetSaveDataInfo ==
== GetSaveDataInfo ==
No input/output, takes a type-0x6 output buffer.
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.


== OpenSaveDataDiffChunkIterator ==
The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw.
No input, returns an [[#ISaveDataChunkIterator]].


== InitializeImport ==
== GetRestSize ==
No input, returns an output u64.
No input, returns an output u64.


== FinalizeImport ==
== Pull ==
No input/output.
Takes a type-0x6 output buffer, returns an output u64.


== CancelImport ==
== PullInitialData ==
No input/output.
 
== GetImportContext ==
No input/output, takes a type-0x6 output buffer.
No input/output, takes a type-0x6 output buffer.


== SuspendImport ==
= ISaveDataImporter =
No input/output.
This is "nn::fssrv::sf::ISaveDataImporter".


== OpenSaveDataChunkImporter ==
This was added with [[4.0.0]].
Takes an input u32, returns an [[#ISaveDataChunkImporter]].


== GetImportInitialDataAad ==
{| class="wikitable" border="1"
No input, returns an output 0x20-byte struct.
|-
 
! Cmd || Name
== 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 || [[#GetSaveDataInfo]]
|-
|-
| 0 || [[#Next]]
| 1 || [[#GetRestSize]]
|-
|-
| 1 || [[#IsEnd]]  
| 16 || [[#Push]]
|-
|-
| 16 || [[#GetId]]  
| 17 || [[#Finalize]]
|}
|}


== Next ==
== GetSaveDataInfo ==
No input/output.
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.


== IsEnd ==
The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.
No input, returns an output u8.
 
== GetRestSize ==
No input, returns an output u64.
 
== Push ==
No input/output, takes a type-0x5 input buffer.


== GetId ==
== Finalize ==
No input, returns an output u32.
No input/output.


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


This was added with [[5.0.0]].
This was added with [[5.0.0]].
Line 1,456: Line 1,668:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#Pull]]
| 0 || [[#GetChallenge]]
|-
| 16 || [[#SetKeySeedPackage]]
|-
| 32 || [[#OpenSaveDataExporter]]
|-
|-
| 16 || [6.0.0+] [[#GetRestRawDataSize]]
| 33 || [[#OpenSaveDataExporterForDiffExport]]
|}
|-
 
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
== Pull ==
|-
Takes an input u64 and a type-0x6 output buffer, returns an output u64.
|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'''.


== GetRestRawDataSize ==
== SetKeySeedPackage ==
No input, returns an output u64.
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.


= ISaveDataChunkImporter =
== OpenSaveDataExporter ==
This is "nn::fssrv::sf::ISaveDataChunkImporter".
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
 
 
This was added with [[5.0.0]].
== OpenSaveDataExporterForDiffExport ==
 
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]].
{| class="wikitable" border="1"
 
|-
== OpenSaveDataExporterByContext ==
! Cmd || Name
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].
|-
 
| 0 || [[#Push]]
== OpenSaveDataImporterDeprecated ==
|}
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].
 
 
== Push ==
== OpenSaveDataImporterForDiffImport ==
Takes an input u64 and a type-0x5 input buffer, no output.
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.


= ISaveDataTransferProhibiter =
= IWiper =
This was added with [[6.0.0]].
This is "nn::fs::IWiper".


This doesn't seem to handle any commands (?).
This was added with [[10.0.0]].
 
= IMultiCommitManager =
This was added with [[6.0.0]].


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,494: Line 1,950:
! Cmd || Name
! Cmd || Name
|-
|-
| 1 || [[#Add]]
| 0 || [[#Startup|Startup]]
|-
|-
| 2 || [[#Commit]]
| 16 || [[#Process_2|Process]]
|}
|}


== Add ==
== Startup ==
Takes an input [[#IFilesystem]], no output.
No input. Returns an u64.


== Commit ==
== Process ==
No input/output.
No input. Returns an u64.


= FileSystemProxyType =
= FileSystemProxyType =