Changes

Jump to navigation Jump to search
no edit summary
Line 14: Line 14:     
== OpenCodeFileSystem ==
 
== OpenCodeFileSystem ==
Takes an [[NCM_services#ProgramId|ProgramId]] and a [[#ContentPath]]. Returns an [[#IFileSystem]].
+
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].
    
[10.0.0+] This now takes an additional type-0x1A output buffer.
 
[10.0.0+] This now takes an additional type-0x1A output buffer.
 +
 +
[16.0.0+] This now takes an additional input [[#ContentAttributes]].
 +
 +
[17.0.0+] This now takes a type-0x6 output buffer instead of a type-0x1A output buffer.
    
== IsArchivedProgram ==
 
== IsArchivedProgram ==
Takes an u64 ProcessId. Returns a bool (1 if the process id's [[#ContentPath]] ends in ".nca").
+
Takes an input u64 ProcessId. Returns a bool (1 if the process id's [[#FspPath]] ends in ".nca").
    
== SetCurrentProcess ==
 
== SetCurrentProcess ==
Takes a ProcessId descriptor.
+
Takes an input u64 ProcessId. No output.
    
= fsp-pr =
 
= fsp-pr =
Line 70: Line 74:  
| 7 || [2.0.0+] [[#OpenFileSystemWithPatch]]
 
| 7 || [2.0.0+] [[#OpenFileSystemWithPatch]]
 
|-
 
|-
| 8 || [2.0.0+] [[#OpenFileSystemWithId]]
+
| 8 || [16.0.0+] [[#OpenFileSystemWithIdObsolete]] ([2.0.0-15.0.1] OpenFileSystemWithId)
 
|-
 
|-
 
| 9 || [3.0.0+] OpenDataFileSystemByProgramId
 
| 9 || [3.0.0+] OpenDataFileSystemByProgramId
 +
|-
 +
| 10 || [16.0.0+] [[#OpenFileSystemWithId]]
 
|-
 
|-
 
| 11 || [[#OpenBisFileSystem]]
 
| 11 || [[#OpenBisFileSystem]]
Line 115: Line 121:  
|-
 
|-
 
| 36 || [9.0.0+] OpenHostFileSystemWithOption
 
| 36 || [9.0.0+] OpenHostFileSystemWithOption
 +
|-
 +
| 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2
 
|-
 
|-
 
| 51 || [[#OpenSaveDataFileSystem]]
 
| 51 || [[#OpenSaveDataFileSystem]]
Line 169: Line 177:  
|-
 
|-
 
| 101 || [11.0.0+] OpenBaseFileSystem
 
| 101 || [11.0.0+] OpenBaseFileSystem
 +
|-
 +
| 102 || [12.0.0+] FormatBaseFileSystem
 
|-
 
|-
 
| 110 || [[#OpenContentStorageFileSystem]]
 
| 110 || [[#OpenContentStorageFileSystem]]
Line 187: Line 197:  
|-
 
|-
 
| 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]]
 
| 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]]
 +
|-
 +
| 206 || [13.0.0+] OpenDataStorageByPath
 +
|-
 +
| 207 || [15.0.0+] OpenDataFileSystemByDataId
 
|-
 
|-
 
| 400 || [[#OpenDeviceOperator]]
 
| 400 || [[#OpenDeviceOperator]]
Line 218: Line 232:  
| 608 || [2.0.0+] UnregisterAllExternalKey
 
| 608 || [2.0.0+] UnregisterAllExternalKey
 
|-
 
|-
| 609 || [2.0.0+] GetRightsIdByPath
+
| 609 || [2.0.0-15.0.1] GetRightsIdByPath
 
|-
 
|-
 
| 610 || [3.0.0+] GetRightsIdAndKeyGenerationByPath
 
| 610 || [3.0.0+] GetRightsIdAndKeyGenerationByPath
Line 235: Line 249:  
|-
 
|-
 
| 617 || [7.0.0+] UnregisterExternalKey
 
| 617 || [7.0.0+] UnregisterExternalKey
 +
|-
 +
| 618 || [17.0.0+] GetProgramId
 
|-
 
|-
 
| 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]
 
| 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]
Line 292: Line 308:  
| 1017 || [11.0.0+] OutputApplicationInfoAccessLog
 
| 1017 || [11.0.0+] OutputApplicationInfoAccessLog
 
|-
 
|-
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey
+
| 1018 || [13.0.0+] SetDebugOption
 +
|-
 +
| 1019 || [13.0.0+] UnsetDebugOption
 +
|-
 +
| 1020 || [18.0.0+] OpenMemoryStressor
 +
|-
 +
| 1100 || [4.0.0-17.0.1] OverrideSaveDataTransferTokenSignVerificationKey
 +
|-
 +
| 1101 || [18.0.0+] OverrideSaveDataTransferKeyForTest
 
|-
 
|-
 
| 1110 || [6.0.0+] CorruptSaveDataFileSystemByOffset
 
| 1110 || [6.0.0+] CorruptSaveDataFileSystemByOffset
Line 299: Line 323:  
|-
 
|-
 
| 1300 || [10.0.0+] [[#OpenBisWiper]]
 
| 1300 || [10.0.0+] [[#OpenBisWiper]]
 +
|-
 +
| 1400 || [15.0.0+] NotifyErrorContextServiceReady
 
|}
 
|}
   Line 334: Line 360:  
|-
 
|-
 
| 0x8 || CanMountImageAndVideoStorage ||0x8000000000001000 || RW || [[#OpenImageDirectoryFileSystem]]
 
| 0x8 || CanMountImageAndVideoStorage ||0x8000000000001000 || RW || [[#OpenImageDirectoryFileSystem]]
|-
  −
| ([1.0.0-5.1.0] 0x9) || || 0x8000000000000084 || ||
  −
|-
  −
| ([6.0.0-9.2.0] 0x9) || CanMountCloudBackupWorkStorage || 0x8000000200000000 || RW || OpenCloudBackupWorkStorageFileSystem
   
|-
 
|-
 
| 0x9 || CanMountCustomStorage0 || 0x8000000000000000 || RW || OpenCustomStorageFileSystem
 
| 0x9 || CanMountCustomStorage0 || 0x8000000000000000 || RW || OpenCustomStorageFileSystem
 
|-
 
|-
| ([1.0.0-5.1.0] 0xA) || || 0x8000000000000080 || ||
+
| 0xA || CanMountBisCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| ([6.0.0-6.2.0] 0xA) || || 0x8000000000000084 || ||
+
| 0xB || CanMountBisSafeMode || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| ([7.0.0-7.0.1] 0xA) || || 0x4000000000000000 || ||
+
| 0xC || CanMountBisUser || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| ([8.0.0-9.2.0] 0xA) || || 0x8000000000000000 || ||
+
| 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0xA || CanMountBisCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisFileSystem]]
+
| 0xE || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| ([1.0.0-5.1.0] 0xB) || || 0x8000000000008080 || ||
+
| 0xF || CanMountBisSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| ([6.0.0-6.2.0] 0xB) || || 0x8000000000000080 || ||
+
| 0x10 || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0xB) || || 0x8000000000000084 || ||
+
| 0x11 || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]]
 
|-
 
|-
| 0xB || CanMountBisSafeMode || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
+
| 0x12 || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]]
 
|-
 
|-
| ([1.0.0-6.2.0] 0xC) || || 0x8000000000008080 || ||
+
| 0x13 || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0xC) || || 0x8000000000000080 || ||
+
| 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]]
 
|-
 
|-
| 0xC || CanMountBisUser || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
+
| 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
 
|-
 
|-
| ([1.0.0-5.1.0] 0xD) || || 0x8000000000000080 || ||
+
| 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([6.0.0-9.2.0] 0xD) || || 0x8000000000008080 || ||
+
| 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
+
| 0x18 || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([1.0.0-2.3.0] 0xE) || || 0xC000000000200000 || ||
+
| 0x19 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([3.0.0-6.2.0] 0xE) || || 0x8000000000000080 || ||
+
| 0x1A || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0xE) || || 0x8000000000008080 || ||
+
| 0x1B || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| 0xE || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
+
| 0x1C || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([1.0.0-2.3.0] 0xF) || || 0x8000000000000010 || ||
+
| 0x1D || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([3.0.0-5.1.0] 0xF) || || 0xC000000000200000 || ||
+
| 0x1E || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([6.0.0-9.2.0] 0xF) || || 0x8000000000000080 || ||
+
| 0x1F || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| 0xF || CanMountBisSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
+
| 0x20 || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([1.0.0-2.3.0] 0x10) || || 0x8000000000040020 || ||
+
| 0x21 || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([3.0.0-5.1.0] 0x10) || || 0x8000000000000010 || ||
+
| 0x22 || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([6.0.0-6.2.0] 0x10) || || 0xC000000000200000 || ||
+
| 0x23 || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0x10) || || 0x8000000000000080 || ||
+
| 0x24 || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| 0x10 || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]]
+
| 0x25 || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([1.0.0-2.3.0] 0x11) || || 0x8000000000000028 || ||
+
| 0x26 || CanOpenBisPartitionDeviceTreeBlob || 0x8000002000000080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| ([3.0.0-5.1.0] 0x11) || || 0x8000000000040020 || ||
+
| [3.0.0+] 0x27 || CanOpenSdCardStorage || 0xC000000000200000 || RW ||  
 
|-
 
|-
| ([6.0.0-6.2.0] 0x11) || || 0x8000000000000010 || ||
+
| [3.0.0+] 0x28 || CanOpenGameCardStorage || 0x8000000000000100 || RW || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)
 
|-
 
|-
| ([7.0.0-9.2.0] 0x11) || || 0xC000000000200000 || ||
+
| [4.0.0+] 0x29 || CanMountSystemDataPrivate || 0x8000000000100008 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
 
|-
 
|-
| 0x11 || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]]
+
| [5.0.0+] 0x2A || CanMountHost || 0xC000000000400000 || RW || [[#OpenHostFileSystem]]
 
|-
 
|-
| ([1.0.0-2.3.0] 0x12) || || 0x8000000000000020 || ||
+
| [6.0.0+] 0x2B || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]]
 
|-
 
|-
| ([3.0.0-5.1.0] 0x12) || || 0x8000000000000028 || ||
+
| [7.0.0+] 0x2C || CanOpenSaveDataInternalStorage || 0x8000000000000000 || RW || [[#OpenSaveDataInternalStorageFileSystem]]
 
|-
 
|-
| ([6.0.0-6.2.0] 0x12) || || 0x8000000000040020 || ||
+
| [7.0.0+] 0x2D || CanMountTemporaryDirectory || 0xC000000000000000 || RW ||  
 
|-
 
|-
| ([7.0.0-9.2.0] 0x12) || || 0x8000000000000010 || ||
+
| [11.0.0+] 0x2E || CanMountAllBaseFilesystem || 0x8000000000000000 || RW || OpenBaseFileSystem
 
|-
 
|-
| 0x12 || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]]
+
| [15.0.0+] 0x2F || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem
 +
|}
 +
 
 +
=== Call ===
 +
{| class="wikitable" border="1"
 
|-
 
|-
| ([1.0.0-5.1.0] 0x13) || || 0x8000000000000020 || ||
+
! OperationType || Name || Mask || Used by
 
|-
 
|-
| ([6.0.0-6.2.0] 0x13) || || 0x8000000000000028 || ||
+
| 0x0 || CanInvalidateBisCache || 0x8000000000000080 || [[#InvalidateBisCache]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0x13) || || 0x8000000000040020 || ||
+
| 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc
 
|-
 
|-
| 0x13 || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
+
| 0x2 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate
 
|-
 
|-
| ([1.0.0-2.3.0] 0x14) || || 0x8000000000010082 || ||
+
| 0x3 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet
 
|-
 
|-
| ([3.0.0-6.2.0] 0x14) || || 0x8000000000000020 || ||
+
| 0x4 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver
 
|-
 
|-
| ([7.0.0-9.2.0] 0x14) || || 0x8000000000000028 || ||
+
| 0x5 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo
 
|-
 
|-
| 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]]
+
| 0x6 || CanGetGameCardAsicCertificate || 0x8000000000000200 || GetGameCardAsicCertificate
 
|-
 
|-
| ([1.0.0-2.3.0] 0x15) || || 0x8000000000010080 || ||
+
| 0x7 || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]]
 
|-
 
|-
| ([3.0.0-5.1.0] 0x15) || || 0x8000000000010082 || ||
+
| 0x8 || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
 
|-
 
|-
| ([6.0.0-9.2.0] 0x15) || || 0x8000000000000020 || ||
+
| 0x9 || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId
 
|-
 
|-
| 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
+
| 0xA || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId
 
|-
 
|-
| ([1.0.0-5.1.0] 0x16) || || 0x8000000000010080 || ||
+
| 0xB || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
 
|-
 
|-
| ([6.0.0-6.2.0] 0x16) || || 0x8000000000010082 || ||
+
| 0xC || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0x16) || || 0x8000000000000020 || ||
+
| 0xD || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
 
|-
 
|-
| 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]]
+
| 0xE || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]]
 
|-
 
|-
| ([1.0.0-2.3.0] 0x17) || || 0x8000000000010080 || ||
+
| 0xF || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile
 
|-
 
|-
| ([3.0.0-5.1.0] 0x17) || || 0x8000000000000080 || ||
+
| 0x10 || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
 
|-
 
|-
| ([6.0.0-6.2.0] 0x17) || || 0x8000000000010080 || ||
+
| 0x11 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0x17) || || 0x8000000000010082 || ||
+
| 0x12 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]]
 
|-
 
|-
| 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]]
+
| 0x13 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode
 
|-
 
|-
| ([1.0.0-5.1.0] 0x18) || || 0x8000000000010080 || ||
+
| 0x14 || CanDebug || 0xC000000000000000 ||  
 
|-
 
|-
| ([6.0.0-6.2.0] 0x18) || || 0x8000000000000080 || ||
+
| 0x15 || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles
 
|-
 
|-
| ([7.0.0-9.2.0] 0x18) || || 0x8000000000010080 || ||
+
| [2.0.0+] 0x16 || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
 
|-
 
|-
| 0x18 || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]]
+
| [2.0.0+] 0x17 || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
 
|-
 
|-
| ([6.0.0-6.2.0] 0x19) || || 0x8000000000010080 || ||
+
| [2.0.0+] 0x18 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId
 
|-
 
|-
| ([7.0.0-9.2.0] 0x19) || || 0x8000000000000080 || ||
+
| [2.0.0+] 0x19 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
 
|-
 
|-
| 0x19 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
+
| [2.0.0+] 0x1A || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem
 
|-
 
|-
| ([1.0.0-9.2.0] 0x1A) || || 0x8000000000010080 || ||
+
| [3.0.0+] 0x1B || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
 
|-
 
|-
| 0x1A || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
+
| [3.0.0+] 0x1C || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey
 
|-
 
|-
| ([1.0.0-9.2.0] 0x1B) || || 0x8000000000010080 || ||
+
| [4.0.0+] 0x1D || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]]
 
|-
 
|-
| 0x1B || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
+
| [4.0.0+] 0x1E || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 
|-
 
|-
| ([1.0.0-9.2.0] 0x1C) || || 0x8000000000010080 || ||  
+
| [4.0.0+] 0x1F || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 
|-
 
