Changes

Jump to navigation Jump to search
12,085 bytes added ,  19:48, 4 December 2019
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 [[NCM_services#ProgramId|ProgramId]] 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 ProcessId 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]]
 
|}
 
|}
    
== RegisterProgram ==
 
== RegisterProgram ==
Takes a storageID, a pid, a titleID, a 0x1C type-A buffer for the [[NPDM#FS_Access_Header| FS Access Header]], and a 0x2C type-A buffer for the [[NPDM#FS_Access_Control| FS Access Control]]
+
Takes a [[NCM_services#StorageId|StorageId]], an u64 ProcessId, a [[NCM_services#ProgramId|ProgramId]], a 0x1C type-A buffer for the [[NPDM#FS_Access_Header| FS Access Header]], and a 0x2C type-A buffer for the [[NPDM#FS_Access_Control| FS Access Control]]
    
Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.
 
Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.
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+] OutputAccessLogToSdCard2 (no input, returns two 32-bit values, second is "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 || 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 || 0x8000000200002000<br/>([6.0.0-8.1.0] 0x8000000000000000)<br/>([5.0.0-5.1.0] 0x8000000080010000) || CanOpenOpenSaveDataTransferProhibiter || [[#OpenSaveDataTransferProhibiter]]
 +
|-
 +
| [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 || 0x8000000000000000<br/>([6.0.0-8.1.0] 0x8000000080200000)<br/>([5.0.0-5.1.0] 0x0000000080000001) || CanControlMmcPatrol || SuspendMmcPatrol, ResumeMmcPatrol
 +
|-
 +
| [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+] 0x27 || 0x8000000240002000 <br/>([6.0.0-7.0.1] 0x8000000200002000)<br/>([1.0.0-5.1.0] 0x8000000000100008) || CanListApplicationAccessibleSaveDataOwnerId || ListApplicationAccessibleSaveDataOwnerId
+
| [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+] 0x28 || 0x8000000000000000<br/>([1.0.0-5.1.0] 0x8000000080010000) || CanControlMmcPatrol || [[#SuspendMmcPatrol]], [[#ResumeMmcPatrol]]
+
| [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+] 0x29 || 0x8000000000000000<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanOverrideSaveDataTransferTokenSignVerificationKey || [[#OverrideSaveDataTransferTokenSignVerificationKey]]
+
| [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+] 0x2A || 0x8000000080200000<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanOpenSdCardDetectionEventNotifier || [[#OpenSdCardDetectionEventNotifier]]
+
| [5.0.0+] 0x2F || 0x8000000000010000<br/>([6.0.0-8.1.0] 0x8000000100000000)<br/>([5.0.0-5.1.0] 0x8000000080200000) || CanNotifySystemDataUpdateEvent || NotifySystemDataUpdateEvent
 
|-
 
|-
| [5.0.0+] 0x2B || 0x8000000080000110<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanOpenGameCardDetectionEventNotifier || [[#OpenGameCardDetectionEventNotifier]]
+
| [5.1.0+] 0x30 || 0x8000000100000000<br/>([5.1.0-6.0.0] 0x8000000080080000) || CanOpenAccessFailureDetectionEventNotifier || [[#OpenAccessFailureDetectionEventNotifier]]
 
|-
 
|-
| [5.0.0+] 0x2C || 0x8000000000100008<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanOpenSystemDataUpdateEventNotifier || [[#OpenSystemDataUpdateEventNotifier]]
+
| [6.0.0+] 0x31 || 0x8000000100000000 || CanGetAccessFailureDetectionEvent || GetAccessFailureDetectionEvent
 
|-
 
|-
| [5.0.0+] 0x2D || 0x8000000000010000<br/>([1.0.0-5.1.0] 0x0000000080000001) || CanNotifySystemDataUpdateEvent || [[#NotifySystemDataUpdateEvent]]
+
| [6.0.0+] 0x32 || 0x8000000100000000 || CanIsAccessFailureDetected || IsAccessFailureDetected
 
|-
 
|-
| [5.0.0+] 0x2E || 0x8000000100000000<br/>([1.0.0-5.1.0] 0x8000000040000000) || CanOpenAccessFailureDetectionEventNotifier || [[#OpenAccessFailureResolver]]
+
| [6.0.0+] 0x33 || 0x8000000100000000<br/>([6.0.0-8.1.0] 0x8000000040000000) || CanResolveAccessFailure || ResolveAccessFailure
 
|-
 
|-
| [5.0.0+] 0x2F || 0x8000000100000000<br/>([1.0.0-5.1.0] 0x8000000080200000) || CanGetAccessFailureDetectionEvent || [[#GetAccessFailureDetectionEvent]]
+
| [6.0.0+] 0x34 || 0x8000000100000000<br/>([6.0.0-8.1.0] 0x8000000200000020) || CanAbandonAccessFailure || AbandonAccessFailure
 
|-
 
|-
| [5.1.0+] 0x30 || 0x8000000100000000<br/>([1.0.0-5.1.0] 0x8000000080080000) || CanIsAccessFailureDetected || [[#IsAccessFailureDetected]]
+
| [6.0.0+] 0x35 || 0x8000000040000000<br/>([6.0.0-8.1.0] 0x8000000000200000) || CanQuerySaveDataInternalStorageTotalSize || QuerySaveDataInternalStorageTotalSize
 
|-
 
|-
| [6.0.0+] 0x31 || 0x8000000100000000 || CanResolveAccessFailure || [[#ResolveAccessFailure]]
+
| [6.0.0+] 0x36 || 0x8000000200000020<br/>([6.0.0-8.1.0] 0x4000000000000000) || CanGetSaveDataCommitId || [[#GetSaveDataCommitId]]
 
|-
 
|-
| [6.0.0+] 0x32 || 0x8000000100000000 || CanAbandonAccessFailure || [[#AbandonAccessFailure]]
+
| [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+] 0x33 || 0x8000000040000000 || CanQuerySaveDataInternalStorageTotalSize || [[#QuerySaveDataInternalStorageTotalSize]]
+
| [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
 
|-
 
|-
| [6.0.0+] 0x34 || 0x8000000200000020 || CanGetSaveDataCommitId || [[#GetSaveDataCommitId]]
+
| [8.0.0+] 0x39 || 0x8000000000000000<br/>([8.0.0-8.1.0] 0x8000000000000010) || CanCreateSaveDataWithHashSalt || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]
 
|-
 
|-
| [6.0.0+] 0x35 || 0x8000000000200000 || CanSetSdCardAccessibility || [[#SetSdCardAccessibility]]
+
| [9.0.0+] 0x3A || 0x8000000400000000 || CanRegisterProgramIndexMapInfo || RegisterProgramIndexMapInfo
 
|-
 
|-
| [6.0.0+] 0x36 || 0x4000000000000000 || CanSimulateGameCardDetectionEvent || SimulateGameCardDetectionEvent, SetSimulationEvent, ClearSimulationEvent
+
| [9.0.0+] 0x3B || 0x8000000000000010 || CanChallengeCardExistence || ChallengeCardExistence
 
|-
 
|-
| [6.0.0+] 0x37 || 0x8000000000000000<br/>([6.0.0-6.2.0] 0x8000000000080000) || CanSetDataStorageRedirectTarget || SetDataStorageRedirectTarget
+
| [9.0.0+] 0x3C || 0x8000000800000000 || CanCreateOwnSaveData || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt
 
|-
 
|-
| [6.0.0+] 0x38 || 0x8000000400000000<br/>([6.0.0-6.2.0] 0x8000000000000000) || || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemByHashSalt
+
| [9.0.0+] 0x3D || 0x8000000800000000 || CanReadOwnSaveDataFileSystemExtraData || [[#ReadSaveDataFileSystemExtraData]]
 
|-
 
|-
| [8.0.0+] 0x39 || 0x8000000000000010 || CanChallengeCardExistence || ChallengeCardExistence
+
| [9.0.0+] 0x3E || 0x8000000800000000 || CanExtendOwnSaveData || ExtendSaveDataFileSystem
 +
|-
 +
| [9.0.0+] 0x3F || 0x8000000800000000 || CanOpenOwnSaveDataTransferProhibiter || [[#OpenSaveDataTransferProhibiter]]
 +
|-
 +
| [9.0.0+] 0x40 || 0x8000000800000000 || CanFindOwnSaveDataWithFilter || [[#FindSaveDataWithFilter]]
 
|}
 
|}
    
== OpenFileSystem ==
 
== OpenFileSystem ==
Takes a type-0x19 input buffer (ContentPath) and a [[#FileSystemType]] as parameters. Returns an [[#IFileSystem]].
+
Takes a type-0x19 input [[#ContentPath]] and a [[#FileSystemProxyType]] as parameters. Returns an [[#IFileSystem]].
    
[2.0.0+] This function was removed.
 
[2.0.0+] This function was removed.
Line 502: Line 535:     
== OpenFileSystemWithPatch ==
 
== OpenFileSystemWithPatch ==
Takes an input [[#FileSystemType]] and an u64 title-id. Returns an [[#IFileSystem]].
+
Takes an input [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
   −
Web-applet loads the [[#FileSystemType]] (which must be '''ContentManual''') from u32_table[inparam].
+
Web-applet loads the [[#FileSystemProxyType]] (which must be '''Manual''') from u32_table[inparam].
    
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
 
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
    
== OpenFileSystemWithId ==
 
== OpenFileSystemWithId ==
Takes a type-0x19 input buffer, an [[#FileSystemType]] and an u64 title-id. Returns an [[#IFileSystem]].
+
Takes a type-0x19 input buffer, an [[#FileSystemProxyType]] and an u64 title-id. Returns an [[#IFileSystem]].
   −
The [[#IFileSystem]] must be '''ContentMeta''' if the NCA type is 0 (control).
+
The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.
    
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
 
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
Line 517: Line 550:  
May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn't inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.
 
May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn't inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.
   −
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemType]] '''ApplicationPackage'''.
+
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.
   −
After the [[#FileSystemType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.
+
After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.
   −
When [[#FileSystemType]] is '''ContentMeta''', it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it's compared with the NCA titleID, then an error is thrown on mismatch.
+
When [[#FileSystemProxyType]] is '''Meta''', it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it's compared with the NCA [[NCM_services#ProgramId|ProgramId]], then an error is thrown on mismatch.
    
== OpenBisFileSystem ==
 
== OpenBisFileSystem ==
Takes a type-0x19 input buffer string and a u32 [[Flash_Filesystem|Bis partitionID]]. Official user-process code sets instr[0] = 0 normally. Returns an [[#IFileSystem]].
+
Takes a type-0x19 input buffer string and a [[#BisPartitionId]]. Official user-process code sets instr[0] = 0 normally. Returns an [[#IFileSystem]].
    
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisStorage]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.
 
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisStorage]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.
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 [[NCM_services#DataId|DataId]].
    
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 683: Line 778:  
There are two main implementations of this interface:
 
There are two main implementations of this interface:
   −
* '''RomFS''': Filesystem implementation statically linked in the binary. Uses an [[#IStorage]] interface as underlying raw device.
+
* '''nn::fs::fsa::IFileSystem''': The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface.
* '''IPC proxy''': Used for all non-RomFS filesystems. In this case, actual filesystem implementation is in the FS process.
+
* '''nn::fssrv::sf::IFileSystem''': Used for sending an IFileSystem over IPC. Not used outside of IPC code.
 +
 
 +
There are two adapter classes to convert between these interfaces:
 +
 
 +
* '''nn::fssrv::detail::FileSystemInterfaceAdapter''': Allows access to an nn::fs::fsa::IFileSystem via the nn::fssrv::sf::IFileSystem interface.
 +
* '''nn::fs::detail::FileSystemServiceObjectAdapter''': Allows access to an nn::fssrv::sf::IFileSystem via the nn::fs::fsa::IFileSystem interface.
 +
 
 +
When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC.
 +
Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it.
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 877: Line 980:  
| 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 992:  
| 205 || GetGameCardAttribute
 
| 205 || GetGameCardAttribute
 
|-
 
|-
| 206 || GetGameCardDeviceCertificate
+
| 206 || [[#GetGameCardDeviceCertificate]]
 
|-
 
|-
 
| 207 || GetGameCardAsicInfo
 
| 207 || GetGameCardAsicInfo
Line 895: Line 998:  
| 208 || GetGameCardIdSet
 
| 208 || GetGameCardIdSet
 
|-
 
|-
| 209 || WriteToGameCard
+
| 209 || WriteToGameCardDirectly
 
|-
 
|-
 
| 210 || SetVerifyWriteEnalbleFlag
 
| 210 || SetVerifyWriteEnalbleFlag
Line 915: Line 1,018:  
| 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,030:  
| 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 ==
Returns a titleID and the title-version for it.
+
Returns a [[NCM_services#ProgramId|ProgramId]] and the title-version for it.
    
* Output u32 with ARMS-gamecard: title-version v131162. This is the title-version for [[2.1.0]], which is the sysupdate included with this gamecard. Launch-day gamecards return title-version v450.
 
* Output u32 with ARMS-gamecard: title-version v131162. This is the title-version for [[2.1.0]], which is the sysupdate included with this gamecard. Launch-day gamecards return title-version v450.
* Output u64 with ARMS-gamecard: titleID 0100000000000816.
+
* Output u64 with ARMS-gamecard: [[NCM_services#ProgramId|ProgramId]] 0100000000000816.
 +
 
 +
[[NS_Services|NS]] appears to only use this with [[NCM_services|NCM]] 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.
   −
= IEventNotifier =
+
== ChallengeCardExistence ==
This is "nn::fssrv::sf::IEventNotifier".
+
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 =
 +
This is "nn::fssrv::sf::IEventNotifier".
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 947: Line 1,078:  
! 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,101:  
| 64 || [[#OpenSaveDataImporter]]
 
| 64 || [[#OpenSaveDataImporter]]
 
|}
 
|}
  −
This was added with [[4.0.0]].
      
== GetChallenge ==
 
== GetChallenge ==
Line 980: Line 1,114:  
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]].
   −
= ISaveDataExporter =
+
= ISaveDataTransferManagerForSaveDataRepair =
This is "nn::fssrv::sf::ISaveDataExporter".
+
This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair".
 +
 
 +
This was added with [[9.0.0]].
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 987: Line 1,123:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#Initialize]]
+
| 0 || [[#GetChallenge]]
 
|-
 
|-
| 1 || [[#GetRestSize]]
+
| 16 || [[#SetKeyPackage]]
 +
|-
 +
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]
 +
|-
 +
| 81 || [[#PrepareOpenSaveDataImporter]]
 +
|-
 +
| 90 || [[#OpenSaveDataImporter]]
 +
|-
 +
| 91 || [[#OpenSaveDataImporter2]]
 
|-
 
|-
| 16 || [[#Pull]]
+
| 100 || [[#OpenSaveDataExporterWithKey]]
 
|-
 
|-
| 17 || [[#PullInitialData]]
+
| 110 || [[#OpenSaveDataImporterWithKey]]
 
|}
 
|}
   −
This was added with [[4.0.0]].
+
== SetKeyPackage ==
 +
No input/output, takes a type-0x5 input buffer.
   −
== Initialize ==
+
== 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 =
 +
This is "nn::fssrv::sf::ISaveDataExporter".
 +
 
 +
This was added with [[4.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#GetSaveDataInfo]]
 +
|-
 +
| 1 || [[#GetRestSize]]
 +
|-
 +
| 16 || [[#Pull]]
 +
|-
 +
| 17 || [[#PullInitialData]]
 +
|}
 +
 
 +
== 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,195:  
= 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,202:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || [[#Initialize]]
+
| 0 || [[#GetSaveDataInfo]]
 
|-
 
|-
 
| 1 || [[#GetRestSize]]
 
| 1 || [[#GetRestSize]]
Line 1,028: Line 1,211:  
|}
 
|}
   −
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,227:  
= 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,238:  
| 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
 
|-
 
|-
| 65 || [[#OpenSaveDataDiffImporter]]
+
| [6.0.0+] [[#OpenSaveDataImporterDeprecated]]
 
|-
 
|-
| 66 || [6.0.0+] [[#OpenSaveDataDuplicateDiffImporter]]
+
| 65 || [[#OpenSaveDataImporterForDiffImport]]
 +
|-
 +
| 66 || [6.0.0+] [[#OpenSaveDataImporterForDuplicateDiffImport]]
 
|-
 
|-
 
| 67 || [6.0.0+] [[#OpenSaveDataImporter]]
 
| 67 || [6.0.0+] [[#OpenSaveDataImporter]]
Line 1,073: Line 1,258:  
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
 
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
 
|}
 
|}
  −
This was added with [[5.0.0]].
      
== GetChallenge ==
 
== GetChallenge ==
Line 1,082: Line 1,265:  
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,274:  
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,294:  
= 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,301:  
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || SetDivisionCount (Takes an input u32, no output)
+
| 0 || [[#SetDivisionCount]]
 +
|-
 +
| 1 || [6.0.0+] [[#GetSaveDataInfo]]
 
|-
 
|-
| 1 || [6.0.0+] GetSaveDataInfo (No input/output, takes a type-0x6 output buffer)
+
| 16 || [[#OpenSaveDataDiffChunkIterator]]
 
|-
 
|-
| 16 || OpenSaveDataDiffChunkIterator (No input, returns an [[#ISaveDataChunkIterator]])
+
| 48 || [[#OpenSaveDataChunkExporter]]
 
|-
 
|-
| 48 || OpenSaveDataChunkExporter (Takes an input u32, returns an [[#ISaveDataChunkExporter]])
+
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
 
|-
 
|-
| 64 || [6.0.0+] FinalizeFullExport (No input, returns two 0x10-byte output structs)
+
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
 
|-
 
|-
| 65 || [6.0.0+] FinalizeDiffExport (No input, returns an output 0x10-byte struct)
+
| 66 || [6.0.0+] [[#CancelExport]]
 
|-
 
|-
| 66 || [6.0.0+] CancelExport (No input/output)
+
| 67 || [6.0.0+] [[#SuspendExport]]
 
|-
 
|-
| 67 || [6.0.0+] SuspendExport (No input/output, takes a type-0x6 output buffer)
+
| 70 || [6.0.0+] [[#GetKeySeed]]
 
|-
 
|-
| 70 || [6.0.0+] GetKeySeed (No input, returns an output 0x10-byte struct)
+
| 71 || [6.0.0+] [[#GetInitialDataMac]]
 
|-
 
|-
| 71 || [6.0.0+] GetInitialDataMac (No input, returns an output 0x10-byte struct)
+
| 72 || [6.0.0+] [[#FinalizeExport]]
 
|-
 
|-
| 72 || [6.0.0+] FinalizeExport (No input/output)
+
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
 
|-
 
|-
| 80 || [6.0.0+] GetImportInitialDataAad (No input, returns an output 0x20-byte struct)
+
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
 
|-
 
|-
| 81 || [6.0.0+] SetExportInitialDataAad (Takes an input 0x20-byte struct, no output)
+
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
 
|-
 
|-
| 96 || [6.0.0+] GetReportInfo (No input, returns an output 0x20-byte struct)
+
| 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,371:  
! 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,431:  
! 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,456:  
! 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,476:  
! 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,488:     
= 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.
 +
 
 +
= FileSystemProxyType =
 +
This is "nn::fs::FileSystemProxyType".
   −
= FileSystemType =
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
 
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || Invalid
+
| 0 || Code
 
|-
 
|-
| 1 || Invalid
+
| 1 || Rom
 
|-
 
|-
 
| 2 || Logo
 
| 2 || Logo
 
|-
 
|-
| 3 || ContentControl
+
| 3 || Control
 
|-
 
|-
| 4 || ContentManual
+
| 4 || Manual
 
|-
 
|-
| 5 || ContentMeta
+
| 5 || Meta
 
|-
 
|-
| 6 || ContentData
+
| 6 || Data
 
|-
 
|-
| 7 || ApplicationPackage
+
| 7 || Package
 +
|-
 +
| 8 || [4.0.0+] RegisteredUpdate
 
|}
 
|}
   −
= StorageId =
+
= ContentType =
 +
This is "nn::fs::ContentType".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
 
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || None
+
| 0 || Meta
 
|-
 
|-
| 1 || Host
+
| 1 || Control
 
|-
 
|-
| 2 || GameCard
+
| 2 || Manual
 
|-
 
|-
| 3 || NandSystem
+
| 3 || Logo
 
|-
 
|-
| 4 || NandUser
+
| 4 || Data
|-
  −
| 5 || SdCard
   
|}
 
|}
   Line 1,303: Line 1,575:  
|-
 
|-
 
| 2 || SdSystem
 
| 2 || SdSystem
 +
|-
 +
| 3 || [3.0.0+] Temporary
 +
|-
 +
| 4 || [4.0.0+] SdUser
 
|-
 
|-
 
| 100 || [3.0.0+] ProperSystem
 
| 100 || [3.0.0+] ProperSystem
 +
|-
 +
| 101 || [3.0.0+] SafeMode
 
|}
 
|}
   Line 1,310: Line 1,588:     
= SaveDataType =
 
= SaveDataType =
 +
This is "nn::fs::SaveDataType".
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
 
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || SystemSaveData
+
| 0 || System
 
|-
 
|-
| 1 || SaveData
+
| 1 || Account
 
|-
 
|-
| 2 || BcatDeliveryCacheStorage
+
| 2 || Bcat
 
|-
 
|-
| 3 || DeviceSaveData
+
| 3 || Device
 
|-
 
|-
| 4 || [3.0.0+] TemporaryStorage
+
| 4 || [3.0.0+] Temporary
 
|-
 
|-
| 5 || [3.0.0+] CacheStorage
+
| 5 || [3.0.0+] Cache
|}
+
|-
 
+
| 6 || [4.0.0+] SystemBcat
= ImageDirectoryId =
+
|}
This is "nn::fs::ImageDirectoryId".
+
 
 
+
= SaveDataRank =
{| class="wikitable" border="1"
+
This is "nn::fs::SaveDataRank".
|-
+
 
! Value || Name
+
{| class="wikitable" border="1"
|-
+
|-
| 0 || Nand
+
! Value || Name
|-
+
|-
| 1 || SdCard
+
| 0 || Primary
|}
+
|-
 
+
| 1 || Secondary
= CloudBackupWorkStorageId =
+
|}
{| class="wikitable" border="1"
+
 
|-
+
= SaveDataEnumerateOption =
! Value || Name
+
This is "nn::fs::SaveDataEnumerateOption".
|-
+
 
| 0 || Nand
+
{| class="wikitable" border="1"
|-
+
|-
| 1 || SdCard
+
! Value || Name
|}
+
|-
 
+
| 1 || AllRank
= ContentPath =
+
|}
These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They're passed via X descriptors, and returned via various [[Location Resolver services|ncm/lr]] commands.
+
 
 
+
= SaveDataFlags =
{| class="wikitable" border="1"
+
This is "nn::fs::SaveDataFlags".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || KeepAfterResettingSystemSaveData
 +
|-
 +
| 2 || KeepAfterRefurbishment
 +
|-
 +
| 4 || KeepAfterResettingSystemSaveDataWithoutUserSaveData
 +
|-
 +
| 8 || NeedsSecureDelete
 +
|}
 +
 
 +
= SaveDataMetaType =
 +
This is "nn::fs::SaveDataMetaType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || None
 +
|-
 +
| 1 || Thumbnail
 +
|-
 +
| 2 || ExtensionContext
 +
|}
 +
 
 +
= ImageDirectoryId =
 +
This is "nn::fs::ImageDirectoryId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Nand
 +
|-
 +
| 1 || SdCard
 +
|}
 +
 
 +
= 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"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || System
 +
|-
 +
| 1 || SdCard
 +
|}
 +
 
 +
= Priority =
 +
This is "nn::fs::Priority".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Realtime
 +
|-
 +
| 1 || Normal
 +
|-
 +
| 2 || Low
 +
|}
 +
 
 +
= PriorityRaw =
 +
This is "nn::fs::PriorityRaw".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Realtime
 +
|-
 +
| 1 || Normal
 +
|-
 +
| 2 || Low
 +
|-
 +
| 3 || Background
 +
|}
 +
 
 +
= AbortSpecifier =
 +
This is "nn::fs::AbortSpecifier".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Default
 +
|-
 +
| 1 || Abort
 +
|-
 +
| 2 || ReturnResult
 +
|}
 +
 
 +
= OperationId =
 +
This is "nn::fs::OperationId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Clear
 +
|-
 +
| 1 || ClearSignature
 +
|-
 +
| 2 || InvalidateCache
 +
|-
 +
| 3 || QueryRange
 +
|}
 +
 
 +
= MountHostOption =
 +
This is "nn::fs::MountHostOption".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || PseudoCaseSensitive
 +
|}
 +
 
 +
= BisPartitionId =
 +
This is "nn::fs::BisPartitionId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || BootPartition1Root
 +
|-
 +
| 10 || BootPartition2Root
 +
|-
 +
| 20 || UserDataRoot
 +
|-
 +
| 21 || BootConfigAndPackage2Part1
 +
|-
 +
| 22 || BootConfigAndPackage2Part2
 +
|-
 +
| 23 || BootConfigAndPackage2Part3
 +
|-
 +
| 24 || BootConfigAndPackage2Part4
 +
|-
 +
| 25 || BootConfigAndPackage2Part5
 +
|-
 +
| 26 || BootConfigAndPackage2Part6
 +
|-
 +
| 27 || CalibrationBinary
 +
|-
 +
| 28 || CalibrationFile
 +
|-
 +
| 29 || SafeMode
 +
|-
 +
| 30 || User
 +
|-
 +
| 31 || System
 +
|-
 +
| 32 || SystemProperEncryption
 +
|-
 +
| 33 || SystemProperPartition
 +
|-
 +
| 34 || SignedSystemPartitionOnSafeMode
 +
|}
 +
 
 +
= MmcSpeedMode =
 +
This is "nn::fs::MmcSpeedMode".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Identification
 +
|-
 +
| 1 || LegacySpeed
 +
|-
 +
| 2 || HighSpeed
 +
|-
 +
| 3 || Hs200
 +
|-
 +
| 4 || Hs400
 +
|-
 +
| 5 || Unknown
 +
|}
 +
 
 +
= MmcPartition =
 +
This is "nn::fs::MmcPartition".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || UserData
 +
|-
 +
| 1 || BootPartition1
 +
|-
 +
| 2 || BootPartition2
 +
|}
 +
 
 +
= GameCardPartition =
 +
This is "nn::fs::GameCardPartition".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Update
 +
|-
 +
| 1 || Normal
 +
|-
 +
| 2 || Secure
 +
|-
 +
| 3 || [4.0.0+] Logo
 +
|}
 +
 
 +
= GameCardPartitionRaw =
 +
This is "nn::fs::GameCardPartitionRaw".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || NormalReadOnly
 +
|-
 +
| 1 || SecureReadOnly
 +
|-
 +
| 2 || RootWriteOnly
 +
|}
 +
 
 +
= GameCardAttribute =
 +
This is "nn::fs::GameCardAttribute".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || AutoBootFlag
 +
|-
 +
| 2 || HistoryEraseFlag
 +
|-
 +
| 4 || [4.0.0+] RepairToolFlag
 +
|-
 +
| 8 || [9.0.0+] DifferentRegionCupToTerraDeviceFlag
 +
|-
 +
| 16 || [9.0.0+] DifferentRegionCupToGlobalDeviceFlag
 +
|}
 +
 
 +
= GameCardSize =
 +
This is "nn::fs::GameCardSize".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || Size1GB
 +
|-
 +
| 2 || Size2GB
 +
|-
 +
| 4 || Size4GB
 +
|-
 +
| 8 || Size8GB
 +
|-
 +
| 16 || Size16GB
 +
|-
 +
| 32 || Size32GB
 +
|}
 +
 
 +
= GameCardClockRate =
 +
This is "nn::fs::GameCardClockRate".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 25 || ClockRate25MHz
 +
|-
 +
| 50 || ClockRate50MHz
 +
|}
 +
 
 +
= SimulatingDeviceType =
 +
This is "nn::fs::SimulatingDeviceType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || eMMC
 +
|-
 +
| 1 || SdCard
 +
|-
 +
| 2 || GameCard
 +
|}
 +
 
 +
= SimulatingDeviceDetectionMode =
 +
This is "nn::fs::SimulatingDeviceDetectionMode".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || NoSimulation
 +
|-
 +
| 1 || DeviceAttached
 +
|-
 +
| 2 || DeviceRemoved
 +
|}
 +
 
 +
= SimulatingDeviceAccessFailureEventType =
 +
This is "nn::fs::SimulatingDeviceAccessFailureEventType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || None
 +
|-
 +
| 1 || AccessTimeoutFailure
 +
|-
 +
| 2 || AccessFailure
 +
|-
 +
| 3 || DataCorruption
 +
|}
 +
 
 +
= SimulatingDeviceTargetOperation =
 +
This is "nn::fs::SimulatingDeviceTargetOperation".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || Read
 +
|-
 +
| 2 || Write
 +
|}
 +
 
 +
= SpeedEmulationMode =
 +
This is "nn::fs::SpeedEmulationMode".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || None
 +
|-
 +
| 1 || Faster
 +
|-
 +
| 2 || Slower
 +
|-
 +
| 3 || Random
 +
|}
 +
 
 +
= ContentPath =
 +
These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They're passed via X descriptors, and returned via various [[Location Resolver services|ncm/lr]] commands.
 +
 
 +
{| class="wikitable" border="1"
 
|-
 
|-
 
! Path || Notes
 
! Path || Notes
Line 1,376: Line 2,022:  
| @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 2,029:  
|}
 
|}
   −
= Save Struct =
+
= SaveDataAttribute =
 +
This is "nn::fs::SaveDataAttribute".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 1,392: Line 2,040:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| 0 for SystemSaveData. SaveData: 0 can be used for accessing the savedata associated with the current FS session titleID, otherwise when set this is the titleID associated with the savedata to access.
+
| [[NCM_services#ApplicationId|ApplicationId]] (0 for SystemSaveData)</br>SaveData: 0 can be used for accessing the savedata associated with the current FS session [[NCM_services#ApplicationId|ApplicationId]], otherwise when set this is the [[NCM_services#ApplicationId|ApplicationId]] associated with the savedata to access.
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x10
 
| 0x10
| userID for user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].
+
| UserId</br>For user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| u64 [[Flash_Filesystem|saveID]]. 0 for SaveData.
+
| [[Flash_Filesystem|SystemSaveDataId]] (0 for SaveData)
 
|-
 
|-
 
| 0x20
 
| 0x20
Line 1,408: Line 2,056:  
| 0x21
 
| 0x21
 
| 0x1
 
| 0x1
| Save data 'rank' or 'precedence'. 0 if this save data is considered the primary save data. 1 if it's considered the secondary save data.
+
| [[#SaveDataRank]]
 
|-
 
|-
 
| 0x22
 
| 0x22
 
| 0x2
 
| 0x2
| Save data index
+
| SaveDataIndex
 
|-
 
|-
 
| 0x24
 
| 0x24
Line 1,435: Line 2,083:  
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,444: Line 2,094:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| [[Savegames|IVFC]] level4 size?
+
| SaveDataSize
 
|-
 
|-
 
| 0x8
 
| 0x8
 
| 0x8
 
| 0x8
| Same as offset 0x0 normally? Hard-coded to 0x80000 for BcatSaveData.
+
| JournalSize
 
|-
 
|-
 
| 0x10
 
| 0x10
 
| 0x8
 
| 0x8
| 0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData. [[Savegames|IVFC]] level4 block-size in bytes?
+
| AvailableSize</br>0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData.
 
|-
 
|-
 
| 0x18
 
| 0x18
 
| 0x8
 
| 0x8
| Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[Title_list|titleID]] of the bcat-sysmodule.
+
| OwnerId</br>Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[NCM_services#ProgramId|ProgramId]] of the bcat-sysmodule.
 
|-
 
|-
 
| 0x20
 
| 0x20
 
| 0x4
 
| 0x4
| Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.
+
| [[#SaveDataFlags]]</br>Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.
 
|-
 
|-
 
| 0x24
 
| 0x24
 
| 0x1
 
| 0x1
| Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.
+
| [[#SaveDataSpaceId]]</br>Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.
 
|-
 
|-
 
| 0x25
 
| 0x25
 
| 0x1
 
| 0x1
| 0 for SystemSaveData/SaveData.
+
| Unknown. 0 for SystemSaveData/SaveData.
 
|-
 
|-
 
| 0x26
 
| 0x26
Line 1,478: Line 2,128:     
= 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 [[NCM_services#ApplicationId|ApplicationId]] field is set to <input ApplicationId>. 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.
    
= SaveDataInfo =
 
= SaveDataInfo =
 +
This is "nn::fs::SaveDataInfo".
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 1,494: Line 2,146:  
| 0x0
 
| 0x0
 
| 0x8
 
| 0x8
| Unknown saveID
+
| SaveDataId
 
|-
 
|-
 
| 0x8
 
| 0x8
Line 1,510: Line 2,162:  
| 0x10
 
| 0x10
 
| 0x10
 
| 0x10
| userID
+
| UserId
 
|-
 
|-
 
| 0x20
 
| 0x20
 
| 0x8
 
| 0x8
| saveID, 0 for regular SaveData.
+
| SystemSaveDataId (0 for regular SaveData)
 
|-
 
|-
 
| 0x28
 
| 0x28
 
| 0x8
 
| 0x8
| Application titleID, for regular SaveData.
+
| [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData)
 
|-
 
|-
 
| 0x30
 
| 0x30
Line 1,526: Line 2,178:  
| 0x38
 
| 0x38
 
| 0x2
 
| 0x2
| Save data index
+
| SaveDataIndex
 
|-
 
|-
 
| 0x3A
 
| 0x3A
 
| 0x1
 
| 0x1
| Save data 'rank' or 'precedence'. 0 if this save data is considered the primary save data. 1 if it's considered the secondary save data.
+
| [[#SaveDataRank]]
 
|-
 
|-
 
| 0x3B
 
| 0x3B

Navigation menu