Filesystem services: Difference between revisions

No edit summary
No edit summary
 
(44 intermediate revisions by 4 users not shown)
Line 16: Line 16:
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[NCM_services#ProgramId|ProgramId]]. 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+] This now takes an additional input [[#ContentAttributes]].
[16.0.0+] Now takes an additional input [[#ContentAttributes]].


[17.0.0+] This now takes a type-0x6 output buffer instead of a type-0x1A output buffer.
[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 ==
Line 45: 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 126: Line 132:
| 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2
| 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2
|-
|-
| 38 || [20.0.0+]
| 38 || [20.0.0+] DetachSdCard
|-
| 39 || [21.0.0+] ShutdownStorage
|-
| 40 || [21.0.0+] FixSaveDataCertificate
|-
|-
| 51 || [[#OpenSaveDataFileSystem]]
| 51 || [[#OpenSaveDataFileSystem]]
Line 177: Line 187:
|-
|-
| 87 || [11.0.0+] [[#OpenSaveDataTransferManagerForRepair]]
| 87 || [11.0.0+] [[#OpenSaveDataTransferManagerForRepair]]
|-
| 88 || [21.0.0+] OpenSaveDataTransferManagerForSaveDataRepairWithPolicy
|-
|-
| 100 || OpenImageDirectoryFileSystem
| 100 || OpenImageDirectoryFileSystem
Line 212: Line 224:
| 501 || [[#OpenGameCardDetectionEventNotifier]]
| 501 || [[#OpenGameCardDetectionEventNotifier]]
|-
|-
| 502 || [20.0.0+]
| 502 || [20.0.0+] OpenSdCardAwakenReadyEventNotifier
|-
|-
| 503 || [19.0.0+] OpenGameCardAwakenReadyEventNotifier
| 503 || [19.0.0+] OpenGameCardAwakenReadyEventNotifier
Line 269: Line 281:
|-
|-
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid
|-
| 650 || [S2] RegisterTicketVersionKeys
|-
| 651 || [S2] RegisterCpDeviceUniqueKey
|-
| 660 || [S2] GetProcessEnvironmentSource
|-
|-
| 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]]
| 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]]
Line 280: Line 298:
| 720 || [5.0.0+] AbandonAccessFailure
| 720 || [5.0.0+] AbandonAccessFailure
|-
|-
| 800 || [2.0.0+] GetAndClearErrorInfo
| 800 || [2.0.0+] [[#GetAndClearErrorInfo]]
|-
|-
| 810 || [7.0.0+] RegisterProgramIndexMapInfo
| 810 || [7.0.0+] RegisterProgramIndexMapInfo
Line 292: Line 310:
| 1002 || [[#SetSaveDataRootPath]]
| 1002 || [[#SetSaveDataRootPath]]
|-
|-
| 1003 || DisableAutoSaveDataCreation
| 1003 || [1.0.0-21.2.0] DisableAutoSaveDataCreation
|-
|-
| 1004 || [[#SetGlobalAccessLogMode]]
| 1004 || [[#SetGlobalAccessLogMode]]
Line 324: Line 342:
| 1019 || [13.0.0+] UnsetDebugOption
| 1019 || [13.0.0+] UnsetDebugOption
|-
|-
| 1020 || [18.0.0+] OpenMemoryStressor
| 1020 || [18.0.0+] [[#OpenMemoryStressor]]
|-
|-
| 1100 || [4.0.0-17.0.1] OverrideSaveDataTransferTokenSignVerificationKey
| 1100 || [4.0.0-17.0.1] OverrideSaveDataTransferTokenSignVerificationKey
Line 345: Line 363:


Note that the functions check whether or not at least one bit is set in the mask. This means that, you don't need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000.
Note that the functions check whether or not at least one bit is set in the mask. This means that, you don't need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000.
If nn::spl::IsDebugMode() is disabled (retail behavior), the FS sysmodule masks the permission descriptor with 0x3FFFFFFFFFFFFFFF upon process registration.


If the code were to request an invalid input type, panic. But this never happens.
If the code were to request an invalid input type, panic. But this never happens.
Line 383: Line 403:
| 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
| 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
|-
|-
| 0xE || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
| [21.0.0+] 0xE || CanMountBisUserProperPartition || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
|-
|-
| 0xF || CanMountBisSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
| [21.0.0+] 0xF || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
|-
|-
| 0x10 || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]]
| [21.0.0+] 0x10 || CanMountBisSystemProperPartition || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
|-
|-
| 0x11 || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]]
| [21.0.0+] 0x11 ([-20.5.0] 0x10) || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]]
|-
|-
| 0x12 || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]]
| [21.0.0+] 0x12 ([-20.5.0] 0x11) || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]]
|-
|-
| 0x13 || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
| [21.0.0+] 0x13 ([-20.5.0] 0x12) || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]]
|-
|-
| 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]]
| [21.0.0+] 0x14 ([-20.5.0] 0x13) || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
|-
|-
| 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
| [21.0.0+] 0x15 ([-20.5.0] 0x14) || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]]
|-
|-
| 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x16 ([-20.5.0] 0x15) || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
|-
|-
| 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x17 ([-20.5.0] 0x16) || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]]
|-
|-
| 0x18 || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x18 ([-20.5.0] 0x17) || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x19 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x19 ([-20.5.0] 0x18) || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x1A || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x1A ([-20.5.0] 0x19) || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x1B || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x1B ([-20.5.0] 0x1A) || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x1C || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x1C ([-20.5.0] 0x1B) || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x1D || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x1D ([-20.5.0] 0x1C) || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x1E || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x1E ([-20.5.0] 0x1D) || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x1F || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x1F ([-20.5.0] 0x1E) || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x20 || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x20 ([-20.5.0] 0x1F) || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]]
|-
|-
| 0x21 || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x21 ([-20.5.0] 0x20) || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]]
|-
|-
| 0x22 || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x22 ([-20.5.0] 0x21) || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x23 || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x23 ([-20.5.0] 0x22) || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x24 || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x24 ([-20.5.0] 0x23) || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x25 || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x25 ([-20.5.0] 0x24) || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| 0x26 || CanOpenBisPartitionDeviceTreeBlob || 0x8000002000000080 || RW || [[#OpenBisStorage]]
| [21.0.0+] 0x26 ([-20.5.0] 0x25) || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]]
|-
|-
| [3.0.0+] 0x27 || CanOpenSdCardStorage || 0xC000000000200000 || RW ||  
| [21.0.0+] 0x27 ([-20.5.0] 0x26) || CanOpenBisPartitionDeviceTreeBlob || 0x8000002000000080 || RW || [[#OpenBisStorage]]
|-
|-
| [3.0.0+] 0x28 || CanOpenGameCardStorage || 0x8000000000000100 || RW || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)
| [21.0.0+] 0x28 ([3.0.0-20.5.0] 0x27) || CanOpenSdCardStorage || 0xC000000000200000 || RW ||  
|-
|-
| [4.0.0+] 0x29 || CanMountSystemDataPrivate || 0x8000000000100008 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
| [21.0.0+] 0x29 ([3.0.0-20.5.0] 0x28) || CanOpenGameCardStorage || 0x8000000000000100 || RW || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCardDirectly]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)
|-
|-
| [5.0.0+] 0x2A || CanMountHost || 0xC000000000400000 || RW || [[#OpenHostFileSystem]]
| [21.0.0+] 0x2A ([4.0.0-20.5.0] 0x29) || CanMountSystemDataPrivate || 0x8000000000100008 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
|-
|-
| [6.0.0+] 0x2B || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]]
| [21.0.0+] 0x2B || CanMountSystemDataPrivateIdRestricted || 0x8000200000000000 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
|-
|-
| [7.0.0+] 0x2C || CanOpenSaveDataInternalStorage || [-19.0.0] 0x8000000000000000 [20.0.0+] 0x8000000000000020 || RW || [[#OpenSaveDataInternalStorageFileSystem]]
| [21.0.0+] 0x2C ([5.0.0-20.5.0] 0x2A) || CanMountHost || 0xC000000000400000 || RW || [[#OpenHostFileSystem]]
|-
|-
| [7.0.0+] 0x2D || CanMountTemporaryDirectory || 0xC000000000000000 || RW ||  
| [21.0.0+] 0x2D ([6.0.0-20.5.0] 0x2B) || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]]
|-
|-
| [11.0.0+] 0x2E || CanMountAllBaseFilesystem || 0x8000000000000000 || RW || OpenBaseFileSystem
| [21.0.0+] 0x2E ([7.0.0-20.5.0] 0x2C) || CanOpenSaveDataInternalStorage || [20.0.0+] 0x8000000000000020 ([-19.0.0] 0x8000000000000000) || RW || [[#OpenSaveDataInternalStorageFileSystem]]
|-
|-
| [15.0.0+] 0x2F || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem
| [21.0.0+] 0x2F ([7.0.0-20.5.0] 0x2D) || CanMountTemporaryDirectory || 0xC000000000000000 || RW || [11.0.0+] OpenBaseFileSystem, [12.0.0+] FormatBaseFileSystem
|-
| [21.0.0+] 0x30 ([11.0.0-20.5.0] 0x2E) || CanMountAllBaseFilesystem || 0x8000000000000000 || RW || OpenBaseFileSystem, [12.0.0+] FormatBaseFileSystem
|-
| [21.0.0+] 0x31 ([15.0.0-20.5.0] 0x2F) || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem
|}
|}


Line 461: Line 485:
| 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc
| 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc
|-
|-
| [20.0.0+] 0x2 || || 0x8000100000000080 ||
| [20.0.0+] 0x2 || CanMarkBeforeEraseMmcPartitionUserData || 0x8000100000000080 ||
|-
|-
| [-19.0.0] 0x2 [20.0.0+] 0x3 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate
| [20.0.0+] 0x3 ([-19.0.0] 0x2) || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate
|-
|-
| [-19.0.0] 0x3 [20.0.0+] 0x4 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet
| [20.0.0+] 0x4 ([-19.0.0] 0x3) || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet
|-
|-
| [-19.0.0] 0x4 [20.0.0+] 0x5 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver
| [20.0.0+] 0x5 ([-19.0.0] 0x4) || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver
|-
|-
| [-19.0.0] 0x5 [20.0.0+] 0x6 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo
| [20.0.0+] 0x6 ([-19.0.0] 0x5) || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo
|-
|-
| [-19.0.0] 0x6 [20.0.0+] 0x7 || CanGetGameCardAsicCertificate || 0x8000000000000200 || GetGameCardAsicCertificate
| [20.0.0+] 0x7 ([-19.0.0] 0x6) || CanGetGameCardAsicCertificate || 0x8000000000000200 || GetGameCardAsicCertificate
|-
|-
| [20.0.0+] 0x8 || || 0x8000100000000080 ||
| [20.0.0+] 0x8 || CanGetGameCardCardHeader || 0x8000100000000080 ||
|-
|-
| [20.0.0+] 0x9 || || 0x8000100000000080 ||
| [20.0.0+] 0x9 || CanGetGameCardApplicationIdList || 0x8000100000000080 ||
|-
|-
| [20.0.0+] 0xA || || 0x8000080000000000 ||
| [20.0.0+] 0xA || CanGetGameCardDetailedErrorReportInfo || 0x8000080000000000 ||
|-
|-
| [20.0.0+] 0xB || || 0x8000000000000010 ||
| [20.0.0+] 0xB || CanSetGameCardSessionCreationDelay || 0x8000000000000010 ||
|-
|-
| [20.0.0+] 0xC || || 0x8000100000000080 ||
| [20.0.0+] 0xC || CanRegisterGameCardConfigurationData || 0x8000100000000080 ||
|-
|-
| [-19.0.0] 0x7 [20.0.0+] 0xD || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]]
| [20.0.0+] 0xD ([-19.0.0] 0x7) || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]]
|-
|-
| [-19.0.0] 0x8 [20.0.0+] 0xE || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
| [20.0.0+] 0xE ([-19.0.0] 0x8) || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
|-
|-
| [-19.0.0] 0x9 [20.0.0+] 0xF || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId
| [20.0.0+] 0xF ([-19.0.0] 0x9) || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId
|-
|-
| [-19.0.0] 0xA [20.0.0+] 0x10 || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId
| [20.0.0+] 0x10 ([-19.0.0] 0xA) || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId
|-
|-
| [-19.0.0] 0xB [20.0.0+] 0x11 || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
| [20.0.0+] 0x11 ([-19.0.0] 0xB) || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
|-
|-
| [-19.0.0] 0xC [20.0.0+] 0x12 || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
| [20.0.0+] 0x12 ([-19.0.0] 0xC) || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
|-
|-
| [-19.0.0] 0xD [20.0.0+] 0x13 || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
| [20.0.0+] 0x13 ([-19.0.0] 0xD) || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
|-
|-
| [-19.0.0] 0xE [20.0.0+] 0x14 || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]]
| [20.0.0+] 0x14 ([-19.0.0] 0xE) || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]]
|-
|-
| [-19.0.0] 0xF [20.0.0+] 0x15 || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile
| [20.0.0+] 0x15 ([-19.0.0] 0xF) || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile
|-
|-
| [-19.0.0] 0x10 [20.0.0+] 0x16 || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
| [20.0.0+] 0x16 ([-19.0.0] 0x10) || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
|-
|-
| [-19.0.0] 0x11 [20.0.0+] 0x17 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]]
| [20.0.0+] 0x17 ([-19.0.0] 0x11) || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]]
|-
|-
| [-19.0.0] 0x12 [20.0.0+] 0x18 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]]
| [20.0.0+] 0x18 ([-19.0.0] 0x12) || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]]
|-
|-
| [-19.0.0] 0x13 [20.0.0+] 0x19 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode
| [20.0.0+] 0x19 ([-19.0.0] 0x13) || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode
|-
|-
| [20.0.0+] 0x1A || || 0x8000000400080000 ||
| [20.0.0+] 0x1A || CanSetApplicationStorageSpeed || 0x8000000400080000 ||
|-
|-
| [20.0.0+] 0x1B || || 0x8000000400080000 ||
| [20.0.0+] 0x1B || CanSetGameCardClockRateForSpeedEmulation || 0x8000000400080000 ||
|-
|-
| [-19.0.0] 0x14 [20.0.0+] 0x1C || CanDebug || 0xC000000000000000 ||  
| [20.0.0+] 0x1C ([-19.0.0] 0x14) || CanDebug || 0xC000000000000000 ||  
|-
|-
| [-19.0.0] 0x15 [20.0.0+] 0x1D || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles
| [20.0.0+] 0x1D ([-19.0.0] 0x15) || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles
|-
|-
| [2.0.0-19.0.0] 0x16 [20.0.0+] 0x1E || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
| [20.0.0+] 0x1E ([2.0.0-19.0.0] 0x16) || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
|-
|-
| [2.0.0-19.0.0] 0x17 [20.0.0+] 0x1F || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
| [20.0.0+] 0x1F ([2.0.0-19.0.0] 0x17) || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
|-
|-
| [2.0.0-19.0.0] 0x18 [20.0.0+] 0x20 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId
| [20.0.0+] 0x20 ([2.0.0-19.0.0] 0x18) || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId
|-
|-
| [2.0.0-19.0.0] 0x19 [20.0.0+] 0x21 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
| [20.0.0+] 0x21 ([2.0.0-19.0.0] 0x19) || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
|-
|-
| [2.0.0-19.0.0] 0x1A [20.0.0+] 0x22 || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem
| [20.0.0+] 0x22 ([2.0.0-19.0.0] 0x1A) || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem
|-
|-
| [3.0.0-19.0.0] 0x1B [20.0.0+] 0x23 || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
| [20.0.0+] 0x23 ([3.0.0-19.0.0] 0x1B) || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
|-
|-
| [3.0.0-19.0.0] 0x1C [20.0.0+] 0x24 || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey
| [20.0.0+] 0x24 ([3.0.0-19.0.0] 0x1C) || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey
|-
|-
| [4.0.0-19.0.0] 0x1D [20.0.0+] 0x25 || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]]
| [20.0.0+] 0x25 ([4.0.0-19.0.0] 0x1D) || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]]
|-
|-
| [4.0.0-19.0.0] 0x1E [20.0.0+] 0x26 || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
| [20.0.0+] 0x26 ([4.0.0-19.0.0] 0x1E) || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
|-
|-
| [4.0.0-19.0.0] 0x1F [20.0.0+] 0x27 || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
| [20.0.0+] 0x27 ([4.0.0-19.0.0] 0x1F) || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
|-
|-
| [4.0.0-19.0.0] 0x20 [20.0.0+] 0x28 || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
| [20.0.0+] 0x28 ([4.0.0-19.0.0] 0x20) || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
|-
|-
| [5.0.0-19.0.0] 0x21 [20.0.0+] 0x29 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
| [20.0.0+] 0x29 ([5.0.0-19.0.0] 0x21) || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
|-
|-
| [5.0.0-19.0.0] 0x22 [20.0.0+] 0x2A || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem
| [20.0.0+] 0x2A ([5.0.0-19.0.0] 0x22) || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem
|-
|-
| [5.0.0-19.0.0] 0x23 [20.0.0+] 0x2B || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem
| [20.0.0+] 0x2B ([5.0.0-19.0.0] 0x23) || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem
|-
|-
| [5.0.0-19.0.0] 0x24 [20.0.0+] 0x2C || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem
| [20.0.0+] 0x2C ([5.0.0-19.0.0] 0x24) || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem
|-
|-
| [5.0.0-19.0.0] 0x25 [20.0.0+] 0x2D || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition
| [20.0.0+] 0x2D ([5.0.0-19.0.0] 0x25) || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition
|-
|-
| [5.0.0-19.0.0] 0x26 [20.0.0+] 0x2E || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]]
| [20.0.0+] 0x2E ([5.0.0-19.0.0] 0x26) || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]]
|-
|-
| [5.0.0-19.0.0] 0x27 [20.0.0+] 0x2F || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]]
| [20.0.0+] 0x2F ([5.0.0-19.0.0] 0x27) || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]]
|-
|-
| [5.0.0-19.0.0] 0x28 [20.0.0+] 0x30 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair
| [20.0.0+] 0x30 ([5.0.0-19.0.0] 0x28) || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair
|-
|-
| [5.0.0-19.0.0] 0x29 [20.0.0+] 0x31 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair
| [20.0.0+] 0x31 ([5.0.0-19.0.0] 0x29) || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair
|-
|-
| [5.0.0-19.0.0] 0x2A [20.0.0+] 0x32 || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]]
| [20.0.0+] 0x32 ([5.0.0-19.0.0] 0x2A) || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]]
|-
|-
| [5.0.0-19.0.0] 0x2B [20.0.0+] 0x33 || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]]
| [20.0.0+] 0x33 ([5.0.0-19.0.0] 0x2B) || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]]
|-
|-
| [5.0.0-19.0.0] 0x2C [20.0.0+] 0x34 || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]]
| [20.0.0+] 0x34 ([5.0.0-19.0.0] 0x2C) || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]]
|-
|-
| [5.0.0-19.0.0] 0x2D [20.0.0+] 0x35 || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]]
| [20.0.0+] 0x35 ([5.0.0-19.0.0] 0x2D) || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]]
|-
|-
| [5.0.0-19.0.0] 0x2E [20.0.0+] 0x36 || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol
| [20.0.0+] 0x36 ([5.0.0-19.0.0] 0x2E) || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol
|-
|-
| [5.0.0-19.0.0] 0x2F [20.0.0+] 0x37 || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey
| [20.0.0+] 0x37 ([5.0.0-19.0.0] 0x2F) || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey
|-
|-
| [5.1.0-19.0.0] 0x30 [20.0.0+] 0x38 || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]]
| [20.0.0+] 0x38 ([5.1.0-19.0.0] 0x30) || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]]
|-
|-
| [20.0.0+] 0x39 || || 0x8000000000200000 ||
| [20.0.0+] 0x39 || CanOpenSdCardAwakenReadyEventNotifier || 0x8000000000200000 ||
|-
|-
| [6.0.0-19.0.0] 0x31 [20.0.0+] 0x3A || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]]
| [20.0.0+] 0x3A ([6.0.0-19.0.0] 0x31) || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]]
|-
|-
| [20.0.0+] 0x3B || CanOpenGameCardAwakenReadyEventNotifier || 0x8000000080000110 || OpenGameCardAwakenReadyEventNotifier
| [20.0.0+] 0x3B || CanOpenGameCardAwakenReadyEventNotifier || 0x8000000080000110 || OpenGameCardAwakenReadyEventNotifier
|-
|-
| [6.0.0-19.0.0] 0x32 [20.0.0+] 0x3C || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier
| [20.0.0+] 0x3C ([6.0.0-19.0.0] 0x32) || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier
|-
|-
| [6.0.0-19.0.0] 0x33 [20.0.0+] 0x3D || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent
| [20.0.0+] 0x3D ([6.0.0-19.0.0] 0x33) || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent
|-
|-
| [6.0.0-19.0.0] 0x34 [20.0.0+] 0x3E || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]]
| [20.0.0+] 0x3E ([6.0.0-19.0.0] 0x34) || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]]
|-
|-
| [6.0.0-19.0.0] 0x35 [20.0.0+] 0x3F || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent
| [20.0.0+] 0x3F ([6.0.0-19.0.0] 0x35) || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent
|-
|-
| [6.0.0-19.0.0] 0x36 [20.0.0+] 0x40 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected
| [20.0.0+] 0x40 ([6.0.0-19.0.0] 0x36) || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected
|-
|-
| [6.0.0-19.0.0] 0x37 [20.0.0+] 0x41 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure
| [20.0.0+] 0x41 ([6.0.0-19.0.0] 0x37) || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure
|-
|-
| [6.0.0-19.0.0] 0x38 [20.0.0+] 0x42 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure
| [20.0.0+] 0x42 ([6.0.0-19.0.0] 0x38) || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure
|-
|-
| [8.0.0-19.0.0] 0x39 [20.0.0+] 0x43 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize
| [20.0.0+] 0x43 ([8.0.0-19.0.0] 0x39) || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize
|-
|-
| [9.0.0-19.0.0] 0x3A [20.0.0+] 0x44 || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]]
| [20.0.0+] 0x44 ([9.0.0-19.0.0] 0x3A) || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]]
|-
|-
| [20.0.0+] 0x45 ||   || 0x8000000000200000 ||
| [20.0.0+] 0x45 || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility
|-
|-
| [9.0.0-19.0.0] 0x3B [20.0.0+] 0x46 || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility
| [20.0.0+] 0x46 ([9.0.0-19.0.0] 0x3B) || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent
|-
|-
| [9.0.0-19.0.0] 0x3C [20.0.0+] 0x47 || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent
| [20.0.0+] 0x47 ([9.0.0-19.0.0] 0x3C) || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]
|-
|-
| [9.0.0-19.0.0] 0x3D [20.0.0+] 0x48 || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]
| [20.0.0+] 0x48 ([9.0.0-19.0.0] 0x3D) || CanRegisterProgramIndexMapInfo || RegisterProgramIndexMapInfo
|-
|-
| [9.0.0-19.0.0] 0x3E [20.0.0+] 0x49 || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo
| [20.0.0+] 0x49 ([9.0.0-19.0.0] 0x3E) || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence
|-
|-
| [9.0.0-19.0.0] 0x3F [20.0.0+] 0x4A || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence
| [20.0.0+] 0x4A ([9.0.0-19.0.0] 0x3F) || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt
|-
|-
| [9.0.0-19.0.0] 0x40 [20.0.0+] 0x4B || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt
| [20.0.0+] 0x4B ([9.0.0-19.0.0] 0x40) || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]]
|-
|-
| [9.0.0-19.0.0] 0x41 [20.0.0+] 0x4C || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]]
| [20.0.0+] 0x4C ([9.0.0-19.0.0] 0x41) || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]]
|-
|-
| [10.0.0-19.0.0] 0x42 [20.0.0+] 0x4D || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]]
| [20.0.0+] 0x4D ([10.0.0-19.0.0] 0x42) || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem
|-
|-
| [10.0.0-19.0.0] 0x43 [20.0.0+] 0x4E || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem
| [20.0.0+] 0x4E ([10.0.0-19.0.0] 0x43) || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]]
|-
|-
| [10.2.0-19.0.0] 0x44 [20.0.0+] 0x4F || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]]
| [20.0.0+] 0x4F ([10.2.0-19.0.0] 0x44) || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]]
|-
|-
| [11.0.0-19.0.0] 0x45 [20.0.0+] 0x50 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]]
| [20.0.0+] 0x50 ([11.0.0-19.0.0] 0x45) || CanOpenSaveDataTransferManagerForRepair || 0x8000000000000020 || [[#OpenSaveDataTransferManagerForRepair]]
|-
|-
| [13.0.0-19.0.0] 0x46 [20.0.0+] 0x51 || CanOpenSaveDataTransferManagerForRepair || 0x8000000000000020 || [[#OpenSaveDataTransferManagerForRepair]]
| [20.0.0+] 0x51 ([13.0.0-19.0.0] 0x46) || CanSetDebugConfiguration || 0x8000000000000000 || SetDebugOption, UnsetDebugOption
|-
|-
| [13.0.0-19.0.0] 0x47 [20.0.0+] 0x52 || CanSetDebugConfiguration || 0x8000000000000000 || SetDebugOption, UnsetDebugOption
| [20.0.0+] 0x52 ([13.0.0-19.0.0] 0x47) || CanOpenDataStorageByPath || 0x8000000000000000 || OpenDataStorageByPath
|-
|-
| [15.0.0-19.0.0] 0x48 [20.0.0+] 0x53 || CanOpenDataStorageByPath || 0x8000000000000000 || OpenDataStorageByPath
| [20.0.0+] 0x53 ([15.0.0-19.0.0] 0x48) || CanNotifyErrorContextServiceReady || 0x8000004000000000 || NotifyErrorContextServiceReady
|-
|-
| [17.0.0-19.0.0] 0x49 [20.0.0+] 0x54|| CanNotifyErrorContextServiceReady || 0x8000004000000000 || NotifyErrorContextServiceReady
| [20.0.0+] 0x54 ([17.0.0-19.0.0] 0x49) || CanGetProgramId || 0x8000000008000000 || GetProgramId
|-
|-
| [17.0.0-19.0.0] 0x4A || CanGetProgramId || 0x8000000008000000 || GetProgramId, Removed in 20.0.0
| [20.0.0+] 0x55 || CanGetContentStorageInfo || 0x8000000000000800 ||
|-
|-
| [20.0.0+] 0x55 || || 0x8000000000000800 ||
| [20.0.0+] 0x56 || CanDetachSdCard || 0x8000000004000000 ||
|-
|-
| [20.0.0+] 0x56 || || 0x8000000004000000 ||
| [20.0.0+] 0x57 || CanSetSdCardActivationMode || 0x8000000004000000 ||
|-
|-
| [20.0.0+] 0x57 || || 0x8000000004000000 ||
| [21.0.0+] 0x58 || CanEnableSdCardMalfunctionSimulation || 0x8000000000080000 ||
|-
| [21.0.0+] 0x59 || CanDisableSdCardMalfunctionSimulation || 0x8000000000080000 ||
|-
| [22.0.0+] 0x5A || CanShutdownStorage || 0x8000000000000000 ||
|}
|}


Line 647: Line 675:
Takes an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].
Takes an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].


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


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


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