|-
| 0x1C || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
+
| [4.0.0+] 0x20 || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 
|-
 
|-
| ([1.0.0-2.3.0] 0x1D) || || 0x8000000000000084 || ||
+
| [5.0.0+] 0x21 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 
|-
 
|-
| ([3.0.0-9.2.0] 0x1D) || || 0x8000000000010080 || ||
+
| [5.0.0+] 0x22 || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem
 
|-
 
|-
| 0x1D || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
+
| [5.0.0+] 0x23 || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem
 
|-
 
|-
| ([1.0.0-5.1.0] 0x1E) || || 0x8000000000000084 || ||
+
| [5.0.0+] 0x24 || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem
 
|-
 
|-
| ([6.0.0-9.2.0] 0x1E) || || 0x8000000000010080 || ||
+
| [5.0.0+] 0x25 || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition
 
|-
 
|-
| 0x1E || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
+
| [5.0.0+] 0x26 || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]]
 
|-
 
|-
| ([1.0.0-5.1.0] 0x1F) || || 0x8000000000000080 || ||
+
| [5.0.0+] 0x27 || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]]
 
|-
 
|-
| ([6.0.0-6.2.0] 0x1F) || || 0x8000000000000084 || ||
+
| [5.0.0+] 0x28 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair
 
|-
 
|-
| ([7.0.0-9.2.0] 0x1F) || || 0x8000000000010080 || ||
+
| [5.0.0+] 0x29 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair
 
|-
 
|-
| 0x1F || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]]
+
| [5.0.0+] 0x2A || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]]
|-
  −
| ([1.0.0-5.1.0] 0x20) || || 0x8000000000000080 || ||
   
|-
 
|-
| ([6.0.0-9.2.0] 0x20) || || 0x8000000000000084 || ||
+
| [5.0.0+] 0x2B || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]]
 
|-
 
|-
| 0x20 || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]]
+
| [5.0.0+] 0x2C || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]]
 
|-
 
|-
| ([6.0.0-6.2.0] 0x21) || || 0x8000000000000080 || ||
+
| [5.0.0+] 0x2D || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0x21) || || 0x8000000000000084 || ||
+
| [5.0.0+] 0x2E || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol
 
|-
 
|-
| 0x21 || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]]
+
| [5.0.0+] 0x2F || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey
 
|-
 
|-
| ([1.0.0-9.2.0] 0x22) || || 0x8000000000000080 || ||
+
| [5.1.0+] 0x30 || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]]
 
|-
 
|-
| 0x22 || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]]
+
| [6.0.0+] 0x31 || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]]
 
|-
 
|-
| ([1.0.0-2.3.0] 0x23) || || 0xC000000000200000 || ||
+
| [6.0.0+] 0x32 || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier
 
|-
 
|-
| ([3.0.0-9.2.0] 0x23) || || 0x8000000000000080 || ||
+
| [6.0.0+] 0x33 || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent
 
|-
 
|-
| 0x23 || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]]
+
| [6.0.0+] 0x34 || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]]
 
|-
 
|-
| ([1.0.0-2.3.0] 0x24) || || 0x8000000000000100 || ||
+
| [6.0.0+] 0x35 || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent
 
|-
 
|-
| ([3.0.0-9.2.0] 0x24) || || 0x8000000000000080 || ||
+
| [6.0.0+] 0x36 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected
 
|-
 
|-
| 0x24 || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]]
+
| [6.0.0+] 0x37 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure
 
|-
 
|-
| ([1.0.0-2.3.0] 0x25) || || 0x8000000000100008 || ||
+
| [6.0.0+] 0x38 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure
 
|-
 
|-
| ([3.0.0-5.1.0] 0x25) || || 0xC000000000200000 || ||
+
| [8.0.0+] 0x39 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize
 
|-
 
|-
| ([6.0.0-9.2.0] 0x25) || || 0x8000000000000080 || ||
+
| [9.0.0+] 0x3A || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]]
 
|-
 
|-
| 0x25 || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]]
+
| [9.0.0+] 0x3B || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility
 
|-
 
|-
| ([1.0.0-2.3.0] 0x26) || || 0xC000000000400000 || ||
+
| [9.0.0+] 0x3C || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent
 
|-
 
|-
| ([3.0.0-5.1.0] 0x26) || || 0x8000000000000100 || ||
+
| [9.0.0+] 0x3D || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]
 
|-
 
|-
| ([6.0.0-6.2.0] 0x26) || || 0xC000000000200000 || ||
+
| [9.0.0+] 0x3E || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo
 
|-
 
|-
| ([7.0.0-9.2.0] 0x26) || || 0x8000000000000080 || ||
+
| [9.0.0+] 0x3F || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence
 
|-
 
|-
| 0x26 || CanOpenSdCardStorage || 0xC000000000200000 || RW ||  
+
| [9.0.0+] 0x40 || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt
 
|-
 
|-
| ([3.0.0-5.1.0] 0x27) || || 0x8000000000100008 || ||
+
| [9.0.0+] 0x41 || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]]
 
|-
 
|-
| ([6.0.0-6.2.0] 0x27) || || 0x8000000000000100 || ||
+
| [10.0.0+] 0x42 || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0x27) || || 0xC000000000200000 || ||  
+
| [10.0.0+] 0x43 || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem
 
|-
 
|-
| [3.0.0+] 0x27 || CanOpenGameCardStorage || 0x8000000000000100 || RW || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)
+
| [10.2.0+] 0x44 || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]]
 
|-
 
|-
| ([3.0.0-5.1.0] 0x28) || || 0xC000000000400000 || ||
+
| [11.0.0+] 0x45 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]]
 
|-
 
|-
| ([6.0.0-6.2.0] 0x28) || || 0x8000000000100008 || ||
+
| [13.0.0+] 0x46 || CanOpenSaveDataTransferManagerForRepair || 0x8000000000000020 || [[#OpenSaveDataTransferManagerForRepair]]
 
|-
 
|-
| ([7.0.0-9.2.0] 0x28) || || 0x8000000000000100 || ||
+
| [13.0.0+] 0x47 || CanSetDebugConfiguration || 0x8000000000000000 || SetDebugOption, UnsetDebugOption
 
|-
 
|-
| [3.0.0+] 0x28 || CanMountSystemDataPrivate || 0x8000000000100008 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
+
| [15.0.0+] 0x48 || CanOpenDataStorageByPath || 0x8000000000000000 || OpenDataStorageByPath
 
|-
 
|-
| ([4.0.0-5.1.0] 0x29) || || 0x8000000000010000 || ||
+
| [17.0.0+] 0x49 || CanNotifyErrorContextServiceReady || 0x8000004000000000 || NotifyErrorContextServiceReady
 
|-
 
|-
| ([6.0.0-6.2.0] 0x29) || || 0xC000000000400000 || ||
+
| [17.0.0+] 0x4A || CanGetProgramId || 0x8000000008000000 || GetProgramId
|-
  −
| ([7.0.0-9.2.0] 0x29) || || 0x8000000000100008 || ||
  −
|-
  −
| [4.0.0+] 0x29 || CanMountHost || 0xC000000000400000 || RW || [[#OpenHostFileSystem]]
  −
|-
  −
| ([5.0.0-5.1.0] 0x2A) || || 0x8000000000000000 || ||
  −
|-
  −
| ([6.0.0-6.2.0] 0x2A) || || 0x8000000000010000 || ||
  −
|-
  −
| ([7.0.0-9.2.0] 0x2A) || || 0xC000000000400000 || ||
  −
|-
  −
| [5.0.0+] 0x2A || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]]
  −
|-
  −
| ([6.0.0-6.2.0] 0x2B) || || 0x8000000000000000 || ||
  −
|-
  −
| ([7.0.0-9.2.0] 0x2B) || || 0x8000000000010000 || ||
  −
|-
  −
| [6.0.0+] 0x2B || CanOpenSaveDataInternalStorage || 0x8000000000000000 || RW || [[#OpenSaveDataInternalStorageFileSystem]]
  −
|-
  −
| ([7.0.0-9.2.0] 0x2C) || || 0x8000000000000000 || ||
  −
|-
  −
| [7.0.0+] 0x2C || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem
  −
|-
  −
| ([7.0.0-9.2.0] 0x2D) || || 0x0000000000000000 || ||
   
|}
 
|}
   −
=== Call ===
+
== OpenFileSystem ==
{| class="wikitable" border="1"
+
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#FileSystemProxyType]]. Returns an [[#IFileSystem]].
|-
+
 
! OperationType || Name || Mask || Used by
+
[2.0.0+] This function was removed.
|-
+
 
| 0x0 || CanInvalidateBisCache || 0x8000000000000080 || [[#InvalidateBisCache]]
+
== SetCurrentProcess ==
|-
+
Takes an input u64 ProcessId. No output.
| 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc
+
 
|-
+
== OpenFileSystemWithPatch ==
| 0x2 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate
+
Takes an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].
|-
+
 
| 0x3 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet
+
Web-applet loads the [[#FileSystemProxyType]] (which must be '''Manual''') from u32_table[inparam].
|-
+
 
| 0x4 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver
+
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
|-
+
 
| 0x5 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo
+
== OpenFileSystemWithIdObsolete ==
|-
+
Takes a type-0x19 input buffer containing a [[#FspPath]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].
| 0x6 || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]]
+
 
|-
+
The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.
| 0x7 || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
+
 
|-
+
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
| 0x8 || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId
+
 
|-
+
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.
| 0x9 || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId
+
 
|-
+
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.
| 0xA || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
+
 
|-
+
After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.
| 0xB || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
+
 
|-
+
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.
| 0xC || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
+
 
|-
+
== OpenFileSystemWithId ==
| ([1.0.0-5.1.0] 0xD) || || 0x8000000000020000 ||
+
Takes a type-0x19 input buffer containing a [[#FspPath]], an input [[#ContentAttributes]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].
|-
+
 
| 0xD || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]]
+
== OpenBisFileSystem ==
|-
+
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#BisPartitionId]]. Returns an [[#IFileSystem]].
| ([1.0.0-5.1.0] 0xE) || || 0x8000000000000400 ||
+
 
|-
+
Official user-process code sets instr[0] = 0 normally.
| 0xE || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile
+
 
|-
+
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.
| ([1.0.0-5.1.0] 0xF) || || 0x8000000000004060 ||
+
 
|-
+
== OpenBisStorage ==
| 0xF || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
+
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.
|-
+
 
| ([1.0.0-5.1.0] 0x10) || || 0x8000000000080000 ||
+
== InvalidateBisCache ==
|-
+
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]].
| 0x10 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]]
+
 
|-
+
== DeleteSaveDataFileSystem ==
| 0x11 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]]
+
Takes an input u64.
|-
+
 
| ([1.0.0-5.1.0] 0x12) || CanDebug || 0xC000000000000000 ||
+
== CreateSaveDataFileSystem ==
|-
+
Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct which governs creation of a saveMeta file.
| 0x12 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode
+
 
|-
+
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.
| ([1.0.0-5.1.0] 0x13) || || 0xC000000000800000 ||
+
 
|-
+
Creates non-system savedata.
| 0x13 || CanDebug || 0xC000000000000000 ||
+
 
|-
+
== CreateSaveDataFileSystemBySystemSaveDataId ==
| ([1.0.0-5.1.0] 0x14) || || 0xC000000001000000 ||
+
Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]].
|-
+
 
| 0x14 || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles
+
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
|-
+
 
| ([1.0.0-4.1.0] 0x15) || || 0xC000000002000000 ||
+
== OpenGameCardStorage ==
|-
+
Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].
| ([5.0.0-5.1.0] 0x15) || || 0x8000000001000060 ||
+
 
|-
+
== OpenGameCardFileSystem ==
| 0x15 || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
+
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]].
|-
+
 
| ([2.0.0-4.1.0] 0x16) || || 0x8000000004000000 ||
+
Mounts a [[Gamecard_Partition|gamecard partition]].
|-
+
 
| ([5.0.0-5.1.0] 0x16) || || 0x8000000000000060 ||
+
== CreateSaveDataFileSystemWithHashSalt ==
|-
+
Takes a total of 0xB0-bytes of input, no output.
| [2.0.0+] 0x16 || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
+
 
|-
+
== OpenSaveDataFileSystem ==
| ([2.0.0-4.1.0] 0x17) || || 0x8000000008000000 ||
+
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8.
|-
+
 
| ([5.0.0-5.1.0] 0x17) || || 0xC000000002000000 ||
+
Returns an [[#IFileSystem]].
|-
+
 
| [2.0.0+] 0x17 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId
+
Permissions aren't checked until the specified save is successfully found.
|-
+
 
| ([2.0.0-4.1.0] 0x18) || || 0x8000000010000000 ||
+
Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData).
|-
+
 
| ([5.0.0-5.1.0] 0x18) || || 0x8000000004000000 ||
+
== OpenSaveDataFileSystemBySystemSaveDataId ==
|-
+
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8.
| [2.0.0+] 0x18 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
+
 
|-
+
Returns an [[#IFileSystem]].
| ([2.0.0-4.1.0] 0x19) || || 0x8000000000000800 ||
+
 
|-
+
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
| ([5.0.0-5.1.0] 0x19) || || 0x8000000008000000 ||
+
 
|-
+
== OpenReadOnlySaveDataFileSystem ==
| [2.0.0+] 0x19 || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem
+
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]], and returns an [[#IFileSystem]].
|-
+
 
| ([2.0.0-4.1.0] 0x1A) || || 0x8000000000004020 ||
+
Mounts SaveData as ReadOnly.
|-
+
 
| ([5.0.0-5.1.0] 0x1A) || || 0x8000000010000000 ||
+
== ReadSaveDataFileSystemExtraDataBySaveDataSpaceId ==
|-
+
Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
| [2.0.0+] 0x1A || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
+
 
|-
+
== ReadSaveDataFileSystemExtraData ==
| ([3.0.0-4.1.0] 0x1B) || || 0x8000000000002020 ||
+
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
|-
+
 
| ([5.0.0-5.1.0] 0x1B) || || 0x8000000000000800 ||
+
== OpenSaveDataInfoReader ==
|-
+
No input, returns an output [[#ISaveDataInfoReader]].
| [3.0.0+] 0x1B || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey
+
 
|-
+
== OpenSaveDataInfoReaderBySaveDataSpaceId ==
| ([3.0.0-4.1.0] 0x1C) || || 0x8000000000000028 ||
+
Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]].
|-
+
 
| ([5.0.0-5.1.0] 0x1C) || || 0x8000000000004020 ||
+
== FindSaveDataWithFilter ==
|-
+
Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer.
| [3.0.0+] 0x1C || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]]
+
 
|-
+
== OpenSaveDataInfoReaderWithFilter ==
| ([4.0.0-4.1.0] 0x1D) || || 0x8000000020000000 ||
+
Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]].
|-
+
 
