Filesystem services: Difference between revisions
Update SaveCreate Struct |
whoops part 3 |
||
(18 intermediate revisions by 5 users not shown) | |||
Line 4: | Line 4: | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || | | 0 || [[#OpenCodeFileSystem]] | ||
|- | |- | ||
| 1 || | | 1 || [[#IsArchivedProgram]] | ||
|- | |- | ||
| 2 || [4.0.0+] SetCurrentProcess | | 2 || [4.0.0+] [[#SetCurrentProcess]] | ||
|} | |} | ||
== OpenCodeFileSystem == | |||
Takes an u64 TitleId and a [[#ContentPath]]. Returns an [[#IFileSystem]]. | |||
== IsArchivedProgram == | |||
Takes an u64 ProcessId. Returns a bool (1 if the process id's [[#ContentPath]] ends in ".nca"). | |||
== SetCurrentProcess == | |||
Takes a PID descriptor. | |||
= fsp-pr = | = fsp-pr = | ||
Line 18: | Line 27: | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || [[#RegisterProgram]] | | 0 || [[#RegisterProgram]] | ||
|- | |- | ||
| 1 || [[#UnregisterProgram]] | | 1 || [[#UnregisterProgram]] | ||
|- | |- | ||
| 2 || [4.0.0+] SetCurrentProcess | | 2 || [4.0.0+] [[#SetCurrentProcess]] | ||
|- | |- | ||
| 256 || [[#SetEnabledProgramVerification]] | | 256 || [[#SetEnabledProgramVerification]] | ||
|} | |} | ||
Line 59: | Line 68: | ||
| 8 || [2.0.0+] [[#OpenFileSystemWithId]] | | 8 || [2.0.0+] [[#OpenFileSystemWithId]] | ||
|- | |- | ||
| 9 || [3.0.0+] | | 9 || [3.0.0+] OpenDataFileSystemByProgramId | ||
|- | |- | ||
| 11 || [[#OpenBisFileSystem]] | | 11 || [[#OpenBisFileSystem]] | ||
Line 99: | Line 108: | ||
| 34 || [5.0.0+] GetCacheStorageSize | | 34 || [5.0.0+] GetCacheStorageSize | ||
|- | |- | ||
| 35 || [6.0.0+] | | 35 || [6.0.0+] [[#CreateSaveDataFileSystemWithHashSalt]] | ||
|- | |||
| 36 || [9.0.0+] OpenHostFileSystemWithOption | |||
|- | |- | ||
| 51 || [[#OpenSaveDataFileSystem]] | | 51 || [[#OpenSaveDataFileSystem]] | ||
Line 117: | Line 128: | ||
| 61 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]] | | 61 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]] | ||
|- | |- | ||
| 62 || [5.0.0+] | | 62 || [5.0.0+] OpenSaveDataInfoReaderOnlyCacheStorage | ||
|- | |- | ||
| 64 || [5.0.0+] OpenSaveDataInternalStorageFileSystem | | 64 || [5.0.0+] OpenSaveDataInternalStorageFileSystem | ||
Line 123: | Line 134: | ||
| 65 || [5.0.0+] UpdateSaveDataMacForDebug | | 65 || [5.0.0+] UpdateSaveDataMacForDebug | ||
|- | |- | ||
| 66 || [5.0.0+] | | 66 || [5.0.0+] WriteSaveDataFileSystemExtraDataWithMask | ||
|- | |- | ||
| 67 || [6.0.0+] FindSaveDataWithFilter | | 67 || [6.0.0+] [[#FindSaveDataWithFilter]] | ||
|- | |- | ||
| 68 || [6.0.0+] | | 68 || [6.0.0+] [[#OpenSaveDataInfoReaderWithFilter]] | ||
|- | |- | ||
| 69 || [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute | | 69 || [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute | ||
Line 135: | Line 146: | ||
| 80 || OpenSaveDataMetaFile | | 80 || OpenSaveDataMetaFile | ||
|- | |- | ||
| 81 || [4.0.0+] | | 81 || [4.0.0+] [[#OpenSaveDataTransferManager]] | ||
|- | |- | ||
| 82 || [5.0.0+] | | 82 || [5.0.0+] [[#OpenSaveDataTransferManagerVersion2]] | ||
|- | |- | ||
| 83 || [6.0.0+] | | 83 || [6.0.0+] [[#OpenSaveDataTransferProhibiter]] | ||
|- | |- | ||
| 84 || [6.0.0+] | | 84 || [6.0.0+] [[#ListAccessibleSaveDataOwnerId]] | ||
|- | |||
| 85 || [9.0.0+] [[#OpenSaveDataTransferManagerForSaveDataRepair]] | |||
|- | |- | ||
| 100 || OpenImageDirectoryFileSystem | | 100 || OpenImageDirectoryFileSystem | ||
Line 147: | Line 160: | ||
| 110 || [[#OpenContentStorageFileSystem]] | | 110 || [[#OpenContentStorageFileSystem]] | ||
|- | |- | ||
| 120 || [6.0.0+] | | 120 || [6.0.0+] [[#OpenCloudBackupWorkStorageFileSystem]] | ||
|- | |- | ||
| 130 || [7.0.0+] | | 130 || [7.0.0+] [[#OpenCustomStorageFileSystem]] | ||
|- | |- | ||
| 200 || OpenDataStorageByCurrentProcess | | 200 || OpenDataStorageByCurrentProcess | ||
Line 159: | Line 172: | ||
| 203 || OpenPatchDataStorageByCurrentProcess | | 203 || OpenPatchDataStorageByCurrentProcess | ||
|- | |- | ||
| 204 || [7.0.0+] | | 204 || [7.0.0+] [[#OpenDataFileSystemWithProgramIndex]] | ||
|- | |- | ||
| 205 || [7.0.0+] | | 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]] | ||
|- | |- | ||
| 400 || [[#OpenDeviceOperator]] | | 400 || [[#OpenDeviceOperator]] | ||
Line 173: | Line 186: | ||
| 511 || [5.0.0+] NotifySystemDataUpdateEvent | | 511 || [5.0.0+] NotifySystemDataUpdateEvent | ||
|- | |- | ||
| 520 || [6.0.0+] | | 520 || [6.0.0+] [[#SimulateDeviceDetectionEvent]] | ||
|- | |- | ||
| 600 || [1.0.0-3.0.2] SetCurrentPosixTime | | 600 || [1.0.0-3.0.2] SetCurrentPosixTime | ||
Line 219: | Line 232: | ||
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid | | 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid | ||
|- | |- | ||
| 700 || [5.0.0+] [[# | | 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]] | ||
|- | |- | ||
| 701 || [5.0.0+] GetAccessFailureDetectionEvent | | 701 || [5.0.0+] GetAccessFailureDetectionEvent | ||
Line 229: | Line 242: | ||
| 720 || [5.0.0+] AbandonAccessFailure | | 720 || [5.0.0+] AbandonAccessFailure | ||
|- | |- | ||
| 800 || [2.0.0+] | | 800 || [2.0.0+] GetAndClearErrorInfo | ||
|- | |- | ||
| 810 || [7.0.0+] RegisterProgramIndexMapInfo | | 810 || [7.0.0+] RegisterProgramIndexMapInfo | ||
Line 255: | Line 268: | ||
| 1010 || [5.1.0-6.2.0] SetDataStorageRedirectTarget | | 1010 || [5.1.0-6.2.0] SetDataStorageRedirectTarget | ||
|- | |- | ||
| 1011 || [7.0.0+] | | 1011 || [7.0.0+] [[#GetProgramIndexForAccessLog]] | ||
|- | |||
| 1012 || [9.0.0+] GetFsStackUsage | |||
|- | |||
| 1013 || [9.0.0+] UnsetSaveDataRootPath | |||
|- | |- | ||
| 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey | | 1100 || [4.0.0+] OverrideSaveDataTransferTokenSignVerificationKey | ||
|- | |- | ||
| 1110 || [6.0.0+] | | 1110 || [6.0.0+] CorruptSaveDataFileSystemByOffset | ||
|- | |- | ||
| 1200 || [6.0.0+] OpenMultiCommitManager | | 1200 || [6.0.0+] [[#OpenMultiCommitManager]] | ||
|} | |} | ||
Line 273: | Line 290: | ||
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. | ||
=== | The output values for [[#ReadWrite]] CanMountRegisteredUpdatePartition and [[#Call]] CanRegisterUpdatePartition are masked with the cached value of [[SMC#IsDebugMode|DebugMode]]. | ||
=== ReadWrite === | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! AccessibilityType || Mask || Name || Value || Used by | ||
|- | |- | ||
| 0x0 || 0x8000000000000801 || CanMountLogo || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]] | | 0x0 || 0x8000000000000801 || CanMountLogo || 1 || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]] | ||
Line 298: | Line 317: | ||
| 0x9 || 0x8000000200000000<br/>([1.0.0-5.1.0] 0x8000000000000084) || CanMountCloudBackupWorkStorage || 3 || OpenCloudBackupWorkStorageFileSystem | | 0x9 || 0x8000000200000000<br/>([1.0.0-5.1.0] 0x8000000000000084) || CanMountCloudBackupWorkStorage || 3 || OpenCloudBackupWorkStorageFileSystem | ||
|- | |- | ||
| 0xA || 0x8000000000000000<br/>([7.0.0-7.0.1] 0x4000000000000000)<br/>([6.0.0-6.2.0] 0x8000000000000084)<br/>([1.0.0-5.1.0] 0x8000000000000080) || | | 0xA || 0x8000000000000000<br/>([7.0.0-7.0.1] 0x4000000000000000)<br/>([6.0.0-6.2.0] 0x8000000000000084)<br/>([1.0.0-5.1.0] 0x8000000000000080) || CanMountCustomStorage0 || 3 || OpenCustomStorageFileSystem | ||
|- | |- | ||
| 0xB || 0x8000000000000084<br/>([6.0.0-6.2.0] 0x8000000000000080)<br/>([1.0.0-5.1.0] 0x8000000000008080) || CanMountBisCalibrationFile || 3 || [[#OpenBisFileSystem]] | | 0xB || 0x8000000000000084<br/>([6.0.0-6.2.0] 0x8000000000000080)<br/>([1.0.0-5.1.0] 0x8000000000008080) || CanMountBisCalibrationFile || 3 || [[#OpenBisFileSystem]] | ||
Line 356: | Line 375: | ||
| 0x26 || 0x8000000000000080<br/>([6.0.0-6.2.0] 0xC000000000200000)<br/>([3.0.0-5.1.0] 0x8000000000000100)<br/>([1.0.0-2.3.0] 0xC000000000400000) || CanOpenBisPartitionSystemProperPartition || 3 || [[#OpenBisStorage]] | | 0x26 || 0x8000000000000080<br/>([6.0.0-6.2.0] 0xC000000000200000)<br/>([3.0.0-5.1.0] 0x8000000000000100)<br/>([1.0.0-2.3.0] 0xC000000000400000) || CanOpenBisPartitionSystemProperPartition || 3 || [[#OpenBisStorage]] | ||
|- | |- | ||
| [3.0.0+] 0x27 || 0xC000000000200000<br/>([6.0.0-6.2.0] 0x8000000000000100)<br/>([ | | [3.0.0+] 0x27 || 0xC000000000200000<br/>([6.0.0-6.2.0] 0x8000000000000100)<br/>([3.0.0-5.1.0] 0x8000000000100008) || CanOpenSdCardStorage || || | ||
|- | |- | ||
| [3.0.0+] 0x28 || 0x8000000000000100<br/>([6.0.0-6.2.0] 0x8000000000100008)<br/>([ | | [3.0.0+] 0x28 || 0x8000000000000100<br/>([6.0.0-6.2.0] 0x8000000000100008)<br/>([3.0.0-5.1.0] 0xC000000000400000) || CanOpenGameCardStorage || 3 || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1) | ||
|- | |- | ||
| [4.0.0+] 0x29 || 0x8000000000100008<br/>([6.0.0-6.2.0] 0xC000000000400000)<br/>([ | | [4.0.0+] 0x29 || 0x8000000000100008<br/>([6.0.0-6.2.0] 0xC000000000400000)<br/>([4.0.0-5.1.0] 0x8000000000010000) || CanMountSystemDataPrivate || 1 || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]] | ||
|- | |- | ||
| [5.0.0+] 0x2A || 0xC000000000400000<br/>([6.0.0-6.2.0] 0x8000000000010000)<br/>([ | | [5.0.0+] 0x2A || 0xC000000000400000<br/>([6.0.0-6.2.0] 0x8000000000010000)<br/>([5.0.0-5.1.0] 0x8000000000000000) || CanMountHost || 3 || [[#OpenHostFileSystem]] | ||
|- | |- | ||
| [6.0.0+] 0x2B || 0x8000000000010000<br/>([ | | [6.0.0+] 0x2B || 0x8000000000010000<br/>([6.0.0-6.2.0] 0x8000000000000000) || CanMountRegisteredUpdatePartition || 1 || [[#OpenRegisteredUpdatePartition]] | ||
|- | |- | ||
| [7.0.0+] 0x2C || 0x8000000000000000 || CanOpenSaveDataInternalStorage || 3 || [[#OpenSaveDataInternalStorageFileSystem]] | | [7.0.0+] 0x2C || 0x8000000000000000 || CanOpenSaveDataInternalStorage || 3 || [[#OpenSaveDataInternalStorageFileSystem]] | ||
Line 371: | Line 390: | ||
|} | |} | ||
=== | === Call === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! OperationType || Mask || Name || Used by | ||
|- | |- | ||
| 0x0 || 0x8000000000000080 || CanInvalidateBisCache || [[#InvalidateBisCache]] | | 0x0 || 0x8000000000000080 || CanInvalidateBisCache || [[#InvalidateBisCache]] | ||
|- | |- | ||
| 0x1 || 0x8000000000000080 || CanEraseMmc || | | 0x1 || 0x8000000000000080 || CanEraseMmc || EraseMmc | ||
|- | |- | ||
| 0x2 || 0x8000000000000010 || CanGetGameCardDeviceCertificate || | | 0x2 || 0x8000000000000010 || CanGetGameCardDeviceCertificate || GetGameCardDeviceCertificate | ||
|- | |- | ||
| 0x3 || 0x8000000000000010 || CanGetGameCardIdSet || | | 0x3 || 0x8000000000000010 || CanGetGameCardIdSet || GetGameCardIdSet | ||
|- | |- | ||
| 0x4 || 0x8000000000000200 || CanFinalizeGameCardDriver || | | 0x4 || 0x8000000000000200 || CanFinalizeGameCardDriver || FinalizeGameCardDriver | ||
|- | |- | ||
| 0x5 || 0x8000000000000200 || CanGetGameCardAsicInfo || | | 0x5 || 0x8000000000000200 || CanGetGameCardAsicInfo || GetGameCardAsicInfo | ||
|- | |- | ||
| 0x6 || 0x8000000000002020 || CanCreateSaveData || [[#CreateSaveDataFileSystem]] | | 0x6 || 0x8000000000002020 || CanCreateSaveData || [[#CreateSaveDataFileSystem]] | ||
|- | |- | ||
| 0x7 || 0x8000000000000060 || CanDeleteSaveData || [[#DeleteSaveDataFileSystem]], | | 0x7 || 0x8000000000000060 || CanDeleteSaveData || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion | ||
|- | |- | ||
| 0x8 || 0x8000000000000028 || CanCreateSystemSaveData || | | 0x8 || 0x8000000000000028 || CanCreateSystemSaveData || CreateSaveDataFileSystemBySystemSaveDataId | ||
|- | |- | ||
| 0x9 || 0x8000000000000020 || CanCreateOthersSystemSaveData || | | 0x9 || 0x8000000000000020 || CanCreateOthersSystemSaveData || CreateSaveDataFileSystemBySystemSaveDataId | ||
|- | |- | ||
| 0xA || 0x8000000000004028 || CanDeleteSystemSaveData || [[#DeleteSaveDataFileSystem]], | | 0xA || 0x8000000000004028 || CanDeleteSystemSaveData || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion | ||
|- | |- | ||
| 0xB || 0x8000000000000060 || CanOpenSaveDataInfoReader || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | | 0xB || 0x8000000000000060 || CanOpenSaveDataInfoReader || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | ||
Line 402: | Line 421: | ||
| 0xC || 0x8000000000004020 || CanOpenSaveDataInfoReaderForSystem || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | | 0xC || 0x8000000000004020 || CanOpenSaveDataInfoReaderForSystem || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | ||
|- | |- | ||
| 0xD || 0x8000000000000040<br/>([1.0.0-5.1.0] 0x8000000000020000) || | | 0xD || 0x8000000000000040<br/>([1.0.0-5.1.0] 0x8000000000020000) || CanOpenSaveDataInfoReaderForInternal || [[#OpenSaveDataInfoReaderWithFilter]] | ||
|- | |- | ||
| 0xE || 0x8000000000020000<br/>([1.0.0-5.1.0] 0x8000000000000400) || CanOpenSaveDataMetaFile || | | 0xE || 0x8000000000020000<br/>([1.0.0-5.1.0] 0x8000000000000400) || CanOpenSaveDataMetaFile || OpenSaveDataMetaFile | ||
|- | |- | ||
| 0xF || 0x8000000000000400<br/>([1.0.0-5.1.0] 0x8000000000004060) || CanSetCurrentPosixTime || | | 0xF || 0x8000000000000400<br/>([1.0.0-5.1.0] 0x8000000000004060) || CanSetCurrentPosixTime || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference | ||
|- | |- | ||
| 0x10 || 0x8000000000004060<br/>([1.0.0-5.1.0] 0x8000000000080000) || CanReadSaveDataFileSystemExtraData || [[#ReadSaveDataFileSystemExtraData]] | | 0x10 || 0x8000000000004060<br/>([1.0.0-5.1.0] 0x8000000000080000) || CanReadSaveDataFileSystemExtraData || [[#ReadSaveDataFileSystemExtraData]] | ||
|- | |- | ||
| 0x11 || 0x8000000000080000 || CanSetGlobalAccessLogMode || [[# | | 0x11 || 0x8000000000080000 || CanSetGlobalAccessLogMode || [[#SetGlobalAccessLogMode]] | ||
|- | |- | ||
| 0x12 || 0x8000000000080000<br/>([1.0.0-5.1.0] Invalid) || CanSetSpeedEmulationMode || | | 0x12 || 0x8000000000080000<br/>([1.0.0-5.1.0] Invalid) || CanSetSpeedEmulationMode || SetSpeedEmulationMode | ||
|- | |- | ||
| 0x13 || Invalid<br/>([1.0.0-5.1.0] 0xC000000000800000) || || | | 0x13 || Invalid<br/>([1.0.0-5.1.0] 0xC000000000800000) || || | ||
|- | |- | ||
| 0x14 || 0xC000000000800000<br/>([1.0.0-5.1.0] 0xC000000001000000) || CanFillBis || | | 0x14 || 0xC000000000800000<br/>([1.0.0-5.1.0] 0xC000000001000000) || CanFillBis || CreatePaddingFile, DeleteAllPaddingFiles | ||
|- | |- | ||
| 0x15 || 0xC000000001000000<br/>([5.0.0-5.1.0] 0x8000000001000060)<br/>([1.0.0-4.1.0] 0xC000000002000000) || CanCorruptSaveData || | | 0x15 || 0xC000000001000000<br/>([5.0.0-5.1.0] 0x8000000001000060)<br/>([1.0.0-4.1.0] 0xC000000002000000) || CanCorruptSaveData || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId | ||
|- | |- | ||
| [2.0.0+] 0x16 || 0x8000000001000060<br/>([5.0.0-5.1.0] 0x8000000000000060)<br/>([ | | [2.0.0+] 0x16 || 0x8000000001000060<br/>([5.0.0-5.1.0] 0x8000000000000060)<br/>([2.0.0-4.1.0] 0x8000000004000000) || CanCorruptSystemSaveData || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId | ||
|- | |- | ||
| [2.0.0+] 0x17 || 0x8000000000000060<br/>([5.0.0-5.1.0] 0xC000000002000000)<br/>([ | | [2.0.0+] 0x17 || 0x8000000000000060<br/>([5.0.0-5.1.0] 0xC000000002000000)<br/>([2.0.0-4.1.0] 0x8000000008000000) || CanVerifySaveData || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId | ||
|- | |- | ||
| [2.0.0+] 0x18 || 0xC000000002000000<br/>([5.0.0-5.1.0] 0x8000000004000000)<br/>([ | | [2.0.0+] 0x18 || 0xC000000002000000<br/>([5.0.0-5.1.0] 0x8000000004000000)<br/>([2.0.0-4.1.0] 0x8000000010000000) || CanDebugSaveData || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]] | ||
|- | |- | ||
| [2.0.0+] 0x19 || 0x8000000004000000<br/>([5.0.0-5.1.0] 0x8000000008000000)<br/>([ | | [2.0.0+] 0x19 || 0x8000000004000000<br/>([5.0.0-5.1.0] 0x8000000008000000)<br/>([2.0.0-4.1.0] 0x8000000000000800) || CanFormatSdCard || FormatSdCardFileSystem | ||
|- | |- | ||
| [2.0.0+] 0x1A || 0x8000000008000000<br/>([5.0.0-5.1.0] 0x8000000010000000)<br/>([ | | [2.0.0+] 0x1A || 0x8000000008000000<br/>([5.0.0-5.1.0] 0x8000000010000000)<br/>([2.0.0-4.1.0] 0x8000000000004020) || CanGetRightsId || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath | ||
|- | |- | ||
| [3.0.0+] 0x1B || 0x8000000010000000<br/>([5.0.0-5.1.0] 0x8000000000000800)<br/>([ | | [3.0.0+] 0x1B || 0x8000000010000000<br/>([5.0.0-5.1.0] 0x8000000000000800)<br/>([3.0.0-4.1.0] 0x8000000000002020) || CanRegisterExternalKey || RegisterExternalKey, UnregisterAllExternalKey | ||
|- | |- | ||
| [3.0.0+] 0x1C || 0x8000000000000800<br/>([5.0.0-5.1.0] 0x8000000000004020)<br/>([ | | [3.0.0+] 0x1C || 0x8000000000000800<br/>([5.0.0-5.1.0] 0x8000000000004020)<br/>([3.0.0-4.1.0] 0x8000000000000028) || CanSetEncryptionSeed || [[#SetSdCardEncryptionSeed]] | ||
|- | |- | ||
| [4.0.0+] 0x1D || 0x8000000000000020<br/>([5.0.0-5.1.0] 0x8000000000000000)<br/>([ | | [4.0.0+] 0x1D || 0x8000000000000020<br/>([5.0.0-5.1.0] 0x8000000000000000)<br/>([4.0.0-4.1.0] 0x8000000020000000) || CanWriteSaveDataFileSystemExtraDataTimeStamp || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
|- | |- | ||
| [4.0.0+] 0x1E || 0x8000000000004020<br/>([5.0.0-5.1.0] 0x8000000000002020)<br/>([ | | [4.0.0+] 0x1E || 0x8000000000004020<br/>([5.0.0-5.1.0] 0x8000000000002020)<br/>([4.0.0-4.1.0] 0x8000000040000000) || CanWriteSaveDataFileSystemExtraDataFlags || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
|- | |- | ||
| [4.0.0+] 0x1F || 0x8000000000000020<br/>([5.0.0-5.1.0] 0x8000000000000028)<br/>([ | | [4.0.0+] 0x1F || 0x8000000000000020<br/>([5.0.0-5.1.0] 0x8000000000000028)<br/>([4.0.0-4.1.0] 0x8000000000000000) || CanWriteSaveDataFileSystemExtraDataCommitId || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
|- | |- | ||
| [4.0.0+] 0x20 || 0x8000000000000000<br/>([5.0.0-5.1.0] 0x8000000020000000)<br/>([ | | [4.0.0+] 0x20 || 0x8000000000000000<br/>([5.0.0-5.1.0] 0x8000000020000000)<br/>([4.0.0-4.1.0] 0x8000000000000000) || CanWriteSaveDataFileSystemExtraDataAll || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
|- | |- | ||
| [5.0.0+] 0x21 || 0x8000000000002020<br/>([1.0.0-5.1.0] 0x8000000040000000) || CanExtendSaveData || | | [5.0.0+] 0x21 || 0x8000000000002020<br/>([1.0.0-5.1.0] 0x8000000040000000) || CanExtendSaveData || ExtendSaveDataFileSystem | ||
|- | |- | ||
| [5.0.0+] 0x22 || 0x8000000000000028<br/>([1.0.0-5.1.0] 0x0000000080000002) || CanExtendSystemSaveData || | | [5.0.0+] 0x22 || 0x8000000000000028<br/>([1.0.0-5.1.0] 0x0000000080000002) || CanExtendSystemSaveData || ExtendSaveDataFileSystem | ||
|- | |- | ||
| [5.0.0+] 0x23 || 0x8000000020000000<br/>([1.0.0-5.1.0] 0x8000000000000000) || CanRegisterUpdatePartition || | | [5.0.0+] 0x23 || 0x8000000020000000<br/>([1.0.0-5.1.0] 0x8000000000000000) || CanRegisterUpdatePartition || RegisterUpdatePartition | ||
|- | |- | ||
| [5.0.0+] 0x24 || 0x8000000040000000<br/>([1.0.0-5.1.0] 0x8000000000000000) || CanOpenSaveDataTransferManager || [[#OpenSaveDataTransferManager]] | | [5.0.0+] 0x24 || 0x8000000040000000<br/>([1.0.0-5.1.0] 0x8000000000000000) || CanOpenSaveDataTransferManager || [[#OpenSaveDataTransferManager]] | ||
Line 452: | Line 471: | ||
| [5.0.0+] 0x25 || 0x8000000200000000<br/>([1.0.0-5.1.0] 0x8000000080200000) || CanOpenSaveDataTransferManagerVersion2 || [[#OpenSaveDataTransferManagerVersion2]] | | [5.0.0+] 0x25 || 0x8000000200000000<br/>([1.0.0-5.1.0] 0x8000000080200000) || CanOpenSaveDataTransferManagerVersion2 || [[#OpenSaveDataTransferManagerVersion2]] | ||
|- | |- | ||
| [5.0.0+] 0x26 || 0x8000000200002000<br/>([ | | [5.0.0+] 0x26 || 0x8000000200000000<br/>([6.0.0-8.1.0] 0x8000000200002000)<br/>([5.0.0-5.1.0] 0x8000000080000110) || CanOpenSaveDataTransferManagerForSaveDataRepair || OpenSaveDataTransferManagerForSaveDataRepair | ||
|- | |- | ||
| [5.0.0+] 0x27 || 0x8000000240002000 <br/>([6.0.0-7.0.1] 0x8000000200002000)<br/>([ | | [5.0.0+] 0x27 || 0x8000000000000000<br/>([8.0.0-8.1.0] 0x8000000240002000)<br/>([6.0.0-7.0.1] 0x8000000200002000)<br/>([5.0.0-5.1.0] 0x8000000000100008) || CanOpenSaveDataTransferManagerForSaveDataRepairTool || OpenSaveDataTransferManagerForSaveDataRepair | ||
|- | |- | ||
| [5.0.0+] 0x28 || 0x8000000000000000<br/>([ | | [5.0.0+] 0x28 || 0x8000000200002000<br/>([6.0.0-8.1.0] 0x8000000000000000)<br/>([5.0.0-5.1.0] 0x8000000080010000) || CanOpenOpenSaveDataTransferProhibiter || [[#OpenSaveDataTransferProhibiter]] | ||
|- | |- | ||
| [5.0.0+] 0x29 || 0x8000000000000000<br/>([ | | [5.0.0+] 0x29 || 0x8000000240002000<br/>([6.0.0-8.1.0] 0x8000000000000000)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanListAccessibleSaveDataOwnerId || [[#ListAccessibleSaveDataOwnerId]] | ||
|- | |- | ||
| [5.0.0+] 0x2A || 0x8000000080200000<br/>([ | | [5.0.0+] 0x2A || 0x8000000000000000<br/>([6.0.0-8.1.0] 0x8000000080200000)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanControlMmcPatrol || SuspendMmcPatrol, ResumeMmcPatrol | ||
|- | |- | ||
| [5.0.0+] 0x2B || 0x8000000080000110<br/>([ | | [5.0.0+] 0x2B || 0x8000000000000000<br/>([6.0.0-8.1.0] 0x8000000080000110)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanOverrideSaveDataTransferTokenSignVerificationKey || OverrideSaveDataTransferTokenSignVerificationKey | ||
|- | |- | ||
| [5.0.0+] 0x2C || 0x8000000000100008<br/>([ | | [5.0.0+] 0x2C || 0x8000000080200000<br/>([6.0.0-8.1.0] 0x8000000000100008)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanOpenSdCardDetectionEventNotifier || [[#OpenSdCardDetectionEventNotifier]] | ||
|- | |- | ||
| [5.0.0+] 0x2D || 0x8000000000010000<br/>([ | | [5.0.0+] 0x2D || 0x8000000080000110<br/>([6.0.0-8.1.0] 0x8000000000010000)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanOpenGameCardDetectionEventNotifier || [[#OpenGameCardDetectionEventNotifier]] | ||
|- | |- | ||
| [5.0.0+] 0x2E || 0x8000000100000000<br/>([ | | [5.0.0+] 0x2E || 0x8000000000100008<br/>([6.0.0-8.1.0] 0x8000000100000000)<br/>([5.0.0-5.1.0] 0x8000000040000000) || CanOpenSystemDataUpdateEventNotifier || OpenSystemDataUpdateEventNotifier | ||
|- | |- | ||
| [5.0.0+] 0x2F || 0x8000000100000000<br/>([ | | [5.0.0+] 0x2F || 0x8000000000010000<br/>([6.0.0-8.1.0] 0x8000000100000000)<br/>([5.0.0-5.1.0] 0x8000000080200000) || CanNotifySystemDataUpdateEvent || NotifySystemDataUpdateEvent | ||
|- | |- | ||
| [5.1.0+] 0x30 || 0x8000000100000000<br/>([1.0.0 | | [5.1.0+] 0x30 || 0x8000000100000000<br/>([5.1.0-6.0.0] 0x8000000080080000) || CanOpenAccessFailureDetectionEventNotifier || [[#OpenAccessFailureDetectionEventNotifier]] | ||
|- | |- | ||
| [6.0.0+] 0x31 || 0x8000000100000000 || | | [6.0.0+] 0x31 || 0x8000000100000000 || CanGetAccessFailureDetectionEvent || GetAccessFailureDetectionEvent | ||
|- | |- | ||
| [6.0.0+] 0x32 || 0x8000000100000000 || | | [6.0.0+] 0x32 || 0x8000000100000000 || CanIsAccessFailureDetected || IsAccessFailureDetected | ||
|- | |- | ||
| [6.0.0+] 0x33 || 0x8000000040000000 || | | [6.0.0+] 0x33 || 0x8000000100000000<br/>([6.0.0-8.1.0] 0x8000000040000000) || CanResolveAccessFailure || ResolveAccessFailure | ||
|- | |- | ||
| [6.0.0+] 0x34 || 0x8000000200000020 || | | [6.0.0+] 0x34 || 0x8000000100000000<br/>([6.0.0-8.1.0] 0x8000000200000020) || CanAbandonAccessFailure || AbandonAccessFailure | ||
|- | |- | ||
| [6.0.0+] 0x35 || 0x8000000000200000 || | | [6.0.0+] 0x35 || 0x8000000040000000<br/>([6.0.0-8.1.0] 0x8000000000200000) || CanQuerySaveDataInternalStorageTotalSize || QuerySaveDataInternalStorageTotalSize | ||
|- | |- | ||
| [6.0.0+] 0x36 || 0x4000000000000000 || | | [6.0.0+] 0x36 || 0x8000000200000020<br/>([6.0.0-8.1.0] 0x4000000000000000) || CanGetSaveDataCommitId || [[#GetSaveDataCommitId]] | ||
|- | |- | ||
| [6.0.0+] 0x37 || 0x8000000000000000<br/>([6.0.0-6.2.0] 0x8000000000080000) || | | [6.0.0+] 0x37 || 0x8000000000200000<br/>([7.0.0-8.1.0] 0x8000000000000000)<br/>([6.0.0-6.2.0] 0x8000000000080000) || CanSetSdCardAccessibility || SetSdCardAccessibility | ||
|- | |- | ||
| [6.0.0+] 0x38 || 0x8000000400000000<br/>([6.0.0-6.2.0] 0x8000000000000000) || || | | [6.0.0+] 0x38 || 0x4000000000000000<br/>([7.0.0-8.1.0] 0x8000000400000000)<br/>([6.0.0-6.2.0] 0x8000000000000000) || CanSimulateDevice || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent | ||
|- | |- | ||
| [8.0.0+] 0x39 || 0x8000000000000010 || CanChallengeCardExistence || ChallengeCardExistence | | [8.0.0+] 0x39 || 0x8000000000000000<br/>([8.0.0-8.1.0] 0x8000000000000010) || CanCreateSaveDataWithHashSalt || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]] | ||
|- | |||
| [9.0.0+] 0x3A || 0x8000000400000000 || CanRegisterProgramIndexMapInfo || RegisterProgramIndexMapInfo | |||
|- | |||
| [9.0.0+] 0x3B || 0x8000000000000010 || CanChallengeCardExistence || ChallengeCardExistence | |||
|- | |||
| [9.0.0+] 0x3C || 0x8000000800000000 || CanCreateOwnSaveData || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt | |||
|- | |||
| [9.0.0+] 0x3D || 0x8000000800000000 || CanReadOwnSaveDataFileSystemExtraData || [[#ReadSaveDataFileSystemExtraData]] | |||
|- | |||
| [9.0.0+] 0x3E || 0x8000000800000000 || CanExtendOwnSaveData || ExtendSaveDataFileSystem | |||
|- | |||
| [9.0.0+] 0x3F || 0x8000000800000000 || CanOpenOwnSaveDataTransferProhibiter || [[#OpenSaveDataTransferProhibiter]] | |||
|- | |||
| [9.0.0+] 0x40 || 0x8000000800000000 || CanFindOwnSaveDataWithFilter || [[#FindSaveDataWithFilter]] | |||
|} | |} | ||
Line 538: | Line 571: | ||
== CreateSaveDataFileSystem == | == CreateSaveDataFileSystem == | ||
Takes a 0x40-byte | Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct. | ||
Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1. | Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1. | ||
Line 545: | Line 578: | ||
== CreateSaveDataFileSystemBySystemSaveDataId == | == CreateSaveDataFileSystemBySystemSaveDataId == | ||
Takes a 0x40-byte | Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]]. | ||
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | ||
Line 556: | Line 589: | ||
Mounts a [[Gamecard_Partition|gamecard partition]]. | Mounts a [[Gamecard_Partition|gamecard partition]]. | ||
== CreateSaveDataFileSystemWithHashSalt == | |||
Takes a total of 0xB0-bytes of input, no output. | |||
== OpenSaveDataFileSystem == | == OpenSaveDataFileSystem == | ||
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte | Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8. | ||
Returns an [[#IFileSystem]]. | Returns an [[#IFileSystem]]. | ||
Line 567: | Line 603: | ||
== OpenSaveDataFileSystemBySystemSaveDataId == | == OpenSaveDataFileSystemBySystemSaveDataId == | ||
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte | Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8. | ||
Returns an [[#IFileSystem]]. | Returns an [[#IFileSystem]]. | ||
Line 584: | Line 620: | ||
== OpenSaveDataInfoReaderBySaveDataSpaceId == | == OpenSaveDataInfoReaderBySaveDataSpaceId == | ||
Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]]. | Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]]. | ||
== FindSaveDataWithFilter == | |||
Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer. | |||
== OpenSaveDataInfoReaderWithFilter == | |||
Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]]. | |||
== OpenSaveDataTransferManager == | |||
No input, returns an [[#ISaveDataTransferManager]]. | |||
== OpenSaveDataTransferManagerVersion2 == | |||
No input, returns an [[#ISaveDataTransferManagerWithDivision]]. | |||
== OpenSaveDataTransferProhibiter == | |||
Takes an input u64, returns an [[#ISaveDataTransferProhibiter]]. | |||
== ListAccessibleSaveDataOwnerId == | |||
Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer. | |||
== OpenSaveDataTransferManagerForSaveDataRepair == | |||
No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]]. | |||
== OpenContentStorageFileSystem == | == OpenContentStorageFileSystem == | ||
Line 589: | Line 646: | ||
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]]. | Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]]. | ||
== OpenCloudBackupWorkStorageFileSystem == | |||
Takes 4-bytes of input, returns an [[#IFileSystem]]. | |||
== OpenCustomStorageFileSystem == | |||
Takes a [[#CustomStorageId]]. Invalid values return 0x2EE202. | |||
Returns an [[#IFileSystem]] from either User:/CustomStorage0 or Sdcard:/Nintendo/CustomStorage0. If on the SD card, an AesXtsFileSystem is created using a key source specifically for custom storage. | |||
== OpenDataStorageByDataId == | == OpenDataStorageByDataId == | ||
Takes a [[#StorageId]] and a TitleID. | Takes a [[NCM_services#StorageId|StorageID]] and a TitleID. | ||
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. | ||
== OpenDataFileSystemWithProgramIndex == | |||
Takes an input u8, returns an [[#IFileSystem]]. | |||
== OpenDataStorageWithProgramIndex == | |||
Takes an input u8, returns an [[#IStorage]]. | |||
== OpenDeviceOperator == | == OpenDeviceOperator == | ||
Line 603: | Line 674: | ||
== OpenGameCardDetectionEventNotifier == | == OpenGameCardDetectionEventNotifier == | ||
This command returns a session to a port implementing the [[#IEventNotifier]] interface. | This command returns a session to a port implementing the [[#IEventNotifier]] interface. | ||
== SimulateDeviceDetectionEvent == | |||
Takes a total of 0xC-bytes of input, no output. | |||
== VerifySaveDataFileSystem == | == VerifySaveDataFileSystem == | ||
Line 617: | Line 691: | ||
[[NS_Services|NS]]-module reads the 0x10 bytes from SdCard:/Nintendo/Contents/private, and compares them to the first 0x10 bytes of the ns_appman:/private (in [[Flash_Filesystem#System_Savegames|system savedata]] 0x8000000000000043). If they match, NS calls this command using bytes 0x10-0x20 from ns_appman:/private. The rest of this file (0x1F0 bytes total) is (usually/always?) all-zero (however in some cases the byte at offset 0x20 is value 0x1). | [[NS_Services|NS]]-module reads the 0x10 bytes from SdCard:/Nintendo/Contents/private, and compares them to the first 0x10 bytes of the ns_appman:/private (in [[Flash_Filesystem#System_Savegames|system savedata]] 0x8000000000000043). If they match, NS calls this command using bytes 0x10-0x20 from ns_appman:/private. The rest of this file (0x1F0 bytes total) is (usually/always?) all-zero (however in some cases the byte at offset 0x20 is value 0x1). | ||
== | == OpenAccessFailureDetectionEventNotifier == | ||
Takes 8-bytes of input and returns an [[#IEventNotifier]]. | Takes 8-bytes of input and returns an [[#IEventNotifier]]. | ||
Line 655: | Line 729: | ||
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). | 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]]. | |||
= IStorage = | = IStorage = | ||
Line 663: | Line 743: | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || Read | | 0 || [[#Read]] | ||
|- | |- | ||
| 1 || Write | | 1 || [[#Write]] | ||
|- | |- | ||
| 2 || Flush | | 2 || [[#Flush]] | ||
|- | |- | ||
| 3 || SetSize | | 3 || [[#SetSize]] | ||
|- | |- | ||
| 4 || GetSize | | 4 || [[#GetSize]] | ||
|- | |- | ||
| 5 || [4.0.0+] OperateRange | | 5 || [4.0.0+] OperateRange | ||
|} | |} | ||
== Read == | |||
Takes a type-0x46 buffer, an offset and length. | |||
== Write == | |||
Takes a type-0x45 buffer, an offset and length. | |||
== Flush == | |||
No input. | |||
== SetSize == | |||
Takes a size. | |||
== GetSize == | |||
Returns a size. | |||
= IFileSystem = | = IFileSystem = | ||
Line 877: | Line 972: | ||
| 116 || [4.0.0+] ResumeMmcPatrol | | 116 || [4.0.0+] ResumeMmcPatrol | ||
|- | |- | ||
| 200 || IsGameCardInserted | | 200 || [[#IsGameCardInserted]] | ||
|- | |- | ||
| 201 || EraseGameCard | | 201 || EraseGameCard | ||
|- | |- | ||
| 202 || GetGameCardHandle | | 202 || [[#GetGameCardHandle]] | ||
|- | |- | ||
| 203 || [[#GetGameCardUpdatePartitionInfo]] | | 203 || [[#GetGameCardUpdatePartitionInfo]] | ||
Line 889: | Line 984: | ||
| 205 || GetGameCardAttribute | | 205 || GetGameCardAttribute | ||
|- | |- | ||
| 206 || GetGameCardDeviceCertificate | | 206 || [[#GetGameCardDeviceCertificate]] | ||
|- | |- | ||
| 207 || GetGameCardAsicInfo | | 207 || GetGameCardAsicInfo | ||
Line 895: | Line 990: | ||
| 208 || GetGameCardIdSet | | 208 || GetGameCardIdSet | ||
|- | |- | ||
| 209 || | | 209 || WriteToGameCardDirectly | ||
|- | |- | ||
| 210 || SetVerifyWriteEnalbleFlag | | 210 || SetVerifyWriteEnalbleFlag | ||
Line 915: | Line 1,010: | ||
| 218 || [3.0.0+] GetGameCardDeviceId | | 218 || [3.0.0+] GetGameCardDeviceId | ||
|- | |- | ||
| 219 || [8.0.0+] ChallengeCardExistence | | 219 || [8.0.0+] [[#ChallengeCardExistence]] | ||
|- | |||
| 220 || [9.0.0+] [[#GetGameCardCompatibilityType]] | |||
|- | |- | ||
| 300 || SetSpeedEmulationMode | | 300 || SetSpeedEmulationMode | ||
Line 925: | Line 1,022: | ||
| 401 || [5.0.0+] ResumeSdmmcControl | | 401 || [5.0.0+] ResumeSdmmcControl | ||
|- | |- | ||
| 402 || [6.0.0+] GetSdmmcConnectionStatus | | 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]] | ||
|- | |- | ||
| 500 || [6.0.0+] | | 500 || [6.0.0+] [[#SetDeviceSimulationEvent]] | ||
|- | |- | ||
| 501 || [6.0.0+] | | 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]] | ||
|} | |} | ||
== IsGameCardInserted == | |||
No input, returns a bool. | |||
== GetGameCardHandle == | |||
No input, returns an u32 '''GameCardHandle'''. | |||
== GetGameCardUpdatePartitionInfo == | == GetGameCardUpdatePartitionInfo == | ||
Line 939: | Line 1,042: | ||
[[NS_Services|NS]] appears to only use this with [[Content_Manager_services#GetTitleIdInfo]] and [[Content_Manager_services#GetUpdateTitleList]] with storageid=nandsys, for checking whether a sysupdate is required. | [[NS_Services|NS]] appears to only use this with [[Content_Manager_services#GetTitleIdInfo]] and [[Content_Manager_services#GetUpdateTitleList]] with storageid=nandsys, for checking whether a sysupdate is required. | ||
== GetGameCardDeviceCertificate == | |||
Takes a type-0x6 output buffer, an u32 '''GameCardHandle''' and an u64 '''DeviceCertificateBufferSize'''. No output. | |||
== ChallengeCardExistence == | |||
Takes a type-0x6 output buffer, two type-0x5 input buffers and an u32 '''GameCardHandle'''. No output. | |||
[9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]]. | |||
== GetGameCardCompatibilityType == | |||
Takes an u32 '''GameCardHandle''', returns an u8 '''CompatibilityType''' (0x00 = Global, 0x01 = China) from [[Gamecard_Format#Gamecard_Info|Gamecard Info]]. | |||
== GetSdmmcConnectionStatus == | |||
Takes a total of 4-bytes of input, returns a total of 8-bytes of output. | |||
== SetDeviceSimulationEvent == | |||
Takes a total of 0x14-bytes of input, no output. | |||
== ClearDeviceSimulationEvent == | |||
Takes a total of 4-bytes of input, no output. | |||
= IEventNotifier = | = IEventNotifier = | ||
Line 947: | Line 1,070: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || GetEventHandle | | 0 || [[#GetEventHandle]] | ||
|} | |} | ||
== GetEventHandle == | |||
No input, returns an output Event handle. With official sw the EventClearMode is user-specified. | |||
= ISaveDataTransferManager = | = ISaveDataTransferManager = | ||
This is "nn::fssrv::sf::ISaveDataTransferManager". | This is "nn::fssrv::sf::ISaveDataTransferManager". | ||
This was added with [[4.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 965: | Line 1,093: | ||
| 64 || [[#OpenSaveDataImporter]] | | 64 || [[#OpenSaveDataImporter]] | ||
|} | |} | ||
== GetChallenge == | == GetChallenge == | ||
Line 979: | Line 1,105: | ||
== 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 an input u8 [[#SaveDataSpaceId]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]]. | ||
= ISaveDataTransferManagerForSaveDataRepair = | |||
This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair". | |||
This was added with [[9.0.0]]. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Cmd || Name | |||
|- | |||
| 0 || [[#GetChallenge]] | |||
|- | |||
| 16 || [[#SetKeyPackage]] | |||
|- | |||
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]] | |||
|- | |||
| 81 || [[#PrepareOpenSaveDataImporter]] | |||
|- | |||
| 90 || [[#OpenSaveDataImporter]] | |||
|- | |||
| 91 || [[#OpenSaveDataImporter2]] | |||
|- | |||
| 100 || [[#OpenSaveDataExporterWithKey]] | |||
|- | |||
| 110 || [[#OpenSaveDataImporterWithKey]] | |||
|} | |||
== SetKeyPackage == | |||
No input/output, takes a type-0x5 input buffer. | |||
== OpenSaveDataExporterAndGetEncryptedKey == | |||
Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an [[#ISaveDataDivisionExporter]]. | |||
== PrepareOpenSaveDataImporter == | |||
Takes a type-0x1A output buffer to receive a RsaEncryptedKey. | |||
== OpenSaveDataImporter == | |||
Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an [[#ISaveDataDivisionImporter]]. | |||
== OpenSaveDataImporter2 == | |||
Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | |||
== OpenSaveDataExporterWithKey == | |||
Takes a total of 0x20-bytes of input, returns an [[#ISaveDataDivisionExporter]]. | |||
== OpenSaveDataImporterWithKey == | |||
Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | |||
= ISaveDataExporter = | = ISaveDataExporter = | ||
This is "nn::fssrv::sf::ISaveDataExporter". | This is "nn::fssrv::sf::ISaveDataExporter". | ||
This was added with [[4.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 987: | Line 1,162: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || [[# | | 0 || [[#GetSaveDataInfo]] | ||
|- | |- | ||
| 1 || [[#GetRestSize]] | | 1 || [[#GetRestSize]] | ||
Line 996: | Line 1,171: | ||
|} | |} | ||
== GetSaveDataInfo == | |||
== | |||
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer. | No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer. | ||
Line 1,014: | Line 1,187: | ||
= ISaveDataImporter = | = ISaveDataImporter = | ||
This is "nn::fssrv::sf::ISaveDataImporter". | This is "nn::fssrv::sf::ISaveDataImporter". | ||
This was added with [[4.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,019: | Line 1,194: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || [[# | | 0 || [[#GetSaveDataInfo]] | ||
|- | |- | ||
| 1 || [[#GetRestSize]] | | 1 || [[#GetRestSize]] | ||
Line 1,028: | Line 1,203: | ||
|} | |} | ||
== GetSaveDataInfo == | |||
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer. | |||
== | |||
No input/output, takes a type-0x1A [[# | |||
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. | ||
Line 1,046: | Line 1,219: | ||
= ISaveDataTransferManagerWithDivision = | = ISaveDataTransferManagerWithDivision = | ||
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision". | This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision". | ||
This was added with [[5.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,055: | Line 1,230: | ||
| 16 || [[#SetKeySeedPackage]] | | 16 || [[#SetKeySeedPackage]] | ||
|- | |- | ||
| 32 || [[# | | 32 || [[#OpenSaveDataExporter]] | ||
|- | |- | ||
| 33 || [[# | | 33 || [[#OpenSaveDataExporterForDiffExport]] | ||
|- | |- | ||
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]] | | 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]] | ||
|- | |- | ||
| 64 || [[# | |rowspan="2"| 64 || [5.0.0-5.1.0] OpenSaveDataImporter | ||
|- | |||
| [6.0.0+] [[#OpenSaveDataImporterDeprecated]] | |||
|- | |- | ||
| 65 || [[# | | 65 || [[#OpenSaveDataImporterForDiffImport]] | ||
|- | |- | ||
| 66 || [6.0.0+] [[# | | 66 || [6.0.0+] [[#OpenSaveDataImporterForDuplicateDiffImport]] | ||
|- | |- | ||
| 67 || [6.0.0+] [[#OpenSaveDataImporter]] | | 67 || [6.0.0+] [[#OpenSaveDataImporter]] | ||
Line 1,073: | Line 1,250: | ||
| 69 || [6.0.0+] [[#CancelSuspendingImport]] | | 69 || [6.0.0+] [[#CancelSuspendingImport]] | ||
|} | |} | ||
== GetChallenge == | == GetChallenge == | ||
Line 1,082: | Line 1,257: | ||
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''. | No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''. | ||
== | == OpenSaveDataExporter == | ||
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]]. | 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]]. | Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]]. | ||
Line 1,091: | Line 1,266: | ||
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]]. | No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]]. | ||
== | == OpenSaveDataImporterDeprecated == | ||
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]]. | Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]]. | ||
== | == OpenSaveDataImporterForDiffImport == | ||
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]]. | Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]]. | ||
== | == OpenSaveDataImporterForDuplicateDiffImport == | ||
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | ||
Line 1,111: | Line 1,286: | ||
= ISaveDataDivisionExporter = | = ISaveDataDivisionExporter = | ||
This is "nn::fssrv::sf::ISaveDataDivisionExporter". | This is "nn::fssrv::sf::ISaveDataDivisionExporter". | ||
This was added with [[5.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,116: | Line 1,293: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || SetDivisionCount | | 0 || [[#SetDivisionCount]] | ||
|- | |- | ||
| 1 || [6.0.0+] GetSaveDataInfo | | 1 || [6.0.0+] [[#GetSaveDataInfo]] | ||
|- | |- | ||
| 16 || | | 16 || [[#OpenSaveDataDiffChunkIterator]] | ||
|- | |- | ||
| 48 || | | 48 || [[#OpenSaveDataChunkExporter]] | ||
|- | |- | ||
| 64 || [6.0.0 | | 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]] | ||
|- | |- | ||
| 65 || [6.0.0 | | 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]] | ||
|- | |- | ||
| 66 || [6.0.0+] CancelExport | | 66 || [6.0.0+] [[#CancelExport]] | ||
|- | |- | ||
| 67 || [6.0.0+] SuspendExport | | 67 || [6.0.0+] [[#SuspendExport]] | ||
|- | |- | ||
| 70 || [6.0.0+] GetKeySeed | | 70 || [6.0.0+] [[#GetKeySeed]] | ||
|- | |- | ||
| 71 || [6.0.0+] GetInitialDataMac | | 71 || [6.0.0+] [[#GetInitialDataMac]] | ||
|- | |- | ||
| 72 || [6.0.0+] FinalizeExport | | 72 || [6.0.0+] [[#FinalizeExport]] | ||
|- | |- | ||
| | | 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]] | ||
|- | |- | ||
| | | 80 || [6.0.0+] [[#GetImportInitialDataAad]] | ||
|- | |- | ||
| 96 || [6.0.0+] GetReportInfo | | 81 || [6.0.0+] [[#SetExportInitialDataAad]] | ||
|- | |||
| 96 || [6.0.0+] [[#GetReportInfo]] | |||
|} | |} | ||
== SetDivisionCount == | |||
Takes an input u32, no output. | |||
== OpenSaveDataChunkExporter == | |||
Takes an input u32, returns an [[#ISaveDataChunkExporter]]. | |||
== FinalizeFullExport == | |||
No input, returns two 0x10-byte output structs. | |||
== FinalizeDiffExport == | |||
No input, returns an output 0x10-byte struct. | |||
== CancelExport == | |||
No input/output. | |||
== SuspendExport == | |||
No input/output, takes a type-0x6 output buffer. | |||
== GetKeySeed == | |||
No input, returns an output 0x10-byte struct. | |||
== GetInitialDataMac == | |||
No input, returns an output 0x10-byte struct. | |||
== FinalizeExport == | |||
No input/output. | |||
== SetExportInitialDataAad == | |||
Takes an input 0x20-byte struct, no output. | |||
= ISaveDataDivisionImporter = | = ISaveDataDivisionImporter = | ||
This is "nn::fssrv::sf::ISaveDataDivisionImporter". | This is "nn::fssrv::sf::ISaveDataDivisionImporter". | ||
This was added with [[5.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,154: | Line 1,363: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || [6.0.0+] GetSaveDataInfo | | 0 || [6.0.0+] [[#GetSaveDataInfo]] | ||
|- | |- | ||
| 16 || | | 16 || [[#OpenSaveDataDiffChunkIterator]] | ||
|- | |- | ||
| 32 || InitializeImport | | 32 || [[#InitializeImport]] | ||
|- | |- | ||
| 33 || FinalizeImport | | 33 || [[#FinalizeImport]] | ||
|- | |- | ||
| 34 || [6.0.0+] CancelImport | | 34 || [6.0.0+] [[#CancelImport]] | ||
|- | |- | ||
| 35 || [6.0.0+] GetImportContext | | 35 || [6.0.0+] [[#GetImportContext]] | ||
|- | |- | ||
| 36 || [6.0.0+] SuspendImport | | 36 || [6.0.0+] [[#SuspendImport]] | ||
|- | |- | ||
| 48 || | | 48 || [[#OpenSaveDataChunkImporter]] | ||
|- | |- | ||
| 64 || [6.0.0+] GetImportInitialDataAad | | 64 || [6.0.0+] [[#GetImportInitialDataAad]] | ||
|- | |- | ||
| 80 || [6.0.0+] GetReportInfo | | 80 || [6.0.0+] [[#GetReportInfo]] | ||
|} | |} | ||
== GetSaveDataInfo == | |||
No input/output, takes a type-0x6 output buffer. | |||
== OpenSaveDataDiffChunkIterator == | |||
No input, returns an [[#ISaveDataChunkIterator]]. | |||
== InitializeImport == | |||
No input, returns an output u64. | |||
== FinalizeImport == | |||
No input/output. | |||
== CancelImport == | |||
No input/output. | |||
== GetImportContext == | |||
No input/output, takes a type-0x6 output buffer. | |||
== SuspendImport == | |||
No input/output. | |||
== OpenSaveDataChunkImporter == | |||
Takes an input u32, returns an [[#ISaveDataChunkImporter]]. | |||
== GetImportInitialDataAad == | |||
No input, returns an output 0x20-byte struct. | |||
== GetReportInfo == | |||
No input, returns an output 0x20-byte struct. | |||
= ISaveDataChunkIterator = | = ISaveDataChunkIterator = | ||
This is "nn::fssrv::sf::ISaveDataChunkIterator". | This is "nn::fssrv::sf::ISaveDataChunkIterator". | ||
This was added with [[5.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,184: | Line 1,423: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || Next | | 0 || [[#Next]] | ||
|- | |- | ||
| 1 || IsEnd | | 1 || [[#IsEnd]] | ||
|- | |- | ||
| 16 || GetId | | 16 || [[#GetId]] | ||
|} | |} | ||
== Next == | |||
No input/output. | |||
== IsEnd == | |||
No input, returns an output u8. | |||
== GetId == | |||
No input, returns an output u32. | |||
= ISaveDataChunkExporter = | = ISaveDataChunkExporter = | ||
This is "nn::fssrv::sf::ISaveDataChunkExporter". | This is "nn::fssrv::sf::ISaveDataChunkExporter". | ||
This was added with [[5.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,200: | Line 1,448: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || Pull | | 0 || [[#Pull]] | ||
|- | |- | ||
| 16 || [6.0.0+] [[#GetRestRawDataSize]] | |||
|} | |} | ||
== Pull == | |||
Takes an input u64 and a type-0x6 output buffer, returns an output u64. | |||
== GetRestRawDataSize == | |||
No input, returns an output u64. | |||
= ISaveDataChunkImporter = | = ISaveDataChunkImporter = | ||
This is "nn::fssrv::sf::ISaveDataChunkImporter". | This is "nn::fssrv::sf::ISaveDataChunkImporter". | ||
This was added with [[5.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,215: | Line 1,468: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 0 || Push | | 0 || [[#Push]] | ||
|} | |} | ||
== Push == | |||
Takes an input u64 and a type-0x5 input buffer, no output. | |||
= ISaveDataTransferProhibiter = | = ISaveDataTransferProhibiter = | ||
Line 1,226: | Line 1,480: | ||
= IMultiCommitManager = | = IMultiCommitManager = | ||
This was added with [[6.0.0]]. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| 1 || | | 1 || [[#Add]] | ||
|- | |- | ||
| 2 || | | 2 || [[#Commit]] | ||
|} | |} | ||
== Add == | |||
Takes an input [[#IFilesystem]], no output. | |||
== Commit == | |||
No input/output. | |||
= FileSystemType = | = FileSystemType = | ||
Line 1,257: | Line 1,517: | ||
|- | |- | ||
| 7 || ApplicationPackage | | 7 || ApplicationPackage | ||
|- | |- | ||
| | | 8 || RegisteredUpdate | ||
|} | |} | ||
Line 1,310: | Line 1,554: | ||
= SaveDataType = | = SaveDataType = | ||
This is "nn::fs::SaveDataType". | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 1,340: | Line 1,586: | ||
= CloudBackupWorkStorageId = | = CloudBackupWorkStorageId = | ||
This is "nn::fs::CloudBackupWorkStorageId". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value || Name | |||
|- | |||
| 0 || Nand | |||
|- | |||
| 1 || SdCard | |||
|} | |||
= CustomStorageId = | |||
This is "nn::fs::CustomStorageId". | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 1,376: | Line 1,636: | ||
| @GcApp || Gamecard App partition (Partition 2) | | @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) | | @upp || Gamecard update partition (Partition 0) | ||
Line 1,383: | Line 1,643: | ||
|} | |} | ||
= | = SaveDataAttribute = | ||
This is "nn::fs::SaveDataAttribute". | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 1,435: | Line 1,697: | ||
For DeviceSaveData, this struct is all-zero except for the [[#SaveDataType]] field. | For DeviceSaveData, this struct is all-zero except for the [[#SaveDataType]] field. | ||
= | = SaveDataCreationInfo = | ||
This is "nn::fs::SaveDataCreationInfo". | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 1,478: | Line 1,742: | ||
= DeviceSaveData = | = DeviceSaveData = | ||
This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the | This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the [[#SaveDataAttribute]]. | ||
= BcatSaveData = | = BcatSaveData = | ||
This is accessed using the same commands for SaveData with the same input u8. The | This is accessed using the same commands for SaveData with the same input u8. The [[#SaveDataAttribute]] is the same as DeviceSaveData, except that the titleID field is set to <input titleID>. See above regarding [[#SaveDataCreationInfo]]. | ||
The 0x10-byte struct passed to [[#CreateSaveDataFileSystem]] has the first 0x5-bytes set to all-zero. | The 0x10-byte struct passed to [[#CreateSaveDataFileSystem]] has the first 0x5-bytes set to all-zero. |