== ReadSaveDataFileSystemExtraData ==
== ReadSaveDataFileSystemExtraData ==
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataExtraData]].


== OpenSaveDataInfoReader ==
== OpenSaveDataInfoReader ==
Line 749: Line 777:
== OpenSaveDataTransferManager ==
== OpenSaveDataTransferManager ==
No input, returns an [[#ISaveDataTransferManager]].
No input, returns an [[#ISaveDataTransferManager]].
[S2] Stubbed, just returns Result 0x177202.


== OpenSaveDataTransferManagerVersion2 ==
== OpenSaveDataTransferManagerVersion2 ==
Line 785: Line 815:


Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.
[[NCA|PublicData]] is exempt from the [[#Permissions|permissions]] check.


== OpenDataFileSystemWithProgramIndex ==
== OpenDataFileSystemWithProgramIndex ==
Line 821: Line 853:


[8.0.0+] Now takes an additional 8-bytes of input.
[8.0.0+] Now takes an additional 8-bytes of input.
== GetAndClearErrorInfo ==
[21.0.0+] Now takes a type-0x1A output buffer and no longer returns 0x80-bytes of output.


== SetSaveDataSize ==
== SetSaveDataSize ==
Line 858: Line 893:
== GetProgramIndexForAccessLog ==
== GetProgramIndexForAccessLog ==
No input, returns two 32-bit values "version" and "program_index".
No input, returns two 32-bit values "version" and "program_index".
== OpenMemoryStressor ==
No input. Returns an output [[#IMemoryStressor]].


== OpenMultiCommitManager ==
== OpenMultiCommitManager ==
Line 1,097: Line 1,135:
| 6 || [17.0.0+] [[#GetSdCardHostControllerStatus]]
| 6 || [17.0.0+] [[#GetSdCardHostControllerStatus]]
|-
|-
| 7 || [20.0.0+]
| 7 || [20.0.0+] [[#SetSdCardActivationMode]]
|-
|-
| 8 || [20.0.0+]
| 8 || [20.0.0+] [S1] [[#TryGetSdCardInfo]]
|-
|-
| 100 || [[#GetMmcCid]]
| 100 || [[#GetMmcCid]]
Line 1,121: Line 1,159:
| 117 || [17.0.0+] [[#EraseMmcWithRange]]
| 117 || [17.0.0+] [[#EraseMmcWithRange]]
|-
|-
| 118 || [20.0.0+]
| 118 || [20.0.0+] [[#MarkBeforeEraseMmcPartitionUserData]]
|-
|-
| 119 || [20.0.0+]
| 119 || [20.0.0+] [[#CheckAfterEraseMmcPartitionUserData]]
|-
|-
| 200 || [[#IsGameCardInserted]]
| 200 || [S1] [[#IsGameCardInserted]]
|-
|-
| 201 || [[#EraseGameCard]]
| 201 || [S1] [[#EraseGameCard]]
|-
|-
| 202 || [[#GetGameCardHandle]]
| 202 || [S1] [[#GetGameCardHandle]]
|-
|-
| 203 || [[#GetGameCardUpdatePartitionInfo]]
| 203 || [S1] [[#GetGameCardUpdatePartitionInfo]]
|-
|-
| 204 || [[#FinalizeGameCardDriver]]
| 204 || [S1] [[#FinalizeGameCardDriver]]
|-
|-
| 205 || [[#GetGameCardAttribute]]
| 205 || [S1] [[#GetGameCardAttribute]]
|-
|-
| 206 || [[#GetGameCardDeviceCertificate]]
| 206 || [S1] [[#GetGameCardDeviceCertificate]]
|-
|-
| 207 || [[#GetGameCardAsicInfo]]
| 207 || [S1] [[#GetGameCardAsicInfo]]
|-
|-
| 208 || [[#GetGameCardIdSet]]
| 208 || [S1] [[#GetGameCardIdSet]]
|-
|-
| 209 || [[#WriteToGameCardDirectly]]
| 209 || [S1] [[#WriteToGameCardDirectly]]
|-
|-
| 210 || [[#SetVerifyWriteEnalbleFlag]]
| 210 || [S1] [[#SetVerifyWriteEnalbleFlag]]
|-
|-
| 211 || [[#GetGameCardImageHash]]
| 211 || [S1] [[#GetGameCardImageHash]]
|-
|-
| 212 || [2.0.0+] [[#GetGameCardDeviceIdForProdCard]]
| 212 || [S1] [2.0.0+] [[#GetGameCardDeviceIdForProdCard]]
|-
|-
| 213 || [2.0.0+] [[#EraseAndWriteParamDirectly]]
| 213 || [S1] [2.0.0+] [[#EraseAndWriteParamDirectly]]
|-
|-
| 214 || [2.0.0+] [[#ReadParamDirectly]]
| 214 || [S1] [2.0.0+] [[#ReadParamDirectly]]
|-
|-
| 215 || [2.0.0+] [[#ForceEraseGameCard]]
| 215 || [S1] [2.0.0+] [[#ForceEraseGameCard]]
|-
|-
| 216 || [2.0.0+] [[#GetGameCardErrorInfo]]
| 216 || [S1] [2.0.0+] [[#GetGameCardErrorInfo]]
|-
|-
| 217 || [2.1.0+] [[#GetGameCardErrorReportInfo]]
| 217 || [S1] [2.1.0+] [[#GetGameCardErrorReportInfo]]
|-
|-
| 218 || [3.0.0+] [[#GetGameCardDeviceId]]
| 218 || [S1] [3.0.0+] [[#GetGameCardDeviceId]]
|-
|-
| 219 || [8.0.0+] [[#ChallengeCardExistence]]
| 219 || [S1] [8.0.0+] [[#ChallengeCardExistence]]
|-
|-
| 220 || [9.0.0+] [[#GetGameCardCompatibilityType]]
| 220 || [S1] [9.0.0+] [[#GetGameCardCompatibilityType]]
|-
|-
| 221 || [17.0.0+] [[#GetGameCardAsicCertificate]]
| 221 || [S1] [17.0.0+] [[#GetGameCardAsicCertificate]]
|-
|-
| 222 || [18.0.0+] [[#GetGameCardCardHeader]]
| 222 || [S1] [18.0.0+] [[#GetGameCardCardHeader]]
|-
|-
| 223 || [19.0.0+] [[#SetGameCardSessionCreationDelay]]
| 223 || [S1] [19.0.0+] [[#SetGameCardSessionCreationDelay]]
|-
|-
| 224 || [19.0.0+] [[#GetGameCardApplicationIdList]]
| 224 || [S1] [19.0.0+] [[#GetGameCardApplicationIdList]]
|-
|-
| 225 || [20.0.0+]
| 225 || [S1] [20.0.0+] [[#RegisterGameCardConfigurationData]]
|-
|-
| 226 || [20.0.0+]
| 226 || [S1] [20.0.0+] [[#GetGameCardDetailedErrorReportInfo]]
|-
|-
| 300 || [[#SetSpeedEmulationMode]]
| 300 || [[#SetSpeedEmulationMode]]
Line 1,185: Line 1,223:
| 302 || [18.0.0+] [[#SetApplicationStorageSpeed]]
| 302 || [18.0.0+] [[#SetApplicationStorageSpeed]]
|-
|-
| 303 || [20.0.0+]
| 303 || [20.0.0+] [[#SetGameCardClockRateForSpeedEmulation]]
|-
|-
| 304 || [20.0.0+]
| 304 || [20.0.0+] [[#ClearGameCardClockRateForSpeedEmulation]]
|-
|-
| 400 || [5.0.0+] [[#SuspendSdmmcControl]]
| 400 || [5.0.0+] [[#SuspendSdmmcControl]]
Line 1,198: Line 1,236:
|-
|-
| 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]]
| 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]]
|-
| 800 || [S2] [[#OpenStorageDeviceManager]]
|}
|}


Line 1,220: Line 1,260:
== GetSdCardHostControllerStatus ==
== GetSdCardHostControllerStatus ==
No input. Returns an output [[#HostControllerStatus]].
No input. Returns an output [[#HostControllerStatus]].
== SetSdCardActivationMode ==
Takes an input [[#SdCardActivationMode]]. No output.
== TryGetSdCardInfo ==
Takes a type-0x6 output buffer and an input s64. No output.


== GetMmcCid ==
== GetMmcCid ==
Line 1,250: Line 1,296:
== EraseMmcWithRange ==
== EraseMmcWithRange ==
Takes an input [[#MmcPartition]] and two input u64s. No output.
Takes an input [[#MmcPartition]] and two input u64s. No output.
== MarkBeforeEraseMmcPartitionUserData ==
No input/output.
== CheckAfterEraseMmcPartitionUserData ==
No input/output.


== IsGameCardInserted ==
== IsGameCardInserted ==
Line 1,329: Line 1,381:
== GetGameCardApplicationIdList ==
== GetGameCardApplicationIdList ==
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. Returns an output u16.
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. Returns an output u16.
== RegisterGameCardConfigurationData ==
Takes a type-0x5 input buffer and an input s64. No output.
== GetGameCardDetailedErrorReportInfo ==
Takes a type-0x6 output buffer and an input s64. No output.


== SetSpeedEmulationMode ==
== SetSpeedEmulationMode ==
Line 1,338: Line 1,396:
== SetApplicationStorageSpeed ==
== SetApplicationStorageSpeed ==
Takes an input s32. No output.
Takes an input s32. No output.
== SetGameCardClockRateForSpeedEmulation ==
Takes an input s32. No output.
== ClearGameCardClockRateForSpeedEmulation ==
No input/output.


== SuspendSdmmcControl ==
== SuspendSdmmcControl ==
Line 1,353: Line 1,417:
== ClearDeviceSimulationEvent ==
== ClearDeviceSimulationEvent ==
Takes a total of 4-bytes of input. No output.
Takes a total of 4-bytes of input. No output.
== OpenStorageDeviceManager ==
Takes a byte. Returns an [[#IStorageDeviceManager]].


= IEventNotifier =
= IEventNotifier =
Line 1,376: Line 1,443:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetChallenge]]
| 0 || [[#GetChallenge|GetChallenge]]
|-
|-
| 16 || [[#SetToken]]
| 16 || [[#SetToken|SetToken]]
|-
|-
| 32 || [[#OpenSaveDataExporter]]
| 32 || [[#OpenSaveDataExporter|OpenSaveDataExporter]]
|-
|-
| 64 || [[#OpenSaveDataImporter]]
| 64 || [[#OpenSaveDataImporter|OpenSaveDataImporter]]
|}
|}


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


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


== OpenSaveDataExporter ==
== OpenSaveDataExporter ==
Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]].
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataExporter]].


== OpenSaveDataImporter ==
== OpenSaveDataImporter ==
Line 1,406: Line 1,473:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetChallenge]]
| 0 || [[#GetChallenge|GetChallenge]]
|-
|-
| 16 || [[#SetKeyPackage]]
| 16 || [[#SetKeyPackage|SetKeyPackage]]
|-
|-
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey|OpenSaveDataExporterAndGetEncryptedKey]]
|-
|-
| 81 || [[#PrepareOpenSaveDataImporter]]
| 81 || [[#PrepareOpenSaveDataImporter|PrepareOpenSaveDataImporter]]
|-
|-
| 90 || [[#OpenSaveDataImporter]]
| 90 || [[#OpenSaveDataImporter_2|OpenSaveDataImporter]]
|-
|-
| 91 || [[#OpenSaveDataImporter2]]
| 91 || [[#OpenSaveDataImporter2|OpenSaveDataImporter2]]
|-
|-
| 100 || [[#OpenSaveDataExporterWithKey]]
| 100 || [[#OpenSaveDataExporterWithKey|OpenSaveDataExporterWithKey]]
|-
|-
| 110 || [[#OpenSaveDataImporterWithKey]]
| 110 || [[#OpenSaveDataImporterWithKey|OpenSaveDataImporterWithKey]]
|}
|}


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


== OpenSaveDataExporterAndGetEncryptedKey ==
== OpenSaveDataExporterAndGetEncryptedKey ==
Line 1,430: Line 1,497:


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


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


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


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


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


[17.0.0+] Now only takes 0x18-bytes of input and an additional type-0x5 input buffer.
[17.0.0+] Now only takes 0x18-bytes of input and an additional type-0x5 input buffer.
Line 1,455: Line 1,522:
! Cmd || Name
! Cmd || Name
|-
|-
| 8 || [[#Register]]
| 8 || [[#Register|Register]]
|-
|-
| 16 || [[#Process]]
| 16 || [[#Process|Process]]
|-
|-
| 18 || [[#Cancel]]
| 18 || [[#Cancel|Cancel]]
|}
|}


== Register ==
== Register ==
Takes an input u64, no output.
Takes an input u64. No output.


== Process ==
== Process ==
Takes an input u64, returns an output u64.
Takes an input u64. Returns an output u64.


== Cancel ==
== Cancel ==
Line 1,480: Line 1,547:
! Cmd || Name
! Cmd || Name
|-
|-
| 80 || [[#OpenSaveDataExporter]]
| 80 || [[#OpenSaveDataExporter_2|OpenSaveDataExporter]]
|-
|-
| 90 || [[#OpenSaveDataImporter]]
| 90 || [[#OpenSaveDataImporter_3|OpenSaveDataImporter]]
|}
|}


== OpenSaveDataExporter ==
== OpenSaveDataExporter ==
Takes a total of 0x10-bytes of input, returns an [[#ISaveDataDivisionExporter]].
Takes a total of 0x10-bytes of input. Returns an [[#ISaveDataDivisionExporter]].


== OpenSaveDataImporter ==
== OpenSaveDataImporter ==
Takes 1-byte of input, a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
Takes 1-byte of input, a type-0x5 input buffer. Returns an [[#ISaveDataDivisionImporter]].


= ISaveDataExporter =
= ISaveDataExporter =
Line 1,500: Line 1,567:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetSaveDataInfo]]
| 0 || [[#GetSaveDataInfo|GetSaveDataInfo]]
|-
|-
| 1 || [[#GetRestSize]]
| 1 || [[#GetRestSize|GetRestSize]]
|-
|-
| 16 || [[#Pull]]
| 16 || [[#Pull|Pull]]
|-
|-
| 17 || [[#PullInitialData]]
| 17 || [[#PullInitialData|PullInitialData]]
|}
|}


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


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


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


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


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


= ISaveDataImporter =
= ISaveDataImporter =
Line 1,532: Line 1,599:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetSaveDataInfo]]
| 0 || [[#GetSaveDataInfo_2|GetSaveDataInfo]]
|-
|-
| 1 || [[#GetRestSize]]
| 1 || [[#GetRestSize_2|GetRestSize]]
|-
|-
| 16 || [[#Push]]
| 16 || [[#Push|Push]]
|-
|-
| 17 || [[#Finalize]]
| 17 || [[#Finalize|Finalize]]
|}
|}


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


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


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


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


== Finalize ==
== Finalize ==
Line 1,564: Line 1,631:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#GetChallenge]]
| 0 || [[#GetChallenge_2|GetChallenge]]
|-
|-
| 8 || [18.0.0+] SetMode
| 8 || [18.0.0+] SetMode
Line 1,570: Line 1,637:
| 9 || [18.0.0+] SetAttribute
| 9 || [18.0.0+] SetAttribute
|-
|-
| 16 || [[#SetKeySeedPackage]]
| 16 || [[#SetKeySeedPackage_2|SetKeySeedPackage]]
|-
|-
| 17 || [20.0.0+]
| 17 || [20.0.0+] [[#SetLocalKeySeedPackage|SetLocalKeySeedPackage]]
|-
|-
| 32 || [[#OpenSaveDataExporter]]
| 32 || [[#OpenSaveDataExporter_3|OpenSaveDataExporter]]
|-
|-
| 33 || [[#OpenSaveDataExporterForDiffExport]]
| 33 || [[#OpenSaveDataExporterForDiffExport|OpenSaveDataExporterForDiffExport]]
|-
|-
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext|OpenSaveDataExporterByContext]]
|-
|-
| 63 || [17.0.0+] OpenSaveDataImporter
| 63 || [17.0.0+] [[#OpenSaveDataImporter_4|OpenSaveDataImporter]]
|-
|-
| 64 || [6.0.0-17.0.1] [[#OpenSaveDataImporterDeprecated]] ([5.0.0-5.1.0] OpenSaveDataImporter)
| 64 || [6.0.0-17.0.1] [[#OpenSaveDataImporterDeprecated|OpenSaveDataImporterDeprecated]] ([5.0.0-5.1.0] OpenSaveDataImporter)
|-
|-
| 65 || [5.0.0-17.0.1] [[#OpenSaveDataImporterForDiffImport]]
| 65 || [5.0.0-17.0.1] [[#OpenSaveDataImporterForDiffImport|OpenSaveDataImporterForDiffImport]]
|-
|-
| 66 || [6.0.0-17.0.1] [[#OpenSaveDataImporterForDuplicateDiffImport]]
| 66 || [6.0.0-17.0.1] [[#OpenSaveDataImporterForDuplicateDiffImport|OpenSaveDataImporterForDuplicateDiffImport]]
|-
|-
| 67 || [6.0.0-16.1.0] [[#OpenSaveDataImporter]]
| 67 || [6.0.0-16.1.0] [[#OpenSaveDataImporter_5|OpenSaveDataImporter]]
|-
|-
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]]
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext|OpenSaveDataImporterByContext]]
|-
|-
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
| 69 || [6.0.0+] [[#CancelSuspendingImport|CancelSuspendingImport]]
|-
|-
| 70 || [10.0.0+] CancelSuspendingImportByAttribute
| 70 || [10.0.0+] CancelSuspendingImportByAttribute
Line 1,600: Line 1,667:


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


== SetKeySeedPackage ==
== SetKeySeedPackage ==
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.
Takes a type-0x5 input buffer containing the '''KeySeedPackage'''. No output.
 
== SetLocalKeySeedPackage ==
Takes a type-0x5 input buffer containing a [[#LocalKeySeedPackage|LocalKeySeedPackage]]. No output.
 
This can only be used after [[#SetKeySeedPackage]], in certain conditions.


== OpenSaveDataExporter ==
== OpenSaveDataExporter ==
Line 1,612: Line 1,684:


== OpenSaveDataExporterByContext ==
== OpenSaveDataExporterByContext ==
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].
Takes a type-0x5 input buffer. Returns an [[#ISaveDataDivisionExporter]].
 
== OpenSaveDataImporter ==
Takes an input u8 [[#SaveDataSpaceId]], a type-0x19 input buffer containing a [[#SaveDataCreationInfo2]] and a type-0x5 input buffer containing an [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].


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


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


== OpenSaveDataImporterForDuplicateDiffImport ==
== OpenSaveDataImporterForDuplicateDiffImport ==
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
Takes an input u8 and an u64, and a type-0x5 input buffer. Returns an [[#ISaveDataDivisionImporter]].


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


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


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


= ISaveDataDivisionExporter =
= ISaveDataDivisionExporter =
Line 1,641: Line 1,716:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#SetDivisionCount]]
| 0 || [[#SetDivisionCount|SetDivisionCount]]
|-
|-
| 1 || [6.0.0+] [[#ReadSaveDataExtraData]]
| 1 || [6.0.0+] [[#ReadSaveDataExtraData|ReadSaveDataExtraData]]
|-
|-
| 16 || [[#OpenSaveDataDiffChunkIterator]]
| 16 || [[#OpenSaveDataDiffChunkIterator|OpenSaveDataDiffChunkIterator]]
|-
|-
| 48 || [[#OpenSaveDataChunkExporter]]
| 48 || [[#OpenSaveDataChunkExporter|OpenSaveDataChunkExporter]]
|-
|-
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport|FinalizeFullExport]]
|-
|-
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport|FinalizeDiffExport]]
|-
|-
| 66 || [6.0.0+] [[#CancelExport]]
| 66 || [6.0.0+] [[#CancelExport|CancelExport]]
|-
|-
| 67 || [6.0.0+] [[#SuspendExport]]
| 67 || [6.0.0+] [[#SuspendExport|SuspendExport]]
|-
|-
| 70 || [6.0.0-17.0.1] [[#GetKeySeed]]
| 70 || [6.0.0-17.0.1] [[#GetKeySeed|GetKeySeed]]
|-
|-
| 71 || [6.0.0+] [[#GetInitialDataMac]]
| 71 || [6.0.0+] [[#GetInitialDataMac|GetInitialDataMac]]
|-
|-
| 72 || [6.0.0+] [[#FinalizeExport]]
| 72 || [6.0.0+] [[#FinalizeExport|FinalizeExport]]
|-
|-
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration|GetInitialDataMacKeyGeneration]]
|-
|-
| 74 || [18.0.0+] [[#GetKeySeed]]
| 74 || [18.0.0+] [[#GetKeySeed|GetKeySeed]]
|-
|-
| 75 || [20.0.0+]
| 75 || [20.0.0+] GetLocalKeySeedPackage
|-
|-
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
| 80 || [6.0.0+] [[#GetImportInitialDataAad|GetImportInitialDataAad]]
|-
|-
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
| 81 || [6.0.0+] [[#SetExportInitialDataAad|SetExportInitialDataAad]]
|-
|-
| 96 || [6.0.0+] [[#GetReportInfo]]
| 96 || [6.0.0+] [[#GetReportInfo|GetReportInfo]]
|}
|}


== SetDivisionCount ==
== SetDivisionCount ==
Takes an input u32, no output.
Takes an input u32. No output.


== OpenSaveDataChunkExporter ==
== OpenSaveDataChunkExporter ==
Takes an input u32, returns an [[#ISaveDataChunkExporter]].
Takes an input u32. Returns an [[#ISaveDataChunkExporter]].


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


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


== CancelExport ==
== CancelExport ==
Line 1,692: Line 1,767:


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


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


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


== FinalizeExport ==
== FinalizeExport ==
Line 1,704: Line 1,779:


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


= ISaveDataDivisionImporter =
= ISaveDataDivisionImporter =
Line 1,715: Line 1,790:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [6.0.0+] [[#ReadSaveDataExtraData]]
| 0 || [6.0.0+] [[#ReadSaveDataExtraData_2|ReadSaveDataExtraData]]
|-
|-
| 16 || [[#OpenSaveDataDiffChunkIterator]]
| 16 || [[#OpenSaveDataDiffChunkIterator_2|OpenSaveDataDiffChunkIterator]]
|-
|-
| 32 || [[#InitializeImport]]
| 32 || [[#InitializeImport|InitializeImport]]
|-
|-
| 33 || [[#FinalizeImport]]
| 33 || [[#FinalizeImport|FinalizeImport]]
|-
|-
| 34 || [6.0.0+] [[#CancelImport]]
| 34 || [6.0.0+] [[#CancelImport|CancelImport]]
|-
|-
| 35 || [6.0.0+] [[#GetImportContext]]
| 35 || [6.0.0+] [[#GetImportContext|GetImportContext]]
|-
|-
| 36 || [6.0.0+] [[#SuspendImport]]
| 36 || [6.0.0+] [[#SuspendImport|SuspendImport]]
|-
|-
| 37 || [11.0.0+] FinalizeImportWithoutSwap
| 37 || [11.0.0+] FinalizeImportWithoutSwap
|-
|-
| 48 || [[#OpenSaveDataChunkImporter]]
| 48 || [[#OpenSaveDataChunkImporter|OpenSaveDataChunkImporter]]
|-
|-
| 64 || [6.0.0+] [[#GetImportInitialDataAad]]
| 64 || [6.0.0+] [[#GetImportInitialDataAad|GetImportInitialDataAad]]
|-
|-
| 80 || [6.0.0+] [[#GetReportInfo]]
| 80 || [6.0.0+] [[#GetReportInfo_2|GetReportInfo]]
|}
|}


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


== OpenSaveDataDiffChunkIterator ==
== OpenSaveDataDiffChunkIterator ==
No input, returns an [[#ISaveDataChunkIterator]].
No input. Returns an [[#ISaveDataChunkIterator]].


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


== FinalizeImport ==
== FinalizeImport ==
Line 1,754: Line 1,829:


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


== SuspendImport ==
== SuspendImport ==
Line 1,760: Line 1,835:


== OpenSaveDataChunkImporter ==
== OpenSaveDataChunkImporter ==
Takes an input u32, returns an [[#ISaveDataChunkImporter]].
Takes an input u32. Returns an [[#ISaveDataChunkImporter]].


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


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


= ISaveDataChunkIterator =
= ISaveDataChunkIterator =
Line 1,777: Line 1,852:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#Next]]
| 0 || [[#Next|Next]]
|-
|-
| 1 || [[#IsEnd]]  
| 1 || [[#IsEnd|IsEnd]]  
|-
|-
| 16 || [[#GetId]]  
| 16 || [[#GetId|GetId]]  
|}
|}


Line 1,788: Line 1,863:


== IsEnd ==
== IsEnd ==
No input, returns an output u8.
No input. Returns an output u8.


== GetId ==
== GetId ==
No input, returns an output u32.
No input. Returns an output u32.


= ISaveDataChunkExporter =
= ISaveDataChunkExporter =
Line 1,802: Line 1,877:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#Pull]]
| 0 || [[#Pull_2|Pull]]
|-
|-
| 16 || [6.0.0+] [[#GetRestRawDataSize]]
| 16 || [6.0.0+] [[#GetRestRawDataSize|GetRestRawDataSize]]
|}
|}


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


== GetRestRawDataSize ==
== GetRestRawDataSize ==
No input, returns an output u64.
No input. Returns an output u64.


= ISaveDataChunkImporter =
= ISaveDataChunkImporter =
Line 1,822: Line 1,897:
! Cmd || Name
! Cmd || Name
|-
|-
| 0 || [[#Push]]
| 0 || [[#Push_2|Push]]
|}
|}


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


= ISaveDataTransferProhibiter =
= ISaveDataTransferProhibiter =
Line 1,834: Line 1,909:


This doesn't seem to handle any commands (?).
This doesn't seem to handle any commands (?).
= IMemoryStressor =
This is "nn::fssrv::sf::IMemoryStressor".
This was added with [18.0.0+].
{| class="wikitable" border="1"
|-
! Cmd || Name
|-
| 1 || [[#SetPooledBufferFreeSize]]
|}
== SetPooledBufferFreeSize ==
Takes an input u32. No output.


= IMultiCommitManager =
= IMultiCommitManager =
Line 1,876: Line 1,966:


= IStorageDeviceManager =
= IStorageDeviceManager =
This is "nn::fssrv::storage::sf::IStorageDeviceManager".
[S2] This is "nn::fssrv::storage::sf::IStorageDeviceManager".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,882: Line 1,972:
! Cmd || Name
! Cmd || Name
|-
|-
| N/A || IsInserted
| 0 || IsInserted
|-
|-
| N/A || IsHandleValid
| 1 || IsHandleValid
|-
|-
| N/A || OpenDetectionEvent
| 2 || [[#OpenDetectionEvent]]
|-
|-
| N/A || OpenOperator
| 3 || Returns an [[#IEventNotifier]].
|-
|-
| N/A || OpenDevice
| 10 || [[#OpenOperator]]
|-
|-
| N/A || OpenStorage
| 20 || [[#OpenDevice]]
|-
|-
| N/A || Invalidate
| 21 || [[#OpenStorage]]
|-
| 34 || Invalidate
|}
|}
== OpenDetectionEvent ==
Returns an [[#IEventNotifier]].
== OpenOperator ==
Returns an [[#IStorageDeviceOperator]].
== OpenDevice ==
Returns an [[#IStorageDevice]].
== OpenStorage ==
Returns an [[#IStorage]].


= IStorageDeviceOperator =
= IStorageDeviceOperator =
This is "nn::fssrv::storage::sf::IStorageDeviceOperator".
[S2] This is "nn::fssrv::storage::sf::IStorageDeviceOperator".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,904: Line 2,007:
! Cmd || Name
! Cmd || Name
|-
|-
| N/A || Operate
| 0 || Operate
|-
|-
| N/A || OperateIn
| 1 || OperateIn
|-
|-
| N/A || OperateOut
| 10 || OperateOut
|-
|-
| N/A || OperateOut2
| 11 || OperateOut2
|-
|-
| N/A || OperateInOut
| 20 || OperateInOut
|-
|-
| N/A || OperateIn2Out
| 21 || OperateIn2Out
|}
|}


= IStorageDevice =
= IStorageDevice =
This is "nn::fssrv::storage::sf::IStorageDevice".
[S2] This is "nn::fssrv::storage::sf::IStorageDevice".


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 1,924: Line 2,027:
! Cmd || Name
! Cmd || Name
|-
|-
| N/A || GetHandle
| 0 || GetHandle
|-
|-
| N/A || IsHandleValid
| 1 || IsHandleValid
|-
|-
| N/A || OpenOperator
| 10 || OpenOperator
|-
|-
| N/A || Read
| 20 || Read
|-
|-
| N/A || Write
| 21 || Write
|-
|-
| N/A || Flush
| 22 || Flush
|-
|-
| N/A || SetSize
| 23 || SetSize
|-
|-
| N/A || GetSize
| 24 || GetSize
|-
|-
| N/A || OperateRange
| 25 || OperateRange
|}
|}


Line 1,968: Line 2,071:
| 8 || [4.0.0+] RegisteredUpdate
| 8 || [4.0.0+] RegisteredUpdate
|}
|}
sdknso converts the input [[#ContentType|ContentType]] to a FileSystemProxyType, for use with the cmd input.


= ContentType =
= ContentType =
Line 1,995: Line 2,100:
|-
|-
| 0 || None
| 0 || None
|-
| 1 || [S2]
|-
|-
| 15 || All
| 15 || All
Line 2,014: Line 2,121:
| 3 || [16.0.0+] System0
| 3 || [16.0.0+] System0
|}
|}
= UserId =
This is "nn::fs::UserId". This is a 0x10-byte struct.
= HashSalt =
This is "nn::fs::HashSalt". This is a 0x20-byte struct.
= SaveDataId =
This is "nn::fs::SaveDataId". This is an u64.
= StaticSaveDataId =
This is "nn::fs::StaticSaveDataId". This is an u64.
= SystemSaveDataId =
This is "nn::fs::SystemSaveDataId". This is an u64.
= SystemBcatSaveDataId =
This is "nn::fs::SystemBcatSaveDataId". This is an u64.
= SaveDataReferenceId =
This is "nn::fs::SaveDataReferenceId". This is an u64.


= SaveDataSpaceId =
= SaveDataSpaceId =
Line 2,035: Line 2,163:
|-
|-
| 101 || [3.0.0+] SafeMode
| 101 || [3.0.0+] SafeMode
|-
| 102 || [?+] ProperUser
|}
|}


Line 2,113: Line 2,243:
|}
|}


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


{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Value || Name
! Offset
! Size
! Description
|-
|-
| 0 || Nand
| 0x0
| 0x4
| Size
|-
|-
| 1 || SdCard
| 0x4
| 0x1
| [[#SaveDataMetaType|Type]]
|-
| 0x5
| 0xB
| Reserved
|}
 
= ImageDirectoryId =
This is "nn::fs::ImageDirectoryId".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 || Nand
|-
| 1 || SdCard
|}
|}


Line 2,258: Line 2,410:
| 33 || SystemProperPartition
| 33 || SystemProperPartition
|-
|-
| 34 || SignedSystemPartitionOnSafeMode
| 34 || [-?] SignedSystemPartitionOnSafeMode
|-
|-
| 35 || [16.0.0+] DeviceTreeBlob
| 35 || [16.0.0+] DeviceTreeBlob
|-
|-
| 36 || [16.0.0+] System0
| 36 || [16.0.0+] System0
|-
| 37 || System2
|-
| 38 || [?+] System3
|-
| 39 || [21.0.0+] UserProperPartition
|}
|}
System2 is not supported by FS, perhaps removed at some point?


= SdCardSpeedMode =
= SdCardSpeedMode =
Line 2,337: Line 2,497:
| 0xC
| 0xC
|  
|  
|}
= SdCardActivationMode =
This is "nn::fs::SdCardActivationMode".
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 ||
|}
|}


Line 3,014: Line 3,184:
| 0x0
| 0x0
| 0x8
| 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.
| [[#SaveDataReferenceId|ReferenceId]] (0 for SystemSaveData; 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
| 0x8
| 0x10
| 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]].
| [[#UserId|UserId]] (for user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon); this is loaded from [[Account_services]])
|-
|-
| 0x18
| 0x18
| 0x8
| 0x8
| [[Flash_Filesystem|SystemSaveDataId]] (0 for SaveData)
| [[#StaticSaveDataId|StaticSaveDataId]] (0 for SaveData)
|-
|-
| 0x20
| 0x20
| 0x1
| 0x1
| [[#SaveDataType]]
| [[#SaveDataType|Type]]
|-
|-
| 0x21
| 0x21
| 0x1
| 0x1
| [[#SaveDataRank]]
| [[#SaveDataRank|Rank]]
|-
|-
| 0x22
| 0x22
| 0x2
| 0x2
| SaveDataIndex
| Index
|-
|-
| 0x24
| 0x24
| 0x4
| 0x1C
| Padding
| Reserved
|-
|}
| 0x28
 
| 0x8
For DeviceSaveData, this struct is all-zero except for the [[#SaveDataType]] field (and optionally the ApplicationId if specified).
| 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 =
= SaveDataCreationInfo =
Line 3,068: Line 3,224:
| 0x0
| 0x0
| 0x8
| 0x8
| SaveDataSize
| Size
|-
|-
| 0x8
| 0x8
Line 3,076: Line 3,232:
| 0x10
| 0x10
| 0x8
| 0x8
| AvailableSize</br>0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData.
| BlockSize (0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData)
|-
|-
| 0x18
| 0x18
| 0x8
| 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.
| OwnerId (official user-processes only uses 0 here for SystemSaveData/SaveData; for the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes; for BcatSaveData, this is the hard-coded [[NCM_services#ProgramId|ProgramId]] of the bcat-sysmodule)
|-
|-
| 0x20
| 0x20
| 0x4
| 0x4
| [[#SaveDataFlags]]</br>Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.
| [[#SaveDataFlags|Flags]] (written using an input param for official user-processes; hard-coded 0 for BcatSaveData)
|-
|-
| 0x24
| 0x24
| 0x1
| 0x1
| [[#SaveDataSpaceId]]</br>Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.
| [[#SaveDataSpaceId|SpaceId]] (Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData)
|-
|-
| 0x25
| 0x25
| 0x1
| 0x1
| Unknown. 0 for SystemSaveData/SaveData.
| IsPseudoSaveFs (0 for SystemSaveData/SaveData)
|-
|-
| 0x26
| 0x26
| 0x1A
| 0x1A
| Not initialized for SystemSaveData/SaveData.
| Reserved
|}
|}


Total size is 0x40-bytes.
= SaveDataCreationInfo2 =
 
This is "nn::fs::SaveDataCreationInfo2".
= 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"
{| class="wikitable" border="1"
Line 3,121: Line 3,265:
|-
|-
| 0x0
| 0x0
| 0x4
| Version
|-
| 0x4
| 0x4
| Reserved
|-
| 0x8
| 0x8
| SaveDataId
| 0x40
| [[#SaveDataAttribute|Attribute]]
|-
|-
| 0x48
| 0x8
| 0x8
| 0x1
| Size
| [[#SaveDataSpaceId]]
|-
|-
| 0x9
| 0x50
| 0x1
| 0x8
| [[#SaveDataType]]
| JournalSize
|-
|-
| 0xA
| 0x58
| 0x6
| 0x8
| Padding?
| BlockSize
|-
|-
| 0x10
| 0x60
| 0x10
| 0x8
| UserId
| OwnerId
|-
|-
| 0x20
| 0x68
| 0x8
| 0x4
| SystemSaveDataId (0 for regular SaveData)
| Flags
|-
|-
| 0x28
| 0x6C
| 0x8
| 0x1
| [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData)
| [[#SaveDataSpaceId|SpaceId]]
|-
|-
| 0x30
| 0x6D
| 0x8
| 0x1
| Raw saveimage size
| [[#SaveDataFormatType|FormatType]]
|-
|-
| 0x38
| 0x6E
| 0x2
| 0x2
| SaveDataIndex
| Reserved
|-
| 0x70
| 0x1
| IsHashSaltSpecified
|-
| 0x71
| 0x3
| Reserved
|-
|-
| 0x3A
| 0x74
| 0x20
| [[#HashSalt|HashSalt]]
|-
| 0x94
| 0x1
| 0x1
| [[#SaveDataRank]]
| [[#SaveDataMetaType|MetaType]]
|-
|-
| 0x3B
| 0x95
| 0x25
| 0x3
| Unknown. Usually zeros?
| Reserved
|}
|-
| 0x98
| 0x4
| MetaSize
|-
| 0x9C
| 0x160
| Reserved
|}


This is a 0x60-byte struct.
= SaveDataInfo =
 
This is "nn::fs::SaveDataInfo".
= SaveDataFileSystemExtraData =
 
This is a 0x200-byte struct. Appears to match [[Savegames#Extra_data]].
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x8
| SaveDataId
|-
| 0x8
| 0x1
| [[#SaveDataSpaceId|SaveDataSpaceId]]
|-
| 0x9
| 0x1
| [[#SaveDataType|SaveDataType]]
|-
| 0xA
| 0x6
| Reserved
|-
| 0x10
| 0x10
| SaveDataUserId
|-
| 0x20
| 0x8
| SystemSaveDataId (0 for regular SaveData)
|-
| 0x28
| 0x8
| [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData)
|-
| 0x30
| 0x8
| SaveDataSize
|-
| 0x38
| 0x2
| Index
|-
| 0x3A
| 0x1
| [[#SaveDataRank|Rank]]
|-
| 0x3B
| 0x1
| State
|-
| 0x3C
| 0x24
| Reserved
|}
 
= SaveDataExtraData =
This is "nn::fs::SaveDataExtraData".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x40
| [[#SaveDataAttribute|Attribute]]
|-
| 0x40
| 0x8
| OwnerId
|-
| 0x48
| 0x8
| TimeStamp
|-
| 0x50
| 0x4
| Flags
|-
| 0x54
| 0x4
| Reserved
|-
| 0x58
| 0x8
| AvailableSize
|-
| 0x60
| 0x8
| JournalSize
|-
| 0x68
| 0x8
| CommitId
|-
| 0x70
| 0x190
| Reserved
|}
 
= SaveDataFilter =
This is "nn::fs::SaveDataFilter".
 
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 0x1
| FilterApplicationId
|-
| 0x1
| 0x1
| FilterSaveDataType
|-
| 0x2
| 0x1
| FilterSaveDataUserId
|-
| 0x3
| 0x1
| FilterStaticSaveDataId
|-
| 0x4
| 0x1
| FilterIndex
|-
| 0x5
| 0x1
| Option
|-
| 0x6
| 0x2
| Reserved
|-
| 0x8
| 0x40
| [[#SaveDataAttribute|Attribute]]
|}


= InitialDataVersion2 =
= InitialDataVersion2 =
This is a 0x8210-byte struct used by [[#ISaveDataTransferManagerWithDivision]].
This is a 0x2000-byte struct used by [[#ISaveDataTransferManagerWithDivision]].
 
= LocalKeySeedPackage =
This is "nn::fs::LocalKeySeedPackage".
 
This is a 0x200-byte ([S2] 0x280-byte) struct.
 
= FsAccessControlRestrictionMode =
This is "nn::fs::FsAccessControlRestrictionMode".
 
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 ||
|}
 
= Notes =
== 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.


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