| ([5.0.0-5.1.0] 0x1D) || || 0x8000000000000000 ||
+
== OpenSaveDataTransferManager ==
|-
+
No input, returns an [[#ISaveDataTransferManager]].
| [4.0.0+] 0x1D || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
+
 
|-
+
== OpenSaveDataTransferManagerVersion2 ==
| ([4.0.0-4.1.0] 0x1E) || || 0x8000000040000000 ||
+
No input, returns an [[#ISaveDataTransferManagerWithDivision]].
|-
+
 
| ([5.0.0-5.1.0] 0x1E) || || 0x8000000000002020 ||
+
== OpenSaveDataTransferProhibiter ==
|-
+
Takes an input u64, returns an [[#ISaveDataTransferProhibiter]].
| [4.0.0+] 0x1E || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
+
 
|-
+
== ListAccessibleSaveDataOwnerId ==
| ([4.0.0-4.1.0] 0x1F) || || 0x8000000000000000 ||
+
Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer.
|-
+
 
| ([5.0.0-5.1.0] 0x1F) || || 0x8000000000000028 ||
+
== OpenSaveDataTransferManagerForSaveDataRepair ==
|-
+
No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]].
| [4.0.0+] 0x1F || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
+
 
|-
+
== OpenSaveDataMover ==
| ([4.0.0-4.1.0] 0x20) || || 0x8000000000000000 ||
+
Takes 2 input [[#SaveDataSpaceId]], an input u64 size and a TransferMemory handle. Returns an output [[#ISaveDataMover]].
|-
+
 
| ([5.0.0-5.1.0] 0x20) || || 0x8000000020000000 ||
+
== OpenSaveDataTransferManagerForRepair ==
|-
+
No input, returns an output [[#ISaveDataTransferManagerForRepair]].
| [4.0.0+] 0x20 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
+
 
|-
+
== OpenContentStorageFileSystem ==
| ([5.0.0-5.1.0] 0x21) || || 0x8000000040000000 ||
+
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.
|-
+
 
| [5.0.0+] 0x21 || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem
+
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] 0x22) || || 0x0000000080000002 ||
+
== OpenCloudBackupWorkStorageFileSystem ==
|-
+
Takes 4-bytes of input, returns an [[#IFileSystem]].
| [5.0.0+] 0x22 || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem
+
 
|-
+
== OpenCustomStorageFileSystem ==
| ([5.0.0-5.1.0] 0x23) || || 0x8000000000000000 ||
+
Takes a [[#CustomStorageId]]. Invalid values return 0x2EE202.
|-
+
 
| ([6.0.0-9.2.0] 0x23) || || 0x8000000020000000 ||
+
Returns an [[#IFileSystem]] from either User:/CustomStorage0 or Sdcard:/Nintendo/CustomStorage0. If on the SD card, an AesXtsFileSystem is created using a key source specifically for custom storage.
|-
+
 
| [5.0.0+] 0x23 || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem
+
== OpenDataStorageByDataId ==
|-
+
Takes a [[NCM_services#StorageId|StorageID]] and a [[NCM_services#DataId|DataId]].
| ([5.0.0-5.1.0] 0x24) || || 0x8000000000000000 ||
+
 
|-
+
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.
| ([6.0.0-9.2.0] 0x24) || || 0x8000000040000000 ||
+
 
|-
+
== OpenDataFileSystemWithProgramIndex ==
| [5.0.0+] 0x24 || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition
+
Takes an input u8, returns an [[#IFileSystem]].
|-
+
 
| ([5.0.0-5.1.0] 0x25) || || 0x8000000080200000 ||
+
== OpenDataStorageWithProgramIndex ==
|-
+
Takes an input u8, returns an [[#IStorage]].
| ([6.0.0-9.2.0] 0x25) || || 0x8000000200000000 ||
+
 
|-
+
== OpenDeviceOperator ==
| [5.0.0+] 0x25 || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]]
+
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.
|-
+
 
| ([5.0.0-5.1.0] 0x26) || || 0x8000000080000110 ||
+
== OpenSdCardDetectionEventNotifier ==
|-
+
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
| ([6.0.0-8.1.0] 0x26) || || 0x8000000200002000 ||
+
 
|-
+
== OpenGameCardDetectionEventNotifier ==
| ([9.0.0-9.2.0] 0x26) || || 0x8000000200000000 ||
+
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
|-
+
 
| [5.0.0+] 0x26 || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]]
+
== SimulateDeviceDetectionEvent ==
|-
+
Takes a total of 0xC-bytes of input, no output.
| ([5.0.0-5.1.0] 0x27) || || 0x8000000000100008 ||
+
 
|-
+
== VerifySaveDataFileSystem ==
| ([6.0.0-7.0.1] 0x27) || || 0x8000000200002000 ||
+
Takes an unknown input u64 and a type-0x6 output buffer.
|-
+
 
| ([8.0.0-8.1.0] 0x27) || || 0x8000000240002000 ||
+
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).
|-
+
 
| ([9.0.0-9.2.0] 0x27) || || 0x8000000000000000 ||
+
== GetSaveDataCommitId ==
|-
+
Takes an input u8 and u64, returns an output u64.
| [5.0.0+] 0x27 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair
+
 
|-
+
== SetSdCardEncryptionSeed ==
| ([5.0.0-5.1.0] 0x28) || || 0x8000000080010000 ||
+
Takes in the 0x10 byte SD card encryption seed, and loads it into FS-module state.
|-
+
 
| ([6.0.0-8.1.0] 0x28) || || 0x8000000000000000 ||
+
[[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 all-zero except for the byte at offset 0x20. This byte is set to 1 by NS if the SD card has been mounted successfully and is subsequently passed to SetSdCardAccessibility.
|-
+
 
| ([9.0.0-9.2.0] 0x28) || || 0x8000000200002000 ||
+
== OpenAccessFailureDetectionEventNotifier ==
|-
+
Takes 8-bytes of input and returns an [[#IEventNotifier]].
| [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 ||
  −
|-
  −
| ([10.0.0-10.1.1] 0x40) || || 0x8000000800000000 ||
  −
|-
  −
| [9.0.0+] 0x40 || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]]
  −
|-
  −
| ([9.0.0-10.1.1] 0x41) || || 0x8000000800000000 ||
  −
|-
  −
| [9.0.0+] 0x41 || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]]
  −
|-
  −
| ([10.0.0-10.1.1] 0x42) || || 0x8000000800000000 ||
  −
|-
  −
| [10.0.0+] 0x42 || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem
  −
|-
  −
| ([10.0.0-10.1.1] 0x43) || || 0x8000000800000000 ||
  −
|-
  −
| [10.0.0+] 0x43 || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]]
  −
|-
  −
| [10.2.0+] 0x44 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]]
  −
|}
     −
== OpenFileSystem ==
+
[8.0.0+] Now takes an additional 8-bytes of input.
Takes a type-0x19 input [[#ContentPath]] and a [[#FileSystemProxyType]] as parameters. Returns an [[#IFileSystem]].
     −
[2.0.0+] This function was removed.
+
== SetSaveDataSize ==
 +
Takes two input u64s "size" and "journal_size", and writes them to fsp-srv object member variables.
   −
== SetCurrentProcess ==
+
These variables are normally initialized with 32 MiB (0x2000000) and 16 MiB (0x1000000), respectively.
Takes a pid-descriptor.
     −
== OpenFileSystemWithPatch ==
+
These variables don't seem to be actually used anywhere else (?)
Takes an input [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
     −
Web-applet loads the [[#FileSystemProxyType]] (which must be '''Manual''') from u32_table[inparam].
+
== SetSaveDataRootPath ==
 +
Takes an input path, and does snprintf(<fsp-srv object>->m_save_data_root_path, FS_MAX_PATH-1, "/%s", input_path);
   −
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
+
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.
   −
== OpenFileSystemWithId ==
+
== SetGlobalAccessLogMode ==
Takes a type-0x19 input buffer, an [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
+
Takes an input u32.
   −
The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.
+
== SetGlobalAccessLogMode ==
 +
Takes an input u32.
   −
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
+
== GetGlobalAccessLogMode ==
 +
Returns an output u32.
   −
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.
+
GlobalAccessLogMode is normally 0.
   −
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.
+
== OutputAccessLogToSdCard ==
 +
Takes a type-0x5 input buffer.
   −
After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.
+
The input buffer is the string to output to the log. User-processes normally include a newline at the end.
   −
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.
+
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.
   −
== OpenBisFileSystem ==
+
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.
Takes a type-0x19 input buffer string and a [[#BisPartitionId]]. Official user-process code sets instr[0] = 0 normally. Returns an [[#IFileSystem]].
     −
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisStorage]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.
+
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).
   −
== OpenBisStorage ==
+
== GetProgramIndexForAccessLog ==
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.
+
No input, returns two 32-bit values "version" and "program_index".
   −
== InvalidateBisCache ==
+
== OpenMultiCommitManager ==
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]].
+
No input, returns an output [[#IMultiCommitManager]].
   −
== DeleteSaveDataFileSystem ==
+
== OpenBisWiper ==
Takes an input u64.
+
Takes an input u64 size and a TransferMemory handle. Returns an output [[#IWiper]].
   −
== CreateSaveDataFileSystem ==
+
= IStorage =
Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct which governs creation of a saveMeta file.
+
This is "nn::fssrv::sf::IStorage".
   −
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.
+
This is the interface for a raw device, usually a block device.
   −
Creates non-system savedata.
+
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#Read]]
 +
|-
 +
| 1 || [[#Write]]
 +
|-
 +
| 2 || [[#Flush]]
 +
|-
 +
| 3 || [[#SetSize]]
 +
|-
 +
| 4 || [[#GetSize]]
 +
|-
 +
| 5 || [4.0.0+] OperateRange
 +
|}
   −
== CreateSaveDataFileSystemBySystemSaveDataId ==
+
== Read ==
Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]].
+
Takes a type-0x46 buffer, an offset and length.
   −
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
+
== Write ==
 +
Takes a type-0x45 buffer, an offset and length.
   −
== OpenGameCardStorage ==
+
== Flush ==
Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].
+
No input.
   −
== OpenGameCardFileSystem ==
+
== SetSize ==
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]].
+
Takes a size.
   −
Mounts a [[Gamecard_Partition|gamecard partition]].
+
== GetSize ==
 +
Returns a size.
   −
== CreateSaveDataFileSystemWithHashSalt ==
+
= IFileSystem =
Takes a total of 0xB0-bytes of input, no output.
+
This is "nn::fssrv::sf::IFileSystem".
   −
== OpenSaveDataFileSystem ==
+
There are two main implementations of this interface:
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8.
     −
Returns an [[#IFileSystem]].
+
* '''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.
   −
Permissions aren't checked until the specified save is successfully found.
+
There are two adapter classes to convert between these interfaces:
   −
Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData).
+
* '''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.
   −
== OpenSaveDataFileSystemBySystemSaveDataId ==
+
When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC.
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8.
+
Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it.
   −
Returns an [[#IFileSystem]].
+
{| class="wikitable" border="1"
 
+
|-
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
+
! Cmd || Name
 
+
|-
== OpenReadOnlySaveDataFileSystem ==
+
| 0 || CreateFile
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]], and returns an [[#IFileSystem]].
+
|-
 
+
| 1 || DeleteFile
Mounts SaveData as ReadOnly.
+
|-
 
+
| 2 || CreateDirectory
== ReadSaveDataFileSystemExtraDataBySaveDataSpaceId ==
+
|-
Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
+
| 3 || DeleteDirectory
 
+
|-
== ReadSaveDataFileSystemExtraData ==
+
| 4 || DeleteDirectoryRecursively
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
+
|-
 
+
| 5 || RenameFile
== OpenSaveDataInfoReader ==
+
|-
No input, returns an output [[#ISaveDataInfoReader]].
+
| 6 || RenameDirectory
 +
|-
 +
| 7 || [[#GetEntryType]]
 +
|-
 +
| 8 || [[#OpenFile]]
 +
|-
 +
| 9 || [[#OpenDirectory]]
 +
|-
 +
| 10 || [[#Commit]]
 +
|-
 +
| 11 || [[#GetFreeSpaceSize]]
 +
|-
 +
| 12 || [[#GetTotalSpaceSize]]
 +
|-
 +
| 13 || [3.0.0+] [[#CleanDirectoryRecursively]]
 +
|-
 +
| 14 || [3.0.0+] [[#GetFileTimeStampRaw]]
 +
|-
 +
| 15 || [4.0.0+] QueryEntry
 +
|-
 +
| 16 || [15.0.0+] GetFileSystemAttribute
 +
|}
   −
== OpenSaveDataInfoReaderBySaveDataSpaceId ==
+
== GetEntryType ==
Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]].
+
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.
   −
== FindSaveDataWithFilter ==
+
== OpenFile ==
Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer.
+
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:
   −
== OpenSaveDataInfoReaderWithFilter ==
+
* When bit 0 is set, the file is Readable: you can use the Read operation.
Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]].
+
* 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)
   −
== OpenSaveDataTransferManager ==
+
== OpenDirectory ==
No input, returns an [[#ISaveDataTransferManager]].
+
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.
   −
== OpenSaveDataTransferManagerVersion2 ==
+
== Commit ==
No input, returns an [[#ISaveDataTransferManagerWithDivision]].
+
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.
   −
== OpenSaveDataTransferProhibiter ==
+
== GetFreeSpaceSize ==
Takes an input u64, returns an [[#ISaveDataTransferProhibiter]].
+
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.
   −
== ListAccessibleSaveDataOwnerId ==
+
== GetTotalSpaceSize ==
Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer.
+
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).
   −
== OpenSaveDataTransferManagerForSaveDataRepair ==
+
== CleanDirectoryRecursively ==
No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]].
+
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.
   −
== OpenSaveDataMover ==
+
== GetFileTimeStampRaw ==
Takes 2 input [[#SaveDataSpaceId]], an input u64 size and a TransferMemory handle. Returns an output [[#ISaveDataMover]].
+
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.
   −
== OpenSaveDataTransferManagerForRepair ==
+
= IDirectory =
No input, returns an output [[#ISaveDataTransferManagerForRepair]].
+
This is "nn::fssrv::sf::IDirectory".
   −
== OpenContentStorageFileSystem ==
+
{| class="wikitable" border="1"
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.
+
|-
 
+
! Cmd || Name
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]].
+
|-
 +
| 0 || [[#Read]]
 +
|-
 +
| 1 || [[#GetEntryCount]]
 +
|}
   −
== OpenCloudBackupWorkStorageFileSystem ==
+
== Read ==
Takes 4-bytes of input, returns an [[#IFileSystem]].
+
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.
   −
== OpenCustomStorageFileSystem ==
+
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..".
Takes a [[#CustomStorageId]]. Invalid values return 0x2EE202.
     −
Returns an [[#IFileSystem]] from either User:/CustomStorage0 or Sdcard:/Nintendo/CustomStorage0. If on the SD card, an AesXtsFileSystem is created using a key source specifically for custom storage.
+
== GetEntryCount ==
 +
Returns an u64 for the total number of readable entries.
   −
== OpenDataStorageByDataId ==
+
= DirectoryEntry =
Takes a [[NCM_services#StorageId|StorageID]] and a [[NCM_services#DataId|DataId]].
+
This is "nn::fs::DirectoryEntry".
   −
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.
+
{| class="wikitable" border="1"
 
+
|-
== OpenDataFileSystemWithProgramIndex ==
+
! Offset || Size || Description
Takes an input u8, returns an [[#IFileSystem]].
+
|-
 
+
| 0x0 || 0x301 || Path
== OpenDataStorageWithProgramIndex ==
+
|-
Takes an input u8, returns an [[#IStorage]].
+
| 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.
 +
|}
   −
== OpenDeviceOperator ==
+
= DirectoryEntryType =
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.
+
This is "nn::fs::DirectoryEntryType".
   −
== OpenSdCardDetectionEventNotifier ==
+
An s8 value indicating a directory entry type. The current values are:
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
     −
== OpenGameCardDetectionEventNotifier ==
+
{| class="wikitable" border="1"
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
+
|-
 +
! Value || Description
 +
|-
 +
| 0 || Directory
 +
|-
 +
| 1 || File
 +
|}
   −
== SimulateDeviceDetectionEvent ==
+
= IFile =
Takes a total of 0xC-bytes of input, no output.
+
This is "nn::fssrv::sf::IFile".
   −
== VerifySaveDataFileSystem ==
+
{| class="wikitable" border="1"
Takes an unknown input u64 and a type-0x6 output buffer.
+
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || Read
 +
|-
 +
| 1 || Write
 +
|-
 +
| 2 || Flush
 +
|-
 +
| 3 || SetSize
 +
|-
 +
| 4 || GetSize
 +
|-
 +
| 5 || [4.0.0+] OperateRange
 +
|-
 +
| 6 || [12.0.0+] OperateRangeWithBuffer
 +
|}
   −
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).
+
= ISaveDataInfoReader =
 +
This is "nn::fssrv::sf::ISaveDataInfoReader".
   −
== GetSaveDataCommitId ==
+
{| class="wikitable" border="1"
Takes an input u8 and u64, returns an output u64.
+
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#ReadSaveDataInfo]]
 +
|}
   −
== SetSdCardEncryptionSeed ==
+
== ReadSaveDataInfo ==
Takes in the 0x10 byte SD card encryption seed, and loads it into FS-module state.
+
Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]].
   −
[[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).
+
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).
   −
== OpenAccessFailureDetectionEventNotifier ==
+
= IDeviceOperator =
Takes 8-bytes of input and returns an [[#IEventNotifier]].
+
This is "nn::fssrv::sf::IDeviceOperator".
   −
[8.0.0+] Now takes an additional 8-bytes of input.
+
{| class="wikitable" border="1"
 
+
|-
== SetSaveDataSize ==
+
! Cmd || Name
Takes two input u64s "size" and "journal_size", and writes them to fsp-srv object member variables.
+
|-
 
+
| 0 || [[#IsSdCardInserted]]
These variables are normally initialized with 32 MiB (0x2000000) and 16 MiB (0x1000000), respectively.
+
|-
 
+
| 1 || [[#GetSdCardSpeedMode]]
These variables don't seem to be actually used anywhere else (?)
+
|-
 
+
| 2 || [2.0.0+] [[#GetSdCardCid]]
== SetSaveDataRootPath ==
+
|-
Takes an input path, and does snprintf(<fsp-srv object>->m_save_data_root_path, FS_MAX_PATH-1, "/%s", input_path);
+
| 3 || [2.0.0+] [[#GetSdCardUserAreaSize]]
 
+
|-
This path is normally all-zero. When this path is non-zero, the internal OpenSaveDataFileSystem function will create a DirectorySaveDataFileSystem if the target save is a user-save + a directory exists, instead of the normal savedata filesystem object.
+
| 4 || [2.0.0+] [[#GetSdCardProtectedAreaSize]]
 
+
|-
== SetGlobalAccessLogMode ==
+
| 5 || [2.0.0+] [[#GetAndClearSdCardErrorInfo]]
Takes an input u32.
+
|-
 
+
| 6 || [17.0.0+] GetSdCardHostControllerStatus
== SetGlobalAccessLogMode ==
+
|-
Takes an input u32.
+
| 100 || [[#GetMmcCid]]
 
+
|-
== GetGlobalAccessLogMode ==
+
| 101 || [[#GetMmcSpeedMode]]
Returns an output u32.
+
|-
 
+
| 110 || [[#EraseMmc]]
GlobalAccessLogMode is normally 0.
+
|-
 
+
| 111 || [[#GetMmcPartitionSize]]
== OutputAccessLogToSdCard ==
+
|-
Takes a type-0x5 input buffer.
+
| 112 || [2.0.0+] [[#GetMmcPatrolCount]]
 
+
|-
The input buffer is the string to output to the log. User-processes normally include a newline at the end.
+
| 113 || [2.0.0+] [[#GetAndClearMmcErrorInfo]]
 
+
|-
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.
+
| 114 || [2.0.0+] [[#GetMmcExtendedCsd]]
 
+
|-
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.
+
| 115 || [4.0.0+] [[#SuspendMmcPatrol]]
 
  −
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"
   
|-
 
|-
! Cmd || Name
+
| 116 || [4.0.0+] [[#ResumeMmcPatrol]]
 
|-
 
|-
| 0 || [[#Read]]
+
| 117 || [17.0.0+] EraseMmcWithRange
 
|-
 
|-
| 1 || [[#Write]]
+
| 200 || [[#IsGameCardInserted]]
 
|-
 
|-
| 2 || [[#Flush]]
+
| 201 || [[#EraseGameCard]]
 
|-
 
|-
| 3 || [[#SetSize]]
+
| 202 || [[#GetGameCardHandle]]
 
|-
 
|-
| 4 || [[#GetSize]]
+
| 203 || [[#GetGameCardUpdatePartitionInfo]]
 
|-
 
|-
| 5 || [4.0.0+] OperateRange
+
| 204 || [[#FinalizeGameCardDriver]]
|}
+
|-
 
+
| 205 || [[#GetGameCardAttribute]]
== Read ==
+
|-
Takes a type-0x46 buffer, an offset and length.
+
| 206 || [[#GetGameCardDeviceCertificate]]
 
+
|-
== Write ==
+
| 207 || [[#GetGameCardAsicInfo]]
Takes a type-0x45 buffer, an offset and length.
+
|-
 
+
| 208 || [[#GetGameCardIdSet]]
== Flush ==
+
|-
No input.
+
| 209 || [[#WriteToGameCardDirectly]]
 
+
|-
== SetSize ==
+
| 210 || [[#SetVerifyWriteEnalbleFlag]]
Takes a size.
+
|-
 
+
| 211 || [[#GetGameCardImageHash]]
== GetSize ==
+
|-
Returns a size.
+
| 212 || [2.0.0+] [[#GetGameCardDeviceIdForProdCard]]
 
+
|-
= IFileSystem =
+
| 213 || [2.0.0+] [[#EraseAndWriteParamDirectly]]
This is "nn::fssrv::sf::IFileSystem".
  −
 
  −
There are two main implementations of this interface:
  −
 
  −
* '''nn::fs::fsa::IFileSystem''': The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface.
  −
* '''nn::fssrv::sf::IFileSystem''': Used for sending an IFileSystem over IPC. Not used outside of IPC code.
  −
 
  −
There are two adapter classes to convert between these interfaces:
  −
 
  −
* '''nn::fssrv::detail::FileSystemInterfaceAdapter''': Allows access to an nn::fs::fsa::IFileSystem via the nn::fssrv::sf::IFileSystem interface.
  −
* '''nn::fs::detail::FileSystemServiceObjectAdapter''': Allows access to an nn::fssrv::sf::IFileSystem via the nn::fs::fsa::IFileSystem interface.
  −
 
  −
When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC.
  −
Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it.
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Cmd || Name
+
| 214 || [2.0.0+] [[#ReadParamDirectly]]
 
|-
 
|-
| 0 || CreateFile
+
| 215 || [2.0.0+] [[#ForceEraseGameCard]]
 
|-
 
|-
| 1 || DeleteFile
+
| 216 || [2.0.0+] [[#GetGameCardErrorInfo]]
 
|-
 
|-
| 2 || CreateDirectory
+
| 217 || [2.1.0+] [[#GetGameCardErrorReportInfo]]
 
|-
 
|-
| 3 || DeleteDirectory
+
| 218 || [3.0.0+] [[#GetGameCardDeviceId]]
 
|-
 
|-
| 4 || DeleteDirectoryRecursively
+
| 219 || [8.0.0+] [[#ChallengeCardExistence]]
 
|-
 
|-
| 5 || RenameFile
+
| 220 || [9.0.0+] [[#GetGameCardCompatibilityType]]
 
|-
 
|-
| 6 || RenameDirectory
+
| 221 || [17.0.0+] GetGameCardAsicCertificate
 
|-
 
|-
| 7 || [[#GetEntryType]]
+
| 222 || [18.0.0+] GetGameCardCardHeader
 
|-
 
|-
| 8 || [[#OpenFile]]
+
| 300 || [[#SetSpeedEmulationMode]]
 
|-
 
|-
| 9 || [[#OpenDirectory]]
+
| 301 || [[#GetSpeedEmulationMode]]
 
|-
 
|-
| 10 || [[#Commit]]
+
| 302 || [18.0.0+] SetApplicationStorageSpeed
 
|-
 
|-
| 11 || [[#GetFreeSpaceSize]]
+
| 400 || [5.0.0+] [[#SuspendSdmmcControl]]
 
|-
 
|-
| 12 || [[#GetTotalSpaceSize]]
+
| 401 || [5.0.0+] [[#ResumeSdmmcControl]]
 
|-
 
|-
| 13 || [3.0.0+] [[#CleanDirectoryRecursively]]
+
| 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]]
 
|-
 
|-
| 14 || [3.0.0+] [[#GetFileTimeStampRaw]]
+
| 500 || [6.0.0+] [[#SetDeviceSimulationEvent]]
 
|-
 
|-
| 15 || [4.0.0+] QueryEntry
+
| 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]]
 
|}
 
|}
   −
== GetEntryType ==
+
== IsSdCardInserted ==
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.
+
No input. Returns an output bool.
   −
== OpenFile ==
+
== GetSdCardSpeedMode ==
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 [[#SdCardSpeedMode]].
   −
* When bit 0 is set, the file is Readable: you can use the Read operation.
+
== GetSdCardCid ==
* When bit 1 is set, the file is Writable: you can use the Write operation.
+
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
* 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 ==
+
== GetSdCardUserAreaSize ==
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.
+
No input. Returns an output s64 '''SdCardUserAreaSize'''.
 +
 
 +
== GetSdCardProtectedAreaSize ==
 +
No input. Returns an output s64 '''SdCardProtectedAreaSize'''.
   −
== Commit ==
+
== GetAndClearSdCardErrorInfo ==
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.
+
Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''.
   −
== GetFreeSpaceSize ==
+
== GetMmcCid ==
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 a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
   −
== GetTotalSpaceSize ==
+
== GetMmcSpeedMode ==
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).
+
No input. Returns an output [[#MmcSpeedMode]].
   −
== CleanDirectoryRecursively ==
+
== EraseMmc ==
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.
+
Takes an input [[#MmcPartition]]. No output.
   −
== GetFileTimeStampRaw ==
+
== GetMmcPartitionSize ==
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.
+
Takes an input [[#MmcPartition]]. Returns an output s64 '''MmcPartitionSize'''.
   −
= IDirectory =
+
== GetMmcPatrolCount ==
This is "nn::fssrv::sf::IDirectory".
+
No input. Returns an output u32 '''MmcPatrolCount'''.
   −
{| class="wikitable" border="1"
+
== GetAndClearMmcErrorInfo ==
|-
+
Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''.
! Cmd || Name
+
 
|-
+
== GetMmcExtendedCsd ==
| 0 || [[#Read]]
+
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
|-
+
 
| 1 || [[#GetEntryCount]]
+
== SuspendMmcPatrol ==
|}
+
No input/output.
   −
== Read ==
+
== ResumeMmcPatrol ==
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.
+
No input/output.
   −
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..".
+
== IsGameCardInserted ==
 +
No input. Returns an output bool.
   −
== GetEntryCount ==
+
== EraseGameCard ==
Returns an u64 for the total number of readable entries.
+
Takes an input [[#GameCardSize]] and an input u64 '''NormalAreaSize'''. No output.
   −
= DirectoryEntry =
+
== GetGameCardHandle ==
This is "nn::fs::DirectoryEntry".
+
No input. Returns an output [[#GameCardHandle]].
   −
{| class="wikitable" border="1"
+
== GetGameCardUpdatePartitionInfo ==
|-
+
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardUpdatePartitionInfo]].
! 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 =
+
== FinalizeGameCardDriver ==
This is "nn::fs::DirectoryEntryType".
+
No input/output.
   −
An s8 value indicating a directory entry type. The current values are:
+
== GetGameCardAttribute ==
 +
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardAttribute]].
   −
{| class="wikitable" border="1"
+
== GetGameCardDeviceCertificate ==
|-
+
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
! Value || Description
  −
|-
  −
| 0 || Directory
  −
|-
  −
| 1 || File
  −
|}
     −
= IFile =
+
== GetGameCardAsicInfo ==
This is "nn::fssrv::sf::IFile".
+
Takes a type-0x5 input buffer '''FwBuffer''', a type-0x6 output buffer containing [[#RmaInformation]] and two input s64s '''FwBufferSize''' and '''RmaInformationSize'''. No output.
   −
{| class="wikitable" border="1"
+
== GetGameCardIdSet ==
|-
+
Takes a type-0x6 output buffer containing a [[#GameCardIdSet]] and an input s64 '''BufferSize'''. No output.
! Cmd || Name
  −
|-
  −
| 0 || Read
  −
|-
  −
| 1 || Write
  −
|-
  −
| 2 || Flush
  −
|-
  −
| 3 || SetSize
  −
|-
  −
| 4 || GetSize
  −
|-
  −
| 5 || [4.0.0+] OperateRange
  −
|}
     −
= ISaveDataInfoReader =
+
== WriteToGameCardDirectly ==
This is "nn::fssrv::sf::ISaveDataInfoReader".
+
Takes a type-0x6 output buffer and two input s64s '''Offset''' and '''BufferSize'''. No output.
   −
{| class="wikitable" border="1"
+
== SetVerifyWriteEnalbleFlag ==
|-
+
Takes an input bool. No output.
! Cmd || Name
  −
|-
  −
| 0 || [[#ReadSaveDataInfo]]
  −
|}
     −
== ReadSaveDataInfo ==
+
== GetGameCardImageHash ==
Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]].
+
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
   −
This is used to get [[#SaveDataInfo]] for all savedata on the system (or all savedata for the current [[#SaveDataSpaceId]]). When used multiple times, it will resume reading where it left off, until no more entries are available (in that case the out u64 is value 0).
+
== GetGameCardDeviceIdForProdCard ==
 +
Takes a type-0x5 input buffer '''CardHeaderForDev''', a type-0x6 output buffer and two input s64s '''CardHeaderForDevSize''' and '''BufferSize'''. No output.
 +
 
 +
== EraseAndWriteParamDirectly ==
 +
Takes a type-0x5 input buffer and an input s64 '''BufferSize'''. No output.
 +
 
 +
== ReadParamDirectly ==
 +
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
 +
 
 +
== ForceEraseGameCard ==
 +
No input/output.
 +
 
 +
== GetGameCardErrorInfo ==
 +
No input. Returns an output [[#GameCardErrorInfo]].
   −
= IDeviceOperator =
+
== GetGameCardErrorReportInfo ==
This is "nn::fssrv::sf::IDeviceOperator".
+
No input. Returns an output [[#GameCardErrorReportInfo]].
   −
{| class="wikitable" border="1"
+
== GetGameCardDeviceId ==
|-
+
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
! Cmd || Name
+
 
|-
+
== ChallengeCardExistence ==
| 0 || [[#IsSdCardInserted]]
+
Takes a type-0x6 output buffer, two type-0x5 input buffers and an input [[#GameCardHandle]]. No output.
|-
+
 
| 1 || [[#GetSdCardSpeedMode]]
+
[9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]].
|-
+
 
| 2 || [2.0.0+] [[#GetSdCardCid]]
+
== GetGameCardCompatibilityType ==
|-
+
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardCompatibilityType]].
| 3 || [2.0.0+] [[#GetSdCardUserAreaSize]]
+
 
|-
+
== SetSpeedEmulationMode ==
| 4 || [2.0.0+] [[#GetSdCardProtectedAreaSize]]
+
Takes an input [[#SpeedEmulationMode]]. No output.
|-
+
 
| 5 || [2.0.0+] [[#GetAndClearSdCardErrorInfo]]
+
== GetSpeedEmulationMode ==
|-
+
No input. Returns an output [[#SpeedEmulationMode]].
| 100 || [[#GetMmcCid]]
+
 
|-
+
== SuspendSdmmcControl ==
| 101 || [[#GetMmcSpeedMode]]
+
No input/output.
|-
+
 
| 110 || [[#EraseMmc]]
+
== ResumeSdmmcControl ==
|-
+
No input/output.
| 111 || [[#GetMmcPartitionSize]]
+
 
|-
+
== GetSdmmcConnectionStatus ==
| 112 || [2.0.0+] [[#GetMmcPatrolCount]]
+
Takes a total of 4-bytes of input. Returns a total of 8-bytes of output.
|-
+
 
| 113 || [2.0.0+] [[#GetAndClearMmcErrorInfo]]
+
== SetDeviceSimulationEvent ==
|-
+
Takes a total of 0x14-bytes of input. No output.
| 114 || [2.0.0+] [[#GetMmcExtendedCsd]]
+
 
 +
== ClearDeviceSimulationEvent ==
 +
Takes a total of 4-bytes of input. No output.
 +
 
 +
= IEventNotifier =
 +
This is "nn::fssrv::sf::IEventNotifier".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 115 || [4.0.0+] [[#SuspendMmcPatrol]]
+
! Cmd || Name
 
|-
 
|-
| 116 || [4.0.0+] [[#ResumeMmcPatrol]]
+
| 0 || [[#GetEventHandle]]
 +
|}
 +
 
 +
== GetEventHandle ==
 +
No input, returns an output Event handle. With official sw the EventClearMode is user-specified.
 +
 
 +
= ISaveDataTransferManager =
 +
This is "nn::fssrv::sf::ISaveDataTransferManager".
 +
 
 +
This was added with [[4.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 200 || [[#IsGameCardInserted]]
+
! Cmd || Name
 
|-
 
|-
| 201 || [[#EraseGameCard]]
+
| 0 || [[#GetChallenge]]
 
|-
 
|-
| 202 || [[#GetGameCardHandle]]
+
| 16 || [[#SetToken]]
 
|-
 
|-
| 203 || [[#GetGameCardUpdatePartitionInfo]]
+
| 32 || [[#OpenSaveDataExporter]]
 
|-
 
|-
| 204 || [[#FinalizeGameCardDriver]]
+
| 64 || [[#OpenSaveDataImporter]]
 +
|}
 +
 
 +
== GetChallenge ==
 +
No input/output, takes a type-0x6 output buffer.
 +
 
 +
== SetToken ==
 +
No input/output, takes a type-0x5 input buffer.
 +
 
 +
== OpenSaveDataExporter ==
 +
Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]].
 +
 
 +
== OpenSaveDataImporter ==
 +
Takes an input u8 [[#SaveDataSpaceId]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]].
 +
 
 +
= ISaveDataTransferManagerForSaveDataRepair =
 +
This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair".
 +
 
 +
This was added with [[9.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 205 || [[#GetGameCardAttribute]]
+
! Cmd || Name
 
|-
 
|-
| 206 || [[#GetGameCardDeviceCertificate]]
+
| 0 || [[#GetChallenge]]
 
|-
 
|-
| 207 || [[#GetGameCardAsicInfo]]
+
| 16 || [[#SetKeyPackage]]
 
|-
 
|-
| 208 || [[#GetGameCardIdSet]]
+
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]
 
|-
 
|-
| 209 || [[#WriteToGameCardDirectly]]
+
| 81 || [[#PrepareOpenSaveDataImporter]]
 
|-
 
|-
| 210 || [[#SetVerifyWriteEnalbleFlag]]
+
| 90 || [[#OpenSaveDataImporter]]
 
|-
 
|-
| 211 || [[#GetGameCardImageHash]]
+
| 91 || [[#OpenSaveDataImporter2]]
 
|-
 
|-
| 212 || [2.0.0+] [[#GetGameCardDeviceIdForProdCard]]
+
| 100 || [[#OpenSaveDataExporterWithKey]]
 
|-
 
|-
| 213 || [2.0.0+] [[#EraseAndWriteParamDirectly]]
+
| 110 || [[#OpenSaveDataImporterWithKey]]
|-
+
|}
| 214 || [2.0.0+] [[#ReadParamDirectly]]
+
 
|-
+
== SetKeyPackage ==
| 215 || [2.0.0+] [[#ForceEraseGameCard]]
+
No input/output, takes a type-0x5 input buffer.
|-
+
 
| 216 || [2.0.0+] [[#GetGameCardErrorInfo]]
+
== OpenSaveDataExporterAndGetEncryptedKey ==
|-
+
Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an [[#ISaveDataDivisionExporter]].
| 217 || [2.1.0+] [[#GetGameCardErrorReportInfo]]
+
 
|-
+
== PrepareOpenSaveDataImporter ==
| 218 || [3.0.0+] [[#GetGameCardDeviceId]]
+
Takes a type-0x1A output buffer to receive a RsaEncryptedKey.
 +
 
 +
== OpenSaveDataImporter ==
 +
Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
== OpenSaveDataImporter2 ==
 +
Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
== OpenSaveDataExporterWithKey ==
 +
Takes a total of 0x20-bytes of input, returns an [[#ISaveDataDivisionExporter]].
 +
 
 +
== OpenSaveDataImporterWithKey ==
 +
Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 
 +
[17.0.0+] Now only takes 0x18-bytes of input and an additional type-0x5 input buffer.
 +
 
 +
= ISaveDataMover =
 +
This is "nn::fssrv::sf::ISaveDataMover".
 +
 
 +
This was added with [[10.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 219 || [8.0.0+] [[#ChallengeCardExistence]]
+
! Cmd || Name
 
|-
 
|-
| 220 || [9.0.0+] [[#GetGameCardCompatibilityType]]
+
| 8 || [[#Register]]
 
|-
 
|-
| 300 || [[#SetSpeedEmulationMode]]
+
| 16 || [[#Process]]
 
|-
 
|-
| 301 || [[#GetSpeedEmulationMode]]
+
| 18 || [[#Cancel]]
|-
+
|}
| 400 || [5.0.0+] [[#SuspendSdmmcControl]]
+
 
 +
== Register ==
 +
Takes an input u64, no output.
 +
 
 +
== Process ==
 +
Takes an input u64, returns an output u64.
 +
 
 +
== Cancel ==
 +
No input/output.
 +
 
 +
= ISaveDataTransferManagerForRepair =
 +
This is "nn::fssrv::sf::ISaveDataTransferManagerForRepair".
 +
 
 +
This was added with [[11.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 401 || [5.0.0+] [[#ResumeSdmmcControl]]
+
! Cmd || Name
 
|-
 
|-
| 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]]
+
| 80 || [[#OpenSaveDataExporter]]
 
|-
 
|-
| 500 || [6.0.0+] [[#SetDeviceSimulationEvent]]
+
| 90 || [[#OpenSaveDataImporter]]
|-
  −
| 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]]
   
|}
 
|}
   −
== IsSdCardInserted ==
+
== OpenSaveDataExporter ==
No input. Returns an output bool.
+
Takes a total of 0x10-bytes of input, returns an [[#ISaveDataDivisionExporter]].
   −
== GetSdCardSpeedMode ==
+
== OpenSaveDataImporter ==
No input. Returns an output [[#SdCardSpeedMode]].
+
Takes 1-byte of input, a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
   −
== GetSdCardCid ==
+
= ISaveDataExporter =
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
+
This is "nn::fssrv::sf::ISaveDataExporter".
   −
== GetSdCardUserAreaSize ==
+
This was added with [[4.0.0]].
No input. Returns an output s64 '''SdCardUserAreaSize'''.
     −
== GetSdCardProtectedAreaSize ==
+
{| class="wikitable" border="1"
No input. Returns an output s64 '''SdCardProtectedAreaSize'''.
+
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#GetSaveDataInfo]]
 +
|-
 +
| 1 || [[#GetRestSize]]
 +
|-
 +
| 16 || [[#Pull]]
 +
|-
 +
| 17 || [[#PullInitialData]]
 +
|}
   −
== GetAndClearSdCardErrorInfo ==
+
== GetSaveDataInfo ==
Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''.
+
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.
   −
== GetMmcCid ==
+
The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw.
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
     −
== GetMmcSpeedMode ==
+
== GetRestSize ==
No input. Returns an output [[#MmcSpeedMode]].
+
No input, returns an output u64.
   −
== EraseMmc ==
+
== Pull ==
Takes an input [[#MmcPartition]]. No output.
+
Takes a type-0x6 output buffer, returns an output u64.
   −
== GetMmcPartitionSize ==
+
== PullInitialData ==
Takes an input [[#MmcPartition]]. Returns an output s64 '''MmcPartitionSize'''.
+
No input/output, takes a type-0x6 output buffer.
   −
== GetMmcPatrolCount ==
+
= ISaveDataImporter =
No input. Returns an output u32 '''MmcPatrolCount'''.
+
This is "nn::fssrv::sf::ISaveDataImporter".
   −
== GetAndClearMmcErrorInfo ==
+
This was added with [[4.0.0]].
Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''.
     −
== GetMmcExtendedCsd ==
+
{| class="wikitable" border="1"
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
+
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#GetSaveDataInfo]]
 +
|-
 +
| 1 || [[#GetRestSize]]
 +
|-
 +
| 16 || [[#Push]]
 +
|-
 +
| 17 || [[#Finalize]]
 +
|}
   −
== SuspendMmcPatrol ==
+
== GetSaveDataInfo ==
No input/output.
+
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.
   −
== ResumeMmcPatrol ==
+
The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.
No input/output.
     −
== IsGameCardInserted ==
+
== GetRestSize ==
No input. Returns an output bool.
+
No input, returns an output u64.
   −
== EraseGameCard ==
+
== Push ==
Takes an input [[#GameCardSize]] and an input u64 '''NormalAreaSize'''. No output.
+
No input/output, takes a type-0x5 input buffer.
   −
== GetGameCardHandle ==
+
== Finalize ==
No input. Returns an output [[#GameCardHandle]].
  −
 
  −
== GetGameCardUpdatePartitionInfo ==
  −
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardUpdatePartitionInfo]].
  −
 
  −
== FinalizeGameCardDriver ==
   
No input/output.
 
No input/output.
   −
== GetGameCardAttribute ==
+
= ISaveDataTransferManagerWithDivision =
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardAttribute]].
+
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".
   −
== GetGameCardDeviceCertificate ==
+
This was added with [[5.0.0]].
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
     −
== GetGameCardAsicInfo ==
+
{| class="wikitable" border="1"
Takes a type-0x5 input buffer '''FwBuffer''', a type-0x6 output buffer containing [[#RmaInformation]] and two input s64s '''FwBufferSize''' and '''RmaInformationSize'''. No output.
+
|-
 
+
! Cmd || Name
== GetGameCardIdSet ==
+
|-
Takes a type-0x6 output buffer containing a [[#GameCardIdSet]] and an input s64 '''BufferSize'''. No output.
+
| 0 || [[#GetChallenge]]
 +
|-
 +
| 8 || [18.0.0+] SetMode
 +
|-
 +
| 9 || [18.0.0+] SetAttribute
 +
|-
 +
| 16 || [[#SetKeySeedPackage]]
 +
|-
 +
| 32 || [[#OpenSaveDataExporter]]
 +
|-
 +
| 33 || [[#OpenSaveDataExporterForDiffExport]]
 +
|-
 +
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
 +
|-
 +
| 63 || [17.0.0+] OpenSaveDataImporter
 +
|-
 +
| 64 || [6.0.0-17.0.1] [[#OpenSaveDataImporterDeprecated]] ([5.0.0-5.1.0] OpenSaveDataImporter)
 +
|-
 +
| 65 || [5.0.0-17.0.1] [[#OpenSaveDataImporterForDiffImport]]
 +
|-
 +
| 66 || [6.0.0-17.0.1] [[#OpenSaveDataImporterForDuplicateDiffImport]]
 +
|-
 +
| 67 || [6.0.0-16.1.0] [[#OpenSaveDataImporter]]
 +
|-
 +
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]]
 +
|-
 +
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
 +
|-
 +
| 70 || [10.0.0+] CancelSuspendingImportByAttribute
 +
|-
 +
| 80 || [11.0.0+] SwapSecondary
 +
|}
   −
== WriteToGameCardDirectly ==
+
== GetChallenge ==
Takes a type-0x6 output buffer and two input s64s '''Offset''' and '''BufferSize'''. No output.
+
No input/output, takes a type-0x6 output buffer containing the '''Challenge'''.
   −
== SetVerifyWriteEnalbleFlag ==
+
== SetKeySeedPackage ==
Takes an input bool. No output.
+
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.
   −
== GetGameCardImageHash ==
+
== OpenSaveDataExporter ==
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
+
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
   −
== GetGameCardDeviceIdForProdCard ==
+
== OpenSaveDataExporterForDiffExport ==
Takes a type-0x5 input buffer '''CardHeaderForDev''', a type-0x6 output buffer and two input s64s '''CardHeaderForDevSize''' and '''BufferSize'''. No output.
+
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]].
   −
== EraseAndWriteParamDirectly ==
+
== OpenSaveDataExporterByContext ==
Takes a type-0x5 input buffer and an input s64 '''BufferSize'''. No output.
+
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].
   −
== ReadParamDirectly ==
+
== OpenSaveDataImporterDeprecated ==
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
+
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].
   −
== ForceEraseGameCard ==
+
== OpenSaveDataImporterForDiffImport ==
No input/output.
+
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]].
   −
== GetGameCardErrorInfo ==
+
== OpenSaveDataImporterForDuplicateDiffImport ==
No input. Returns an output [[#GameCardErrorInfo]].
+
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
   −
== GetGameCardErrorReportInfo ==
+
== OpenSaveDataImporter ==
No input. Returns an output [[#GameCardErrorReportInfo]].
+
Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
   −
== GetGameCardDeviceId ==
+
== OpenSaveDataImporterByContext ==
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
+
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
   −
== ChallengeCardExistence ==
+
== CancelSuspendingImport ==
Takes a type-0x6 output buffer, two type-0x5 input buffers and an input [[#GameCardHandle]]. No output.
+
Takes an input u64 and a 0x10-byte struct, no output.
   −
[9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]].
+
= ISaveDataDivisionExporter =
 +
This is "nn::fssrv::sf::ISaveDataDivisionExporter".
   −
== GetGameCardCompatibilityType ==
+
This was added with [[5.0.0]].
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardCompatibilityType]].
  −
 
  −
== SetSpeedEmulationMode ==
  −
Takes an input [[#SpeedEmulationMode]]. No output.
  −
 
  −
== GetSpeedEmulationMode ==
  −
No input. Returns an output [[#SpeedEmulationMode]].
  −
 
  −
== SuspendSdmmcControl ==
  −
No input/output.
  −
 
  −
== ResumeSdmmcControl ==
  −
No input/output.
  −
 
  −
== GetSdmmcConnectionStatus ==
  −
Takes a total of 4-bytes of input. Returns a total of 8-bytes of output.
  −
 
  −
== SetDeviceSimulationEvent ==
  −
Takes a total of 0x14-bytes of input. No output.
  −
 
  −
== ClearDeviceSimulationEvent ==
  −
Takes a total of 4-bytes of input. No output.
  −
 
  −
= IEventNotifier =
  −
This is "nn::fssrv::sf::IEventNotifier".
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,605: Line 1,556:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#GetEventHandle]]
+
| 0 || [[#SetDivisionCount]]
|}
+
|-
 
+
| 1 || [6.0.0+] [[#ReadSaveDataExtraData]]
== GetEventHandle ==
+
|-
No input, returns an output Event handle. With official sw the EventClearMode is user-specified.
+
| 16 || [[#OpenSaveDataDiffChunkIterator]]
 
+
|-
= ISaveDataTransferManager =
+
| 48 || [[#OpenSaveDataChunkExporter]]
This is "nn::fssrv::sf::ISaveDataTransferManager".
+
|-
 
+
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
This was added with [[4.0.0]].
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Cmd || Name
+
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
 
|-
 
|-
| 0 || [[#GetChallenge]]
+
| 66 || [6.0.0+] [[#CancelExport]]
 
|-
 
|-
| 16 || [[#SetToken]]
+
| 67 || [6.0.0+] [[#SuspendExport]]
 
|-
 
|-
| 32 || [[#OpenSaveDataExporter]]
+
| 70 || [6.0.0-17.0.1] [[#GetKeySeed]]
 
|-
 
|-
| 64 || [[#OpenSaveDataImporter]]
+
| 71 || [6.0.0+] [[#GetInitialDataMac]]
|}
  −
 
  −
== GetChallenge ==
  −
No input/output, takes a type-0x6 output buffer.
  −
 
  −
== SetToken ==
  −
No input/output, takes a type-0x5 input buffer.
  −
 
  −
== OpenSaveDataExporter ==
  −
Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]].
  −
 
  −
== OpenSaveDataImporter ==
  −
Takes an input u8 [[#SaveDataSpaceId]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]].
  −
 
  −
= ISaveDataTransferManagerForSaveDataRepair =
  −
This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair".
  −
 
  −
This was added with [[9.0.0]].
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Cmd || Name
+
| 72 || [6.0.0+] [[#FinalizeExport]]
 
|-
 
|-
| 0 || [[#GetChallenge]]
+
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
 
|-
 
|-
| 16 || [[#SetKeyPackage]]
+
| 74 || [18.0.0+] [[#GetKeySeed]]
 
|-
 
|-
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]
+
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
 
|-
 
|-
| 81 || [[#PrepareOpenSaveDataImporter]]
+
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
 
|-
 
|-
| 90 || [[#OpenSaveDataImporter]]
+
| 96 || [6.0.0+] [[#GetReportInfo]]
|-
  −
| 91 || [[#OpenSaveDataImporter2]]
  −
|-
  −
| 100 || [[#OpenSaveDataExporterWithKey]]
  −
|-
  −
| 110 || [[#OpenSaveDataImporterWithKey]]
   
|}
 
|}
   −
== SetKeyPackage ==
+
== SetDivisionCount ==
No input/output, takes a type-0x5 input buffer.
+
Takes an input u32, no output.
   −
== OpenSaveDataExporterAndGetEncryptedKey ==
+
== OpenSaveDataChunkExporter ==
Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an [[#ISaveDataDivisionExporter]].
+
Takes an input u32, returns an [[#ISaveDataChunkExporter]].
   −
== PrepareOpenSaveDataImporter ==
+
== FinalizeFullExport ==
Takes a type-0x1A output buffer to receive a RsaEncryptedKey.
+
No input, returns two 0x10-byte output structs.
   −
== OpenSaveDataImporter ==
+
== FinalizeDiffExport ==
Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an [[#ISaveDataDivisionImporter]].
+
No input, returns an output 0x10-byte struct.
   −
== OpenSaveDataImporter2 ==
+
== CancelExport ==
Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
+
No input/output.
   −
== OpenSaveDataExporterWithKey ==
+
== SuspendExport ==
Takes a total of 0x20-bytes of input, returns an [[#ISaveDataDivisionExporter]].
+
No input/output, takes a type-0x6 output buffer.
   −
== OpenSaveDataImporterWithKey ==
+
== GetKeySeed ==
Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
+
No input, returns an output 0x10-byte struct.
   −
= ISaveDataMover =
+
== GetInitialDataMac ==
This is "nn::fssrv::sf::ISaveDataMover".
+
No input, returns an output 0x10-byte struct.
   −
This was added with [[10.0.0]].
+
== 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"
 
{| class="wikitable" border="1"
Line 1,697: Line 1,628:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 8 || [[#Register]]
+
| 0 || [6.0.0+] [[#ReadSaveDataExtraData]]
 +
|-
 +
| 16 || [[#OpenSaveDataDiffChunkIterator]]
 +
|-
 +
| 32 || [[#InitializeImport]]
 +
|-
 +
| 33 || [[#FinalizeImport]]
 +
|-
 +
| 34 || [6.0.0+] [[#CancelImport]]
 +
|-
 +
| 35 || [6.0.0+] [[#GetImportContext]]
 +
|-
 +
| 36 || [6.0.0+] [[#SuspendImport]]
 +
|-
 +
| 37 || [11.0.0+] FinalizeImportWithoutSwap
 +
|-
 +
| 48 || [[#OpenSaveDataChunkImporter]]
 
|-
 
|-
| 16 || [[#Process]]
+
| 64 || [6.0.0+] [[#GetImportInitialDataAad]]
 
|-
 
|-
| 18 || [[#Cancel]]
+
| 80 || [6.0.0+] [[#GetReportInfo]]
 
|}
 
|}
   −
== Register ==
+
== ReadSaveDataExtraData ==
Takes an input u64, no output.
+
No input/output, takes a type-0x6 output buffer.
   −
== Process ==
+
== OpenSaveDataDiffChunkIterator ==
Takes an input u64, returns an output u64.
+
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.
   −
== Cancel ==
+
== SuspendImport ==
 
No input/output.
 
No input/output.
   −
= ISaveDataTransferManagerForRepair =
+
== OpenSaveDataChunkImporter ==
This is "nn::fssrv::sf::ISaveDataTransferManagerForRepair".
+
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 [[11.0.0]].
+
This was added with [[5.0.0]].
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,722: Line 1,690:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 80 || [[#OpenSaveDataExporter]]
+
| 0 || [[#Next]]
 +
|-
 +
| 1 || [[#IsEnd]]  
 
|-
 
|-
| 90 || [[#OpenSaveDataImporter]]
+
| 16 || [[#GetId]]  
 
|}
 
|}
   −
== OpenSaveDataExporter ==
+
== Next ==
Takes a total of 0x10-bytes of input, returns an [[#ISaveDataDivisionExporter]].
+
No input/output.
 +
 
 +
== IsEnd ==
 +
No input, returns an output u8.
   −
== OpenSaveDataImporter ==
+
== GetId ==
Takes 1-byte of input, a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
+
No input, returns an output u32.
   −
= ISaveDataExporter =
+
= ISaveDataChunkExporter =
This is "nn::fssrv::sf::ISaveDataExporter".
+
This is "nn::fssrv::sf::ISaveDataChunkExporter".
   −
This was added with [[4.0.0]].
+
This was added with [[5.0.0]].
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,742: Line 1,715:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#GetSaveDataInfo]]
+
| 0 || [[#Pull]]
 
|-
 
|-
| 1 || [[#GetRestSize]]
+
| 16 || [6.0.0+] [[#GetRestRawDataSize]]
|-
  −
| 16 || [[#Pull]]
  −
|-
  −
| 17 || [[#PullInitialData]]
   
|}
 
|}
   −
== GetSaveDataInfo ==
+
== Pull ==
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.
+
Takes an input u64 and a type-0x6 output buffer, returns an output u64.
   −
The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw.
+
== GetRestRawDataSize ==
 
  −
== GetRestSize ==
   
No input, returns an output u64.
 
No input, returns an output u64.
   −
== Pull ==
+
= ISaveDataChunkImporter =
Takes a type-0x6 output buffer, returns an output u64.
+
This is "nn::fssrv::sf::ISaveDataChunkImporter".
   −
== PullInitialData ==
+
This was added with [[5.0.0]].
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"
 
{| class="wikitable" border="1"
Line 1,774: Line 1,735:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#GetSaveDataInfo]]
+
| 0 || [[#Push]]
|-
  −
| 1 || [[#GetRestSize]]
  −
|-
  −
| 16 || [[#Push]]
  −
|-
  −
| 17 || [[#Finalize]]
   
|}
 
|}
   −
== GetSaveDataInfo ==
+
== Push ==
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.
+
Takes an input u64 and a type-0x5 input buffer, no output.
   −
The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.
+
= ISaveDataTransferProhibiter =
 +
This is "nn::fssrv::sf::ISaveDataTransferProhibiter".
   −
== GetRestSize ==
+
This was added with [6.0.0+].
No input, returns an output u64.
     −
== Push ==
+
This doesn't seem to handle any commands (?).
No input/output, takes a type-0x5 input buffer.
     −
== Finalize ==
+
= IMultiCommitManager =
No input/output.
+
This is "nn::fssrv::sf::IMultiCommitManager".
   −
= ISaveDataTransferManagerWithDivision =
+
This was added with [6.0.0+].
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".
  −
 
  −
This was added with [[5.0.0]].
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 1,806: Line 1,757:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#GetChallenge]]
+
| 1 || [[#Add]]
 
|-
 
|-
| 16 || [[#SetKeySeedPackage]]
+
| 2 || [[#Commit]]
 +
|}
 +
 
 +
== Add ==
 +
Takes an input [[#IFilesystem]], no output.
 +
 
 +
== Commit ==
 +
No input/output.
 +
 
 +
= IWiper =
 +
This is "nn::fssrv::sf::IWiper".
 +
 
 +
This was added with [[10.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 32 || [[#OpenSaveDataExporter]]
+
! Cmd || Name
 
|-
 
|-
| 33 || [[#OpenSaveDataExporterForDiffExport]]
+
| 0 || [[#Startup|Startup]]
 
|-
 
|-
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
+
| 16 || [[#Process_2|Process]]
 +
|}
 +
 
 +
== Startup ==
 +
No input. Returns an u64.
 +
 
 +
== Process ==
 +
No input. Returns an u64.
 +
 
 +
= IStorageDeviceManager =
 +
This is "nn::fssrv::storage::sf::IStorageDeviceManager".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
|rowspan="2"| 64 || [5.0.0-5.1.0] OpenSaveDataImporter
+
! Cmd || Name
|-
  −
| [6.0.0+] [[#OpenSaveDataImporterDeprecated]]
   
|-
 
|-
| 65 || [[#OpenSaveDataImporterForDiffImport]]
+
| N/A || IsInserted
 
|-
 
|-
| 66 || [6.0.0+] [[#OpenSaveDataImporterForDuplicateDiffImport]]
+
| N/A || IsHandleValid
 
|-
 
|-
| 67 || [6.0.0+] [[#OpenSaveDataImporter]]
+
| N/A || OpenDetectionEvent
 
|-
 
|-
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]]
+
| N/A || OpenOperator
 
|-
 
|-
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
+
| N/A || OpenDevice
 
|-
 
|-
| 70 || [10.0.0+] DecryptAndVerifyInitialData
+
| N/A || OpenStorage
 
|-
 
|-
| 80 || [11.0.0+] DecryptoAndVerifyPortContext
+
| N/A || Invalidate
 
|}
 
|}
   −
== GetChallenge ==
+
= IStorageDeviceOperator =
No input/output, takes a type-0x6 output buffer containing the '''Challenge'''.
+
This is "nn::fssrv::storage::sf::IStorageDeviceOperator".
   −
== SetKeySeedPackage ==
+
{| class="wikitable" border="1"
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.
+
|-
 +
! Cmd || Name
 +
|-
 +
| N/A || Operate
 +
|-
 +
| N/A || OperateIn
 +
|-
 +
| N/A || OperateOut
 +
|-
 +
| N/A || OperateOut2
 +
|-
 +
| N/A || OperateInOut
 +
|-
 +
| N/A || OperateIn2Out
 +
|}
   −
== OpenSaveDataExporter ==
+
= IStorageDevice =
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
+
This is "nn::fssrv::storage::sf::IStorageDevice".
   −
== OpenSaveDataExporterForDiffExport ==
+
{| class="wikitable" border="1"
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]].
+
|-
 
  −
== OpenSaveDataExporterByContext ==
  −
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].
  −
 
  −
== OpenSaveDataImporterDeprecated ==
  −
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].
  −
 
  −
== OpenSaveDataImporterForDiffImport ==
  −
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]].
  −
 
  −
== OpenSaveDataImporterForDuplicateDiffImport ==
  −
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
  −
 
  −
== OpenSaveDataImporter ==
  −
Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
  −
 
  −
== OpenSaveDataImporterByContext ==
  −
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
  −
 
  −
== CancelSuspendingImport ==
  −
Takes an input u64 and a 0x10-byte struct, no output.
  −
 
  −
= ISaveDataDivisionExporter =
  −
This is "nn::fssrv::sf::ISaveDataDivisionExporter".
  −
 
  −
This was added with [[5.0.0]].
  −
 
  −
{| class="wikitable" border="1"
  −
|-
   
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#SetDivisionCount]]
+
| N/A || GetHandle
 
|-
 
|-
| 1 || [6.0.0+] [[#GetSaveDataInfo]]
+
| N/A || IsHandleValid
 
|-
 
|-
| 16 || [[#OpenSaveDataDiffChunkIterator]]
+
| N/A || OpenOperator
 
|-
 
|-
| 48 || [[#OpenSaveDataChunkExporter]]
+
| N/A || Read
 
|-
 
|-
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
+
| N/A || Write
 +
|-
 +
| N/A || Flush
 +
|-
 +
| N/A || SetSize
 +
|-
 +
| N/A || GetSize
 
|-
 
|-
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
+
| N/A || OperateRange
 +
|}
 +
 
 +
= FileSystemProxyType =
 +
This is "nn::fs::FileSystemProxyType".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 66 || [6.0.0+] [[#CancelExport]]
+
! Value || Name
 
|-
 
|-
| 67 || [6.0.0+] [[#SuspendExport]]
+
| 0 || Code
 
|-
 
|-
| 70 || [6.0.0+] [[#GetKeySeed]]
+
| 1 || Rom
 
|-
 
|-
| 71 || [6.0.0+] [[#GetInitialDataMac]]
+
| 2 || Logo
 +
|-
 +
| 3 || Control
 
|-
 
|-
| 72 || [6.0.0+] [[#FinalizeExport]]
+
| 4 || Manual
 
|-
 
|-
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
+
| 5 || Meta
 
|-
 
|-
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
+
| 6 || Data
 
|-
 
|-
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
+
| 7 || Package
 
|-
 
|-
| 96 || [6.0.0+] [[#GetReportInfo]]
+
| 8 || [4.0.0+] RegisteredUpdate
 
|}
 
|}
   −
== SetDivisionCount ==
+
= ContentType =
Takes an input u32, no output.
+
This is "nn::fs::ContentType".
   −
== OpenSaveDataChunkExporter ==
+
{| class="wikitable" border="1"
Takes an input u32, returns an [[#ISaveDataChunkExporter]].
+
|-
 +
! Value || Name
 +
|-
 +
| 0 || Meta
 +
|-
 +
| 1 || Control
 +
|-
 +
| 2 || Manual
 +
|-
 +
| 3 || Logo
 +
|-
 +
| 4 || Data
 +
|}
   −
== FinalizeFullExport ==
+
= ContentAttributes =
No input, returns two 0x10-byte output structs.
+
This is "nn::fs::ContentAttributes".
   −
== FinalizeDiffExport ==
+
{| class="wikitable" border="1"
No input, returns an output 0x10-byte struct.
+
|-
 +
! Value || Name
 +
|-
 +
| 0 || None
 +
|-
 +
| 15 || All
 +
|}
   −
== CancelExport ==
+
= ContentStorageId =
No input/output.
+
This is "nn::fs::ContentStorageId".
   −
== SuspendExport ==
+
{| class="wikitable" border="1"
No input/output, takes a type-0x6 output buffer.
+
|-
 +
! Value || Name
 +
|-
 +
| 0 || System
 +
|-
 +
| 1 || User
 +
|-
 +
| 2 || SdCard
 +
|-
 +
| 3 || [16.0.0+] System0
 +
|}
   −
== GetKeySeed ==
+
= SaveDataSpaceId =
No input, returns an output 0x10-byte struct.
+
This is "nn::fs::SaveDataSpaceId".
 
  −
== 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"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name
+
! Value || Name
 
|-
 
|-
| 0 || [6.0.0+] [[#GetSaveDataInfo]]
+
| 0 || System
 
|-
 
|-
| 16 || [[#OpenSaveDataDiffChunkIterator]]
+
| 1 || User
 
|-
 
|-
| 32 || [[#InitializeImport]]
+
| 2 || SdSystem
 
|-
 
|-
| 33 || [[#FinalizeImport]]
+
| 3 || [3.0.0+] Temporary
 
|-
 
|-
| 34 || [6.0.0+] [[#CancelImport]]
+
| 4 || [4.0.0+] SdUser
 
|-
 
|-
| 35 || [6.0.0+] [[#GetImportContext]]
+
| 100 || [3.0.0+] ProperSystem
 
|-
 
|-
| 36 || [6.0.0+] [[#SuspendImport]]
+
| 101 || [3.0.0+] SafeMode
 +
|}
 +
 
 +
Determines the storage where the savedata is stored.
 +
 
 +
= SaveDataType =
 +
This is "nn::fs::SaveDataType".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 37 || [11.0.0+] FinalizeImportWithoutSwap
+
! Value || Name
 
|-
 
|-
| 48 || [[#OpenSaveDataChunkImporter]]
+
| 0 || System
 
|-
 
|-
| 64 || [6.0.0+] [[#GetImportInitialDataAad]]
+
| 1 || Account
 
|-
 
|-
| 80 || [6.0.0+] [[#GetReportInfo]]
+
| 2 || Bcat
|}
+
|-
 
+
| 3 || Device
== GetSaveDataInfo ==
+
|-
No input/output, takes a type-0x6 output buffer.
+
| 4 || [3.0.0+] Temporary
 
+
|-
== OpenSaveDataDiffChunkIterator ==
+
| 5 || [3.0.0+] Cache
No input, returns an [[#ISaveDataChunkIterator]].
+
|-
 +
| 6 || [4.0.0+] SystemBcat
 +
|}
   −
== InitializeImport ==
+
= SaveDataRank =
No input, returns an output u64.
+
This is "nn::fs::SaveDataRank".
   −
== FinalizeImport ==
+
{| class="wikitable" border="1"
No input/output.
+
|-
 +
! Value || Name
 +
|-
 +
| 0 || Primary
 +
|-
 +
| 1 || Secondary
 +
|}
   −
== CancelImport ==
+
= SaveDataEnumerateOption =
No input/output.
+
This is "nn::fs::SaveDataEnumerateOption".
   −
== GetImportContext ==
+
{| class="wikitable" border="1"
No input/output, takes a type-0x6 output buffer.
+
|-
 +
! Value || Name
 +
|-
 +
| 1 || AllRank
 +
|}
   −
== SuspendImport ==
+
= SaveDataFlags =
No input/output.
+
This is "nn::fs::SaveDataFlags".
 
  −
== 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"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name
+
! Value || Name
 +
|-
 +
| 1 || KeepAfterResettingSystemSaveData
 
|-
 
|-
| 0 || [[#Next]]
+
| 2 || KeepAfterRefurbishment
 
|-
 
|-
| 1 || [[#IsEnd]]
+
| 4 || KeepAfterResettingSystemSaveDataWithoutUserSaveData
 
|-
 
|-
| 16 || [[#GetId]]
+
| 8 || NeedsSecureDelete
 
|}
 
|}
   −
== Next ==
+
= SaveDataMetaType =
No input/output.
+
This is "nn::fs::SaveDataMetaType".
   −
== IsEnd ==
+
{| class="wikitable" border="1"
No input, returns an output u8.
+
|-
 +
! Value || Name
 +
|-
 +
| 0 || None
 +
|-
 +
| 1 || Thumbnail
 +
|-
 +
| 2 || ExtensionContext
 +
|}
   −
== GetId ==
+
= ImageDirectoryId =
No input, returns an output u32.
+
This is "nn::fs::ImageDirectoryId".
 
  −
= ISaveDataChunkExporter =
  −
This is "nn::fssrv::sf::ISaveDataChunkExporter".
  −
 
  −
This was added with [[5.0.0]].
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name
+
! Value || Name
 
|-
 
|-
| 0 || [[#Pull]]
+
| 0 || Nand
 
|-
 
|-
| 16 || [6.0.0+] [[#GetRestRawDataSize]]
+
| 1 || SdCard
 
|}
 
|}
   −
== Pull ==
+
= CloudBackupWorkStorageId =
Takes an input u64 and a type-0x6 output buffer, returns an output u64.
+
This is "nn::fs::CloudBackupWorkStorageId".
 
  −
== 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"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name
+
! Value || Name
 +
|-
 +
| 0 || Nand
 
|-
 
|-
| 0 || [[#Push]]
+
| 1 || SdCard
 
|}
 
|}
   −
== Push ==
+
= CustomStorageId =
Takes an input u64 and a type-0x5 input buffer, no output.
+
This is "nn::fs::CustomStorageId".
 
  −
= 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"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name
+
! Value || Name
 
|-
 
|-
| 1 || [[#Add]]
+
| 0 || System
 
|-
 
|-
| 2 || [[#Commit]]
+
| 1 || SdCard
 
|}
 
|}
   −
== Add ==
+
= Priority =
Takes an input [[#IFilesystem]], no output.
+
This is "nn::fs::Priority".
 
  −
== Commit ==
  −
No input/output.
  −
 
  −
= IWiper =
  −
This is "nn::fs::IWiper".
  −
 
  −
This was added with [[10.0.0]].
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name
+
! Value || Name
 +
|-
 +
| 0 || Realtime
 
|-
 
|-
| 0 || [[#Startup|Startup]]
+
| 1 || Normal
 
|-
 
|-
| 16 || [[#Process_2|Process]]
+
| 2 || Low
 
|}
 
|}
   −
== Startup ==
+
= PriorityRaw =
No input. Returns an u64.
+
This is "nn::fs::PriorityRaw".
 
  −
== Process ==
  −
No input. Returns an u64.
  −
 
  −
= FileSystemProxyType =
  −
This is "nn::fs::FileSystemProxyType".
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,110: Line 2,083:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || Code
+
| 0 || Realtime
 
|-
 
|-
| 1 || Rom
+
| 1 || Normal
 
|-
 
|-
| 2 || Logo
+
| 2 || Low
 
|-
 
|-
| 3 || Control
+
| 3 || Background
|-
  −
| 4 || Manual
  −
|-
  −
| 5 || Meta
  −
|-
  −
| 6 || Data
  −
|-
  −
| 7 || Package
  −
|-
  −
| 8 || [4.0.0+] RegisteredUpdate
   
|}
 
|}
   −
= ContentType =
+
= AbortSpecifier =
This is "nn::fs::ContentType".
+
This is "nn::fs::AbortSpecifier".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,136: Line 2,099:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || Meta
+
| 0 || Default
 
|-
 
|-
| 1 || Control
+
| 1 || Abort
 
|-
 
|-
| 2 || Manual
+
| 2 || ReturnResult
|-
  −
| 3 || Logo
  −
|-
  −
| 4 || Data
   
|}
 
|}
   −
= ContentStorageId =
+
= OperationId =
This is "nn::fs::ContentStorageId".
+
This is "nn::fs::OperationId".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,154: Line 2,113:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || System
+
| 0 || Clear
 
|-
 
|-
| 1 || User
+
| 1 || ClearSignature
 +
|-
 +
| 2 || InvalidateCache
 
|-
 
|-
| 2 || SdCard
+
| 3 || QueryRange
 
|}
 
|}
   −
= SaveDataSpaceId =
+
= MountHostOption =
This is "nn::fs::SaveDataSpaceId".
+
This is "nn::fs::MountHostOption".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,168: Line 2,129:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || System
+
| 1 || PseudoCaseSensitive
|-
  −
| 1 || User
  −
|-
  −
| 2 || SdSystem
  −
|-
  −
| 3 || [3.0.0+] Temporary
  −
|-
  −
| 4 || [4.0.0+] SdUser
  −
|-
  −
| 100 || [3.0.0+] ProperSystem
  −
|-
  −
| 101 || [3.0.0+] SafeMode
   
|}
 
|}
   −
Determines the storage where the savedata is stored.
+
= BisPartitionId =
 
+
This is "nn::fs::BisPartitionId".
= SaveDataType =
  −
This is "nn::fs::SaveDataType".
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,192: Line 2,139:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || System
+
| 0 || BootPartition1Root
 
|-
 
|-
| 1 || Account
+
| 10 || BootPartition2Root
 
|-
 
|-
| 2 || Bcat
+
| 20 || UserDataRoot
 +
|-
 +
| 21 || BootConfigAndPackage2Part1
 
|-
 
|-
| 3 || Device
+
| 22 || BootConfigAndPackage2Part2
 
|-
 
|-
| 4 || [3.0.0+] Temporary
+
| 23 || BootConfigAndPackage2Part3
 
|-
 
|-
| 5 || [3.0.0+] Cache
+
| 24 || BootConfigAndPackage2Part4
 
|-
 
|-
| 6 || [4.0.0+] SystemBcat
+
| 25 || BootConfigAndPackage2Part5
|}
  −
 
  −
= SaveDataRank =
  −
This is "nn::fs::SaveDataRank".
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Value || Name
+
| 26 || BootConfigAndPackage2Part6
 
|-
 
|-
| 0 || Primary
+
| 27 || CalibrationBinary
 
|-
 
|-
| 1 || Secondary
+
| 28 || CalibrationFile
|}
  −
 
  −
= SaveDataEnumerateOption =
  −
This is "nn::fs::SaveDataEnumerateOption".
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Value || Name
+
| 29 || SafeMode
 
|-
 
|-
| 1 || AllRank
+
| 30 || User
|}
+
|-
 
+
| 31 || System
= SaveDataFlags =
  −
This is "nn::fs::SaveDataFlags".
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Value || Name
+
| 32 || SystemProperEncryption
 
|-
 
|-
| 1 || KeepAfterResettingSystemSaveData
+
| 33 || SystemProperPartition
 
|-
 
|-
| 2 || KeepAfterRefurbishment
+
| 34 || SignedSystemPartitionOnSafeMode
 
|-
 
|-
| 4 || KeepAfterResettingSystemSaveDataWithoutUserSaveData
+
| 35 || [16.0.0+] DeviceTreeBlob
 
|-
 
|-
| 8 || NeedsSecureDelete
+
| 36 || [16.0.0+] System0
 
|}
 
|}
   −
= SaveDataMetaType =
+
= SdCardSpeedMode =
This is "nn::fs::SaveDataMetaType".
+
This is "nn::fs::SdCardSpeedMode".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,252: Line 2,185:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || None
+
| 0 || Identification
 
|-
 
|-
| 1 || Thumbnail
+
| 1 || DefaultSpeed
 
|-
 
|-
| 2 || ExtensionContext
+
| 2 || HighSpeed
|}
  −
 
  −
= ImageDirectoryId =
  −
This is "nn::fs::ImageDirectoryId".
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Value || Name
+
| 3 || Sdr12
 +
|-
 +
| 4 || Sdr25
 +
|-
 +
| 5 || Sdr50
 +
|-
 +
| 6 || Sdr104
 
|-
 
|-
| 0 || Nand
+
| 7 || Ddr50
 
|-
 
|-
| 1 || SdCard
+
| 8 || Unknown
 
|}
 
|}
   −
= CloudBackupWorkStorageId =
+
= MmcSpeedMode =
This is "nn::fs::CloudBackupWorkStorageId".
+
This is "nn::fs::MmcSpeedMode".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,278: Line 2,211:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || Nand
+
| 0 || Identification
 +
|-
 +
| 1 || LegacySpeed
 +
|-
 +
| 2 || HighSpeed
 +
|-
 +
| 3 || Hs200
 +
|-
 +
| 4 || Hs400
 
|-
 
|-
| 1 || SdCard
+
| 5 || Unknown
 
|}
 
|}
   −
= CustomStorageId =
+
= MmcPartition =
This is "nn::fs::CustomStorageId".
+
This is "nn::fs::MmcPartition".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,290: Line 2,231:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || System
+
| 0 || UserData
 +
|-
 +
| 1 || BootPartition1
 
|-
 
|-
| 1 || SdCard
+
| 2 || BootPartition2
 
|}
 
|}
   −
= Priority =
+
= MemoryReportInfo =
This is "nn::fs::Priority".
+
This is "nn::fs::MemoryReportInfo".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Value || Name
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 0 || Realtime
+
| 0x0
 +
| 0x8
 +
| PooledBufferFreeSizePeak
 
|-
 
|-
| 1 || Normal
+
| 0x8
 +
| 0x8
 +
| PooledBufferRetriedCount
 
|-
 
|-
| 2 || Low
+
| 0x10
|}
+
| 0x8
 
+
| PooledBufferReduceAllocationCount
= PriorityRaw =
  −
This is "nn::fs::PriorityRaw".
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Value || Name
+
| 0x18
 +
| 0x8
 +
| BufferManagerFreeSizePeak
 
|-
 
|-
| 0 || Realtime
+
| 0x20
 +
| 0x8
 +
| BufferManagerRetriedCount
 
|-
 
|-
| 1 || Normal
+
| 0x28
 +
| 0x8
 +
| ExpHeapFreeSizePeak
 
|-
 
|-
| 2 || Low
+
| 0x30
 +
| 0x8
 +
| BufferPoolFreeSizePeak
 
|-
 
|-
| 3 || Background
+
| 0x38
|}
+
| 0x8
 
+
| PatrolReadAllocateBufferSuccessCount
= AbortSpecifier =
+
|-
This is "nn::fs::AbortSpecifier".
+
| 0x40
 
+
| 0x8
{| class="wikitable" border="1"
+
| PatrolReadAllocateBufferFailureCount
 
|-
 
|-
! Value || Name
+
| 0x48
 +
| 0x8
 +
| BufferManagerTotalAllocatableSizePeak
 
|-
 
|-
| 0 || Default
+
| 0x50
 +
| 0x8
 +
| BufferPoolAllocateSizeMax
 
|-
 
|-
| 1 || Abort
+
| 0x58
 +
| 0x8
 +
| PooledBufferFailedIdealAllocationCountOnAsyncAccess
 
|-
 
|-
| 2 || ReturnResult
+
| 0x60
 +
| 0x20
 +
| Reserved
 
|}
 
|}
   −
= OperationId =
+
= StorageErrorInfo =
This is "nn::fs::OperationId".
+
This is "nn::fs::StorageErrorInfo".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Value || Name
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 0 || Clear
+
| 0x0
 +
| 0x4
 +
| NumActivationFailures
 
|-
 
|-
| 1 || ClearSignature
+
| 0x4
 +
| 0x4
 +
| NumActivationErrorCorrections
 
|-
 
|-
| 2 || InvalidateCache
+
| 0x8
 +
| 0x4
 +
| NumReadWriteFailures
 
|-
 
|-
| 3 || QueryRange
+
| 0xC
 +
| 0x4
 +
| NumReadWriteErrorCorrections
 
|}
 
|}
   −
= MountHostOption =
+
= GameCardErrorInfo =
This is "nn::fs::MountHostOption".
+
This is "nn::fs::GameCardErrorInfo".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Value || Name
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 1 || PseudoCaseSensitive
+
| 0x0
|}
+
| 0x2
 
+
| GameCardCrcErrorCount
= BisPartitionId =
  −
This is "nn::fs::BisPartitionId".
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Value || Name
+
| 0x2
 +
| 0x2
 +
| Reserved
 
|-
 
|-
| 0 || BootPartition1Root
+
| 0x4
 +
| 0x2
 +
| AsicCrcErrorCount
 
|-
 
|-
| 10 || BootPartition2Root
+
| 0x6
 +
| 0x2
 +
| Reserved
 
|-
 
|-
| 20 || UserDataRoot
+
| 0x8
 +
| 0x2
 +
| RefreshCount
 
|-
 
|-
| 21 || BootConfigAndPackage2Part1
+
| 0xA
 +
| 0x2
 +
| Reserved
 
|-
 
|-
| 22 || BootConfigAndPackage2Part2
+
| 0xC
 +
| 0x2
 +
| ReadRetryCount
 
|-
 
|-
| 23 || BootConfigAndPackage2Part3
+
| 0xE
 +
| 0x2
 +
| TimeoutRetryErrorCount
 +
|}
 +
 
 +
= GameCardErrorReportInfo =
 +
This is "nn::fs::GameCardErrorReportInfo".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 24 || BootConfigAndPackage2Part4
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 25 || BootConfigAndPackage2Part5
+
| 0x0
 +
| 0x10
 +
| [[#GameCardErrorInfo|ErrorInfo]]
 
|-
 
|-
| 26 || BootConfigAndPackage2Part6
+
| 0x10
 +
| 0x2
 +
| AsicReinitializeFailureDetail
 
|-
 
|-
| 27 || CalibrationBinary
+
| 0x12
 +
| 0x2
 +
| InsertionCount
 
|-
 
|-
| 28 || CalibrationFile
+
| 0x14
 +
| 0x2
 +
| RemovalCount
 
|-
 
|-
| 29 || SafeMode
+
| 0x16
 +
| 0x2
 +
| AsicReinitializeCount
 
|-
 
|-
| 30 || User
+
| 0x18
 +
| 0x4
 +
| AsicInitializeCount
 +
|-
 +
| 0x1C
 +
| 0x2
 +
| AsicReinitializeFailureCount
 +
|-
 +
| 0x1E
 +
| 0x2
 +
| AwakenFailureCount
 +
|-
 +
| 0x20
 +
| 0x2
 +
| Reserved
 +
|-
 +
| 0x22
 +
| 0x2
 +
| RefreshCount
 +
|-
 +
| 0x24
 +
| 0x4
 +
| LastReadErrorPageAddress
 +
|-
 +
| 0x28
 +
| 0x4
 +
| LastReadErrorPageCount
 
|-
 
|-
| 31 || System
+
| 0x2C
 +
| 0x4
 +
| AwakenCount
 
|-
 
|-
| 32 || SystemProperEncryption
+
| 0x30
 +
| 0x4
 +
| ReadCountFromInsert
 
|-
 
|-
| 33 || SystemProperPartition
+
| 0x34
 +
| 0x4
 +
| ReadCountFromAwaken
 
|-
 
|-
| 34 || SignedSystemPartitionOnSafeMode
+
| 0x38
 +
| 0x8
 +
| Reserved
 
|}
 
|}
   −
= SdCardSpeedMode =
+
= GameCardHandle =
This is "nn::fs::SdCardSpeedMode".
+
This is "nn::fs::GameCardHandle". This is an u32.
 +
 
 +
= GameCardPartition =
 +
This is "nn::fs::GameCardPartition".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,414: Line 2,452:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || Identification
+
| 0 || Update
 
|-
 
|-
| 1 || DefaultSpeed
+
| 1 || Normal
 
|-
 
|-
| 2 || HighSpeed
+
| 2 || Secure
 
|-
 
|-
| 3 || Sdr12
+
| 3 || [4.0.0+] Logo
 +
|}
 +
 
 +
= GameCardPartitionRaw =
 +
This is "nn::fs::GameCardPartitionRaw".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 4 || Sdr25
+
! Value || Name
 
|-
 
|-
| 5 || Sdr50
+
| 0 || NormalReadOnly
 
|-
 
|-
| 6 || Sdr104
+
| 1 || SecureReadOnly
 
|-
 
|-
| 7 || Ddr50
+
| 2 || RootWriteOnly
|-
  −
| 8 || Unknown
   
|}
 
|}
   −
= MmcSpeedMode =
+
= GameCardAttribute =
This is "nn::fs::MmcSpeedMode".
+
This is "nn::fs::GameCardAttribute".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,440: Line 2,482:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || Identification
+
| 1 || AutoBootFlag
 
|-
 
|-
| 1 || LegacySpeed
+
| 2 || HistoryEraseFlag
 
|-
 
|-
| 2 || HighSpeed
+
| 4 || [4.0.0+] RepairToolFlag
 
|-
 
|-
| 3 || Hs200
+
| 8 || [9.0.0+] DifferentRegionCupToTerraDeviceFlag
 
|-
 
|-
| 4 || Hs400
+
| 16 || [9.0.0+] DifferentRegionCupToGlobalDeviceFlag
|-
  −
| 5 || Unknown
   
|}
 
|}
   −
= MmcPartition =
+
= GameCardSize =
This is "nn::fs::MmcPartition".
+
This is "nn::fs::GameCardSize".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,460: Line 2,500:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || UserData
+
| 1 || Size1GB
 +
|-
 +
| 2 || Size2GB
 +
|-
 +
| 4 || Size4GB
 +
|-
 +
| 8 || Size8GB
 
|-
 
|-
| 1 || BootPartition1
+
| 16 || Size16GB
 
|-
 
|-
| 2 || BootPartition2
+
| 32 || Size32GB
 
|}
 
|}
   −
= StorageErrorInfo =
+
= GameCardClockRate =
This is "nn::fs::StorageErrorInfo".
+
This is "nn::fs::GameCardClockRate".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Offset
+
! Value || Name
! Size
  −
! Description
   
|-
 
|-
| 0x0
+
| 25 || ClockRate25MHz
| 0x4
  −
| NumActivationFailures
   
|-
 
|-
| 0x4
+
| 50 || ClockRate50MHz
| 0x4
+
|}
| NumActivationErrorCorrections
+
 
 +
= GameCardCompatibilityType =
 +
This is "nn::fs::GameCardCompatibilityType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 
|-
 
|-
| 0x8
+
| 0 || Global
| 0x4
  −
| NumReadWriteFailures
   
|-
 
|-
| 0xC
+
| 1 || China
| 0x4
  −
| NumReadWriteErrorCorrections
   
|}
 
|}
   −
= GameCardErrorInfo =
+
= GameCardUpdatePartitionInfo =
This is "nn::fs::GameCardErrorInfo".
+
This is "nn::fs::GameCardUpdatePartitionInfo".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,504: Line 2,548:  
| 0x0
 
| 0x0
 
| 0x4
 
| 0x4
| GameCardCrcErrorNum
+
| Version
 
|-
 
|-
 
| 0x4
 
| 0x4
 
| 0x4
 
| 0x4
| AsicCrcErrorNum
+
| Reserved
 
|-
 
|-
 
| 0x8
 
| 0x8
| 0x4
+
| 0x8
| RefreshNum
+
| Id
|-
  −
| 0xC
  −
| 0x4
  −
| RetryLimitOutNum
   
|}
 
|}
   −
= GameCardErrorReportInfo =
+
= GameCardIdSet =
This is "nn::fs::GameCardErrorReportInfo". This is a 0x40-byte struct.
+
This is "nn::gc::GameCardIdSet".
 
  −
= GameCardHandle =
  −
This is "nn::fs::GameCardHandle". This is an u32.
  −
 
  −
= GameCardPartition =
  −
This is "nn::fs::GameCardPartition".
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Value || Name
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 0 || Update
+
| 0x0
 +
| 0x4
 +
| [[#CardId1|Id1]]
 
|-
 
|-
| 1 || Normal
+
| 0x4
 +
| 0x4
 +
| [[#CardId2|Id2]]
 
|-
 
|-
| 2 || Secure
+
| 0x8
|-
+
| 0x4
| 3 || [4.0.0+] Logo
+
| [[#CardId3|Id3]]
 
|}
 
|}
   −
= GameCardPartitionRaw =
+
= CardId1 =
This is "nn::fs::GameCardPartitionRaw".
+
This is "nn::gc::detail::CardId1".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Value || Name
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 0 || NormalReadOnly
+
| 0x0
 +
| 0x1
 +
| [[#MakerCodeForCardId1|MakerCode]]
 +
|-
 +
| 0x1
 +
| 0x1
 +
| [[#MemoryCapacity|MemoryCapacity]]
 
|-
 
|-
| 1 || SecureReadOnly
+
| 0x2
 +
| 0x1
 +
| Reserved
 
|-
 
|-
| 2 || RootWriteOnly
+
| 0x3
 +
| 0x1
 +
| MemoryType
 
|}
 
|}
   −
= GameCardAttribute =
+
= CardId2 =
This is "nn::fs::GameCardAttribute".
+
This is "nn::gc::detail::CardId2".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Value || Name
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 1 || AutoBootFlag
+
| 0x0
 +
| 0x1
 +
| CardSecurityNumber
 
|-
 
|-
| 2 || HistoryEraseFlag
+
| 0x1
 +
| 0x1
 +
| CardType
 
|-
 
|-
| 4 || [4.0.0+] RepairToolFlag
+
| 0x2
 +
| 0x2
 +
| Reserved
 +
|}
 +
 
 +
= CardId3 =
 +
This is "nn::gc::detail::CardId3".
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 8 || [9.0.0+] DifferentRegionCupToTerraDeviceFlag
+
! Offset
 +
! Size
 +
! Description
 
|-
 
|-
| 16 || [9.0.0+] DifferentRegionCupToGlobalDeviceFlag
+
| 0x0
 +
| 0x4
 +
| Reserved
 
|}
 
|}
   −
= GameCardSize =
+
= MakerCodeForCardId1 =
This is "nn::fs::GameCardSize".
+
This is "nn::gc::detail::MakerCodeForCardId1".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,580: Line 2,650:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 1 || Size1GB
+
| 0x36 || Unknown
|-
  −
| 2 || Size2GB
  −
|-
  −
| 4 || Size4GB
  −
|-
  −
| 8 || Size8GB
   
|-
 
|-
| 16 || Size16GB
+
| 0xC2 || MegaChips
 
|-
 
|-
| 32 || Size32GB
+
| 0xAE || Lapis
 
|}
 
|}
   −
= GameCardClockRate =
+
= MemoryCapacity =
This is "nn::fs::GameCardClockRate".
+
This is "nn::gc::detail::MemoryCapacity".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 2,600: Line 2,664:  
! Value || Name
 
! Value || Name
 
|-
 
|-
| 25 || ClockRate25MHz
+
| 0xFA || 1GB
|-
  −
| 50 || ClockRate50MHz
  −
|}
  −
 
  −
= GameCardCompatibilityType =
  −
This is "nn::fs::GameCardCompatibilityType".
  −
 
  −
{| class="wikitable" border="1"
  −
|-
  −
! Value || Name
  −
|-
  −
| 0 || Global
  −
|-
  −
| 1 || China
  −
|}
  −
 
  −
= GameCardUpdatePartitionInfo =
  −
This is "nn::fs::GameCardUpdatePartitionInfo".
  −
 
  −
{| class="wikitable" border="1"
  −
|-
  −
! Offset
  −
! Size
  −
! Description
  −
|-
  −
| 0x0
  −
| 0x4
  −
| Version
  −
|-
  −
| 0x4
  −
| 0x4
  −
| Reserved
  −
|-
  −
| 0x8
  −
| 0x8
  −
| Id
  −
|}
  −
 
  −
= CardId1 =
  −
This is "nn::gc::detail::CardId1".
  −
 
  −
{| class="wikitable" border="1"
  −
|-
  −
! Offset
  −
! Size
  −
! Description
  −
|-
  −
| 0x0
  −
| 0x1
  −
| MakerCode
  −
|-
  −
| 0x1
  −
| 0x1
  −
| MemoryCapacity
  −
|-
  −
| 0x2
  −
| 0x1
  −
| Reserved
  −
|-
  −
| 0x3
  −
| 0x1
  −
| MemoryType
  −
|}
  −
 
  −
= CardId2 =
  −
This is "nn::gc::detail::CardId2".
  −
 
  −
{| class="wikitable" border="1"
  −
|-
  −
! Offset
  −
! Size
  −
! Description
  −
|-
  −
| 0x0
  −
| 0x1
  −
| CardSecurityNumber
  −
|-
  −
| 0x1
  −
| 0x1
  −
| CardType
  −
|-
  −
| 0x2
  −
| 0x2
  −
| Reserved
  −
|}
  −
 
  −
= CardId3 =
  −
This is "nn::gc::detail::CardId3".
  −
 
  −
{| class="wikitable" border="1"
  −
|-
  −
! Offset
  −
! Size
  −
! Description
   
|-
 
|-
| 0x0
+
| 0xF8 || 2GB
| 0x4
  −
| Reserved
  −
|}
  −
 
  −
= GameCardIdSet =
  −
This is "nn::gc::GameCardIdSet".
  −
 
  −
{| class="wikitable" border="1"
   
|-
 
|-
! Offset
+
| 0xF0 || 4GB
! Size
  −
! Description
   
|-
 
|-
| 0x0
+
| 0xE0 || 8GB
| 0x4
  −
| [[#CardId1|Id1]]
   
|-
 
|-
| 0x4
+
| 0xE1 || 16GB
| 0x4
  −
| [[#CardId2|Id2]]
   
|-
 
|-
| 0x8
+
| 0xE2 || 32GB
| 0x4
  −
| [[#CardId3|Id3]]
   
|}
 
|}
   Line 2,798: Line 2,752:  
|}
 
|}
   −
= ContentPath =
+
= FspPath =
These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They're passed via X descriptors, and returned via various [[Location Resolver services|ncm/lr]] commands.
+
This is "nn::fssrv::sf::FspPath". This is a 0x301-byte string.
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"

Navigation menu