Filesystem services: Difference between revisions

No edit summary
 
(42 intermediate revisions by 4 users not shown)
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+] Now takes an additional type-0x1A output buffer.
 
[16.0.0+] Now takes an additional input [[#ContentAttributes]].
 
[17.0.0+] Now takes a type-0x6 output buffer instead of a type-0x1A output buffer.
 
[20.0.0+] Now no longer takes a type-0x19 input buffer containing a [[#FspPath]] and instead takes an input [[NCM_services#StorageId|StorageId]].


== 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 41: Line 47:


== RegisterProgram ==
== RegisterProgram ==
Takes a [[NCM_services#StorageId|StorageId]], an u64 ProcessId, a [[NCM_services#ProgramId|ProgramId]], a 0x1C type-A buffer for the [[NPDM#FS_Access_Header| FS Access Header]], and a 0x2C type-A buffer for the [[NPDM#FS_Access_Control| FS Access Control]]
Takes an input [[NCM_services#StorageId|StorageId]], an input u64 ProcessId, an input [[NCM_services#ProgramId|ProgramId]], a type-0x5 input buffer containing an [[NPDM#ACID|ACID]] [[NPDM#FsAccessControl|FsAccessControl]], and a type-0x5 input buffer containing an [[NPDM#ACI0|ACI0]] [[NPDM#FsAccessControl|FsAccessControl]].


Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.
Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.
[20.0.0+] Now takes an additional input [[#FsAccessControlRestrictionMode]].


== UnregisterProgram ==
== UnregisterProgram ==
Takes a pid. Removes registered FS permissions for that PID.
Takes an input u64 ProcessId. No output.
 
Removes registered FS permissions for that PID.


== SetEnabledProgramVerification ==
== SetEnabledProgramVerification ==
Seems to sets a global flag to inputval & 1.
Takes an input bool. No output.


When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.
When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.
Line 70: Line 80:
| 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 101: Line 113:
|-
|-
| 28 || [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute
| 28 || [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute
|-
| 29 || [19.0.0+] IsInitializationMode
|-
|-
| 30 || [[#OpenGameCardStorage]]
| 30 || [[#OpenGameCardStorage]]
Line 115: Line 129:
|-
|-
| 36 || [9.0.0+] OpenHostFileSystemWithOption
| 36 || [9.0.0+] OpenHostFileSystemWithOption
|-
| 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2
|-
| 38 || [20.0.0+] DetachSdCard
|-
|-
| 51 || [[#OpenSaveDataFileSystem]]
| 51 || [[#OpenSaveDataFileSystem]]
Line 190: Line 208:
| 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]]
| 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]]
|-
|-
| 206 || [13.0.0+]  
| 206 || [13.0.0+] OpenDataStorageByPath
|-
| 207 || [15.0.0+] OpenDataFileSystemByDataId
|-
|-
| 400 || [[#OpenDeviceOperator]]
| 400 || [[#OpenDeviceOperator]]
Line 197: Line 217:
|-
|-
| 501 || [[#OpenGameCardDetectionEventNotifier]]
| 501 || [[#OpenGameCardDetectionEventNotifier]]
|-
| 502 || [20.0.0+] OpenSdCardAwakenReadyEventNotifier
|-
| 503 || [19.0.0+] OpenGameCardAwakenReadyEventNotifier
|-
|-
| 510 || [5.0.0+] OpenSystemDataUpdateEventNotifier
| 510 || [5.0.0+] OpenSystemDataUpdateEventNotifier
Line 222: Line 246:
| 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 239: Line 263:
|-
|-
| 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 245: Line 271:
|-
|-
| 631 || [4.0.0+] IsSdCardAccessible
| 631 || [4.0.0+] IsSdCardAccessible
|-
| 632 || [19.0.0+] TestExternalKey
|-
|-
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid
Line 261: Line 289:
|-
|-
| 810 || [7.0.0+] RegisterProgramIndexMapInfo
| 810 || [7.0.0+] RegisterProgramIndexMapInfo
|-
| 820 || [19.0.0+] GetContentStorageInfoIndex
|-
|-
| 1000 || [1.0.0-9.2.0] SetBisRootForHost
| 1000 || [1.0.0-9.2.0] SetBisRootForHost
Line 300: Line 330:
| 1019 || [13.0.0+] UnsetDebugOption
| 1019 || [13.0.0+] UnsetDebugOption
|-
|-
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey
| 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 307: Line 341:
|-
|-
| 1300 || [10.0.0+] [[#OpenBisWiper]]
| 1300 || [10.0.0+] [[#OpenBisWiper]]
|-
| 1400 || [15.0.0+] NotifyErrorContextServiceReady
|}
|}


Line 342: Line 378:
|-
|-
| 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 || [-19.0.0] 0x8000000000000000 [20.0.0+] 0x8000000000000020 || 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]]
| [20.0.0+] 0x2 || || 0x8000100000000080 ||
|-
|-
| ([1.0.0-2.3.0] 0x14) || || 0x8000000000010082 || ||
| [-19.0.0] 0x2 [20.0.0+] 0x3 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate
|-
|-
| ([3.0.0-6.2.0] 0x14) || || 0x8000000000000020 || ||
| [-19.0.0] 0x3 [20.0.0+] 0x4 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet
|-
|-
| ([7.0.0-9.2.0] 0x14) || || 0x8000000000000028 || ||
| [-19.0.0] 0x4 [20.0.0+] 0x5 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver
|-
|-
| 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]]
| [-19.0.0] 0x5 [20.0.0+] 0x6 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo
|-
|-
| ([1.0.0-2.3.0] 0x15) || || 0x8000000000010080 || ||
| [-19.0.0] 0x6 [20.0.0+] 0x7 || CanGetGameCardAsicCertificate || 0x8000000000000200 || GetGameCardAsicCertificate
|-
|-
| ([3.0.0-5.1.0] 0x15) || || 0x8000000000010082 || ||
| [20.0.0+] 0x8 || || 0x8000100000000080 ||
|-
|-
| ([6.0.0-9.2.0] 0x15) || || 0x8000000000000020 || ||
| [20.0.0+] 0x9 || || 0x8000100000000080 ||
|-
|-
| 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
| [20.0.0+] 0xA || || 0x8000080000000000 ||
|-
|-
| ([1.0.0-5.1.0] 0x16) || || 0x8000000000010080 || ||
| [20.0.0+] 0xB || || 0x8000000000000010 ||
|-
|-
| ([6.0.0-6.2.0] 0x16) || || 0x8000000000010082 || ||
| [20.0.0+] 0xC || || 0x8000100000000080 ||
|-
|-
| ([7.0.0-9.2.0] 0x16) || || 0x8000000000000020 || ||
| [-19.0.0] 0x7 [20.0.0+] 0xD || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]]
|-
|-
| 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]]
| [-19.0.0] 0x8 [20.0.0+] 0xE || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
|-
|-
| ([1.0.0-2.3.0] 0x17) || || 0x8000000000010080 || ||
| [-19.0.0] 0x9 [20.0.0+] 0xF || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId
|-
|-
| ([3.0.0-5.1.0] 0x17) || || 0x8000000000000080 || ||
| [-19.0.0] 0xA [20.0.0+] 0x10 || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId
|-
|-
| ([6.0.0-6.2.0] 0x17) || || 0x8000000000010080 || ||
| [-19.0.0] 0xB [20.0.0+] 0x11 || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
|-
|-
| ([7.0.0-9.2.0] 0x17) || || 0x8000000000010082 || ||
| [-19.0.0] 0xC [20.0.0+] 0x12 || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
|-
|-
| 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [-19.0.0] 0xD [20.0.0+] 0x13 || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
|-
|-
| ([1.0.0-5.1.0] 0x18) || || 0x8000000000010080 || ||
| [-19.0.0] 0xE [20.0.0+] 0x14 || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]]
|-
|-
| ([6.0.0-6.2.0] 0x18) || || 0x8000000000000080 || ||
| [-19.0.0] 0xF [20.0.0+] 0x15 || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile
|-
|-
| ([7.0.0-9.2.0] 0x18) || || 0x8000000000010080 || ||
| [-19.0.0] 0x10 [20.0.0+] 0x16 || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
|-
|-
| 0x18 || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [-19.0.0] 0x11 [20.0.0+] 0x17 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]]
|-
| [-19.0.0] 0x12 [20.0.0+] 0x18 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]]
|-
|-
| ([6.0.0-6.2.0] 0x19) || || 0x8000000000010080 || ||
| [-19.0.0] 0x13 [20.0.0+] 0x19 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode
|-
|-
| ([7.0.0-9.2.0] 0x19) || || 0x8000000000000080 || ||
| [20.0.0+] 0x1A || || 0x8000000400080000 ||
|-
|-
| 0x19 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [20.0.0+] 0x1B || || 0x8000000400080000 ||
|-
|-
| ([1.0.0-9.2.0] 0x1A) || || 0x8000000000010080 || ||
| [-19.0.0] 0x14 [20.0.0+] 0x1C || CanDebug || 0xC000000000000000 ||  
|-
|-
| 0x1A || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [-19.0.0] 0x15 [20.0.0+] 0x1D || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles
|-
|-
| ([1.0.0-9.2.0] 0x1B) || || 0x8000000000010080 || ||
| [2.0.0-19.0.0] 0x16 [20.0.0+] 0x1E || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
|-
|-
| 0x1B || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [2.0.0-19.0.0] 0x17 [20.0.0+] 0x1F || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
|-
|-
| ([1.0.0-9.2.0] 0x1C) || || 0x8000000000010080 || ||  
| [2.0.0-19.0.0] 0x18 [20.0.0+] 0x20 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId
|-
|-
| 0x1C || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [2.0.0-19.0.0] 0x19 [20.0.0+] 0x21 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
|-
|-
| ([1.0.0-2.3.0] 0x1D) || || 0x8000000000000084 || ||
| [2.0.0-19.0.0] 0x1A [20.0.0+] 0x22 || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem
|-
|-
| ([3.0.0-9.2.0] 0x1D) || || 0x8000000000010080 || ||
| [3.0.0-19.0.0] 0x1B [20.0.0+] 0x23 || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
|-
|-
| 0x1D || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [3.0.0-19.0.0] 0x1C [20.0.0+] 0x24 || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey
|-
|-
| ([1.0.0-5.1.0] 0x1E) || || 0x8000000000000084 || ||
| [4.0.0-19.0.0] 0x1D [20.0.0+] 0x25 || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]]
|-
|-
| ([6.0.0-9.2.0] 0x1E) || || 0x8000000000010080 || ||
| [4.0.0-19.0.0] 0x1E [20.0.0+] 0x26 || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
|-
|-
| 0x1E || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [4.0.0-19.0.0] 0x1F [20.0.0+] 0x27 || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
|-
|-
| ([1.0.0-5.1.0] 0x1F) || || 0x8000000000000080 || ||
| [4.0.0-19.0.0] 0x20 [20.0.0+] 0x28 || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
|-
|-
| ([6.0.0-6.2.0] 0x1F) || || 0x8000000000000084 || ||
| [5.0.0-19.0.0] 0x21 [20.0.0+] 0x29 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
|-
|-
| ([7.0.0-9.2.0] 0x1F) || || 0x8000000000010080 || ||
| [5.0.0-19.0.0] 0x22 [20.0.0+] 0x2A || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem
|-
|-
| 0x1F || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]]
| [5.0.0-19.0.0] 0x23 [20.0.0+] 0x2B || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem
|-
|-
| ([1.0.0-5.1.0] 0x20) || || 0x8000000000000080 || ||
| [5.0.0-19.0.0] 0x24 [20.0.0+] 0x2C || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem
|-
|-
| ([6.0.0-9.2.0] 0x20) || || 0x8000000000000084 || ||
| [5.0.0-19.0.0] 0x25 [20.0.0+] 0x2D || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition
|-
|-
| 0x20 || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]]
| [5.0.0-19.0.0] 0x26 [20.0.0+] 0x2E || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]]
|-
|-
| ([6.0.0-6.2.0] 0x21) || || 0x8000000000000080 || ||
| [5.0.0-19.0.0] 0x27 [20.0.0+] 0x2F || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]]
|-
|-
| ([7.0.0-9.2.0] 0x21) || || 0x8000000000000084 || ||
| [5.0.0-19.0.0] 0x28 [20.0.0+] 0x30 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair
|-
|-
| 0x21 || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [5.0.0-19.0.0] 0x29 [20.0.0+] 0x31 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair
|-
|-
| ([1.0.0-9.2.0] 0x22) || || 0x8000000000000080 || ||
| [5.0.0-19.0.0] 0x2A [20.0.0+] 0x32 || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]]
|-
|-
| 0x22 || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [5.0.0-19.0.0] 0x2B [20.0.0+] 0x33 || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]]
|-
|-
| ([1.0.0-2.3.0] 0x23) || || 0xC000000000200000 || ||
| [5.0.0-19.0.0] 0x2C [20.0.0+] 0x34 || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]]
|-
|-
| ([3.0.0-9.2.0] 0x23) || || 0x8000000000000080 || ||
| [5.0.0-19.0.0] 0x2D [20.0.0+] 0x35 || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]]
|-
|-
| 0x23 || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [5.0.0-19.0.0] 0x2E [20.0.0+] 0x36 || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol
|-
|-
| ([1.0.0-2.3.0] 0x24) || || 0x8000000000000100 || ||
| [5.0.0-19.0.0] 0x2F [20.0.0+] 0x37 || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey
|-
|-
| ([3.0.0-9.2.0] 0x24) || || 0x8000000000000080 || ||
| [5.1.0-19.0.0] 0x30 [20.0.0+] 0x38 || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]]
|-
|-
| 0x24 || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [20.0.0+] 0x39 || || 0x8000000000200000 ||
|-
|-
| ([1.0.0-2.3.0] 0x25) || || 0x8000000000100008 || ||
| [6.0.0-19.0.0] 0x31 [20.0.0+] 0x3A || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]]
|-
|-
| ([3.0.0-5.1.0] 0x25) || || 0xC000000000200000 || ||
| [20.0.0+] 0x3B || CanOpenGameCardAwakenReadyEventNotifier || 0x8000000080000110 || OpenGameCardAwakenReadyEventNotifier
|-
|-
| ([6.0.0-9.2.0] 0x25) || || 0x8000000000000080 || ||
| [6.0.0-19.0.0] 0x32 [20.0.0+] 0x3C || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier
|-
|-
| 0x25 || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [6.0.0-19.0.0] 0x33 [20.0.0+] 0x3D || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent
|-
|-
| ([1.0.0-2.3.0] 0x26) || || 0xC000000000400000 || ||
| [6.0.0-19.0.0] 0x34 [20.0.0+] 0x3E || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]]
|-
|-
| ([3.0.0-5.1.0] 0x26) || || 0x8000000000000100 || ||
| [6.0.0-19.0.0] 0x35 [20.0.0+] 0x3F || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent
|-
|-
| ([6.0.0-6.2.0] 0x26) || || 0xC000000000200000 || ||
| [6.0.0-19.0.0] 0x36 [20.0.0+] 0x40 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected
|-
|-
| ([7.0.0-9.2.0] 0x26) || || 0x8000000000000080 || ||
| [6.0.0-19.0.0] 0x37 [20.0.0+] 0x41 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure
|-
|-
| 0x26 || CanOpenSdCardStorage || 0xC000000000200000 || RW ||  
| [6.0.0-19.0.0] 0x38 [20.0.0+] 0x42 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure
|-
|-
| ([3.0.0-5.1.0] 0x27) || || 0x8000000000100008 || ||
| [8.0.0-19.0.0] 0x39 [20.0.0+] 0x43 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize
|-
|-
| ([6.0.0-6.2.0] 0x27) || || 0x8000000000000100 || ||
| [9.0.0-19.0.0] 0x3A [20.0.0+] 0x44 || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]]
|-
|-
| ([7.0.0-9.2.0] 0x27) || || 0xC000000000200000 || ||  
| [20.0.0+] 0x45 ||   || 0x8000000000200000 ||
|-
|-
| [3.0.0+] 0x27 || CanOpenGameCardStorage || 0x8000000000000100 || RW || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)
| [9.0.0-19.0.0] 0x3B [20.0.0+] 0x46 || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility
|-
|-
| ([3.0.0-5.1.0] 0x28) || || 0xC000000000400000 || ||
| [9.0.0-19.0.0] 0x3C [20.0.0+] 0x47 || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent
|-
|-
| ([6.0.0-6.2.0] 0x28) || || 0x8000000000100008 || ||
| [9.0.0-19.0.0] 0x3D [20.0.0+] 0x48 || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]
|-
|-
| ([7.0.0-9.2.0] 0x28) || || 0x8000000000000100 || ||
| [9.0.0-19.0.0] 0x3E [20.0.0+] 0x49 || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo
|-
|-
| [3.0.0+] 0x28 || CanMountSystemDataPrivate || 0x8000000000100008 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
| [9.0.0-19.0.0] 0x3F [20.0.0+] 0x4A || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence
|-
|-
| ([4.0.0-5.1.0] 0x29) || || 0x8000000000010000 || ||
| [9.0.0-19.0.0] 0x40 [20.0.0+] 0x4B || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt
|-
|-
| ([6.0.0-6.2.0] 0x29) || || 0xC000000000400000 || ||
| [9.0.0-19.0.0] 0x41 [20.0.0+] 0x4C || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]]
|-
|-
| ([7.0.0-9.2.0] 0x29) || || 0x8000000000100008 || ||
| [10.0.0-19.0.0] 0x42 [20.0.0+] 0x4D || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]]
|-
|-
| [4.0.0+] 0x29 || CanMountHost || 0xC000000000400000 || RW || [[#OpenHostFileSystem]]
| [10.0.0-19.0.0] 0x43 [20.0.0+] 0x4E || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem
|-
|-
| ([5.0.0-5.1.0] 0x2A) || || 0x8000000000000000 || ||
| [10.2.0-19.0.0] 0x44 [20.0.0+] 0x4F || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]]
|-
|-
| ([6.0.0-6.2.0] 0x2A) || || 0x8000000000010000 || ||
| [11.0.0-19.0.0] 0x45 [20.0.0+] 0x50 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]]
|-
|-
| ([7.0.0-9.2.0] 0x2A) || || 0xC000000000400000 || ||
| [13.0.0-19.0.0] 0x46 [20.0.0+] 0x51 || CanOpenSaveDataTransferManagerForRepair || 0x8000000000000020 || [[#OpenSaveDataTransferManagerForRepair]]
|-
|-
| [5.0.0+] 0x2A || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]]
| [13.0.0-19.0.0] 0x47 [20.0.0+] 0x52 || CanSetDebugConfiguration || 0x8000000000000000 || SetDebugOption, UnsetDebugOption
|-
|-
| ([6.0.0-6.2.0] 0x2B) || || 0x8000000000000000 || ||
| [15.0.0-19.0.0] 0x48 [20.0.0+] 0x53 || CanOpenDataStorageByPath || 0x8000000000000000 || OpenDataStorageByPath
|-
|-
| ([7.0.0-9.2.0] 0x2B) || || 0x8000000000010000 || ||  
| [17.0.0-19.0.0] 0x49 [20.0.0+] 0x54|| CanNotifyErrorContextServiceReady || 0x8000004000000000 || NotifyErrorContextServiceReady
|-
|-
| [6.0.0+] 0x2B || CanOpenSaveDataInternalStorage || 0x8000000000000000 || RW || [[#OpenSaveDataInternalStorageFileSystem]]
| [17.0.0-19.0.0] 0x4A || CanGetProgramId || 0x8000000008000000 || GetProgramId, Removed in 20.0.0
|-
|-
| ([7.0.0-9.2.0] 0x2C) || || 0x8000000000000000 || ||
| [20.0.0+] 0x55 || || 0x8000000000000800 ||
|-
|-
| [7.0.0+] 0x2C || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem
| [20.0.0+] 0x56 || || 0x8000000004000000 ||
|-
|-
| ([7.0.0-9.2.0] 0x2D) || || 0x0000000000000000 || ||
| [20.0.0+] 0x57 || || 0x8000000004000000 ||
|}
|}


