Filesystem services: Difference between revisions

Adubbz (talk | contribs)
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 || Arguments || Notes
! Cmd || Name
|-
|-
| 0 || OpenCodeFileSystem || u64 TitleId + X descriptor [[#ContentPath]] || Returns an [[#IFileSystem]].
| 0 || [[#OpenCodeFileSystem]]
|-
|-
| 1 || IsArchivedProgram || u64 ProcessId || Returns a bool (1 if the process id's [[#ContentPath]] ends in ".nca").
| 1 || [[#IsArchivedProgram]]
|-
|-
| 2 || [4.0.0+] SetCurrentProcess || PID descriptor ||
| 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 || Notes
! 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+] OpenDataFileSystemByApplicationId
| 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+] CreateSaveDataFileSystemByHashSalt (Unofficial name, takes a total of 0xB0-bytes of input, no output)
| 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+] OpenCacheStorageList
| 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+] WriteSaveDataFileSystemExtraData2
| 66 || [5.0.0+] WriteSaveDataFileSystemExtraDataWithMask
|-
|-
| 67 || [6.0.0+] FindSaveDataWithFilter (Takes a total of 0x50-bytes of input, returns 8-bytes of output, and a type-0x6 output buffer)
| 67 || [6.0.0+] [[#FindSaveDataWithFilter]]
|-
|-
| 68 || [6.0.0+] OpenSaveDataIterator (Takes a total of 0x50-bytes of input, returns an #ISaveDataInfoReader)
| 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+] OpenSaveDataTransferManager (No input, returns an [[#ISaveDataTransferManager]])
| 81 || [4.0.0+] [[#OpenSaveDataTransferManager]]
|-
|-
| 82 || [5.0.0+] OpenSaveDataTransferManagerVersion2 (No input, returns an [[#ISaveDataTransferManagerWithDivision]])
| 82 || [5.0.0+] [[#OpenSaveDataTransferManagerVersion2]]
|-
|-
| 83 || [6.0.0+] OpenSaveDataTransferProhibiterForCloudBackUp (Takes an input u64, returns an [[#ISaveDataTransferProhibiter]])
| 83 || [6.0.0+] [[#OpenSaveDataTransferProhibiter]]
|-
|-
| 84 || [6.0.0+] ListApplicationAccessibleSaveDataOwnerId (Takes a total of 0x10-bytes of input, returns 4-bytes of output, and a type-0x6 output buffer)
| 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+] OpenCloudBackupWorkStorageFileSystem (Takes 4-bytes of input, returns an [[#IFileSystem]])
| 120 || [6.0.0+] [[#OpenCloudBackupWorkStorageFileSystem]]
|-
|-
| 130 || [7.0.0+] OpenCustomStorageFileSystem (Takes 4-bytes of input, returns an [[#IFileSystem]])
| 130 || [7.0.0+] [[#OpenCustomStorageFileSystem]]
|-
|-
| 200 || OpenDataStorageByCurrentProcess
| 200 || OpenDataStorageByCurrentProcess
Line 159: Line 172:
| 203 || OpenPatchDataStorageByCurrentProcess
| 203 || OpenPatchDataStorageByCurrentProcess
|-
|-
| 204 || [7.0.0+] OpenDataFileSystemByProgramIndex (Takes an input u8, returns an [[#IFileSystem]])
| 204 || [7.0.0+] [[#OpenDataFileSystemWithProgramIndex]]
|-
|-
| 205 || [7.0.0+] OpenDataStorageByProgramIndex (Takes an input u8, returns an [[#IStorage]])
| 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+] SimulateGameCardDetectionEvent (Takes a total of 0xC-bytes of input, no output)
| 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+] [[#OpenAccessFailureResolver]]
| 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+] GetAndClearFileSystemProxyErrorInfo
| 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+] GetAccessLogVersionInfo (Unofficial name, no input, returns two 32-bit values "version" and "program_index")
| 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+] CorruptSaveDataFileSystemBySaveDataSpaceId2
| 1110 || [6.0.0+] CorruptSaveDataFileSystemByOffset
|-
|-
| 1200 || [6.0.0+] OpenMultiCommitManager (No input, returns an output #IMultiCommitManager)
| 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.


=== RwPermissions ===
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"
|-
|-
! Type(s) || Mask || Name || Value || Used by
! 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) || CanMountCustomStorage || 3 || OpenCustomStorageFileSystem
| 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/>([1.0.0-5.1.0] 0x8000000000100008) || CanOpenSdCardStorage || ||
| [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/>([1.0.0-5.1.0] 0xC000000000400000) || CanOpenGameCardStorage || 3 || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)  
| [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/>([1.0.0-5.1.0] 0x8000000000010000) || CanMountSystemDataPrivate || 1 || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
| [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/>([1.0.0-5.1.0] 0x8000000000000000) || CanMountHost || 3 || [[#OpenHostFileSystem]]
| [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/>([1.0.0-6.2.0]0x8000000000000000) || CanMountRegisteredUpdatePartition || 1 || [[#OpenRegisteredUpdatePartition]]
| [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:
|}
|}


=== BoolPermissions ===
=== Call ===
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Type(s) || Mask || Name || Used by
! OperationType || Mask || Name || Used by
|-
|-
| 0x0 || 0x8000000000000080 || CanInvalidateBisCache || [[#InvalidateBisCache]]
| 0x0 || 0x8000000000000080 || CanInvalidateBisCache || [[#InvalidateBisCache]]
|-
|-
| 0x1 || 0x8000000000000080 || CanEraseMmc || [[#EraseMmc]]
| 0x1 || 0x8000000000000080 || CanEraseMmc || EraseMmc
|-
|-
| 0x2 || 0x8000000000000010 || CanGetGameCardDeviceCertificate || [[#GetGameCardDeviceCertificate]]
| 0x2 || 0x8000000000000010 || CanGetGameCardDeviceCertificate || GetGameCardDeviceCertificate
|-
|-
| 0x3 || 0x8000000000000010 || CanGetGameCardIdSet || [[#GetGameCardIdSet]]
| 0x3 || 0x8000000000000010 || CanGetGameCardIdSet || GetGameCardIdSet
|-
|-
| 0x4 || 0x8000000000000200 || CanFinalizeGameCardDriver || [[#FinalizeGameCardDriver]]
| 0x4 || 0x8000000000000200 || CanFinalizeGameCardDriver || FinalizeGameCardDriver
|-
|-
| 0x5 || 0x8000000000000200 || CanGetGameCardAsicInfo || [[#GetGameCardAsicInfo]]
| 0x5 || 0x8000000000000200 || CanGetGameCardAsicInfo || GetGameCardAsicInfo
|-
|-
| 0x6 || 0x8000000000002020 || CanCreateSaveData || [[#CreateSaveDataFileSystem]]
| 0x6 || 0x8000000000002020 || CanCreateSaveData || [[#CreateSaveDataFileSystem]]
|-
|-
| 0x7 || 0x8000000000000060 || CanDeleteSaveData || [[#DeleteSaveDataFileSystem]], [[#RegisterSaveDataFileSystemAtomicDeletion]]
| 0x7 || 0x8000000000000060 || CanDeleteSaveData || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
|-
|-
| 0x8 || 0x8000000000000028 || CanCreateSystemSaveData || [[#CreateSaveDataFileSystemBySystemSaveDataId]]
| 0x8 || 0x8000000000000028 || CanCreateSystemSaveData || CreateSaveDataFileSystemBySystemSaveDataId
|-
|-
| 0x9 || 0x8000000000000020 || CanCreateOthersSystemSaveData || [[#CreateSaveDataFileSystemBySystemSaveDataId]]
| 0x9 || 0x8000000000000020 || CanCreateOthersSystemSaveData || CreateSaveDataFileSystemBySystemSaveDataId
|-
|-
| 0xA || 0x8000000000004028 || CanDeleteSystemSaveData || [[#DeleteSaveDataFileSystem]], [[#RegisterSaveDataFileSystemAtomicDeletion]]
| 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) || CanOpenSaveDataIterator || OpenSaveDataIterator
| 0xD || 0x8000000000000040<br/>([1.0.0-5.1.0] 0x8000000000020000) || CanOpenSaveDataInfoReaderForInternal || [[#OpenSaveDataInfoReaderWithFilter]]
|-
|-
| 0xE || 0x8000000000020000<br/>([1.0.0-5.1.0] 0x8000000000000400) || CanOpenSaveDataMetaFile || [[#OpenSaveDataMetaFile]]
| 0xE || 0x8000000000020000<br/>([1.0.0-5.1.0] 0x8000000000000400) || CanOpenSaveDataMetaFile || OpenSaveDataMetaFile
|-
|-
| 0xF || 0x8000000000000400<br/>([1.0.0-5.1.0] 0x8000000000004060) || CanSetCurrentPosixTime || [[#SetCurrentPosixTime]], [[#SetCurrentPosixTimeWithTimeDifference]]
| 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 || [[#SetGlobalAccessMode]]
| 0x11 || 0x8000000000080000 || CanSetGlobalAccessLogMode || [[#SetGlobalAccessLogMode]]
|-
|-
| 0x12 || 0x8000000000080000<br/>([1.0.0-5.1.0] Invalid) || CanSetSpeedEmulationMode || [[#SetSpeedEmulationMode]]
| 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 || [[#CreatePaddingFile]], [[#DeleteAllPaddingFiles]]
| 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 || [[#CorruptSaveDataFileSystem]], [[#CorruptSaveDataFileSystemBySaveDataSpaceId]]
| 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/>([1.0.0-4.1.0] 0x8000000004000000) || CanCorruptSystemSaveData || [[#CorruptSaveDataFileSystem]], [[#CorruptSaveDataFileSystemBySaveDataSpaceId]]
| [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/>([1.0.0-4.1.0] 0x8000000008000000) || CanVerifySaveData || [[#VerifySaveDataFileSystem]], [[#VerifySaveDataFileSystemBySaveDataSpaceId]]
| [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/>([1.0.0-4.1.0] 0x8000000010000000) || CanDebugSaveData || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
| [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/>([1.0.0-4.1.0] 0x8000000000000800) || CanFormatSdCard || [[#FormatSdCardFileSystem]]
| [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/>([1.0.0-4.1.0] 0x8000000000004020) || CanGetRightsId || [[#GetRightsId]], [[#GetRightsIdAndKeyGenerationByPath]], [[#GetRightsIdByPath]]
| [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/>([1.0.0-4.1.0] 0x8000000000002020) || CanRegisterExternalKey || [[#RegisterExternalKey]], [[#UnregisterAllExternalKey]]
| [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/>([1.0.0-4.1.0] 0x8000000000000028) || CanSetEncryptionSeed || [[#SetSdCardEncryptionSeed]]
| [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/>([1.0.0-4.1.0] 0x8000000020000000) || SaveDataExtraData_Write0 || [[#WriteSaveDataFileSystemExtraData]], [[#WriteSaveDataFileSystemExtraData2]]
| [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/>([1.0.0-4.1.0] 0x8000000040000000) || CanWriteSaveDataFileSystemExtraDataFlags || [[#WriteSaveDataFileSystemExtraData]], [[#WriteSaveDataFileSystemExtraData2]]
| [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/>([1.0.0-4.1.0] 0x8000000000000000) || SaveDataExtraData_Write1 || [[#WriteSaveDataFileSystemExtraData]], [[#WriteSaveDataFileSystemExtraData2]]
| [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/>([1.0.0-4.1.0] 0x8000000000000000) || CanWriteSaveDataFileSystemExtraDataAll || [[#WriteSaveDataFileSystemExtraData]], [[#WriteSaveDataFileSystemExtraData2]]
| [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 || [[#ExtendSaveDataFileSystem]]
| [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 || [[#ExtendSaveDataFileSystem]]
| [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 || [[#RegisterUpdatePartition]]
| [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/>([1.0.0-5.1.0] 0x8000000080000110) || CanOpenSaveDataTransferProhibiterForCloudBackUp || [[#OpenSaveDataTransferProhibiterForCloudBackUp]]
| [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/>([1.0.0-5.1.0] 0x8000000000100008) || CanListApplicationAccessibleSaveDataOwnerId || ListApplicationAccessibleSaveDataOwnerId
| [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/>([1.0.0-5.1.0] 0x8000000080010000) || CanControlMmcPatrol || [[#SuspendMmcPatrol]], [[#ResumeMmcPatrol]]
| [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/>([1.0.0-5.1.0] 0x0000000080000001) || CanOverrideSaveDataTransferTokenSignVerificationKey || [[#OverrideSaveDataTransferTokenSignVerificationKey]]
| [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/>([1.0.0-5.1.0] 0x0000000080000001) || CanOpenSdCardDetectionEventNotifier || [[#OpenSdCardDetectionEventNotifier]]
| [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/>([1.0.0-5.1.0] 0x0000000080000001) || CanOpenGameCardDetectionEventNotifier || [[#OpenGameCardDetectionEventNotifier]]
| [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/>([1.0.0-5.1.0] 0x0000000080000001) || CanOpenSystemDataUpdateEventNotifier || [[#OpenSystemDataUpdateEventNotifier]]
| [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/>([1.0.0-5.1.0] 0x0000000080000001) || CanNotifySystemDataUpdateEvent || [[#NotifySystemDataUpdateEvent]]
| [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/>([1.0.0-5.1.0] 0x8000000040000000) || CanOpenAccessFailureDetectionEventNotifier || [[#OpenAccessFailureResolver]]
| [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/>([1.0.0-5.1.0] 0x8000000080200000) || CanGetAccessFailureDetectionEvent || [[#GetAccessFailureDetectionEvent]]
| [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] 0x8000000080080000) || CanIsAccessFailureDetected || [[#IsAccessFailureDetected]]  
| [5.1.0+] 0x30 || 0x8000000100000000<br/>([5.1.0-6.0.0] 0x8000000080080000) || CanOpenAccessFailureDetectionEventNotifier || [[#OpenAccessFailureDetectionEventNotifier]]
|-
|-
| [6.0.0+] 0x31 || 0x8000000100000000 || CanResolveAccessFailure || [[#ResolveAccessFailure]]
| [6.0.0+] 0x31 || 0x8000000100000000 || CanGetAccessFailureDetectionEvent || GetAccessFailureDetectionEvent
|-
|-
| [6.0.0+] 0x32 || 0x8000000100000000 || CanAbandonAccessFailure || [[#AbandonAccessFailure]]
| [6.0.0+] 0x32 || 0x8000000100000000 || CanIsAccessFailureDetected || IsAccessFailureDetected
|-
|-
| [6.0.0+] 0x33 || 0x8000000040000000 || CanQuerySaveDataInternalStorageTotalSize || [[#QuerySaveDataInternalStorageTotalSize]]
| [6.0.0+] 0x33 || 0x8000000100000000<br/>([6.0.0-8.1.0] 0x8000000040000000) || CanResolveAccessFailure || ResolveAccessFailure
|-
|-
| [6.0.0+] 0x34 || 0x8000000200000020 || CanGetSaveDataCommitId || [[#GetSaveDataCommitId]]
| [6.0.0+] 0x34 || 0x8000000100000000<br/>([6.0.0-8.1.0] 0x8000000200000020) || CanAbandonAccessFailure || AbandonAccessFailure
|-
|-
| [6.0.0+] 0x35 || 0x8000000000200000 || CanSetSdCardAccessibility || [[#SetSdCardAccessibility]]
| [6.0.0+] 0x35 || 0x8000000040000000<br/>([6.0.0-8.1.0] 0x8000000000200000) || CanQuerySaveDataInternalStorageTotalSize || QuerySaveDataInternalStorageTotalSize
|-
|-
| [6.0.0+] 0x36 || 0x4000000000000000 || CanSimulateGameCardDetectionEvent || SimulateGameCardDetectionEvent, SetSimulationEvent, ClearSimulationEvent
| [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) || CanSetDataStorageRedirectTarget || SetDataStorageRedirectTarget
| [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) || || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemByHashSalt
| [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 Save-struct entry, a 0x40-byte SaveCreate-struct entry, and a 0x10-byte input struct.
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 Save-struct entry and a 0x40-byte SaveCreate-struct entry.
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 Save-struct entry. Official user-process code is only known to use value 1 for the u8.
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 Save-struct entry. Web-applet only uses value0 for the input u8.
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).


== OpenAccessFailureResolver ==
== 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 || Arguments
! Cmd || Name
|-
|-
| 0 || Read || Takes a type-0x46 buffer, an offset and length
| 0 || [[#Read]]
|-
|-
| 1 || Write || Takes a type-0x45 buffer, an offset and length
| 1 || [[#Write]]
|-
|-
| 2 || Flush || None
| 2 || [[#Flush]]
|-
|-
| 3 || SetSize || Takes a size
| 3 || [[#SetSize]]
|-
|-
| 4 || GetSize || None
| 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 || WriteToGameCard
| 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 (Takes a total of 4-bytes of input, returns a total of 8-bytes of output)
| 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]]
|-
|-
| 500 || [6.0.0+] SetSimulationEvent (Takes a total of 0x14-bytes of input, no output)
| 500 || [6.0.0+] [[#SetDeviceSimulationEvent]]
|-
|-
| 501 || [6.0.0+] ClearSimulationEvent (Takes a total of 4-bytes of input, no output)
| 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]]
|}
|}
This was added with [[4.0.0]].


== 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 || [[#Initialize]]
| 0 || [[#GetSaveDataInfo]]
|-
|-
| 1 || [[#GetRestSize]]
| 1 || [[#GetRestSize]]
Line 996: Line 1,171:
|}
|}


This was added with [[4.0.0]].
== GetSaveDataInfo ==
 
== Initialize ==
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 || [[#Initialize]]
| 0 || [[#GetSaveDataInfo]]
|-
|-
| 1 || [[#GetRestSize]]
| 1 || [[#GetRestSize]]
Line 1,028: Line 1,203:
|}
|}


This was added with [[4.0.0]].
== GetSaveDataInfo ==
 
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.
== Initialize ==
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.


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 || [[#OpenSaveDataFullExporter]]
| 32 || [[#OpenSaveDataExporter]]
|-
|-
| 33 || [[#OpenSaveDataDiffExporter]]
| 33 || [[#OpenSaveDataExporterForDiffExport]]
|-
|-
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
|-
|-
| 64 || [[#OpenSaveDataFullImporter]]
|rowspan="2"| 64 || [5.0.0-5.1.0] OpenSaveDataImporter
|-
| [6.0.0+] [[#OpenSaveDataImporterDeprecated]]
|-
|-
| 65 || [[#OpenSaveDataDiffImporter]]
| 65 || [[#OpenSaveDataImporterForDiffImport]]
|-
|-
| 66 || [6.0.0+] [[#OpenSaveDataDuplicateDiffImporter]]
| 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]]
|}
|}
This was added with [[5.0.0]].


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


== OpenSaveDataFullExporter ==
== OpenSaveDataExporter ==
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].


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


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


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


== OpenSaveDataDuplicateDiffImporter ==
== 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 (Takes an input u32, no output)
| 0 || [[#SetDivisionCount]]
|-
|-
| 1 || [6.0.0+] GetSaveDataInfo (No input/output, takes a type-0x6 output buffer)
| 1 || [6.0.0+] [[#GetSaveDataInfo]]
|-
|-
| 16 || OpenSaveDataDiffChunkIterator (No input, returns an [[#ISaveDataChunkIterator]])
| 16 || [[#OpenSaveDataDiffChunkIterator]]
|-
|-
| 48 || OpenSaveDataChunkExporter (Takes an input u32, returns an [[#ISaveDataChunkExporter]])
| 48 || [[#OpenSaveDataChunkExporter]]
|-
|-
| 64 || [6.0.0+] FinalizeFullExport (No input, returns two 0x10-byte output structs)
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
|-
|-
| 65 || [6.0.0+] FinalizeDiffExport (No input, returns an output 0x10-byte struct)
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
|-
|-
| 66 || [6.0.0+] CancelExport (No input/output)
| 66 || [6.0.0+] [[#CancelExport]]
|-
|-
| 67 || [6.0.0+] SuspendExport (No input/output, takes a type-0x6 output buffer)
| 67 || [6.0.0+] [[#SuspendExport]]
|-
|-
| 70 || [6.0.0+] GetKeySeed (No input, returns an output 0x10-byte struct)
| 70 || [6.0.0+] [[#GetKeySeed]]
|-
|-
| 71 || [6.0.0+] GetInitialDataMac (No input, returns an output 0x10-byte struct)
| 71 || [6.0.0+] [[#GetInitialDataMac]]
|-
|-
| 72 || [6.0.0+] FinalizeExport (No input/output)
| 72 || [6.0.0+] [[#FinalizeExport]]
|-
|-
| 80 || [6.0.0+] GetImportInitialDataAad (No input, returns an output 0x20-byte struct)
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
|-
|-
| 81 || [6.0.0+] SetExportInitialDataAad (Takes an input 0x20-byte struct, no output)
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
|-
|-
| 96 || [6.0.0+] GetReportInfo (No input, returns an output 0x20-byte struct)
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
|-
| 96 || [6.0.0+] [[#GetReportInfo]]
|}
|}


This was added with [[5.0.0]].
== 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 (No input/output, takes a type-0x6 output buffer)
| 0 || [6.0.0+] [[#GetSaveDataInfo]]
|-
|-
| 16 || OpenSaveDataDiffChunkIterator (No input, returns an [[#ISaveDataChunkIterator]])
| 16 || [[#OpenSaveDataDiffChunkIterator]]
|-
|-
| 32 || InitializeImport (No input, returns an output u64)
| 32 || [[#InitializeImport]]
|-
|-
| 33 || FinalizeImport (No input/output)
| 33 || [[#FinalizeImport]]
|-
|-
| 34 || [6.0.0+] CancelImport (No input/output)
| 34 || [6.0.0+] [[#CancelImport]]
|-
|-
| 35 || [6.0.0+] GetImportContext (No input/output, takes a type-0x6 output buffer)
| 35 || [6.0.0+] [[#GetImportContext]]
|-
|-
| 36 || [6.0.0+] SuspendImport (No input/output)
| 36 || [6.0.0+] [[#SuspendImport]]
|-
|-
| 48 || OpenSaveDataChunkImporter (Takes an input u32, returns an [[#ISaveDataChunkImporter]])
| 48 || [[#OpenSaveDataChunkImporter]]
|-
|-
| 64 || [6.0.0+] GetImportInitialDataAad (No input, returns an output 0x20-byte struct)
| 64 || [6.0.0+] [[#GetImportInitialDataAad]]
|-
|-
| 80 || [6.0.0+] GetReportInfo (No input, returns an output 0x20-byte struct)
| 80 || [6.0.0+] [[#GetReportInfo]]
|}
|}


This was added with [[5.0.0]].
== 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 (No input/output)
| 0 || [[#Next]]
|-
|-
| 1 || IsEnd (No input, returns an output u8)
| 1 || [[#IsEnd]]
|-
|-
| 16 || GetId (No input, returns an output u32)
| 16 || [[#GetId]]
|}
|}


This was added with [[5.0.0]].
== 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 (Takes an input u64 and a type-0x6 output buffer, returns an output u64)
| 0 || [[#Pull]]
|-
| 16 || [6.0.0+] GetRestRawDataSize (No input, returns an output u64)
|-
|-
| 16 || [6.0.0+] [[#GetRestRawDataSize]]
|}
|}


This was added with [[5.0.0]].
== 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 (Takes an input u64 and a type-0x5 input buffer, no output)
| 0 || [[#Push]]
|}
|}


This was added with [[5.0.0]].
== 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 || ? (Takes an input [[#IFilesystem]], no output)
| 1 || [[#Add]]
|-
|-
| 2 || ? (No input/output)
| 2 || [[#Commit]]
|}
|}


This was added with [[6.0.0]].
== Add ==
Takes an input [[#IFilesystem]], no output.
 
== Commit ==
No input/output.


= FileSystemType =
= FileSystemType =
Line 1,257: Line 1,517:
|-
|-
| 7 || ApplicationPackage
| 7 || ApplicationPackage
|}
= StorageId =
{| class="wikitable" border="1"
|-
! Value || Name
|-
| 0 || None
|-
|-
| 1 || Host
| 8 || RegisteredUpdate
|-
| 2 || GameCard
|-
| 3 || NandSystem
|-
| 4 || NandUser
|-
| 5 || SdCard
|}
|}


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)
|-
|-
| @GcS00000001 || Gamecard Contents.
| @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:
|}
|}


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


= SaveCreate Struct =
= 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 Save-struct.
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 Save-struct is the same as DeviceSaveData, except that the titleID field is set to <input titleID>. See above regarding SaveCreate-struct.
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.