=== 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]]
|-
| ([5.0.0-5.1.0] 0x27) || || 0x8000000000100008 ||
|-
| ([6.0.0-7.0.1] 0x27) || || 0x8000000200002000 ||
|-
| ([8.0.0-8.1.0] 0x27) || || 0x8000000240002000 ||
|-
| ([9.0.0-9.2.0] 0x27) || || 0x8000000000000000 ||
|-
| [5.0.0+] 0x27 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair
|-
| ([5.0.0-5.1.0] 0x28) || || 0x8000000080010000 ||
|-
| ([6.0.0-8.1.0] 0x28) || || 0x8000000000000000 ||
|-
| ([9.0.0-9.2.0] 0x28) || || 0x8000000200002000 ||
|-
| [5.0.0+] 0x28 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair
|-
| ([5.0.0-5.1.0] 0x29) || || 0x0000000080000001 ||
|-
| ([6.0.0-8.1.0] 0x29) || || 0x8000000000000000 ||
|-
| ([9.0.0-9.2.0] 0x29) || || 0x8000000240002000 ||
|-
| [5.0.0+] 0x29 || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]]
|-
| ([5.0.0-5.1.0] 0x2A) || || 0x0000000080000001 ||
|-
| ([6.0.0-8.1.0] 0x2A) || || 0x8000000080200000 ||
|-
| ([9.0.0-9.2.0] 0x2A) || || 0x8000000000000000 ||
|-
| [5.0.0+] 0x2A || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]]
|-
| ([5.0.0-5.1.0] 0x2B) || || 0x0000000080000001 ||
|-
| ([6.0.0-8.1.0] 0x2B) || || 0x8000000080000110 ||
|-
| ([9.0.0-9.2.0] 0x2B) || || 0x8000000000000000 ||
|-
| [5.0.0+] 0x2B || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]]
|-
| ([5.0.0-5.1.0] 0x2C) || || 0x0000000080000001 ||
|-
| ([6.0.0-8.1.0] 0x2C) || || 0x8000000000100008 ||
|-
| ([9.0.0-9.2.0] 0x2C) || || 0x8000000080200000 ||
|-
| [5.0.0+] 0x2C || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]]
|-
| ([5.0.0-5.1.0] 0x2D) || || 0x0000000080000001 ||
|-
| ([6.0.0-8.1.0] 0x2D) || || 0x8000000000010000 ||
|-
| ([9.0.0-9.2.0] 0x2D) || || 0x8000000080000110 ||
|-
| [5.0.0+] 0x2D || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol
|-
| ([5.0.0-5.1.0] 0x2E) || || 0x8000000040000000 ||
|-
| ([6.0.0-8.1.0] 0x2E) || || 0x8000000100000000 ||
|-
| ([9.0.0-9.2.0] 0x2E) || || 0x8000000000100008 ||
|-
| [5.0.0+] 0x2E || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey
|-
| ([5.0.0-5.1.0] 0x2F) || || 0x8000000080200000 ||
|-
| ([6.0.0-8.1.0] 0x2F) || || 0x8000000100000000 ||
|-
| ([9.0.0-9.2.0] 0x2F) || || 0x8000000000010000 ||
|-
| [5.0.0+] 0x2F || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]]
|-
| ([5.1.0-6.0.0] 0x30) || || 0x8000000080080000 ||
|-
| ([6.0.1-9.2.0] 0x30) || || 0x8000000100000000 ||
|-
| [5.1.0+] 0x30 || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]]
|-
| ([6.0.0-9.2.0] 0x31) || || 0x8000000100000000 ||
|-
| [6.0.0+] 0x31 || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier
|-
| ([6.0.0-9.2.0] 0x32) || || 0x8000000100000000 ||
|-
| [6.0.0+] 0x32 || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent
|-
| ([6.0.0-8.1.0] 0x33) || || 0x8000000040000000 ||
|-
| ([9.0.0-9.2.0] 0x33) || || 0x8000000100000000 ||
|-
| [6.0.0+] 0x33 || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]]
|-
| ([6.0.0-8.1.0] 0x34) || || 0x8000000200000020 ||
|-
| ([9.0.0-9.2.0] 0x34) || || 0x8000000100000000 ||
|-
| [6.0.0+] 0x34 || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent
|-
| ([6.0.0-8.1.0] 0x35) || || 0x8000000000200000 ||
|-
| ([9.0.0-9.2.0] 0x35) || || 0x8000000040000000 ||
|-
| [6.0.0+] 0x35 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected
|-
| ([6.0.0-8.1.0] 0x36) || || 0x4000000000000000 ||
|-
| ([9.0.0-9.2.0] 0x36) || || 0x8000000200000020 ||
|-
| [6.0.0+] 0x36 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure
|-
| ([6.0.0-6.2.0] 0x37) || || 0x8000000000080000 ||
|-
| ([7.0.0-8.1.0] 0x37) || || 0x8000000000000000 ||
|-
| ([9.0.0-9.2.0] 0x37) || || 0x8000000000200000 ||
|-
| [6.0.0+] 0x37 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure
|-
| ([6.0.0-6.2.0] 0x38) || || 0x8000000000000000 ||
|-
| ([7.0.0-8.1.0] 0x38) || || 0x8000000400000000 ||
|-
| ([9.0.0-9.2.0] 0x38) || || 0x4000000000000000 ||
|-
| [6.0.0+] 0x38 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize
|-
| ([8.0.0-8.1.0] 0x39) || || 0x8000000000000010 ||
|-
| ([9.0.0-9.2.0] 0x39) || || 0x8000000000000000 ||
|-
| [8.0.0+] 0x39 || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]]
|-
| ([9.0.0-9.2.0] 0x3A) || || 0x8000000400000000 ||
|-
| [9.0.0+] 0x3A || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility
|-
| ([9.0.0-9.2.0] 0x3B) || || 0x8000000000000010 ||
|-
| [9.0.0+] 0x3B || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent
|-
| ([9.0.0-9.2.0] 0x3C) || || 0x8000000800000000 ||
|-
| [9.0.0+] 0x3C || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]
|-
| ([9.0.0-9.2.0] 0x3D) || || 0x8000000800000000 ||
|-
| [9.0.0+] 0x3D || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo
|-
| ([9.0.0-9.2.0] 0x3E) || || 0x8000000800000000 ||
|-
| [9.0.0+] 0x3E || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence
|-
| ([9.0.0-9.2.0] 0x3F) || || 0x8000000800000000 ||
|-
| [9.0.0+] 0x3F || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt
|-
| ([9.0.0-9.2.0] 0x40) || || 0x8000000800000000 ||
|-
| ([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 ==
== SimulateDeviceDetectionEvent ==
Takes a type-0x19 input [[#ContentPath]] and a [[#FileSystemProxyType]] as parameters. Returns an [[#IFileSystem]].
Takes a total of 0xC-bytes of input, no output.


[2.0.0+] This function was removed.
== VerifySaveDataFileSystem ==
Takes an unknown input u64 and a type-0x6 output buffer.


== SetCurrentProcess ==
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).
Takes a pid-descriptor.


== OpenFileSystemWithPatch ==
== GetSaveDataCommitId ==
Takes an input [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
Takes an input u8 and u64, returns an output u64.


Web-applet loads the [[#FileSystemProxyType]] (which must be '''Manual''') from u32_table[inparam].
== SetSdCardEncryptionSeed ==
Takes in the 0x10 byte SD card encryption seed, and loads it into FS-module state.


Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
[[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.


== OpenFileSystemWithId ==
== OpenAccessFailureDetectionEventNotifier ==
Takes a type-0x19 input buffer, an [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
Takes 8-bytes of input and returns an [[#IEventNotifier]].


The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.
[8.0.0+] Now takes an additional 8-bytes of input.


The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
== SetSaveDataSize ==
Takes two input u64s "size" and "journal_size", and writes them to fsp-srv object member variables.


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.
These variables are normally initialized with 32 MiB (0x2000000) and 16 MiB (0x1000000), respectively.


The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.
These variables don't seem to be actually used anywhere else (?)


After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.
== SetSaveDataRootPath ==
Takes an input path, and does snprintf(<fsp-srv object>->m_save_data_root_path, FS_MAX_PATH-1, "/%s", input_path);


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


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


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.
== SetGlobalAccessLogMode ==
Takes an input u32.


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


== InvalidateBisCache ==
GlobalAccessLogMode is normally 0.
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]].


== DeleteSaveDataFileSystem ==
== OutputAccessLogToSdCard ==
Takes an input u64.
Takes a type-0x5 input buffer.


== CreateSaveDataFileSystem ==
The input buffer is the string to output to the log. User-processes normally include a newline at the end.
Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct which governs creation of a saveMeta file.


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.
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.


Creates non-system savedata.
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.


== CreateSaveDataFileSystemBySystemSaveDataId ==
The input buffer is written to the "$FsAccessLog:/FsAccessLog.txt" file, where "$FsAccessLog" is the SD-card mount-name. It's written to the current end of the file(appended).
Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]].


Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
== GetProgramIndexForAccessLog ==
No input, returns two 32-bit values "version" and "program_index".


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


== OpenGameCardFileSystem ==
== OpenBisWiper ==
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]].
Takes an input u64 size and a TransferMemory handle. Returns an output [[#IWiper]].


Mounts a [[Gamecard_Partition|gamecard partition]].
= IStorage =
This is "nn::fssrv::sf::IStorage".


== CreateSaveDataFileSystemWithHashSalt ==
This is the interface for a raw device, usually a block device.
Takes a total of 0xB0-bytes of input, no output.


== OpenSaveDataFileSystem ==
{| class="wikitable" border="1"
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8.
|-
! Cmd || Name
|-
| 0 || [[#Read]]
|-
| 1 || [[#Write]]
|-
| 2 || [[#Flush]]
|-
| 3 || [[#SetSize]]
|-
| 4 || [[#GetSize]]
|-
| 5 || [4.0.0+] OperateRange
|}


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


Permissions aren't checked until the specified save is successfully found.
== Write ==
Takes a type-0x45 buffer, an offset and length.


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


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


Returns an [[#IFileSystem]].
== GetSize ==
Returns a size.


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


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


Mounts SaveData as ReadOnly.
* '''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.


== ReadSaveDataFileSystemExtraDataBySaveDataSpaceId ==
There are two adapter classes to convert between these interfaces:
Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].


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


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


== OpenSaveDataInfoReaderBySaveDataSpaceId ==
{| class="wikitable" border="1"
Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]].
|-
 
! Cmd || Name
== FindSaveDataWithFilter ==
|-
Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer.
| 0 || CreateFile
|-
| 1 || DeleteFile
|-
| 2 || CreateDirectory
|-
| 3 || DeleteDirectory
|-
| 4 || DeleteDirectoryRecursively
|-
| 5 || RenameFile
|-
| 6 || RenameDirectory
|-
| 7 || [[#GetEntryType]]
|-
| 8 || [[#OpenFile]]
|-
| 9 || [[#OpenDirectory]]
|-
| 10 || [[#Commit]]
|-
| 11 || [[#GetFreeSpaceSize]]
|-
| 12 || [[#GetTotalSpaceSize]]
|-
| 13 || [3.0.0+] [[#CleanDirectoryRecursively]]
|-
| 14 || [3.0.0+] [[#GetFileTimeStampRaw]]
|-
| 15 || [4.0.0+] QueryEntry
|-
| 16 || [15.0.0+] GetFileSystemAttribute
|}


== OpenSaveDataInfoReaderWithFilter ==
== GetEntryType ==
Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]].
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.


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


== OpenSaveDataTransferManagerVersion2 ==
* When bit 0 is set, the file is Readable: you can use the Read operation.
No input, returns an [[#ISaveDataTransferManagerWithDivision]].
* 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)


== OpenSaveDataTransferProhibiter ==
== OpenDirectory ==
Takes an input u64, returns an [[#ISaveDataTransferProhibiter]].
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.


== ListAccessibleSaveDataOwnerId ==
== Commit ==
Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer.
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.


== OpenSaveDataTransferManagerForSaveDataRepair ==
== GetFreeSpaceSize ==
No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]].
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.


== OpenSaveDataMover ==
== GetTotalSpaceSize ==
Takes 2 input [[#SaveDataSpaceId]], an input u64 size and a TransferMemory handle. Returns an output [[#ISaveDataMover]].
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).


== OpenSaveDataTransferManagerForRepair ==
== CleanDirectoryRecursively ==
No input, returns an output [[#ISaveDataTransferManagerForRepair]].
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.


== OpenContentStorageFileSystem ==
== GetFileTimeStampRaw ==
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.


Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]].
= IDirectory =
This is "nn::fssrv::sf::IDirectory".


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


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


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.
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..".


== OpenDataStorageByDataId ==
== GetEntryCount ==
Takes a [[NCM_services#StorageId|StorageID]] and a [[NCM_services#DataId|DataId]].
Returns an u64 for the total number of readable entries.


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


== OpenDataFileSystemWithProgramIndex ==
{| class="wikitable" border="1"
Takes an input u8, returns an [[#IFileSystem]].
|-
 
! Offset || Size || Description
== OpenDataStorageWithProgramIndex ==
|-
Takes an input u8, returns an [[#IStorage]].
| 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.
|}


== 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 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.
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.
| 7 || [20.0.0+] SetSdCardActivationMode
 
== GetGlobalAccessLogMode ==
Returns an output u32.
 
GlobalAccessLogMode is normally 0.
 
== OutputAccessLogToSdCard ==
Takes a type-0x5 input buffer.
 
The input buffer is the string to output to the log. User-processes normally include a newline at the end.
 
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.
 
When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn't show up SD, unknown why.
 
The input buffer is written to the "$FsAccessLog:/FsAccessLog.txt" file, where "$FsAccessLog" is the SD-card mount-name. It's written to the current end of the file(appended).
 
== GetProgramIndexForAccessLog ==
No input, returns two 32-bit values "version" and "program_index".
 
== OpenMultiCommitManager ==
No input, returns an output [[#IMultiCommitManager]].
 
== OpenBisWiper ==
Takes an input u64 size and a TransferMemory handle. Returns an output [[#IWiper]].
 
= IStorage =
This is "nn::fssrv::sf::IStorage".
 
This is the interface for a raw device, usually a block device.
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 8 || [20.0.0+] TryGetSdCardInfo
|-
| 100 || [[#GetMmcCid]]
|-
| 101 || [[#GetMmcSpeedMode]]
|-
| 110 || [[#EraseMmc]]
|-
| 111 || [[#GetMmcPartitionSize]]
|-
| 112 || [2.0.0+] [[#GetMmcPatrolCount]]
|-
| 113 || [2.0.0+] [[#GetAndClearMmcErrorInfo]]
|-
| 114 || [2.0.0+] [[#GetMmcExtendedCsd]]
|-
|-
| 0 || [[#Read]]
| 115 || [4.0.0+] [[#SuspendMmcPatrol]]
|-
|-
| 1 || [[#Write]]
| 116 || [4.0.0+] [[#ResumeMmcPatrol]]
|-
|-
| 2 || [[#Flush]]
| 117 || [17.0.0+] [[#EraseMmcWithRange]]
|-
|-
| 3 || [[#SetSize]]
| 118 || [20.0.0+] MarkBeforeEraseMmcPartitionUserData
|-
|-
| 4 || [[#GetSize]]
| 119 || [20.0.0+] CheckAfterEraseMmcPartitionUserData
|-
|-
| 5 || [4.0.0+] OperateRange
| 200 || [[#IsGameCardInserted]]
|}
 
== Read ==
Takes a type-0x46 buffer, an offset and length.
 
== Write ==
Takes a type-0x45 buffer, an offset and length.
 
== Flush ==
No input.
 
== SetSize ==
Takes a size.
 
== GetSize ==
Returns a size.
 
= IFileSystem =
This is "nn::fssrv::sf::IFileSystem".
 
There are two main implementations of this interface:
 
* '''nn::fs::fsa::IFileSystem''': The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface.
* '''nn::fssrv::sf::IFileSystem''': Used for sending an IFileSystem over IPC. Not used outside of IPC code.
 
There are two adapter classes to convert between these interfaces:
 
* '''nn::fssrv::detail::FileSystemInterfaceAdapter''': Allows access to an nn::fs::fsa::IFileSystem via the nn::fssrv::sf::IFileSystem interface.
* '''nn::fs::detail::FileSystemServiceObjectAdapter''': Allows access to an nn::fssrv::sf::IFileSystem via the nn::fs::fsa::IFileSystem interface.
 
When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC.
Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it.
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 201 || [[#EraseGameCard]]
|-
|-
| 0 || CreateFile
| 202 || [[#GetGameCardHandle]]
|-
|-
| 1 || DeleteFile
| 203 || [[#GetGameCardUpdatePartitionInfo]]
|-
|-
| 2 || CreateDirectory
| 204 || [[#FinalizeGameCardDriver]]
|-
|-
| 3 || DeleteDirectory
| 205 || [[#GetGameCardAttribute]]
|-
|-
| 4 || DeleteDirectoryRecursively
| 206 || [[#GetGameCardDeviceCertificate]]
|-
|-
| 5 || RenameFile
| 207 || [[#GetGameCardAsicInfo]]
|-
| 208 || [[#GetGameCardIdSet]]
|-
| 209 || [[#WriteToGameCardDirectly]]
|-
| 210 || [[#SetVerifyWriteEnalbleFlag]]
|-
| 211 || [[#GetGameCardImageHash]]
|-
|-
| 6 || RenameDirectory
| 212 || [2.0.0+] [[#GetGameCardDeviceIdForProdCard]]
|-
|-
| 7 || [[#GetEntryType]]
| 213 || [2.0.0+] [[#EraseAndWriteParamDirectly]]
|-
|-
| 8 || [[#OpenFile]]
| 214 || [2.0.0+] [[#ReadParamDirectly]]
|-
|-
| 9 || [[#OpenDirectory]]
| 215 || [2.0.0+] [[#ForceEraseGameCard]]
|-
|-
| 10 || [[#Commit]]
| 216 || [2.0.0+] [[#GetGameCardErrorInfo]]
|-
|-
| 11 || [[#GetFreeSpaceSize]]
| 217 || [2.1.0+] [[#GetGameCardErrorReportInfo]]
|-
|-
| 12 || [[#GetTotalSpaceSize]]
| 218 || [3.0.0+] [[#GetGameCardDeviceId]]
|-
|-
| 13 || [3.0.0+] [[#CleanDirectoryRecursively]]
| 219 || [8.0.0+] [[#ChallengeCardExistence]]
|-
|-
| 14 || [3.0.0+] [[#GetFileTimeStampRaw]]
| 220 || [9.0.0+] [[#GetGameCardCompatibilityType]]
|-
|-
| 15 || [4.0.0+] QueryEntry
| 221 || [17.0.0+] [[#GetGameCardAsicCertificate]]
|}
|-
 
| 222 || [18.0.0+] [[#GetGameCardCardHeader]]
== GetEntryType ==
|-
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.
| 223 || [19.0.0+] [[#SetGameCardSessionCreationDelay]]
 
|-
== OpenFile ==
| 224 || [19.0.0+] [[#GetGameCardApplicationIdList]]
Takes a type-0x19 input buffer for the path, and an u32 '''mode'''. '''mode''' controls how the file is opened, based on which bits are set:
 
* When bit 0 is set, the file is Readable: you can use the Read operation.
* When bit 1 is set, the file is Writable: you can use the Write operation.
* When bit 2 is set, the file is Appendable: unless this bit is set, you will not be able to write beyond the end of a file (such writes will result in an error 0x307202)
 
== OpenDirectory ==
Takes a type-0x9 input buffer for the path and an u64 '''filter_flags'''. '''filter_flags''' controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files.
 
== Commit ==
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.
 
== GetFreeSpaceSize ==
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.
 
== GetTotalSpaceSize ==
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used).
 
== CleanDirectoryRecursively ==
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.
 
== GetFileTimeStampRaw ==
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.
 
= IDirectory =
This is "nn::fssrv::sf::IDirectory".
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 225 || [20.0.0+] RegisterGameCardConfigurationData
|-
|-
| 0 || [[#Read]]
| 226 || [20.0.0+] GetGameCardDetailedErrorReportInfo
|-
|-
| 1 || [[#GetEntryCount]]
| 300 || [[#SetSpeedEmulationMode]]
|}
|-
 
| 301 || [[#GetSpeedEmulationMode]]
== Read ==
|-
Takes a type-0x6 output buffer. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available.
| 302 || [18.0.0+] [[#SetApplicationStorageSpeed]]
 
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..".
 
== GetEntryCount ==
Returns an u64 for the total number of readable entries.
 
= DirectoryEntry =
This is "nn::fs::DirectoryEntry".
 
{| class="wikitable" border="1"
|-
|-
! Offset || Size || Description
| 303 || [20.0.0+] SetGameCardClockRateForSpeedEmulation
|-
|-
| 0x0 || 0x301 || Path
| 304 || [20.0.0+] ClearGameCardClockRateForSpeedEmulation
|-
|-
| 0x301 || 0x1 || File attributes (bit 0 = is directory; bit 1 = archive bit)
| 400 || [5.0.0+] [[#SuspendSdmmcControl]]
|-
|-
| 0x302 || 0x2 || Padding?
| 401 || [5.0.0+] [[#ResumeSdmmcControl]]
|-
|-
| 0x304 || 0x1 || [[#DirectoryEntryType]]
| 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]]
|-
|-
| 0x305 || 0x3 || Padding?
| 500 || [6.0.0+] [[#SetDeviceSimulationEvent]]
|-
|-
| 0x308 || 0x8 || Filesize, 0 for directories.
| 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]]
|}
|}


= DirectoryEntryType =
== IsSdCardInserted ==
This is "nn::fs::DirectoryEntryType".
No input. Returns an output bool.


An s8 value indicating a directory entry type. The current values are:
== GetSdCardSpeedMode ==
No input. Returns an output [[#SdCardSpeedMode]].


{| class="wikitable" border="1"
== GetSdCardCid ==
|-
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
! Value || Description
|-
| 0 || Directory
|-
| 1 || File
|}


= IFile =
== GetSdCardUserAreaSize ==
This is "nn::fssrv::sf::IFile".
No input. Returns an output s64 '''SdCardUserAreaSize'''.


{| class="wikitable" border="1"
== GetSdCardProtectedAreaSize ==
|-
No input. Returns an output s64 '''SdCardProtectedAreaSize'''.
! Cmd || Name
|-
| 0 || Read
|-
| 1 || Write
|-
| 2 || Flush
|-
| 3 || SetSize
|-
| 4 || GetSize
|-
| 5 || [4.0.0+] OperateRange
|-
| 6 || [12.0.0+] OperateRangeWithBuffer
|}


= ISaveDataInfoReader =
== GetAndClearSdCardErrorInfo ==
This is "nn::fssrv::sf::ISaveDataInfoReader".
Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''.
 
== GetSdCardHostControllerStatus ==
No input. Returns an output [[#HostControllerStatus]].
 
== GetMmcCid ==
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.


{| class="wikitable" border="1"
== GetMmcSpeedMode ==
|-
No input. Returns an output [[#MmcSpeedMode]].
! Cmd || Name
|-
| 0 || [[#ReadSaveDataInfo]]
|}


== ReadSaveDataInfo ==
== EraseMmc ==
Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]].
Takes an input [[#MmcPartition]]. 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).
== GetMmcPartitionSize ==
Takes an input [[#MmcPartition]]. Returns an output s64 '''MmcPartitionSize'''.


= IDeviceOperator =
== GetMmcPatrolCount ==
This is "nn::fssrv::sf::IDeviceOperator".
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 || [[#IsSdCardInserted]]
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
|-
 
| 1 || [[#GetSdCardSpeedMode]]
== SuspendMmcPatrol ==
|-
No input/output.
| 2 || [2.0.0+] [[#GetSdCardCid]]
 
|-
== ResumeMmcPatrol ==
| 3 || [2.0.0+] [[#GetSdCardUserAreaSize]]
No input/output.
|-
 
| 4 || [2.0.0+] [[#GetSdCardProtectedAreaSize]]
== EraseMmcWithRange ==
|-
Takes an input [[#MmcPartition]] and two input u64s. No output.
| 5 || [2.0.0+] [[#GetAndClearSdCardErrorInfo]]
 
|-
== IsGameCardInserted ==
| 100 || [[#GetMmcCid]]
No input. Returns an output bool.
|-
 
| 101 || [[#GetMmcSpeedMode]]
== EraseGameCard ==
|-
Takes an input [[#GameCardSize]] and an input u64 '''NormalAreaSize'''. No output.
| 110 || [[#EraseMmc]]
 
|-
== GetGameCardHandle ==
| 111 || [[#GetMmcPartitionSize]]
No input. Returns an output [[#GameCardHandle]].
|-
 
| 112 || [2.0.0+] [[#GetMmcPatrolCount]]
== GetGameCardUpdatePartitionInfo ==
|-
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardUpdatePartitionInfo]].
| 113 || [2.0.0+] [[#GetAndClearMmcErrorInfo]]
 
|-
== FinalizeGameCardDriver ==
| 114 || [2.0.0+] [[#GetMmcExtendedCsd]]
No input/output.
|-
 
| 115 || [4.0.0+] [[#SuspendMmcPatrol]]
== GetGameCardAttribute ==
|-
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardAttribute]].
| 116 || [4.0.0+] [[#ResumeMmcPatrol]]
 
|-
== GetGameCardDeviceCertificate ==
| 200 || [[#IsGameCardInserted]]
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
|-
 
| 201 || [[#EraseGameCard]]
[19.0.0+] Now returns an output s64 '''OutSize''' which can be 0x200 or 0x400.
|-
 
| 202 || [[#GetGameCardHandle]]
== GetGameCardAsicInfo ==
|-
Takes a type-0x5 input buffer '''FwBuffer''', a type-0x6 output buffer containing [[#RmaInformation]] and two input s64s '''FwBufferSize''' and '''RmaInformationSize'''. No output.
| 203 || [[#GetGameCardUpdatePartitionInfo]]
 
|-
== GetGameCardIdSet ==
| 204 || [[#FinalizeGameCardDriver]]
Takes a type-0x6 output buffer containing a [[#GameCardIdSet]] and an input s64 '''BufferSize'''. No output.
|-
 
| 205 || [[#GetGameCardAttribute]]
== WriteToGameCardDirectly ==
|-
Takes a type-0x6 output buffer and two input s64s '''Offset''' and '''BufferSize'''. No output.
| 206 || [[#GetGameCardDeviceCertificate]]
 
|-
== SetVerifyWriteEnalbleFlag ==
| 207 || [[#GetGameCardAsicInfo]]
Takes an input bool. No output.
|-
 
| 208 || [[#GetGameCardIdSet]]
== GetGameCardImageHash ==
|-
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
| 209 || [[#WriteToGameCardDirectly]]
 
|-
== GetGameCardDeviceIdForProdCard ==
| 210 || [[#SetVerifyWriteEnalbleFlag]]
Takes a type-0x5 input buffer '''CardHeaderForDev''', a type-0x6 output buffer and two input s64s '''CardHeaderForDevSize''' and '''BufferSize'''. No output.
|-
 
| 211 || [[#GetGameCardImageHash]]
== EraseAndWriteParamDirectly ==
|-
Takes a type-0x5 input buffer and an input s64 '''BufferSize'''. No output.
| 212 || [2.0.0+] [[#GetGameCardDeviceIdForProdCard]]
|-
| 213 || [2.0.0+] [[#EraseAndWriteParamDirectly]]
|-
| 214 || [2.0.0+] [[#ReadParamDirectly]]
|-
| 215 || [2.0.0+] [[#ForceEraseGameCard]]
|-
| 216 || [2.0.0+] [[#GetGameCardErrorInfo]]
|-
| 217 || [2.1.0+] [[#GetGameCardErrorReportInfo]]
|-
| 218 || [3.0.0+] [[#GetGameCardDeviceId]]
|-
| 219 || [8.0.0+] [[#ChallengeCardExistence]]
|-
| 220 || [9.0.0+] [[#GetGameCardCompatibilityType]]
|-
| 300 || [[#SetSpeedEmulationMode]]
|-
| 301 || [[#GetSpeedEmulationMode]]
|-
| 400 || [5.0.0+] [[#SuspendSdmmcControl]]
|-
| 401 || [5.0.0+] [[#ResumeSdmmcControl]]
|-
| 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]]
|-
| 500 || [6.0.0+] [[#SetDeviceSimulationEvent]]
|-
| 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]]
|}


== IsSdCardInserted ==
== ReadParamDirectly ==
No input. Returns an output bool.
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
 
== ForceEraseGameCard ==
No input/output.
 
== GetGameCardErrorInfo ==
No input. Returns an output [[#GameCardErrorInfo]].


== GetSdCardSpeedMode ==
== GetGameCardErrorReportInfo ==
No input. Returns an output [[#SdCardSpeedMode]].
No input. Returns an output [[#GameCardErrorReportInfo]].


== GetSdCardCid ==
== GetGameCardDeviceId ==
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.


== GetSdCardUserAreaSize ==
== ChallengeCardExistence ==
No input. Returns an output s64 '''SdCardUserAreaSize'''.
Takes a type-0x6 output buffer, two type-0x5 input buffers and an input [[#GameCardHandle]]. No output.


== GetSdCardProtectedAreaSize ==
[9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]].
No input. Returns an output s64 '''SdCardProtectedAreaSize'''.


== GetAndClearSdCardErrorInfo ==
== GetGameCardCompatibilityType ==
Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''.
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardCompatibilityType]].


== GetMmcCid ==
== GetGameCardAsicCertificate ==
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.


== GetMmcSpeedMode ==
== GetGameCardCardHeader ==
No input. Returns an output [[#MmcSpeedMode]].
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.


== EraseMmc ==
== SetGameCardSessionCreationDelay ==
Takes an input [[#MmcPartition]]. No output.
Takes two input bools and an input u32. No output.


== GetMmcPartitionSize ==
== GetGameCardApplicationIdList ==
Takes an input [[#MmcPartition]]. Returns an output s64 '''MmcPartitionSize'''.
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. Returns an output u16.


== GetMmcPatrolCount ==
== SetSpeedEmulationMode ==
No input. Returns an output u32 '''MmcPatrolCount'''.
Takes an input [[#SpeedEmulationMode]]. No output.


== GetAndClearMmcErrorInfo ==
== GetSpeedEmulationMode ==
Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''.
No input. Returns an output [[#SpeedEmulationMode]].


== GetMmcExtendedCsd ==
== SetApplicationStorageSpeed ==
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
Takes an input s32. No output.


== SuspendMmcPatrol ==
== SuspendSdmmcControl ==
No input/output.
No input/output.


== ResumeMmcPatrol ==
== ResumeSdmmcControl ==
No input/output.
No input/output.


== IsGameCardInserted ==
== GetSdmmcConnectionStatus ==
No input. Returns an output bool.
Takes a total of 4-bytes of input. Returns a total of 8-bytes of output.


== EraseGameCard ==
== SetDeviceSimulationEvent ==  
Takes an input [[#GameCardSize]] and an input u64 '''NormalAreaSize'''. No output.
Takes a total of 0x14-bytes of input. No output.


== GetGameCardHandle ==
== ClearDeviceSimulationEvent ==
No input. Returns an output [[#GameCardHandle]].
Takes a total of 4-bytes of input. No output.


== GetGameCardUpdatePartitionInfo ==
= IEventNotifier =
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardUpdatePartitionInfo]].
This is "nn::fssrv::sf::IEventNotifier".


== FinalizeGameCardDriver ==
{| class="wikitable" border="1"
No input/output.
|-
! Cmd || Name
|-
| 0 || [[#GetEventHandle]]
|}


== GetGameCardAttribute ==
== GetEventHandle ==
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardAttribute]].
No input, returns an output Event handle. With official sw the EventClearMode is user-specified.


== GetGameCardDeviceCertificate ==
= ISaveDataTransferManager =
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
This is "nn::fssrv::sf::ISaveDataTransferManager".


== GetGameCardAsicInfo ==
This was added with [[4.0.0]].
Takes a type-0x5 input buffer '''FwBuffer''', a type-0x6 output buffer containing [[#RmaInformation]] and two input s64s '''FwBufferSize''' and '''RmaInformationSize'''. No output.


== GetGameCardIdSet ==
{| class="wikitable" border="1"
Takes a type-0x6 output buffer containing a [[#GameCardIdSet]] and an input s64 '''BufferSize'''. No output.
|-
! Cmd || Name
|-
| 0 || [[#GetChallenge]]
|-
| 16 || [[#SetToken]]
|-
| 32 || [[#OpenSaveDataExporter]]
|-
| 64 || [[#OpenSaveDataImporter]]
|}


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


== SetVerifyWriteEnalbleFlag ==
== SetToken ==
Takes an input bool. No output.
No input/output, takes a type-0x5 input buffer.


== 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 [[#ISaveDataExporter]].


== GetGameCardDeviceIdForProdCard ==
== OpenSaveDataImporter ==
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]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]].


== EraseAndWriteParamDirectly ==
= ISaveDataTransferManagerForSaveDataRepair =
Takes a type-0x5 input buffer and an input s64 '''BufferSize'''. No output.
This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair".


== ReadParamDirectly ==
This was added with [[9.0.0]].
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.


== ForceEraseGameCard ==
{| class="wikitable" border="1"
No input/output.
|-
! Cmd || Name
|-
| 0 || [[#GetChallenge]]
|-
| 16 || [[#SetKeyPackage]]
|-
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]
|-
| 81 || [[#PrepareOpenSaveDataImporter]]
|-
| 90 || [[#OpenSaveDataImporter]]
|-
| 91 || [[#OpenSaveDataImporter2]]
|-
| 100 || [[#OpenSaveDataExporterWithKey]]
|-
| 110 || [[#OpenSaveDataImporterWithKey]]
|}


== GetGameCardErrorInfo ==
== SetKeyPackage ==
No input. Returns an output [[#GameCardErrorInfo]].
No input/output, takes a type-0x5 input buffer.


== GetGameCardErrorReportInfo ==
== OpenSaveDataExporterAndGetEncryptedKey ==
No input. Returns an output [[#GameCardErrorReportInfo]].
Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an [[#ISaveDataDivisionExporter]].


== GetGameCardDeviceId ==
== PrepareOpenSaveDataImporter ==
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
Takes a type-0x1A output buffer to receive a RsaEncryptedKey.


== ChallengeCardExistence ==
== OpenSaveDataImporter ==
Takes a type-0x6 output buffer, two type-0x5 input buffers and an input [[#GameCardHandle]]. No output.
Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an [[#ISaveDataDivisionImporter]].


[9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]].
== OpenSaveDataImporter2 ==
Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].


== GetGameCardCompatibilityType ==
== OpenSaveDataExporterWithKey ==
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardCompatibilityType]].
Takes a total of 0x20-bytes of input, returns an [[#ISaveDataDivisionExporter]].


== SetSpeedEmulationMode ==
== OpenSaveDataImporterWithKey ==
Takes an input [[#SpeedEmulationMode]]. No output.
Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].


== GetSpeedEmulationMode ==
[17.0.0+] Now only takes 0x18-bytes of input and an additional type-0x5 input buffer.
No input. Returns an output [[#SpeedEmulationMode]].


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


== ResumeSdmmcControl ==
This was added with [[10.0.0]].
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,615: Line 1,461:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetEventHandle]]
| 8 || [[#Register]]
|-
| 16 || [[#Process]]
|-
| 18 || [[#Cancel]]
|}
|}


== GetEventHandle ==
== Register ==
No input, returns an output Event handle. With official sw the EventClearMode is user-specified.
Takes an input u64, no output.
 
== Process ==
Takes an input u64, returns an output u64.
 
== Cancel ==
No input/output.


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


This was added with [[4.0.0]].
This was added with [[11.0.0]].


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,630: Line 1,486:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetChallenge]]
| 80 || [[#OpenSaveDataExporter]]
|-
|-
| 16 || [[#SetToken]]
| 90 || [[#OpenSaveDataImporter]]
|-
| 32 || [[#OpenSaveDataExporter]]
|-
| 64 || [[#OpenSaveDataImporter]]
|}
|}
== GetChallenge ==
No input/output, takes a type-0x6 output buffer.
== SetToken ==
No input/output, takes a type-0x5 input buffer.


== OpenSaveDataExporter ==
== OpenSaveDataExporter ==
Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]].
Takes a total of 0x10-bytes of input, returns an [[#ISaveDataDivisionExporter]].


== OpenSaveDataImporter ==
== OpenSaveDataImporter ==
Takes an input u8 [[#SaveDataSpaceId]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]].
Takes 1-byte of input, a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].


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


This was added with [[9.0.0]].
This was added with [[4.0.0]].


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,660: Line 1,506:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetChallenge]]
| 0 || [[#GetSaveDataInfo]]
|-
|-
| 16 || [[#SetKeyPackage]]
| 1 || [[#GetRestSize]]
|-
|-
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]
| 16 || [[#Pull]]
|-
|-
| 81 || [[#PrepareOpenSaveDataImporter]]
| 17 || [[#PullInitialData]]
|-
|}
| 90 || [[#OpenSaveDataImporter]]
 
|-
== GetSaveDataInfo ==
| 91 || [[#OpenSaveDataImporter2]]
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.
|-
| 100 || [[#OpenSaveDataExporterWithKey]]
|-
| 110 || [[#OpenSaveDataImporterWithKey]]
|}


== SetKeyPackage ==
The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw.
No input/output, takes a type-0x5 input buffer.


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


== PrepareOpenSaveDataImporter ==
== Pull ==
Takes a type-0x1A output buffer to receive a RsaEncryptedKey.
Takes a type-0x6 output buffer, returns an output u64.


== OpenSaveDataImporter ==
== PullInitialData ==
Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an [[#ISaveDataDivisionImporter]].
No input/output, takes a type-0x6 output buffer.


== OpenSaveDataImporter2 ==
= ISaveDataImporter =
Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
This is "nn::fssrv::sf::ISaveDataImporter".


== OpenSaveDataExporterWithKey ==
This was added with [[4.0.0]].
Takes a total of 0x20-bytes of input, returns an [[#ISaveDataDivisionExporter]].


== OpenSaveDataImporterWithKey ==
{| class="wikitable" border="1"
Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
|-
 
! Cmd || Name
= ISaveDataMover =
This is "nn::fssrv::sf::ISaveDataMover".
 
This was added with [[10.0.0]].
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 0 || [[#GetSaveDataInfo]]
|-
|-
| 8 || [[#Register]]
| 1 || [[#GetRestSize]]
|-
|-
| 16 || [[#Process]]
| 16 || [[#Push]]
|-
|-
| 18 || [[#Cancel]]
| 17 || [[#Finalize]]
|}
|}


== Register ==
== GetSaveDataInfo ==
Takes an input u64, no output.
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.


== Process ==
The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.
Takes an input u64, returns an output u64.


== Cancel ==
== GetRestSize ==
No input/output.
No input, returns an output u64.


= ISaveDataTransferManagerForRepair =
== Push ==
This is "nn::fssrv::sf::ISaveDataTransferManagerForRepair".
No input/output, takes a type-0x5 input buffer.


This was added with [[11.0.0]].
== Finalize ==
No input/output.
 
= ISaveDataTransferManagerWithDivision =
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".
 
This was added with [[5.0.0]].


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,732: Line 1,570:
! Cmd || Name
! Cmd || Name
|-
|-
| 80 || [[#OpenSaveDataExporter]]
| 0 || [[#GetChallenge]]
|-
| 8 || [18.0.0+] SetMode
|-
| 9 || [18.0.0+] SetAttribute
|-
|-
| 90 || [[#OpenSaveDataImporter]]
| 16 || [[#SetKeySeedPackage]]
|}
 
== OpenSaveDataExporter ==
Takes a total of 0x10-bytes of input, returns an [[#ISaveDataDivisionExporter]].
 
== OpenSaveDataImporter ==
Takes 1-byte of input, a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 
= ISaveDataExporter =
This is "nn::fssrv::sf::ISaveDataExporter".
 
This was added with [[4.0.0]].
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 17 || [20.0.0+] SetLocalKeySeedPackage
|-
|-
| 0 || [[#GetSaveDataInfo]]
| 32 || [[#OpenSaveDataExporter]]
|-
|-
| 1 || [[#GetRestSize]]
| 33 || [[#OpenSaveDataExporterForDiffExport]]
|-
|-
| 16 || [[#Pull]]
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
|-
|-
| 17 || [[#PullInitialData]]
| 63 || [17.0.0+] OpenSaveDataImporter
|}
|-
 
| 64 || [6.0.0-17.0.1] [[#OpenSaveDataImporterDeprecated]] ([5.0.0-5.1.0] OpenSaveDataImporter)
== GetSaveDataInfo ==
|-
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.
| 65 || [5.0.0-17.0.1] [[#OpenSaveDataImporterForDiffImport]]
 
|-
The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw.
| 66 || [6.0.0-17.0.1] [[#OpenSaveDataImporterForDuplicateDiffImport]]
 
== GetRestSize ==
No input, returns an output u64.
 
== Pull ==
Takes a type-0x6 output buffer, returns an output u64.
 
== PullInitialData ==
No input/output, takes a type-0x6 output buffer.
 
= ISaveDataImporter =
This is "nn::fssrv::sf::ISaveDataImporter".
 
This was added with [[4.0.0]].
 
{| class="wikitable" border="1"
|-
|-
! Cmd || Name
| 67 || [6.0.0-16.1.0] [[#OpenSaveDataImporter]]
|-
|-
| 0 || [[#GetSaveDataInfo]]
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]]
|-
|-
| 1 || [[#GetRestSize]]
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
|-
|-
| 16 || [[#Push]]
| 70 || [10.0.0+] CancelSuspendingImportByAttribute
|-
|-
| 17 || [[#Finalize]]
| 80 || [11.0.0+] SwapSecondary
|}
|}


== GetSaveDataInfo ==
== GetChallenge ==
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.
No input/output, takes a type-0x6 output buffer containing the '''Challenge'''.


The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.
== SetKeySeedPackage ==
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.
 
== OpenSaveDataExporter ==
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
 
== OpenSaveDataExporterForDiffExport ==
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]].


== GetRestSize ==
== OpenSaveDataExporterByContext ==
No input, returns an output u64.
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].


== Push ==
== OpenSaveDataImporterDeprecated ==
No input/output, takes a type-0x5 input buffer.
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].


== Finalize ==
== OpenSaveDataImporterForDiffImport ==
No input/output.
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]].


= ISaveDataTransferManagerWithDivision =
== OpenSaveDataImporterForDuplicateDiffImport ==
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].


This was added with [[5.0.0]].
== OpenSaveDataImporter ==
Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].


{| class="wikitable" border="1"
== OpenSaveDataImporterByContext ==
|-
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
! Cmd || Name
 
|-
== CancelSuspendingImport ==
| 0 || [[#GetChallenge]]
Takes an input u64 and a 0x10-byte struct, no output.
|-
 
| 16 || [[#SetKeySeedPackage]]
= ISaveDataDivisionExporter =
This is "nn::fssrv::sf::ISaveDataDivisionExporter".
 
This was added with [[5.0.0]].
 
{| class="wikitable" border="1"
|-
|-
| 32 || [[#OpenSaveDataExporter]]
! Cmd || Name
|-
| 0 || [[#SetDivisionCount]]
|-
| 1 || [6.0.0+] [[#ReadSaveDataExtraData]]
|-
| 16 || [[#OpenSaveDataDiffChunkIterator]]
|-
|-
| 33 || [[#OpenSaveDataExporterForDiffExport]]
| 48 || [[#OpenSaveDataChunkExporter]]
|-
|-
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
|-
|-
|rowspan="2"| 64 || [5.0.0-5.1.0] OpenSaveDataImporter
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
|-
|-
| [6.0.0+] [[#OpenSaveDataImporterDeprecated]]
| 66 || [6.0.0+] [[#CancelExport]]
|-
|-
| 65 || [[#OpenSaveDataImporterForDiffImport]]
| 67 || [6.0.0+] [[#SuspendExport]]
|-
|-
| 66 || [6.0.0+] [[#OpenSaveDataImporterForDuplicateDiffImport]]
| 70 || [6.0.0-17.0.1] [[#GetKeySeed]]
|-
|-
| 67 || [6.0.0+] [[#OpenSaveDataImporter]]
| 71 || [6.0.0+] [[#GetInitialDataMac]]
|-
|-
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]]
| 72 || [6.0.0+] [[#FinalizeExport]]
|-
|-
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
|-
|-
| 70 || [10.0.0+] DecryptAndVerifyInitialData
| 74 || [18.0.0+] [[#GetKeySeed]]
|-
|-
| 80 || [11.0.0+] DecryptoAndVerifyPortContext
| 75 || [20.0.0+] GetLocalKeySeedPackage
|}
|-
 
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
== GetChallenge ==
|-
No input/output, takes a type-0x6 output buffer containing the '''Challenge'''.
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
 
|-
== SetKeySeedPackage ==
| 96 || [6.0.0+] [[#GetReportInfo]]
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.
|}


== OpenSaveDataExporter ==
== SetDivisionCount ==
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
Takes an input u32, no output.


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


== OpenSaveDataExporterByContext ==
== FinalizeFullExport ==
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].
No input, returns two 0x10-byte output structs.


== OpenSaveDataImporterDeprecated ==
== FinalizeDiffExport ==
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].
No input, returns an output 0x10-byte struct.


== OpenSaveDataImporterForDiffImport ==
== CancelExport ==
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]].
No input/output.


== OpenSaveDataImporterForDuplicateDiffImport ==
== SuspendExport ==
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
No input/output, takes a type-0x6 output buffer.


== OpenSaveDataImporter ==
== GetKeySeed ==
Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
No input, returns an output 0x10-byte struct.
 
== GetInitialDataMac ==
No input, returns an output 0x10-byte struct.


== OpenSaveDataImporterByContext ==
== FinalizeExport ==
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
No input/output.


== CancelSuspendingImport ==
== SetExportInitialDataAad ==
Takes an input u64 and a 0x10-byte struct, no output.
Takes an input 0x20-byte struct, no output.


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


This was added with [[5.0.0]].
This was added with [[5.0.0]].
Line 1,887: Line 1,721:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#SetDivisionCount]]
| 0 || [6.0.0+] [[#ReadSaveDataExtraData]]
|-
| 1 || [6.0.0+] [[#GetSaveDataInfo]]
|-
|-
| 16 || [[#OpenSaveDataDiffChunkIterator]]
| 16 || [[#OpenSaveDataDiffChunkIterator]]
|-
|-
| 48 || [[#OpenSaveDataChunkExporter]]
| 32 || [[#InitializeImport]]
|-
|-
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
| 33 || [[#FinalizeImport]]
|-
|-
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
| 34 || [6.0.0+] [[#CancelImport]]
|-
|-
| 66 || [6.0.0+] [[#CancelExport]]
| 35 || [6.0.0+] [[#GetImportContext]]
|-
|-
| 67 || [6.0.0+] [[#SuspendExport]]
| 36 || [6.0.0+] [[#SuspendImport]]
|-
|-
| 70 || [6.0.0+] [[#GetKeySeed]]
| 37 || [11.0.0+] FinalizeImportWithoutSwap
|-
|-
| 71 || [6.0.0+] [[#GetInitialDataMac]]
| 48 || [[#OpenSaveDataChunkImporter]]
|-
|-
| 72 || [6.0.0+] [[#FinalizeExport]]
| 64 || [6.0.0+] [[#GetImportInitialDataAad]]
|-
|-
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
| 80 || [6.0.0+] [[#GetReportInfo]]
|-
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
|-
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
|-
| 96 || [6.0.0+] [[#GetReportInfo]]
|}
|}


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


== OpenSaveDataChunkExporter ==
== OpenSaveDataDiffChunkIterator ==
Takes an input u32, returns an [[#ISaveDataChunkExporter]].
No input, returns an [[#ISaveDataChunkIterator]].


== FinalizeFullExport ==
== InitializeImport ==
No input, returns two 0x10-byte output structs.
No input, returns an output u64.


== FinalizeDiffExport ==
== FinalizeImport ==
No input, returns an output 0x10-byte struct.
No input/output.


== CancelExport ==
== CancelImport ==
No input/output.
No input/output.


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


== GetKeySeed ==
== SuspendImport ==
No input, returns an output 0x10-byte struct.
No input/output.


== GetInitialDataMac ==
== OpenSaveDataChunkImporter ==
No input, returns an output 0x10-byte struct.
Takes an input u32, returns an [[#ISaveDataChunkImporter]].


== FinalizeExport ==
== GetImportInitialDataAad ==  
No input/output.
No input, returns an output 0x20-byte struct.


== SetExportInitialDataAad ==
== GetReportInfo ==
Takes an input 0x20-byte struct, no output.
No input, returns an output 0x20-byte struct.


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


This was added with [[5.0.0]].
This was added with [[5.0.0]].
Line 1,957: Line 1,783:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [6.0.0+] [[#GetSaveDataInfo]]
| 0 || [[#Next]]
|-
|-
| 16 || [[#OpenSaveDataDiffChunkIterator]]
| 1 || [[#IsEnd]]  
|-
|-
| 32 || [[#InitializeImport]]
| 16 || [[#GetId]]  
|-
| 33 || [[#FinalizeImport]]
|-
| 34 || [6.0.0+] [[#CancelImport]]
|-
| 35 || [6.0.0+] [[#GetImportContext]]
|-
| 36 || [6.0.0+] [[#SuspendImport]]
|-
| 37 || [11.0.0+] FinalizeImportWithoutSwap
|-
| 48 || [[#OpenSaveDataChunkImporter]]
|-
| 64 || [6.0.0+] [[#GetImportInitialDataAad]]
|-
| 80 || [6.0.0+] [[#GetReportInfo]]
|}
|}


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


== OpenSaveDataDiffChunkIterator ==
== IsEnd ==
No input, returns an [[#ISaveDataChunkIterator]].
No input, returns an output u8.


== InitializeImport ==
== GetId ==
No input, returns an output u64.
No input, returns an output u32.


== FinalizeImport ==
= ISaveDataChunkExporter =
No input/output.
This is "nn::fssrv::sf::ISaveDataChunkExporter".
 
== CancelImport ==
No input/output.
 
== GetImportContext ==
No input/output, takes a type-0x6 output buffer.
 
== SuspendImport ==
No input/output.
 
== OpenSaveDataChunkImporter ==
Takes an input u32, returns an [[#ISaveDataChunkImporter]].
 
== GetImportInitialDataAad ==
No input, returns an output 0x20-byte struct.
 
== GetReportInfo ==
No input, returns an output 0x20-byte struct.
 
= ISaveDataChunkIterator =
This is "nn::fssrv::sf::ISaveDataChunkIterator".


This was added with [[5.0.0]].
This was added with [[5.0.0]].
Line 2,019: Line 1,808:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#Next]]
| 0 || [[#Pull]]
|-
| 1 || [[#IsEnd]]
|-
| 16 || [[#GetId]]
|}
 
== Next ==
No input/output.
 
== IsEnd ==
No input, returns an output u8.
 
== GetId ==
No input, returns an output u32.
 
= ISaveDataChunkExporter =
This is "nn::fssrv::sf::ISaveDataChunkExporter".
 
This was added with [[5.0.0]].
 
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 0 || [[#Pull]]
|-
|-
| 16 || [6.0.0+] [[#GetRestRawDataSize]]
| 16 || [6.0.0+] [[#GetRestRawDataSize]]
Line 2,071: Line 1,835:


= ISaveDataTransferProhibiter =
= ISaveDataTransferProhibiter =
This was added with [[6.0.0]].
This is "nn::fssrv::sf::ISaveDataTransferProhibiter".
 
This was added with [6.0.0+].


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


= IMultiCommitManager =
= IMultiCommitManager =
This was added with [[6.0.0]].
This is "nn::fssrv::sf::IMultiCommitManager".
 
This was added with [6.0.0+].


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,094: Line 1,862:


= IWiper =
= IWiper =
This is "nn::fs::IWiper".
This is "nn::fssrv::sf::IWiper".


This was added with [[10.0.0]].
This was added with [[10.0.0]].
Line 2,113: Line 1,881:
No input. Returns an u64.
No input. Returns an u64.


= FileSystemProxyType =
= IStorageDeviceManager =
This is "nn::fs::FileSystemProxyType".
This is "nn::fssrv::storage::sf::IStorageDeviceManager".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value || Name
! Cmd || Name
|-
|-
| 0 || Code
| N/A || IsInserted
|-
|-
| 1 || Rom
| N/A || IsHandleValid
|-
|-
| 2 || Logo
| N/A || OpenDetectionEvent
|-
|-
| 3 || Control
| N/A || OpenOperator
|-
|-
| 4 || Manual
| N/A || OpenDevice
|-
|-
| 5 || Meta
| N/A || OpenStorage
|-
|-
| 6 || Data
| N/A || Invalidate
|-
| 7 || Package
|-
| 8 || [4.0.0+] RegisteredUpdate
|}
|}


= ContentType =
= IStorageDeviceOperator =
This is "nn::fs::ContentType".
This is "nn::fssrv::storage::sf::IStorageDeviceOperator".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value || Name
! Cmd || Name
|-
| N/A || Operate
|-
|-
| 0 || Meta
| N/A || OperateIn
|-
|-
| 1 || Control
| N/A || OperateOut
|-
|-
| 2 || Manual
| N/A || OperateOut2
|-
|-
| 3 || Logo
| N/A || OperateInOut
|-
|-
| 4 || Data
| N/A || OperateIn2Out
|}
|}


= ContentStorageId =
= IStorageDevice =
This is "nn::fs::ContentStorageId".
This is "nn::fssrv::storage::sf::IStorageDevice".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value || Name
! Cmd || Name
|-
| N/A || GetHandle
|-
| N/A || IsHandleValid
|-
| N/A || OpenOperator
|-
| N/A || Read
|-
| N/A || Write
|-
| N/A || Flush
|-
|-
| 0 || System
| N/A || SetSize
|-
|-
| 1 || User
| N/A || GetSize
|-
|-
| 2 || SdCard
| N/A || OperateRange
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,178: Line 1,956:
! Value || Name
! Value || Name
|-
|-
| 0 || System
| 0 || Code
|-
| 1 || Rom
|-
| 2 || Logo
|-
|-
| 1 || User
| 3 || Control
|-
|-
| 2 || SdSystem
| 4 || Manual
|-
|-
| 3 || [3.0.0+] Temporary
| 5 || Meta
|-
|-
| 4 || [4.0.0+] SdUser
| 6 || Data
|-
|-
| 100 || [3.0.0+] ProperSystem
| 7 || Package
|-
|-
| 101 || [3.0.0+] SafeMode
| 8 || [4.0.0+] RegisteredUpdate
|}
|}


Determines the storage where the savedata is stored.
= ContentType =
 
This is "nn::fs::ContentType".
= SaveDataType =
This is "nn::fs::SaveDataType".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,202: Line 1,982:
! Value || Name
! Value || Name
|-
|-
| 0 || System
| 0 || Meta
|-
|-
| 1 || Account
| 1 || Control
|-
|-
| 2 || Bcat
| 2 || Manual
|-
|-
| 3 || Device
| 3 || Logo
|-
|-
| 4 || [3.0.0+] Temporary
| 4 || Data
|-
|}
| 5 || [3.0.0+] Cache
|-
| 6 || [4.0.0+] SystemBcat
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,224: Line 2,000:
! Value || Name
! Value || Name
|-
|-
| 0 || Primary
| 0 || None
|-
|-
| 1 || Secondary
| 15 || All
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,236: Line 2,012:
! Value || Name
! Value || Name
|-
|-
| 1 || AllRank
| 0 || System
|-
| 1 || User
|-
| 2 || SdCard
|-
| 3 || [16.0.0+] System0
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,246: Line 2,028:
! Value || Name
! Value || Name
|-
|-
| 1 || KeepAfterResettingSystemSaveData
| 0 || System
|-
| 1 || User
|-
|-
| 2 || KeepAfterRefurbishment
| 2 || SdSystem
|-
|-
| 4 || KeepAfterResettingSystemSaveDataWithoutUserSaveData
| 3 || [3.0.0+] Temporary
|-
|-
| 8 || NeedsSecureDelete
| 4 || [4.0.0+] SdUser
|}
|-
| 100 || [3.0.0+] ProperSystem
|-
| 101 || [3.0.0+] SafeMode
|}
 
Determines the storage where the savedata is stored.


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,262: Line 2,052:
! Value || Name
! Value || Name
|-
|-
| 0 || None
| 0 || System
|-
| 1 || Account
|-
| 2 || Bcat
|-
| 3 || Device
|-
| 4 || [3.0.0+] Temporary
|-
|-
| 1 || Thumbnail
| 5 || [3.0.0+] Cache
|-
|-
| 2 || ExtensionContext
| 6 || [4.0.0+] SystemBcat
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,276: Line 2,074:
! Value || Name
! Value || Name
|-
|-
| 0 || Nand
| 0 || Primary
|-
|-
| 1 || SdCard
| 1 || Secondary
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,288: Line 2,086:
! Value || Name
! Value || Name
|-
|-
| 0 || Nand
| 1 || AllRank
|-
| 1 || SdCard
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,300: Line 2,096:
! Value || Name
! Value || Name
|-
|-
| 0 || System
| 1 || KeepAfterResettingSystemSaveData
|-
| 2 || KeepAfterRefurbishment
|-
| 4 || KeepAfterResettingSystemSaveDataWithoutUserSaveData
|-
|-
| 1 || SdCard
| 8 || NeedsSecureDelete
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,312: Line 2,112:
! Value || Name
! Value || Name
|-
|-
| 0 || Realtime
| 0 || None
|-
|-
| 1 || Normal
| 1 || Thumbnail
|-
|-
| 2 || Low
| 2 || ExtensionContext
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,326: Line 2,126:
! Value || Name
! Value || Name
|-
|-
| 0 || Realtime
| 0 || Nand
|-
|-
| 1 || Normal
| 1 || SdCard
|-
| 2 || Low
|-
| 3 || Background
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,342: Line 2,138:
! Value || Name
! Value || Name
|-
|-
| 0 || Default
| 0 || Nand
|-
|-
| 1 || Abort
| 1 || SdCard
|-
| 2 || ReturnResult
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,356: Line 2,150:
! Value || Name
! Value || Name
|-
|-
| 0 || Clear
| 0 || System
|-
|-
| 1 || ClearSignature
| 1 || SdCard
|-
| 2 || InvalidateCache
|-
| 3 || QueryRange
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,372: Line 2,162:
! Value || Name
! Value || Name
|-
|-
| 1 || PseudoCaseSensitive
| 0 || Realtime
|-
| 1 || Normal
|-
| 2 || Low
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,382: Line 2,176:
! Value || Name
! Value || Name
|-
|-
| 0 || BootPartition1Root
| 0 || Realtime
|-
|-
| 10 || BootPartition2Root
| 1 || Normal
|-
|-
| 20 || UserDataRoot
| 2 || Low
|-
|-
| 21 || BootConfigAndPackage2Part1
| 3 || Background
|}
 
= AbortSpecifier =
This is "nn::fs::AbortSpecifier".
 
{| class="wikitable" border="1"
|-
|-
| 22 || BootConfigAndPackage2Part2
! Value || Name
|-
|-
| 23 || BootConfigAndPackage2Part3
| 0 || Default
|-
|-
| 24 || BootConfigAndPackage2Part4
| 1 || Abort
|-
|-
| 25 || BootConfigAndPackage2Part5
| 2 || ReturnResult
|}
 
= OperationId =
This is "nn::fs::OperationId".
 
{| class="wikitable" border="1"
|-
|-
| 26 || BootConfigAndPackage2Part6
! Value || Name
|-
|-
| 27 || CalibrationBinary
| 0 || Clear
|-
|-
| 28 || CalibrationFile
| 1 || ClearSignature
|-
|-
| 29 || SafeMode
| 2 || InvalidateCache
|-
|-
| 30 || User
| 3 || QueryRange
|}
 
= MountHostOption =
This is "nn::fs::MountHostOption".
 
{| class="wikitable" border="1"
|-
|-
| 31 || System
! Value || Name
|-
|-
| 32 || SystemProperEncryption
| 1 || PseudoCaseSensitive
|-
| 33 || SystemProperPartition
|-
| 34 || SignedSystemPartitionOnSafeMode
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,424: Line 2,232:
! Value || Name
! Value || Name
|-
|-
| 0 || Identification
| 0 || BootPartition1Root
|-
|-
| 1 || DefaultSpeed
| 10 || BootPartition2Root
|-
|-
| 2 || HighSpeed
| 20 || UserDataRoot
|-
|-
| 3 || Sdr12
| 21 || BootConfigAndPackage2Part1
|-
| 22 || BootConfigAndPackage2Part2
|-
| 23 || BootConfigAndPackage2Part3
|-
| 24 || BootConfigAndPackage2Part4
|-
| 25 || BootConfigAndPackage2Part5
|-
| 26 || BootConfigAndPackage2Part6
|-
| 27 || CalibrationBinary
|-
| 28 || CalibrationFile
|-
| 29 || SafeMode
|-
| 30 || User
|-
| 31 || System
|-
|-
| 4 || Sdr25
| 32 || SystemProperEncryption
|-
|-
| 5 || Sdr50
| 33 || SystemProperPartition
|-
|-
| 6 || Sdr104
| 34 || SignedSystemPartitionOnSafeMode
|-
|-
| 7 || Ddr50
| 35 || [16.0.0+] DeviceTreeBlob
|-
|-
| 8 || Unknown
| 36 || [16.0.0+] System0
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,452: Line 2,280:
| 0 || Identification
| 0 || Identification
|-
|-
| 1 || LegacySpeed
| 1 || DefaultSpeed
|-
| 2 || HighSpeed
|-
| 3 || Sdr12
|-
| 4 || Sdr25
|-
| 5 || Sdr50
|-
| 6 || Sdr104
|-
| 7 || Ddr50
|-
| 8 || Unknown
|}
 
= MmcSpeedMode =
This is "nn::fs::MmcSpeedMode".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 || Identification
|-
| 1 || LegacySpeed
|-
|-
| 2 || HighSpeed
| 2 || HighSpeed
Line 2,477: Line 2,331:
|}
|}


= StorageErrorInfo =
= HostControllerStatus =
This is "nn::fs::StorageErrorInfo".
This is "nn::sdcard::HostControllerStatus".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,487: Line 2,341:
|-
|-
| 0x0
| 0x0
| 0x4
| 0xC
| NumActivationFailures
|  
|-
|}
| 0x4
 
| 0x4
= MemoryReportInfo =
| NumActivationErrorCorrections
This is "nn::fs::MemoryReportInfo".
|-
 
| 0x8
{| class="wikitable" border="1"
| 0x4
| NumReadWriteFailures
|-
| 0xC
| 0x4
| NumReadWriteErrorCorrections
|}
 
= GameCardErrorInfo =
This is "nn::fs::GameCardErrorInfo".
 
{| class="wikitable" border="1"
|-
|-
! Offset
! Offset
Line 2,513: Line 2,355:
|-
|-
| 0x0
| 0x0
| 0x4
| 0x8
| GameCardCrcErrorNum
| PooledBufferFreeSizePeak
|-
|-
| 0x4
| 0x8
| 0x4
| 0x8
| AsicCrcErrorNum
| PooledBufferRetriedCount
|-
|-
| 0x10
| 0x8
| 0x8
| 0x4
| PooledBufferReduceAllocationCount
| RefreshNum
|-
| 0x18
| 0x8
| BufferManagerFreeSizePeak
|-
|-
| 0xC
| 0x20
| 0x4
| 0x8
| RetryLimitOutNum
| BufferManagerRetriedCount
|}
|-
 
| 0x28
= GameCardErrorReportInfo =
| 0x8
This is "nn::fs::GameCardErrorReportInfo". This is a 0x40-byte struct.
| ExpHeapFreeSizePeak
 
|-
= GameCardHandle =
| 0x30
This is "nn::fs::GameCardHandle". This is an u32.
| 0x8
 
| BufferPoolFreeSizePeak
= GameCardPartition =
|-
This is "nn::fs::GameCardPartition".
| 0x38
 
| 0x8
{| class="wikitable" border="1"
| PatrolReadAllocateBufferSuccessCount
|-
|-
! Value || Name
| 0x40
| 0x8
| PatrolReadAllocateBufferFailureCount
|-
|-
| 0 || Update
| 0x48
| 0x8
| BufferManagerTotalAllocatableSizePeak
|-
|-
| 1 || Normal
| 0x50
| 0x8
| BufferPoolAllocateSizeMax
|-
|-
| 2 || Secure
| 0x58
| 0x8
| PooledBufferFailedIdealAllocationCountOnAsyncAccess
|-
|-
| 3 || [4.0.0+] Logo
| 0x60
| 0x20
| Reserved
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value || Name
! Offset
! Size
! Description
|-
|-
| 0 || NormalReadOnly
| 0x0
| 0x4
| NumActivationFailures
|-
| 0x4
| 0x4
| NumActivationErrorCorrections
|-
|-
| 1 || SecureReadOnly
| 0x8
| 0x4
| NumReadWriteFailures
|-
|-
| 2 || RootWriteOnly
| 0xC
| 0x4
| NumReadWriteErrorCorrections
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value || Name
! Offset
! Size
! Description
|-
|-
| 1 || AutoBootFlag
| 0x0
| 0x2
| GameCardCrcErrorCount
|-
|-
| 2 || HistoryEraseFlag
| 0x2
| 0x2
| Reserved
|-
|-
| 4 || [4.0.0+] RepairToolFlag
| 0x4
| 0x2
| AsicCrcErrorCount
|-
| 0x6
| 0x2
| Reserved
|-
| 0x8
| 0x2
| RefreshCount
|-
| 0xA
| 0x2
| Reserved
|-
|-
| 8 || [9.0.0+] DifferentRegionCupToTerraDeviceFlag
| 0xC
| 0x2
| ReadRetryCount
|-
|-
| 16 || [9.0.0+] DifferentRegionCupToGlobalDeviceFlag
| 0xE
| 0x2
| TimeoutRetryErrorCount
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value || Name
! Offset
! Size
! Description
|-
|-
| 1 || Size1GB
| 0x0
| 0x10
| [[#GameCardErrorInfo|ErrorInfo]]
|-
|-
| 2 || Size2GB
| 0x10
| 0x2
| AsicReinitializeFailureDetail
|-
|-
| 4 || Size4GB
| 0x12
| 0x2
| InsertionCount
|-
|-
| 8 || Size8GB
| 0x14
| 0x2
| RemovalCount
|-
|-
| 16 || Size16GB
| 0x16
| 0x2
| AsicReinitializeCount
|-
| 0x18
| 0x4
| AsicInitializeCount
|-
|-
| 32 || Size32GB
| 0x1C
|}
| 0x2
 
| AsicReinitializeFailureCount
= GameCardClockRate =
This is "nn::fs::GameCardClockRate".
 
{| class="wikitable" border="1"
|-
|-
! Value || Name
| 0x1E
| 0x2
| AwakenFailureCount
|-
|-
| 25 || ClockRate25MHz
| 0x20
| 0x2
| Reserved
|-
|-
| 50 || ClockRate50MHz
| 0x22
|}
| 0x2
 
| RefreshCount
= GameCardCompatibilityType =
This is "nn::fs::GameCardCompatibilityType".
 
{| class="wikitable" border="1"
|-
|-
! Value || Name
| 0x24
| 0x4
| LastReadErrorPageAddress
|-
|-
| 0 || Global
| 0x28
| 0x4
| LastReadErrorPageCount
|-
|-
| 1 || China
| 0x2C
|}
| 0x4
 
| AwakenCount
= GameCardUpdatePartitionInfo =
This is "nn::fs::GameCardUpdatePartitionInfo".
 
{| class="wikitable" border="1"
|-
|-
! Offset
| 0x30
! Size
! Description
|-
| 0x0
| 0x4
| 0x4
| Version
| ReadCountFromInsert
|-
|-
| 0x34
| 0x4
| 0x4
| 0x4
| ReadCountFromAwaken
| Reserved
|-
|-
| 0x38
| 0x8
| 0x8
| 0x8
| Reserved
| Id
|}
|}


= CardId1 =
= GameCardHandle =
This is "nn::gc::detail::CardId1".
This is "nn::fs::GameCardHandle". This is an u32.
 
= GameCardPartition =
This is "nn::fs::GameCardPartition".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value || Name
! Size
! Description
|-
|-
| 0x0
| 0 || Update
| 0x1
| MakerCode
|-
|-
| 0x1
| 1 || Normal
| 0x1
| MemoryCapacity
|-
|-
| 0x2
| 2 || Secure
| 0x1
| Reserved
|-
|-
| 0x3
| 3 || [4.0.0+] Logo
| 0x1
| MemoryType
|}
|}


= CardId2 =
= GameCardPartitionRaw =
This is "nn::gc::detail::CardId2".
This is "nn::fs::GameCardPartitionRaw".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value || Name
! Size
! Description
|-
|-
| 0x0
| 0 || NormalReadOnly
| 0x1
| CardSecurityNumber
|-
|-
| 0x1
| 1 || SecureReadOnly
| 0x1
| CardType
|-
|-
| 0x2
| 2 || RootWriteOnly
| 0x2
| Reserved
|}
|}


= CardId3 =
= GameCardAttribute =
This is "nn::gc::detail::CardId3".
This is "nn::fs::GameCardAttribute".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value || Name
! Size
! Description
|-
|-
| 0x0
| 1 || AutoBootFlag
| 0x4
| Reserved
|}
 
= GameCardIdSet =
This is "nn::gc::GameCardIdSet".
 
{| class="wikitable" border="1"
|-
|-
! Offset
| 2 || HistoryEraseFlag
! Size
! Description
|-
|-
| 0x0
| 4 || [4.0.0+] RepairToolFlag
| 0x4
| [[#CardId1|Id1]]
|-
|-
| 0x4
| 8 || [9.0.0+] DifferentRegionCupToTerraDeviceFlag
| 0x4
| [[#CardId2|Id2]]
|-
|-
| 0x8
| 16 || [9.0.0+] DifferentRegionCupToGlobalDeviceFlag
| 0x4
| [[#CardId3|Id3]]
|}
|}


= RmaInformation =
= GameCardAttribute2 =
This is "nn::gc::RmaInformation". This is a 0x200-byte struct.
This is "nn::fs::GameCardAttribute2".


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,743: Line 2,610:
! Value || Name
! Value || Name
|-
|-
| 0 || eMMC
| 1 || Size1GB
|-
|-
| 1 || SdCard
| 2 || Size2GB
|-
|-
| 2 || GameCard
| 4 || Size4GB
|-
| 8 || Size8GB
|-
| 16 || Size16GB
|-
| 32 || Size32GB
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,757: Line 2,630:
! Value || Name
! Value || Name
|-
|-
| 0 || NoSimulation
| 25 || ClockRate25MHz
|-
|-
| 1 || DeviceAttached
| 50 || ClockRate50MHz
|-
| 2 || DeviceRemoved
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,771: Line 2,642:
! Value || Name
! Value || Name
|-
|-
| 0 || None
| 0 || Global
|-
|-
| 1 || AccessTimeoutFailure
| 1 || China
|-
| 2 || AccessFailure
|-
| 3 || DataCorruption
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value || Name
! Offset
! Size
! Description
|-
|-
| 1 || Read
| 0x0
| 0x4
| Version
|-
| 0x4
| 0x4
| Reserved
|-
|-
| 2 || Write
| 0x8
| 0x8
| Id
|}
|}


= SpeedEmulationMode =
= GameCardIdSet =
This is "nn::fs::SpeedEmulationMode".
This is "nn::gc::GameCardIdSet".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value || Name
! Offset
! Size
! Description
|-
|-
| 0 || None
| 0x0
| 0x4
| [[#CardId1|Id1]]
|-
|-
| 1 || Faster
| 0x4
| 0x4
| [[#CardId2|Id2]]
|-
|-
| 2 || Slower
| 0x8
|-
| 0x4
| 3 || Random
| [[#CardId3|Id3]]
|}
|}


= ContentPath =
= CardId1 =
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::gc::detail::CardId1".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Path || Notes
! Offset
! Size
! Description
|-
|-
| @SystemContent ||
| 0x0
|-
| 0x1
| @UserContent ||
| [[#MakerCodeForCardId1|MakerCode]]
|-
|-
| @SdCardContent ||
| 0x1
| 0x1
| [[#MemoryCapacity|MemoryCapacity]]
|-
|-
| @CalibFile ||
| 0x2
| 0x1
| Reserved
|-
|-
| @Safe ||
| 0x3
| 0x1
| [[#MemoryType|MemoryType]]
|}
 
= CardId2 =
This is "nn::gc::detail::CardId2".
 
{| class="wikitable" border="1"
|-
|-
| @User ||
! Offset
! Size
! Description
|-
|-
| @System ||
| 0x0
| 0x1
| [[#CardSecurityNumber|CardSecurityNumber]]
|-
|-
| @Sdcard ||
| 0x1
| 0x1
| [[#CardType|CardType]]
|-
|-
| @Host ||
| 0x2
|-
| 0x2
| @GcApp || Gamecard App partition (Partition 2)
| Reserved
|-
| @GcXYYYYYYYY || Gamecard Contents. X is the partition type (U - Update, N - Normal, S - Secure). Y is the gamecard handle as a 32-bit hex value
|-
| @upp || Gamecard update partition (Partition 0)
|-
| [4.0.0+] @RegUpdate || Registered update partition
|}
|}


= SaveDataAttribute =
= CardId3 =
This is "nn::fs::SaveDataAttribute".
This is "nn::gc::detail::CardId3".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,852: Line 2,749:
|-
|-
| 0x0
| 0x0
| 0x8
| 0x4
| [[NCM_services#ApplicationId|ApplicationId]] (0 for SystemSaveData)</br>SaveData: 0 can be used for accessing the savedata associated with the current FS session [[NCM_services#ApplicationId|ApplicationId]], otherwise when set this is the [[NCM_services#ApplicationId|ApplicationId]] associated with the savedata to access.
| Reserved
|}
 
= MakerCodeForCardId1 =
This is "nn::gc::detail::MakerCodeForCardId1".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
|-
| 0x8
| 0xC2 || MegaChips
| 0x10
| UserId</br>For user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].
|-
|-
| 0x18
| 0xAE || Lapis
| 0x8
| [[Flash_Filesystem|SystemSaveDataId]] (0 for SaveData)
|-
|-
| 0x20
| 0x36 ||
| 0x1
|}
| [[#SaveDataType]]
 
= MemoryCapacity =
This is "nn::gc::detail::MemoryCapacity".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
|-
| 0x21
| 0xFA || 1GB
| 0x1
| [[#SaveDataRank]]
|-
|-
| 0x22
| 0xF8 || 2GB
| 0x2
| SaveDataIndex
|-
|-
| 0x24
| 0xF0 || 4GB
| 0x4
| Padding
|-
|-
| 0x28
| 0xE0 || 8GB
| 0x8
| 0 for SystemSaveData/SaveData.
|-
|-
| 0x30
| 0xE1 || 16GB
| 0x8
| 0 for SystemSaveData/SaveData.
|-
|-
| 0x38
| 0xE2 || 32GB
| 0x8
| 0 for SystemSaveData/SaveData.
|}
|}


Total size is 0x40-bytes.
= MemoryType =
 
This is "nn::gc::detail::MemoryType".
For DeviceSaveData, this struct is all-zero except for the [[#SaveDataType]] field (and optionally the ApplicationId if specified).
 
= SaveDataCreationInfo =
This is "nn::fs::SaveDataCreationInfo".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Offset
! Value || Name
! Size
! Description
|-
|-
| 0x0
| 0x1 || T1RomFast
| 0x8
| SaveDataSize
|-
|-
| 0x8
| 0x2 || T2RomFast
| 0x8
| JournalSize
|-
|-
| 0x10
| 0x9 || T1NandFast
| 0x8
| AvailableSize</br>0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData.
|-
|-
| 0x18
| 0xA || T2NandFast
| 0x8
| OwnerId</br>Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[NCM_services#ProgramId|ProgramId]] of the bcat-sysmodule.
|-
|-
| 0x20
| 0x21 || T1RomLate
| 0x4
| [[#SaveDataFlags]]</br>Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.
|-
|-
| 0x24
| 0x22 || T2RomLate
| 0x1
| [[#SaveDataSpaceId]]</br>Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.
|-
|-
| 0x25
| 0x29 || T1NandLate
| 0x1
| Unknown. 0 for SystemSaveData/SaveData.
|-
|-
| 0x26
| 0x2A || T2NandLate
| 0x1A
| Not initialized for SystemSaveData/SaveData.
|}
|}


Total size is 0x40-bytes.
= CardSecurityNumber =
This is "nn::gc::detail::CardSecurityNumber".


= DeviceSaveData =
{| class="wikitable" border="1"
This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the [[#SaveDataAttribute]].
|-
 
! Value || Name
= BcatSaveData =
|-
This is accessed using the same commands for SaveData with the same input u8. The [[#SaveDataAttribute]] is the same as DeviceSaveData (besides the SaveDataType), except that the [[NCM_services#ApplicationId|ApplicationId]] field is always set to <input ApplicationId> (unlike DeviceSaveData where it's optional). See above regarding [[#SaveDataCreationInfo]].
| 0 || 0
|-
| 1 || 1
|-
| 2 || 2
|-
| 3 || 3
|-
| 4 || 4
|}
 
= CardType =
This is "nn::gc::detail::CardType".


The 0x10-byte struct passed to [[#CreateSaveDataFileSystem]] has the first 0x5-bytes set to all-zero.
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 || Rom
|-
| 1 || WritableDevT1
|-
| 2 || WritableProdT1
|-
| 3 || WritableDevT2
|-
| 4 || WritableProdT2
|}


MountSystemBcatSaveData uses [[#OpenSaveDataFileSystemBySystemSaveDataId]] with [[#SaveDataSpaceId]] System. The [[#SaveDataAttribute]] is all-zero, except for the SaveDataType, and SystemSaveDataId is set to the input param.
= RmaInformation =
This is "nn::gc::RmaInformation". This is a 0x200-byte struct.


= SaveDataInfo =
= GameCardCardHeader =
This is "nn::fs::SaveDataInfo".
This is a 0x600-byte struct.


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 2,960: Line 2,860:
|-
|-
| 0x0
| 0x0
| 0x8
| 0x100
| SaveDataId
| [[XCI#CardHeader|Signature]]
|-
|-
| 0x8
| 0x100
| 0x1
| 0x100
| [[#SaveDataSpaceId]]
| [[Lotus3#GetCardHeader|Header]]
|-
|-
| 0x9
| 0x200
| 0x1
| 0x400
| [[#SaveDataType]]
| [[XCI#NewCardHeaderCertArea|NewCardHeaderCertArea]]
|}
 
= GameCardAsicProductionFirmware =
This is the [[Lotus3#AsicFirmware|firmware]] for reading production Gamecards.
 
Embedded in "nn::gc::detail::EmbeddedDataHolder::g_FwReadBuffer" when in production mode.
 
[4.0.0+] This firmware was updated to provide support for new Gamecards.
 
[9.0.0+] This firmware was updated.
 
[11.0.0+] This firmware was updated.
 
[12.0.0+] This firmware was updated.
 
[14.0.0+] This firmware was updated.
 
= GameCardAsicDevelopmentFirmware =
This is the [[Lotus3#AsicFirmware|firmware]] for reading development Gamecards.
 
Embedded in "nn::gc::detail::EmbeddedDataHolder::g_FwReadBuffer" when in development mode.
 
[9.0.0+] This firmware was updated.
 
[11.0.0+] This firmware was updated.
 
[14.0.0+] This firmware was updated.
 
= GameCardAsicWriterFirmware =
This is the [[Lotus3#AsicFirmware|firmware]] for writing development Gamecards.
 
Embedded in "nn::gc::detail::EmbeddedDataHolder::g_FwWriterBuffer".
 
= SimulatingDeviceType =
This is "nn::fs::SimulatingDeviceType".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
|-
| 0xA
| 0 || eMMC
| 0x6
|-
| 1 || SdCard
|-
| 2 || GameCard
|}
 
= SimulatingDeviceDetectionMode =
This is "nn::fs::SimulatingDeviceDetectionMode".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 || NoSimulation
|-
| 1 || DeviceAttached
|-
| 2 || DeviceRemoved
|}
 
= SimulatingDeviceAccessFailureEventType =
This is "nn::fs::SimulatingDeviceAccessFailureEventType".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 || None
|-
| 1 || AccessTimeoutFailure
|-
| 2 || AccessFailure
|-
| 3 || DataCorruption
|}
 
= SimulatingDeviceTargetOperation =
This is "nn::fs::SimulatingDeviceTargetOperation".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 1 || Read
|-
| 2 || Write
|}
 
= SpeedEmulationMode =
This is "nn::fs::SpeedEmulationMode".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 || None
|-
| 1 || Faster
|-
| 2 || Slower
|-
| 3 || Random
|}
 
= FspPath =
This is "nn::fssrv::sf::FspPath". This is a 0x301-byte string.
 
{| class="wikitable" border="1"
|-
! Path || Notes
|-
| @SystemContent ||
|-
| @UserContent ||
|-
| @SdCardContent ||
|-
| @CalibFile ||
|-
| @Safe ||
|-
| @User ||
|-
| @System ||
|-
| @Sdcard ||
|-
| @Host ||
|-
| @GcApp || Gamecard App partition (Partition 2)
|-
| @GcXYYYYYYYY || Gamecard Contents. X is the partition type (U - Update, N - Normal, S - Secure). Y is the gamecard handle as a 32-bit hex value
|-
| @upp || Gamecard update partition (Partition 0)
|-
| [4.0.0+] @RegUpdate || Registered update partition
|}
 
= SaveDataAttribute =
This is "nn::fs::SaveDataAttribute".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8
| [[NCM_services#ApplicationId|ApplicationId]] (0 for SystemSaveData)</br>SaveData: 0 can be used for accessing the savedata associated with the current FS session [[NCM_services#ApplicationId|ApplicationId]], otherwise when set this is the [[NCM_services#ApplicationId|ApplicationId]] associated with the savedata to access.
|-
| 0x8
| 0x10
| UserId</br>For user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].
|-
| 0x18
| 0x8
| [[Flash_Filesystem|SystemSaveDataId]] (0 for SaveData)
|-
| 0x20
| 0x1
| [[#SaveDataType]]
|-
| 0x21
| 0x1
| [[#SaveDataRank]]
|-
| 0x22
| 0x2
| SaveDataIndex
|-
| 0x24
| 0x4
| Padding
|-
| 0x28
| 0x8
| 0 for SystemSaveData/SaveData.
|-
| 0x30
| 0x8
| 0 for SystemSaveData/SaveData.
|-
| 0x38
| 0x8
| 0 for SystemSaveData/SaveData.
|}
 
Total size is 0x40-bytes.
 
For DeviceSaveData, this struct is all-zero except for the [[#SaveDataType]] field (and optionally the ApplicationId if specified).
 
= SaveDataCreationInfo =
This is "nn::fs::SaveDataCreationInfo".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8
| SaveDataSize
|-
| 0x8
| 0x8
| JournalSize
|-
| 0x10
| 0x8
| AvailableSize</br>0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData.
|-
| 0x18
| 0x8
| OwnerId</br>Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[NCM_services#ProgramId|ProgramId]] of the bcat-sysmodule.
|-
| 0x20
| 0x4
| [[#SaveDataFlags]]</br>Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.
|-
| 0x24
| 0x1
| [[#SaveDataSpaceId]]</br>Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.
|-
| 0x25
| 0x1
| Unknown. 0 for SystemSaveData/SaveData.
|-
| 0x26
| 0x1A
| Not initialized for SystemSaveData/SaveData.
|}
 
Total size is 0x40-bytes.
 
= DeviceSaveData =
This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the [[#SaveDataAttribute]].
 
= BcatSaveData =
This is accessed using the same commands for SaveData with the same input u8. The [[#SaveDataAttribute]] is the same as DeviceSaveData (besides the SaveDataType), except that the [[NCM_services#ApplicationId|ApplicationId]] field is always set to <input ApplicationId> (unlike DeviceSaveData where it's optional). See above regarding [[#SaveDataCreationInfo]].
 
The 0x10-byte struct passed to [[#CreateSaveDataFileSystem]] has the first 0x5-bytes set to all-zero.
 
MountSystemBcatSaveData uses [[#OpenSaveDataFileSystemBySystemSaveDataId]] with [[#SaveDataSpaceId]] System. The [[#SaveDataAttribute]] is all-zero, except for the SaveDataType, and SystemSaveDataId is set to the input param.
 
= SaveDataInfo =
This is "nn::fs::SaveDataInfo".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8
| SaveDataId
|-
| 0x8
| 0x1
| [[#SaveDataSpaceId]]
|-
| 0x9
| 0x1
| [[#SaveDataType]]
|-
| 0xA
| 0x6
| Padding?
| Padding?
|-
|-
| 0x10
| 0x10
| 0x10
| 0x10
| UserId
| UserId
|-
|-
| 0x20
| 0x20
| 0x8
| 0x8
| SystemSaveDataId (0 for regular SaveData)
| SystemSaveDataId (0 for regular SaveData)
|-
|-
| 0x28
| 0x28
| 0x8
| 0x8
| [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData)
| [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData)
|-
|-
| 0x30
| 0x30
| 0x8
| 0x8
| Raw saveimage size
| Raw saveimage size
|-
|-
| 0x38
| 0x38
| 0x2
| 0x2
| SaveDataIndex
| SaveDataIndex
|-
|-
| 0x3A
| 0x3A
| 0x1
| 0x1
| [[#SaveDataRank]]
| [[#SaveDataRank]]
|-
|-
| 0x3B
| 0x3B
| 0x25
| 0x25
| Unknown. Usually zeros?
| Unknown. Usually zeros?
|}
 
This is a 0x60-byte struct.
 
= SaveDataFileSystemExtraData =
This is a 0x200-byte struct. Appears to match [[Savegames#Extra_data]].
 
= InitialDataVersion2 =
This is a 0x8210-byte struct used by [[#ISaveDataTransferManagerWithDivision]].
 
= FsAccessControlRestrictionMode =
This is "nn::fs::FsAccessControlRestrictionMode".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 ||
|}
|}
This is a 0x60-byte struct.
= SaveDataFileSystemExtraData =
This is a 0x200-byte struct. Appears to match [[Savegames#Extra_data]].
= InitialDataVersion2 =
This is a 0x8210-byte struct used by [[#ISaveDataTransferManagerWithDivision]].


[[Category:Services]]
[[Category:Services]]