Changes

Jump to navigation Jump to search
no edit summary
Line 1: Line 1:  
= fsp-ldr =
 
= fsp-ldr =
 +
This is "nn::fssrv::sf::IFileSystemProxyForLoader".
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name || Arguments || Notes
+
! Cmd || Name
 
|-
 
|-
| 0 || MountCode || u64 TID + X descriptor [[#ContentPath]] || Returns an [[#IFileSystem]].
+
| 0 || [[#OpenCodeFileSystem]]
 
|-
 
|-
| 1 || IsCodeMounted || u64 PID || Returns a bool (1 if code is mounted).
+
| 1 || [[#IsArchivedProgram]]
 +
|-
 +
| 2 || [4.0.0+] [[#SetCurrentProcess]]
 
|}
 
|}
 +
 +
== OpenCodeFileSystem ==
 +
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].
 +
 +
[10.0.0+] This now takes an additional type-0x1A output buffer.
 +
 +
[16.0.0+] This now takes an additional input [[#ContentAttributes]].
 +
 +
[17.0.0+] This now takes a type-0x6 output buffer instead of a type-0x1A output buffer.
 +
 +
== IsArchivedProgram ==
 +
Takes an input u64 ProcessId. Returns a bool (1 if the process id's [[#FspPath]] ends in ".nca").
 +
 +
== SetCurrentProcess ==
 +
Takes an input u64 ProcessId. No output.
    
= fsp-pr =
 
= fsp-pr =
 +
This is "nn::fssrv::sf::IProgramRegistry".
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name || Notes
+
! Cmd || Name
 +
|-
 +
| 0 || [[#RegisterProgram]]
 
|-
 
|-
| 0 || [[#SetFsPermissions]] ||
+
| 1 || [[#UnregisterProgram]]
 
|-
 
|-
| 1 || [[#ClearFsPermissions]] ||
+
| 2 || [4.0.0+] [[#SetCurrentProcess]]
 
|-
 
|-
| 256 || [[#SetEnabledProgramVerification]] ||
+
| 256 || [1.0.0-9.2.0] [[#SetEnabledProgramVerification]]
 
|}
 
|}
   −
== SetFsPermissions ==
+
== RegisterProgram ==
Takes a storageID, a pid, a titleID and two type-A buffers. One contains ACI0 contents, other one contains ACID contents.
+
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.
   −
== ClearFsPermissions ==
+
== UnregisterProgram ==
 
Takes a pid. Removes registered FS permissions for that PID.
 
Takes a pid. Removes registered FS permissions for that PID.
   Line 32: Line 55:  
Seems to sets a global flag to inputval & 1.
 
Seems to sets a global flag to inputval & 1.
   −
When the flag is zero, it will set ret=0 instead of ret={error} when verifying a RSA signature fails. This RSA signature seems to be the signature in the [[NPDM]] ACID. It then skips verifying what seems to be the second signature in the [[NCA_Format|NCA header]]. Note that if verifying the NPDM(?) signature is successful, and verifying that second signature fails, it will throw an error and abort.
+
When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.
 +
 
 +
[10.0.0+] This was moved to [[Loader_services|Loader]].
    
= fsp-srv =
 
= fsp-srv =
 +
This is "nn::fssrv::sf::IFileSystemProxy".
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Cmd || Name || Required permissions-type and func
+
! Cmd || Name
 +
|-
 +
| 0 || [1.0.0] [[#OpenFileSystem]]
 +
|-
 +
| 1 || [[#SetCurrentProcess]]
 +
|-
 +
| 2 || OpenDataFileSystemByCurrentProcess
 +
|-
 +
| 7 || [2.0.0+] [[#OpenFileSystemWithPatch]]
 +
|-
 +
| 8 || [16.0.0+] [[#OpenFileSystemWithIdObsolete]] ([2.0.0-15.0.1] OpenFileSystemWithId)
 +
|-
 +
| 9 || [3.0.0+] OpenDataFileSystemByProgramId
 +
|-
 +
| 10 || [16.0.0+] [[#OpenFileSystemWithId]]
 +
|-
 +
| 11 || [[#OpenBisFileSystem]]
 +
|-
 +
| 12 || [[#OpenBisStorage]]
 +
|-
 +
| 13 || InvalidateBisCache
 +
|-
 +
| 17 || OpenHostFileSystem
 +
|-
 +
| 18 || OpenSdCardFileSystem
 +
|-
 +
| 19 || [2.0.0+] FormatSdCardFileSystem
 +
|-
 +
| 21 || [[#DeleteSaveDataFileSystem]]
 +
|-
 +
| 22 || [[#CreateSaveDataFileSystem]]
 +
|-
 +
| 23 || [[#CreateSaveDataFileSystemBySystemSaveDataId]]
 +
|-
 +
| 24 || RegisterSaveDataFileSystemAtomicDeletion
 +
|-
 +
| 25 || [2.0.0+] DeleteSaveDataFileSystemBySaveDataSpaceId
 +
|-
 +
| 26 || [2.0.0+] FormatSdCardDryRun
 +
|-
 +
| 27 || [2.0.0+] IsExFatSupported
 +
|-
 +
| 28 || [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute
 +
|-
 +
| 30 || [[#OpenGameCardStorage]]
 +
|-
 +
| 31 || [[#OpenGameCardFileSystem]]
 +
|-
 +
| 32 || [3.0.0+] ExtendSaveDataFileSystem
 +
|-
 +
| 33 || [5.0.0+] DeleteCacheStorage
 +
|-
 +
| 34 || [5.0.0+] GetCacheStorageSize
 +
|-
 +
| 35 || [6.0.0+] [[#CreateSaveDataFileSystemWithHashSalt]]
 +
|-
 +
| 36 || [9.0.0+] OpenHostFileSystemWithOption
 +
|-
 +
| 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2
 +
|-
 +
| 51 || [[#OpenSaveDataFileSystem]]
 +
|-
 +
| 52 || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
 +
|-
 +
| 53 || [2.0.0+] [[#OpenReadOnlySaveDataFileSystem]]
 +
|-
 +
| 57 || [3.0.0+] [[#ReadSaveDataFileSystemExtraDataBySaveDataSpaceId]]
 +
|-
 +
| 58 || [[#ReadSaveDataFileSystemExtraData]]
 +
|-
 +
| 59 || [2.0.0+] WriteSaveDataFileSystemExtraData
 +
|-
 +
| 60 || [[#OpenSaveDataInfoReader]]
 +
|-
 +
| 61 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]]
 +
|-
 +
| 62 || [5.0.0+] OpenSaveDataInfoReaderOnlyCacheStorage
 +
|-
 +
| 64 || [5.0.0+] OpenSaveDataInternalStorageFileSystem
 +
|-
 +
| 65 || [5.0.0+] UpdateSaveDataMacForDebug
 
|-
 
|-
| 0 || [1.0.0] [[#MountContent]] ||
+
| 66 || [5.0.0+] WriteSaveDataFileSystemExtraDataWithMask
 
|-
 
|-
| 1 || [[#Initialize]] ||
+
| 67 || [6.0.0+] [[#FindSaveDataWithFilter]]
 
|-
 
|-
| 2 || OpenDataFileSystemByCurrentProcess ||  
+
| 68 || [6.0.0+] [[#OpenSaveDataInfoReaderWithFilter]]
 
|-
 
|-
| 7 || [2.0.0+] [[#MountContent7]] ||
+
| 69 || [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute
 
|-
 
|-
| 8 || [2.0.0+] [[#MountContent]] || Depends on input.
+
| 70 || [8.0.0+] WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute
 
|-
 
|-
| 9 || [3.0.0+] OpenDataFileSystemByApplicationId ||
+
| 71 || [10.0.0+] ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute
 
|-
 
|-
| 11 || [[#MountBis]] ||  
+
| 80 || OpenSaveDataMetaFile
 
|-
 
|-
| 12 || [[#OpenBisPartition]] ||
+
| 81 || [4.0.0+] [[#OpenSaveDataTransferManager]]
 
|-
 
|-
| 13 || InvalidateBisCache ||  
+
| 82 || [5.0.0+] [[#OpenSaveDataTransferManagerVersion2]]
 
|-
 
|-
| 17 || OpenHostFileSystemImpl ||  
+
| 83 || [6.0.0+] [[#OpenSaveDataTransferProhibiter]]
 
|-
 
|-
| 18 || MountSdCard ||  
+
| 84 || [6.0.0+] [[#ListAccessibleSaveDataOwnerId]]
 
|-
 
|-
| 19 || [2.0.0+] FormatSdCard ||
+
| 85 || [9.0.0+] [[#OpenSaveDataTransferManagerForSaveDataRepair]]
 
|-
 
|-
| 21 || [[#DeleteSaveData]] ||
+
| 86 || [10.0.0+] [[#OpenSaveDataMover]]
 
|-
 
|-
| 22 || [[#CreateSaveData]] ||
+
| 87 || [11.0.0+] [[#OpenSaveDataTransferManagerForRepair]]
 
|-
 
|-
| 23 || [[#CreateSystemSaveData]] ||  
+
| 100 || OpenImageDirectoryFileSystem
 
|-
 
|-
| 24 || RegisterSaveDataAtomicDeletion ||  
+
| 101 || [11.0.0+] OpenBaseFileSystem
 
|-
 
|-
| 25 || [2.0.0+] DeleteSaveDataWithSpaceId ||
+
| 102 || [12.0.0+] FormatBaseFileSystem
 
|-
 
|-
| 26 || [2.0.0+] FormatSdCardDryRun ||
+
| 110 || [[#OpenContentStorageFileSystem]]
 
|-
 
|-
| 27 || [2.0.0+] IsExFatSupported ||
+
| 120 || [6.0.0-9.2.0] [[#OpenCloudBackupWorkStorageFileSystem]]
 
|-
 
|-
| 30 || [[#OpenGameCardPartition]] ||
+
| 130 || [7.0.0+] [[#OpenCustomStorageFileSystem]]
 
|-
 
|-
| 31 || [[#MountGameCardPartition]] ||  
+
| 200 || OpenDataStorageByCurrentProcess
 
|-
 
|-
| 32 || [3.0.0+] ExtendSaveData ||
+
| 201 || [3.0.0+] OpenDataStorageByProgramId
 
|-
 
|-
| 51 || [[#MountSaveData]] ||
+
| 202 || [[#OpenDataStorageByDataId]]
 
|-
 
|-
| 52 || [[#MountSystemSaveData]] ||  
+
| 203 || OpenPatchDataStorageByCurrentProcess
 
|-
 
|-
| 53 || [2.0.0+] MountSaveDataReadOnly ||
+
| 204 || [7.0.0+] [[#OpenDataFileSystemWithProgramIndex]]
 
|-
 
|-
| 57 || [3.0.0+] ReadSaveDataFileSystemExtraDataWithSpaceId ||
+
| 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]]
 
|-
 
|-
| 58 || ReadSaveDataFileSystemExtraData ||  
+
| 206 || [13.0.0+] OpenDataStorageByPath
 
|-
 
|-
| 59 || [2.0.0+] WriteSaveDataFileSystemExtraData ||
+
| 207 || [15.0.0+] OpenDataFileSystemByDataId
 
|-
 
|-
| 60 || OpenSaveDataInfoReader ||  
+
| 400 || [[#OpenDeviceOperator]]
 
|-
 
|-
| 61 || OpenSaveDataIterator ||  
+
| 500 || [[#OpenSdCardDetectionEventNotifier]]
 
|-
 
|-
| 80 || OpenSaveDataThumbnailFile ||  
+
| 501 || [[#OpenGameCardDetectionEventNotifier]]
 
|-
 
|-
| 100 || MountImageDirectory ||  
+
| 510 || [5.0.0+] OpenSystemDataUpdateEventNotifier
 
|-
 
|-
| 110 || [[#MountContentStorage]] ||
+
| 511 || [5.0.0+] NotifySystemDataUpdateEvent
 
|-
 
|-
| 200 || OpenDataStorageByCurrentProcess ||  
+
| 520 || [6.0.0+] [[#SimulateDeviceDetectionEvent]]
 
|-
 
|-
| 201 || OpenDataStorageByApplicationId [3.0.0+] ||
+
| 600 || [1.0.0-3.0.2] SetCurrentPosixTime
 
|-
 
|-
| 202 || [[#OpenDataStorageByDataId]] ||  
+
| 601 || QuerySaveDataTotalSize
 
|-
 
|-
| 203 || Returns an [[#IStorage]]. ||
+
| 602 || [[#VerifySaveDataFileSystem]]
 
|-
 
|-
| 400 || [[#OpenDeviceOperator]] ||  
+
| 603 || CorruptSaveDataFileSystem
 
|-
 
|-
| 500 || [[#OpenSdCardDetectionEventNotifier]] ||  
+
| 604 || CreatePaddingFile
 
|-
 
|-
| 501 || [[#OpenGameCardDetectionEventNotifier]] ||  
+
| 605 || DeleteAllPaddingFiles
 
|-
 
|-
| 600 || SetCurrentPosixTime || 0x18, 1
+
| 606 || [2.0.0+] GetRightsId
 
|-
 
|-
| 601 || QuerySaveDataTotalSize ||  
+
| 607 || [2.0.0+] RegisterExternalKey
 
|-
 
|-
| 602 || [[#VerifySaveData]] ||
+
| 608 || [2.0.0+] UnregisterAllExternalKey
 
|-
 
|-
| 603 || CorruptSaveDataForDebug ||  
+
| 609 || [2.0.0-15.0.1] GetRightsIdByPath
 
|-
 
|-
| 604 || CreatePaddingFile ||  
+
| 610 || [3.0.0+] GetRightsIdAndKeyGenerationByPath
 
|-
 
|-
| 605 || DeleteAllPaddingFiles ||  
+
| 611 || [4.0.0+] SetCurrentPosixTimeWithTimeDifference
 
|-
 
|-
| 606 || [2.0.0+] GetRightsId ||
+
| 612 || [4.0.0+] GetFreeSpaceSizeForSaveData
 
|-
 
|-
| 607 || [2.0.0+] RegisterExternalKey || 0x18, 1
+
| 613 || [4.0.0+] VerifySaveDataFileSystemBySaveDataSpaceId
 
|-
 
|-
| 608 || [2.0.0+] UnregisterExternalKey ||
+
| 614 || [4.0.0+] CorruptSaveDataFileSystemBySaveDataSpaceId
 
|-
 
|-
| 609 || [2.0.0+] GetRightsIdByPath ||
+
| 615 || [5.0.0+] QuerySaveDataInternalStorageTotalSize
 
|-
 
|-
| 610 || [3.0.0+] GetRightsIdByPath2 (returns extra byte) ||
+
| 616 || [6.0.0+] [[#GetSaveDataCommitId]]
 
|-
 
|-
| 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]] || 0x19, 1
+
| 617 || [7.0.0+] UnregisterExternalKey
 
|-
 
|-
| 800 || [2.0.0+] GetAndClearFileSystemProxyErrorInfo ||
+
| 618 || [17.0.0+] GetProgramId
 
|-
 
|-
| 1000 || SetBisRootForHost ||  
+
| 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]
 
|-
 
|-
| 1001 || SetSaveDataSize ||  
+
| 630 || [4.0.0+] SetSdCardAccessibility
 
|-
 
|-
| 1002 || SetSaveDataRootPath ||  
+
| 631 || [4.0.0+] IsSdCardAccessible
 
|-
 
|-
| 1003 || DisableAutoSaveDataCreation ||  
+
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid
 
|-
 
|-
| 1004 || [[#SetGlobalAccessLogMode]] || 0x10, 1
+
| 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]]
 
|-
 
|-
| 1005 || [[#GetGlobalAccessLogMode]] || None
+
| 701 || [5.0.0+] GetAccessFailureDetectionEvent
 
|-
 
|-
| 1006 || [[#OutputAccessLogToSdCard]] || None
+
| 702 || [5.0.0+] IsAccessFailureDetected
 +
|-
 +
| 710 || [5.0.0+] ResolveAccessFailure
 +
|-
 +
| 720 || [5.0.0+] AbandonAccessFailure
 +
|-
 +
| 800 || [2.0.0+] GetAndClearErrorInfo
 +
|-
 +
| 810 || [7.0.0+] RegisterProgramIndexMapInfo
 +
|-
 +
| 1000 || [1.0.0-9.2.0] SetBisRootForHost
 +
|-
 +
| 1001 || [[#SetSaveDataSize]]
 +
|-
 +
| 1002 || [[#SetSaveDataRootPath]]
 +
|-
 +
| 1003 || DisableAutoSaveDataCreation
 +
|-
 +
| 1004 || [[#SetGlobalAccessLogMode]]
 +
|-
 +
| 1005 || [[#GetGlobalAccessLogMode]]
 +
|-
 +
| 1006 || [[#OutputAccessLogToSdCard]]
 +
|-
 +
| 1007 || [4.0.0+] RegisterUpdatePartition
 +
|-
 +
| 1008 || [4.0.0+] OpenRegisteredUpdatePartition
 +
|-
 +
| 1009 || [4.0.0+] GetAndClearMemoryReportInfo
 +
|-
 +
| 1010 || [5.1.0-6.2.0] SetDataStorageRedirectTarget
 +
|-
 +
| 1011 || [7.0.0+] [[#GetProgramIndexForAccessLog]]
 +
|-
 +
| 1012 || [9.0.0+] GetFsStackUsage
 +
|-
 +
| 1013 || [9.0.0+] UnsetSaveDataRootPath
 +
|-
 +
| 1014 || [10.0.0-10.2.0] OutputMultiProgramTagAccessLog
 +
|-
 +
| 1016 || [11.0.0+] FlushAccessLogOnSdCard
 +
|-
 +
| 1017 || [11.0.0+] OutputApplicationInfoAccessLog
 +
|-
 +
| 1018 || [13.0.0+] SetDebugOption
 +
|-
 +
| 1019 || [13.0.0+] UnsetDebugOption
 +
|-
 +
| 1020 || [18.0.0+] OpenMemoryStressor
 +
|-
 +
| 1100 || [4.0.0-17.0.1] OverrideSaveDataTransferTokenSignVerificationKey
 +
|-
 +
| 1101 || [18.0.0+] OverrideSaveDataTransferKeyForTest
 +
|-
 +
| 1110 || [6.0.0+] CorruptSaveDataFileSystemByOffset
 +
|-
 +
| 1200 || [6.0.0+] [[#OpenMultiCommitManager]]
 +
|-
 +
| 1300 || [10.0.0+] [[#OpenBisWiper]]
 +
|-
 +
| 1400 || [15.0.0+] NotifyErrorContextServiceReady
 
|}
 
|}
    
== Permissions ==
 
== Permissions ==
Each time permissions are checked, the [[#fsp-pr|process-obj]] is loaded using the session PID, then a func is called with the permissions-type. The func retval is checked, then the permissions [[Error_codes|error]] is thrown if needed.
+
Every time permissions are checked, the process registration [[#fsp-pr]] is loaded using the session processID. The permission data is populated with data from the [[NPDM]].
   −
Internally in that process-obj load func, it will load the obj as normal when the PID is >6, otherwise it will use a fixed obj. If not done already, that fixed obj will be initialized using fixed input data, via the same code used internally by [[#fsp-pr]].
+
If the processID is <= 6 (which happens only for built-in sysmodules), it will use a hardcoded registration data. The default mask in this case is 0x8000000000000000.
   −
In general this func uses the input permissions-type to determine what mask value to use. That value is masked with the [[NPDM|permissions]] from the above process-obj. When the result is 0, 0 is returned, otherwise non-zero is returned. The default non-zero retval is basically 0x3.
+
Note that the functions check whether or not at least one bit is set in the mask. This means that, you don't need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000.
   −
Panic is triggered when the input type is >{max value} / invalid.
+
If the code were to request an invalid input type, panic. But this never happens.
   −
Func0:
+
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 || Non-zero retval || Notes
+
! AccessibilityType || Name || Mask || Permission || Used by
 +
|-
 +
| 0x0 || CanMountLogo || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 +
|-
 +
| 0x1 || CanMountContentMeta || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 +
|-
 +
| 0x2 || CanMountContentControl || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 +
|-
 +
| 0x3 || CanMountContentManual || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 +
|-
 +
| 0x4 || CanMountContentData || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 +
|-
 +
| 0x5 || CanMountApplicationPackage || 0x8000000000000801 ||  R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]]
 +
|-
 +
| 0x6 || CanMountSaveDataStorage || 0x8000000000000000 || RW ||
 +
|-
 +
| 0x7 || CanMountContentStorage || 0x8000000000000800 || RW || [[#OpenContentStorageFileSystem]]
 
|-
 
|-
| 0xA 0xD 0x16 0x1F 0x20 0x21 0x22 || 0x8000000000000080 || Default ||  
+
| 0x8 || CanMountImageAndVideoStorage ||0x8000000000001000 || RW || [[#OpenImageDirectoryFileSystem]]
 
|-
 
|-
| 0x15 0x17 0x18 0x19 0x1A 0x1B 0x1C || 0x8000000000010080 || Default ||  
+
| 0x9 || CanMountCustomStorage0 || 0x8000000000000000 || RW || OpenCustomStorageFileSystem
 
|-
 
|-
| 0x0 0x1 0x2 0x3 0x4 0x5 || 0x8000000000000801 || 0x1 ||  
+
| 0xA || CanMountBisCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x9 0x1D 0x1E || 0x8000000000000084 || Default ||  
+
| 0xB || CanMountBisSafeMode || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0xB 0xC || 0x8000000000008080 || Default ||  
+
| 0xC || CanMountBisUser || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0xE 0x23 || 0xC000000000200000 || Default ||  
+
| 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x12 0x13 || 0x8000000000000020 || Default ||  
+
| 0xE || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x6 || || || In this case it appears the func returns retval & 0xff, where retval = {bit0=0, bit1..bit63=obj_permissions starting at bit0}?
+
| 0xF || CanMountBisSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]
 
|-
 
|-
| 0x7 || 0x8000000000000800 || Default ||  
+
| 0x10 || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]]
 
|-
 
|-
| 0x8 || 0x8000000000001000 || Default ||  
+
| 0x11 || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]]
 
|-
 
|-
| 0xF || 0x8000000000000010 || Default ||  
+
| 0x12 || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]]
 
|-
 
|-
| 0x10 || 0x8000000000040020 || Default ||  
+
| 0x13 || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
 
|-
 
|-
| 0x11 || 0x8000000000000028 || Default ||  
+
| 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]]
 
|-
 
|-
| 0x14 || 0x8000000000010082 || Default ||  
+
| 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]
 
|-
 
|-
| 0x24 || 0x8000000000000100 || Default ||  
+
| 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| 0x25 || 0x8000000000100008 || 0x1 ||  
+
| 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 
|-
 
|-
| 0x26 || 0xC000000000400000 || Default ||  
+
| 0x18 || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x19 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x1A || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x1B || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x1C || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x1D || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x1E || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x1F || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x20 || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x21 || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x22 || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x23 || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x24 || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x25 || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| 0x26 || CanOpenBisPartitionDeviceTreeBlob || 0x8000002000000080 || RW || [[#OpenBisStorage]]
 +
|-
 +
| [3.0.0+] 0x27 || CanOpenSdCardStorage || 0xC000000000200000 || RW ||
 +
|-
 +
| [3.0.0+] 0x28 || CanOpenGameCardStorage || 0x8000000000000100 || RW || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1)
 +
|-
 +
| [4.0.0+] 0x29 || CanMountSystemDataPrivate || 0x8000000000100008 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]]
 +
|-
 +
| [5.0.0+] 0x2A || CanMountHost || 0xC000000000400000 || RW || [[#OpenHostFileSystem]]
 +
|-
 +
| [6.0.0+] 0x2B || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]]
 +
|-
 +
| [7.0.0+] 0x2C || CanOpenSaveDataInternalStorage || 0x8000000000000000 || RW || [[#OpenSaveDataInternalStorageFileSystem]]
 +
|-
 +
| [7.0.0+] 0x2D || CanMountTemporaryDirectory || 0xC000000000000000 || RW ||
 +
|-
 +
| [11.0.0+] 0x2E || CanMountAllBaseFilesystem || 0x8000000000000000 || RW || OpenBaseFileSystem
 +
|-
 +
| [15.0.0+] 0x2F || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem
 
|}
 
|}
   −
Func1(non-zero retval is always 0x1):
+
=== Call ===
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
! Type(s) || Mask || Notes
+
! OperationType || Name || Mask || Used by
 +
|-
 +
| 0x0 || CanInvalidateBisCache || 0x8000000000000080 || [[#InvalidateBisCache]]
 +
|-
 +
| 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc
 +
|-
 +
| 0x2 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate
 +
|-
 +
| 0x3 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet
 +
|-
 +
| 0x4 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver
 +
|-
 +
| 0x5 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo
 +
|-
 +
| 0x6 || CanGetGameCardAsicCertificate || 0x8000000000000200 || GetGameCardAsicCertificate
 +
|-
 +
| 0x7 || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]]
 +
|-
 +
| 0x8 || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
 +
|-
 +
| 0x9 || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId
 +
|-
 +
| 0xA || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId
 +
|-
 +
| 0xB || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion
 +
|-
 +
| 0xC || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
 +
|-
 +
| 0xD || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]
 +
|-
 +
| 0xE || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]]
 +
|-
 +
| 0xF || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile
 +
|-
 +
| 0x10 || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference
 +
|-
 +
| 0x11 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]]
 +
|-
 +
| 0x12 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]]
 +
|-
 +
| 0x13 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode
 +
|-
 +
| 0x14 || CanDebug || 0xC000000000000000 ||
 +
|-
 +
| 0x15 || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles
 +
|-
 +
| [2.0.0+] 0x16 || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
 +
|-
 +
| [2.0.0+] 0x17 || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId
 +
|-
 +
| [2.0.0+] 0x18 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId
 +
|-
 +
| [2.0.0+] 0x19 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]
 +
|-
 +
| [2.0.0+] 0x1A || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem
 +
|-
 +
| [3.0.0+] 0x1B || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath
 +
|-
 +
| [3.0.0+] 0x1C || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey
 +
|-
 +
| [4.0.0+] 0x1D || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]]
 +
|-
 +
| [4.0.0+] 0x1E || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 +
|-
 +
| [4.0.0+] 0x1F || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 +
|-
 +
| [4.0.0+] 0x20 || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 +
|-
 +
| [5.0.0+] 0x21 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask
 +
|-
 +
| [5.0.0+] 0x22 || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem
 +
|-
 +
| [5.0.0+] 0x23 || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem
 +
|-
 +
| [5.0.0+] 0x24 || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem
 +
|-
 +
| [5.0.0+] 0x25 || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition
 +
|-
 +
| [5.0.0+] 0x26 || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]]
 +
|-
 +
| [5.0.0+] 0x27 || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]]
 +
|-
 +
| [5.0.0+] 0x28 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair
 +
|-
 +
| [5.0.0+] 0x29 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair
 +
|-
 +
| [5.0.0+] 0x2A || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]]
 +
|-
 +
| [5.0.0+] 0x2B || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]]
 
|-
 
|-
| 0x0 0x1 || 0x8000000000000080 ||  
+
| [5.0.0+] 0x2C || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]]
 
|-
 
|-
| 0x2 0x3 || 0x8000000000000010 ||  
+
| [5.0.0+] 0x2D || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]]
 
|-
 
|-
| 0x4 0x5 || 0x8000000000000200 ||  
+
| [5.0.0+] 0x2E || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol
 
|-
 
|-
| 0x7 0xB || 0x8000000000000060 ||  
+
| [5.0.0+] 0x2F || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey
 
|-
 
|-
| 0xC 0x1A || 0x8000000000004020 ||  
+
| [5.1.0+] 0x30 || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]]
 
|-
 
|-
| 0x10 0x11 || 0x8000000000080000 ||  
+
| [6.0.0+] 0x31 || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]]
 
|-
 
|-
| 0x6 || 0x8000000000002020 ||  
+
| [6.0.0+] 0x32 || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier
 
|-
 
|-
| 0x8 || 0x8000000000000028 ||  
+
| [6.0.0+] 0x33 || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent
 
|-
 
|-
| 0x9 || 0x8000000000000020 ||  
+
| [6.0.0+] 0x34 || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]]
 
|-
 
|-
| 0xA || 0x8000000000004028 ||  
+
| [6.0.0+] 0x35 || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent
 
|-
 
|-
| 0xD || 0x8000000000020000 ||  
+
| [6.0.0+] 0x36 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected
 
|-
 
|-
| 0xE || 0x8000000000000400 ||  
+
| [6.0.0+] 0x37 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure
 
|-
 
|-
| 0xF || 0x8000000000004060 ||  
+
| [6.0.0+] 0x38 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure
 
|-
 
|-
| 0x13 || 0xC000000000800000 ||  
+
| [8.0.0+] 0x39 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize
 
|-
 
|-
| 0x14 || 0xC000000001000000 ||  
+
| [9.0.0+] 0x3A || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]]
 
|-
 
|-
| 0x15 || 0xC000000002000000 ||  
+
| [9.0.0+] 0x3B || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility
 
|-
 
|-
| 0x16 || 0x8000000004000000 ||  
+
| [9.0.0+] 0x3C || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent
 
|-
 
|-
| 0x17 || 0x8000000008000000 ||  
+
| [9.0.0+] 0x3D || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]
 
|-
 
|-
| 0x18 || 0x8000000010000000 ||  
+
| [9.0.0+] 0x3E || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo
 
|-
 
|-
| 0x19 || 0x8000000000000800 ||  
+
| [9.0.0+] 0x3F || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence
 
|-
 
|-
| 0x12 || || Invalid
+
| [9.0.0+] 0x40 || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt
|}
+
|-
 
+
| [9.0.0+] 0x41 || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]]
== Initialize ==
+
|-
{| class="wikitable" border="1"
+
| [10.0.0+] 0x42 || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]]
 
|-
 
|-
! Word || Value
+
| [10.0.0+] 0x43 || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem
 
|-
 
|-
| 0 || 0x00000004
+
| [10.2.0+] 0x44 || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]]
 
|-
 
|-
| 1 || 0x8000000E
+
| [11.0.0+] 0x45 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]]
 
|-
 
|-
| 2 || 0x00000001
+
| [13.0.0+] 0x46 || CanOpenSaveDataTransferManagerForRepair || 0x8000000000000020 || [[#OpenSaveDataTransferManagerForRepair]]
|- style="border-top: double"
  −
| 0-1 || Pid
  −
|- style="border-top: double"
  −
| 0 || Always. 0x18000001
   
|-
 
|-
| 1 || Always. 0
+
| [13.0.0+] 0x47 || CanSetDebugConfiguration || 0x8000000000000000 || SetDebugOption, UnsetDebugOption
 
|-
 
|-
| 2 || "SCFI"
+
| [15.0.0+] 0x48 || CanOpenDataStorageByPath || 0x8000000000000000 || OpenDataStorageByPath
 
|-
 
|-
| 3 || 0x00000001
+
| [17.0.0+] 0x49 || CanNotifyErrorContextServiceReady || 0x8000004000000000 || NotifyErrorContextServiceReady
 
|-
 
|-
| 4 || Always 0.
+
| [17.0.0+] 0x4A || CanGetProgramId || 0x8000000008000000 || GetProgramId
 
|}
 
|}
   −
== MountContent7 ==
+
== OpenFileSystem ==
Takes an input u32 ([[NCA]]-type) and an u64 title-id. Web-applet loads the u32 from u32_table[inparam]. Only type4 is usable with this?
+
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#FileSystemProxyType]]. Returns an [[#IFileSystem]].
   −
Returns an [[#IFileSystem]].
+
[2.0.0+] This function was removed.
 +
 
 +
== SetCurrentProcess ==
 +
Takes an input u64 ProcessId. No output.
   −
Note: web-applet strings refer to both this cmd and the below "MountContent" as "MountContent".
+
== OpenFileSystemWithPatch ==
 +
Takes an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].
   −
== MountContent ==
+
Web-applet loads the [[#FileSystemProxyType]] (which must be '''Manual''') from u32_table[inparam].
Takes a type-0x19 input buffer, an in32, and an input title-id.
     −
The in32 must be 5 if the NCA type is 0 (control).
+
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
   −
The in32 must be 2..7.
+
== OpenFileSystemWithIdObsolete ==
 +
Takes a type-0x19 input buffer containing a [[#FspPath]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].
   −
The input buffer is the output string path from nsam [[NS_Services#GetContentNcaPath|GetContentNcaPath]].
+
The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.
   −
Returns an [[#IFileSystem]].
+
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].
    
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 in32=7.
+
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.
   −
After the in32-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 in32=5, it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so.
+
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.
   −
{| class="wikitable" border="1"
+
== OpenFileSystemWithId ==
|-
+
Takes a type-0x19 input buffer containing a [[#FspPath]], an input [[#ContentAttributes]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].
! in32 || Required permissions-type and func
  −
|-
  −
| 2 || 0x0, 0
  −
|-
  −
| 3 || 0x2, 0
  −
|-
  −
| 4 || 0x3, 0
  −
|-
  −
| 5 || 0x1, 0
  −
|-
  −
| 6 || 0x4, 0
  −
|-
  −
| 7 || 0x5, 0
  −
|}
     −
== MountBis ==
+
== OpenBisFileSystem ==
Takes a type-0x19 input buffer string and a u32 Bis partitionID(see below). Official user-process code sets instr[0] = 0 normally.
+
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#BisPartitionId]]. Returns an [[#IFileSystem]].
   −
Returns an [[#IFileSystem]].
+
Official user-process code sets instr[0] = 0 normally.
   −
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisPartition]] 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.
   −
== OpenBisPartition ==
+
== OpenBisStorage ==
 
Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid [[#IStorage]] handle otherwise.
 
Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid [[#IStorage]] handle otherwise.
    
== InvalidateBisCache ==
 
== InvalidateBisCache ==
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisPartition IStorage. Used by [[SystemInitializer]].
+
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]].
   −
== DeleteSaveData ==
+
== DeleteSaveDataFileSystem ==
 
Takes an input u64.
 
Takes an input u64.
   −
== CreateSaveData ==
+
== 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 which governs creation of a saveMeta file.
   −
Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +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 meta file size, +4 u8 = 1 meta index which dictates meta file name.
   −
Creates regular savedata.
+
Creates non-system savedata.
   −
== CreateSystemSaveData ==
+
== 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.
   −
== OpenGameCardPartition ==
+
== OpenGameCardStorage ==
 
+
Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].
Takes an input u32 (partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].
     −
== MountGameCardPartition ==
+
== OpenGameCardFileSystem ==
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32.
+
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]].
   −
Returns an [[#IFileSystem]].
+
Mounts a [[Gamecard_Partition|gamecard partition]].
   −
Mounts a gamecard [[Gamecard_Partition|partition]].
+
== CreateSaveDataFileSystemWithHashSalt ==
 +
Takes a total of 0xB0-bytes of input, no output.
   −
== MountSaveData ==
+
== OpenSaveDataFileSystem ==
Takes an input u8 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 370: Line 675:  
Permissions aren't checked until the specified save is successfully found.
 
Permissions aren't checked until the specified save is successfully found.
   −
Only one process can mount a given savedata at any given time (this includes systemsavedata).
+
Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData).
   −
== MountSystemSaveData ==
+
== OpenSaveDataFileSystemBySystemSaveDataId ==
Takes an input u8 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 379: Line 684:  
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
 
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.
   −
== MountContentStorage ==
+
== OpenReadOnlySaveDataFileSystem ==
 +
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]], and returns an [[#IFileSystem]].
 +
 
 +
Mounts SaveData as ReadOnly.
 +
 
 +
== ReadSaveDataFileSystemExtraDataBySaveDataSpaceId ==
 +
Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
 +
 
 +
== ReadSaveDataFileSystemExtraData ==
 +
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]].
 +
 
 +
== OpenSaveDataInfoReader ==
 +
No input, returns an output [[#ISaveDataInfoReader]].
 +
 
 +
== OpenSaveDataInfoReaderBySaveDataSpaceId ==
 +
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]].
 +
 
 +
== OpenSaveDataMover ==
 +
Takes 2 input [[#SaveDataSpaceId]], an input u64 size and a TransferMemory handle. Returns an output [[#ISaveDataMover]].
 +
 
 +
== OpenSaveDataTransferManagerForRepair ==
 +
No input, returns an output [[#ISaveDataTransferManagerForRepair]].
 +
 
 +
== OpenContentStorageFileSystem ==
 
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.
 
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202.
   −
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[Content_Manager_services#ReadEntryRaw]].
+
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 398: Line 761:  
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
 
This command returns a session to a port implementing the [[#IEventNotifier]] interface.
   −
== VerifySaveData ==
+
== SimulateDeviceDetectionEvent ==
 +
Takes a total of 0xC-bytes of input, no output.
 +
 
 +
== VerifySaveDataFileSystem ==
 
Takes an unknown input u64 and a type-0x6 output buffer.
 
Takes an unknown input u64 and a type-0x6 output buffer.
    
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).
 
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02).
 +
 +
== GetSaveDataCommitId ==
 +
Takes an input u8 and u64, returns an output u64.
    
== SetSdCardEncryptionSeed ==
 
== SetSdCardEncryptionSeed ==
Takes 0x10-bytes of input.
+
Takes in the 0x10 byte SD card encryption seed, and loads it into FS-module state.
 +
 
 +
[[NS_Services|NS]]-module reads the 0x10 bytes from SdCard:/Nintendo/Contents/private, and compares them to the first 0x10 bytes of the ns_appman:/private (in [[Flash_Filesystem#System_Savegames|system savedata]] 0x8000000000000043). If they match, NS calls this command using bytes 0x10-0x20 from ns_appman:/private. The rest of this file (0x1F0 bytes total) is all-zero except for the byte at offset 0x20. This byte is set to 1 by NS if the SD card has been mounted successfully and is subsequently passed to SetSdCardAccessibility.
 +
 
 +
== OpenAccessFailureDetectionEventNotifier ==
 +
Takes 8-bytes of input and returns an [[#IEventNotifier]].
 +
 
 +
[8.0.0+] Now takes an additional 8-bytes of input.
 +
 
 +
== SetSaveDataSize ==
 +
Takes two input u64s "size" and "journal_size", and writes them to fsp-srv object member variables.
 +
 
 +
These variables are normally initialized with 32 MiB (0x2000000) and 16 MiB (0x1000000), respectively.
 +
 
 +
These variables don't seem to be actually used anywhere else (?)
   −
Appears to be used to load the seed into FS-module state, since FS-module itself doesn't seem to have file-reading code to handle this itself.
+
== SetSaveDataRootPath ==
 +
Takes an input path, and does snprintf(<fsp-srv object>->m_save_data_root_path, FS_MAX_PATH-1, "/%s", input_path);
   −
[[NS_Services|NS]]-module uses this with data read from a file.
+
This path is normally all-zero. When this path is non-zero, the internal OpenSaveDataFileSystem function will create a DirectorySaveDataFileSystem if the target save is a user-save + a directory exists, instead of the normal savedata filesystem object.
 +
 
 +
== SetGlobalAccessLogMode ==
 +
Takes an input u32.
    
== SetGlobalAccessLogMode ==
 
== SetGlobalAccessLogMode ==
Line 428: Line 815:     
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]].
 +
 +
== OpenBisWiper ==
 +
Takes an input u64 size and a TransferMemory handle. Returns an output [[#IWiper]].
    
= IStorage =
 
= IStorage =
 +
This is "nn::fssrv::sf::IStorage".
 +
 
This is the interface for a raw device, usually a block device.
 
This is the interface for a raw device, usually a block device.
    
{| 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
 
|}
 
|}
 +
 +
== 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 =
 +
This is "nn::fssrv::sf::IFileSystem".
 +
 
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 471: Line 896:  
| 6 || RenameDirectory
 
| 6 || RenameDirectory
 
|-
 
|-
| 7 || GetEntryType
+
| 7 || [[#GetEntryType]]
 
|-
 
|-
| 8 || OpenFile
+
| 8 || [[#OpenFile]]
 
|-
 
|-
| 9 || OpenDirectory
+
| 9 || [[#OpenDirectory]]
 
|-
 
|-
| 10 || Commit
+
| 10 || [[#Commit]]
 
|-
 
|-
| 11 || GetFreeSpaceSize
+
| 11 || [[#GetFreeSpaceSize]]
 
|-
 
|-
| 12 || GetTotalSpaceSize
+
| 12 || [[#GetTotalSpaceSize]]
 
|-
 
|-
| 13 || CleanDirectoryRecursively [3.0.0+]
+
| 13 || [3.0.0+] [[#CleanDirectoryRecursively]]
 
|-
 
|-
| 14 || GetFileTimeStampRaw [3.0.0+]
+
| 14 || [3.0.0+] [[#GetFileTimeStampRaw]]
 +
|-
 +
| 15 || [4.0.0+] QueryEntry
 +
|-
 +
| 16 || [15.0.0+] GetFileSystemAttribute
 
|}
 
|}
 +
 +
== GetEntryType ==
 +
Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32.
 +
 +
== OpenFile ==
 +
Takes a type-0x19 input buffer for the path, and an u32 '''mode'''. '''mode''' controls how the file is opened, based on which bits are set:
 +
 +
* When bit 0 is set, the file is Readable: you can use the Read operation.
 +
* When bit 1 is set, the file is Writable: you can use the Write operation.
 +
* When bit 2 is set, the file is Appendable: unless this bit is set, you will not be able to write beyond the end of a file (such writes will result in an error 0x307202)
 +
 +
== OpenDirectory ==
 +
Takes a type-0x9 input buffer for the path and an u64 '''filter_flags'''. '''filter_flags''' controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files.
    
== Commit ==
 
== Commit ==
 
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.
 
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.
 +
 +
== GetFreeSpaceSize ==
 +
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.
 +
 +
== GetTotalSpaceSize ==
 +
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used).
 +
 +
== CleanDirectoryRecursively ==
 +
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.
 +
 +
== GetFileTimeStampRaw ==
 +
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.
    
= IDirectory =
 
= IDirectory =
 +
This is "nn::fssrv::sf::IDirectory".
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || Read
+
| 0 || [[#Read]]
 +
|-
 +
| 1 || [[#GetEntryCount]]
 +
|}
 +
 
 +
== Read ==
 +
Takes a type-0x6 output buffer. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available.
 +
 
 +
The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..".
 +
 
 +
== GetEntryCount ==
 +
Returns an u64 for the total number of readable entries.
 +
 
 +
= DirectoryEntry =
 +
This is "nn::fs::DirectoryEntry".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset || Size || Description
 +
|-
 +
| 0x0 || 0x301 || Path
 +
|-
 +
| 0x301 || 0x1 || File attributes (bit 0 = is directory; bit 1 = archive bit)
 +
|-
 +
| 0x302 || 0x2 || Padding?
 +
|-
 +
| 0x304 || 0x1 || [[#DirectoryEntryType]]
 +
|-
 +
| 0x305 || 0x3 || Padding?
 +
|-
 +
| 0x308 || 0x8 || Filesize, 0 for directories.
 +
|}
 +
 
 +
= DirectoryEntryType =
 +
This is "nn::fs::DirectoryEntryType".
 +
 
 +
An s8 value indicating a directory entry type. The current values are:
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Description
 +
|-
 +
| 0 || Directory
 
|-
 
|-
| 1 || GetEntryCount
+
| 1 || File
 
|}
 
|}
    
= IFile =
 
= IFile =
 +
This is "nn::fssrv::sf::IFile".
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 515: Line 1,015:  
|-
 
|-
 
| 4 || GetSize
 
| 4 || GetSize
 +
|-
 +
| 5 || [4.0.0+] OperateRange
 +
|-
 +
| 6 || [12.0.0+] OperateRangeWithBuffer
 
|}
 
|}
    
= ISaveDataInfoReader =
 
= ISaveDataInfoReader =
 +
This is "nn::fssrv::sf::ISaveDataInfoReader".
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#ReadSaveDataInfo]]
 +
|}
 +
 +
== ReadSaveDataInfo ==
 +
Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]].
 +
 +
This is used to get [[#SaveDataInfo]] for all savedata on the system (or all savedata for the current [[#SaveDataSpaceId]]). When used multiple times, it will resume reading where it left off, until no more entries are available (in that case the out u64 is value 0).
    
= IDeviceOperator =
 
= IDeviceOperator =
 +
This is "nn::fssrv::sf::IDeviceOperator".
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || IsSdCardInserted
+
| 0 || [[#IsSdCardInserted]]
 
|-
 
|-
| 1 || GetSdCardSpeedMode
+
| 1 || [[#GetSdCardSpeedMode]]
 
|-
 
|-
| 2 || [2.0.0+] GetSdCardCid
+
| 2 || [2.0.0+] [[#GetSdCardCid]]
 
|-
 
|-
| 3 || [2.0.0+] GetSdCardUserAreaSize
+
| 3 || [2.0.0+] [[#GetSdCardUserAreaSize]]
 
|-
 
|-
| 4 || [2.0.0+] GetSdCardProtectedAreaSize
+
| 4 || [2.0.0+] [[#GetSdCardProtectedAreaSize]]
 
|-
 
|-
| 5 || [2.0.0+] GetAndClearSdCardErrorInfo
+
| 5 || [2.0.0+] [[#GetAndClearSdCardErrorInfo]]
 
|-
 
|-
| 6 || [2.0.0+]
+
| 6 || [17.0.0+] GetSdCardHostControllerStatus
 
|-
 
|-
| 100 || GetMmcCid
+
| 100 || [[#GetMmcCid]]
 
|-
 
|-
| 101 || GetMmcSpeedMode
+
| 101 || [[#GetMmcSpeedMode]]
 
|-
 
|-
| 110 || EraseMmc
+
| 110 || [[#EraseMmc]]
 
|-
 
|-
| 111 || GetMmcPartitionSize
+
| 111 || [[#GetMmcPartitionSize]]
 
|-
 
|-
| 112 || [2.0.0+] GetMmcPatrolCount
+
| 112 || [2.0.0+] [[#GetMmcPatrolCount]]
 
|-
 
|-
| 113 || [2.0.0+] GetAndClearMmcErrorInfo
+
| 113 || [2.0.0+] [[#GetAndClearMmcErrorInfo]]
 
|-
 
|-
| 114 || [2.0.0+] GetMmcExtendedCsd
+
| 114 || [2.0.0+] [[#GetMmcExtendedCsd]]
 
|-
 
|-
| 200 || IsGameCardInserted
+
| 115 || [4.0.0+] [[#SuspendMmcPatrol]]
 
|-
 
|-
| 201 || EraseGameCard
+
| 116 || [4.0.0+] [[#ResumeMmcPatrol]]
 
|-
 
|-
| 202 || GetGameCardHandle
+
| 117 || [17.0.0+] EraseMmcWithRange
 +
|-
 +
| 200 || [[#IsGameCardInserted]]
 +
|-
 +
| 201 || [[#EraseGameCard]]
 +
|-
 +
| 202 || [[#GetGameCardHandle]]
 
|-
 
|-
 
| 203 || [[#GetGameCardUpdatePartitionInfo]]
 
| 203 || [[#GetGameCardUpdatePartitionInfo]]
 
|-
 
|-
| 204 || FinalizeGameCardDriver
+
| 204 || [[#FinalizeGameCardDriver]]
 +
|-
 +
| 205 || [[#GetGameCardAttribute]]
 +
|-
 +
| 206 || [[#GetGameCardDeviceCertificate]]
 
|-
 
|-
| 205 || GetGameCardAttribute
+
| 207 || [[#GetGameCardAsicInfo]]
 
|-
 
|-
| 206 || GetGameCardDeviceCertificate
+
| 208 || [[#GetGameCardIdSet]]
 
|-
 
|-
| 207 || GetGameCardAsicInfo
+
| 209 || [[#WriteToGameCardDirectly]]
 
|-
 
|-
| 208 || GetGameCardIdSet
+
| 210 || [[#SetVerifyWriteEnalbleFlag]]
 
|-
 
|-
| 209 || WriteToGameCard
+
| 211 || [[#GetGameCardImageHash]]
 
|-
 
|-
| 210 || SetVerifyWriteEnalbleFlag
+
| 212 || [2.0.0+] [[#GetGameCardDeviceIdForProdCard]]
 
|-
 
|-
| 211 || GetGameCardImageHash
+
| 213 || [2.0.0+] [[#EraseAndWriteParamDirectly]]
 
|-
 
|-
| 212 || [2.0.0+] GetGameCardErrorInfo
+
| 214 || [2.0.0+] [[#ReadParamDirectly]]
 
|-
 
|-
| 213 || [2.0.0+]
+
| 215 || [2.0.0+] [[#ForceEraseGameCard]]
 
|-
 
|-
| 214 || [2.0.0+] GetGameCardCid
+
| 216 || [2.0.0+] [[#GetGameCardErrorInfo]]
 
|-
 
|-
| 215 || [2.0.0+]
+
| 217 || [2.1.0+] [[#GetGameCardErrorReportInfo]]
 
|-
 
|-
| 216 || [2.0.0+]
+
| 218 || [3.0.0+] [[#GetGameCardDeviceId]]
 
|-
 
|-
| 217 || [2.1.0+] Returns 0x40-bytes of output data.
+
| 219 || [8.0.0+] [[#ChallengeCardExistence]]
 
|-
 
|-
| 300 || SetSpeedEmulationMode
+
| 220 || [9.0.0+] [[#GetGameCardCompatibilityType]]
 
|-
 
|-
| 301 || GetSpeedEmulationMode
+
| 221 || [17.0.0+] [[#GetGameCardAsicCertificate]]
 +
|-
 +
| 222 || [18.0.0+] [[#GetGameCardCardHeader]]
 +
|-
 +
| 300 || [[#SetSpeedEmulationMode]]
 +
|-
 +
| 301 || [[#GetSpeedEmulationMode]]
 +
|-
 +
| 302 || [18.0.0+] SetApplicationStorageSpeed
 +
|-
 +
| 400 || [5.0.0+] [[#SuspendSdmmcControl]]
 +
|-
 +
| 401 || [5.0.0+] [[#ResumeSdmmcControl]]
 +
|-
 +
| 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]]
 +
|-
 +
| 500 || [6.0.0+] [[#SetDeviceSimulationEvent]]
 +
|-
 +
| 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]]
 
|}
 
|}
 +
 +
== IsSdCardInserted ==
 +
No input. Returns an output bool.
 +
 +
== GetSdCardSpeedMode ==
 +
No input. Returns an output [[#SdCardSpeedMode]].
 +
 +
== GetSdCardCid ==
 +
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
 +
 +
== GetSdCardUserAreaSize ==
 +
No input. Returns an output s64 '''SdCardUserAreaSize'''.
 +
 +
== GetSdCardProtectedAreaSize ==
 +
No input. Returns an output s64 '''SdCardProtectedAreaSize'''.
 +
 +
== GetAndClearSdCardErrorInfo ==
 +
Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''.
 +
 +
== GetMmcCid ==
 +
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
 +
 +
== GetMmcSpeedMode ==
 +
No input. Returns an output [[#MmcSpeedMode]].
 +
 +
== EraseMmc ==
 +
Takes an input [[#MmcPartition]]. No output.
 +
 +
== GetMmcPartitionSize ==
 +
Takes an input [[#MmcPartition]]. Returns an output s64 '''MmcPartitionSize'''.
 +
 +
== GetMmcPatrolCount ==
 +
No input. Returns an output u32 '''MmcPatrolCount'''.
 +
 +
== GetAndClearMmcErrorInfo ==
 +
Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''.
 +
 +
== GetMmcExtendedCsd ==
 +
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
 +
 +
== SuspendMmcPatrol ==
 +
No input/output.
 +
 +
== ResumeMmcPatrol ==
 +
No input/output.
 +
 +
== IsGameCardInserted ==
 +
No input. Returns an output bool.
 +
 +
== EraseGameCard ==
 +
Takes an input [[#GameCardSize]] and an input u64 '''NormalAreaSize'''. No output.
 +
 +
== GetGameCardHandle ==
 +
No input. Returns an output [[#GameCardHandle]].
    
== GetGameCardUpdatePartitionInfo ==
 
== GetGameCardUpdatePartitionInfo ==
 +
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardUpdatePartitionInfo]].
 +
 +
== FinalizeGameCardDriver ==
 +
No input/output.
 +
 +
== GetGameCardAttribute ==
 +
Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardAttribute]].
 +
 +
== GetGameCardDeviceCertificate ==
 +
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
 +
 +
== GetGameCardAsicInfo ==
 +
Takes a type-0x5 input buffer '''FwBuffer''', a type-0x6 output buffer containing [[#RmaInformation]] and two input s64s '''FwBufferSize''' and '''RmaInformationSize'''. No output.
 +
 +
== GetGameCardIdSet ==
 +
Takes a type-0x6 output buffer containing a [[#GameCardIdSet]] and an input s64 '''BufferSize'''. No output.
 +
 +
== WriteToGameCardDirectly ==
 +
Takes a type-0x6 output buffer and two input s64s '''Offset''' and '''BufferSize'''. No output.
 +
 +
== SetVerifyWriteEnalbleFlag ==
 +
Takes an input bool. No output.
 +
 +
== GetGameCardImageHash ==
 +
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
 +
 +
== GetGameCardDeviceIdForProdCard ==
 +
Takes a type-0x5 input buffer '''CardHeaderForDev''', a type-0x6 output buffer and two input s64s '''CardHeaderForDevSize''' and '''BufferSize'''. No output.
 +
 +
== EraseAndWriteParamDirectly ==
 +
Takes a type-0x5 input buffer and an input s64 '''BufferSize'''. No output.
 +
 +
== ReadParamDirectly ==
 +
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
 +
 +
== ForceEraseGameCard ==
 +
No input/output.
 +
 +
== GetGameCardErrorInfo ==
 +
No input. Returns an output [[#GameCardErrorInfo]].
 +
 +
== GetGameCardErrorReportInfo ==
 +
No input. Returns an output [[#GameCardErrorReportInfo]].
 +
 +
== GetGameCardDeviceId ==
 +
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
 +
 +
== ChallengeCardExistence ==
 +
Takes a type-0x6 output buffer, two type-0x5 input buffers and an input [[#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 input [[#GameCardHandle]]. Returns an output [[#GameCardCompatibilityType]].
 +
 +
== GetGameCardAsicCertificate ==
 +
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.
 +
 +
== GetGameCardCardHeader ==
 +
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output.
 +
 +
== SetSpeedEmulationMode ==
 +
Takes an input [[#SpeedEmulationMode]]. No output.
   −
Returns a titleID and the title-version for it.
+
== GetSpeedEmulationMode ==
 +
No input. Returns an output [[#SpeedEmulationMode]].
   −
* 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.
+
== SuspendSdmmcControl ==
* Output u64 with ARMS-gamecard: titleID 0100000000000816.
+
No input/output.
   −
[[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.
+
== ResumeSdmmcControl ==
 +
No input/output.
 +
 
 +
== GetSdmmcConnectionStatus ==
 +
Takes a total of 4-bytes of input. Returns a total of 8-bytes of output.
 +
 
 +
== SetDeviceSimulationEvent ==
 +
Takes a total of 0x14-bytes of input. No output.
 +
 
 +
== ClearDeviceSimulationEvent ==
 +
Takes a total of 4-bytes of input. No output.
    
= IEventNotifier =
 
= IEventNotifier =
 +
This is "nn::fssrv::sf::IEventNotifier".
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#GetEventHandle]]
 +
|}
 +
 +
== GetEventHandle ==
 +
No input, returns an output Event handle. With official sw the EventClearMode is user-specified.
 +
 +
= ISaveDataTransferManager =
 +
This is "nn::fssrv::sf::ISaveDataTransferManager".
 +
 +
This was added with [[4.0.0]].
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#GetChallenge]]
 +
|-
 +
| 16 || [[#SetToken]]
 +
|-
 +
| 32 || [[#OpenSaveDataExporter]]
 +
|-
 +
| 64 || [[#OpenSaveDataImporter]]
 +
|}
 +
 +
== GetChallenge ==
 +
No input/output, takes a type-0x6 output buffer.
 +
 +
== SetToken ==
 +
No input/output, takes a type-0x5 input buffer.
 +
 +
== OpenSaveDataExporter ==
 +
Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]].
 +
 +
== OpenSaveDataImporter ==
 +
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]].
 +
 +
[17.0.0+] Now only takes 0x18-bytes of input and an additional type-0x5 input buffer.
 +
 +
= ISaveDataMover =
 +
This is "nn::fssrv::sf::ISaveDataMover".
 +
 +
This was added with [[10.0.0]].
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 8 || [[#Register]]
 +
|-
 +
| 16 || [[#Process]]
 +
|-
 +
| 18 || [[#Cancel]]
 +
|}
 +
 +
== Register ==
 +
Takes an input u64, no output.
 +
 +
== Process ==
 +
Takes an input u64, returns an output u64.
 +
 +
== Cancel ==
 +
No input/output.
 +
 +
= ISaveDataTransferManagerForRepair =
 +
This is "nn::fssrv::sf::ISaveDataTransferManagerForRepair".
 +
 +
This was added with [[11.0.0]].
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 80 || [[#OpenSaveDataExporter]]
 +
|-
 +
| 90 || [[#OpenSaveDataImporter]]
 +
|}
 +
 +
== OpenSaveDataExporter ==
 +
Takes a total of 0x10-bytes of input, returns an [[#ISaveDataDivisionExporter]].
 +
 +
== OpenSaveDataImporter ==
 +
Takes 1-byte of input, a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 +
= ISaveDataExporter =
 +
This is "nn::fssrv::sf::ISaveDataExporter".
 +
 +
This was added with [[4.0.0]].
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#GetSaveDataInfo]]
 +
|-
 +
| 1 || [[#GetRestSize]]
 +
|-
 +
| 16 || [[#Pull]]
 +
|-
 +
| 17 || [[#PullInitialData]]
 +
|}
 +
 +
== GetSaveDataInfo ==
 +
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.
 +
 +
The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw.
 +
 +
== GetRestSize ==
 +
No input, returns an output u64.
 +
 +
== Pull ==
 +
Takes a type-0x6 output buffer, returns an output u64.
 +
 +
== PullInitialData ==
 +
No input/output, takes a type-0x6 output buffer.
 +
 +
= ISaveDataImporter =
 +
This is "nn::fssrv::sf::ISaveDataImporter".
 +
 +
This was added with [[4.0.0]].
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#GetSaveDataInfo]]
 +
|-
 +
| 1 || [[#GetRestSize]]
 +
|-
 +
| 16 || [[#Push]]
 +
|-
 +
| 17 || [[#Finalize]]
 +
|}
 +
 +
== GetSaveDataInfo ==
 +
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.
 +
 +
The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.
 +
 +
== GetRestSize ==
 +
No input, returns an output u64.
 +
 +
== Push ==
 +
No input/output, takes a type-0x5 input buffer.
 +
 +
== Finalize ==
 +
No input/output.
 +
 +
= ISaveDataTransferManagerWithDivision =
 +
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".
 +
 +
This was added with [[5.0.0]].
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#GetChallenge]]
 +
|-
 +
| 8 || [18.0.0+] SetMode
 +
|-
 +
| 9 || [18.0.0+] SetAttribute
 +
|-
 +
| 16 || [[#SetKeySeedPackage]]
 +
|-
 +
| 32 || [[#OpenSaveDataExporter]]
 +
|-
 +
| 33 || [[#OpenSaveDataExporterForDiffExport]]
 +
|-
 +
| 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]]
 +
|-
 +
| 63 || [17.0.0+] OpenSaveDataImporter
 +
|-
 +
| 64 || [6.0.0-17.0.1] [[#OpenSaveDataImporterDeprecated]] ([5.0.0-5.1.0] OpenSaveDataImporter)
 +
|-
 +
| 65 || [5.0.0-17.0.1] [[#OpenSaveDataImporterForDiffImport]]
 +
|-
 +
| 66 || [6.0.0-17.0.1] [[#OpenSaveDataImporterForDuplicateDiffImport]]
 +
|-
 +
| 67 || [6.0.0-16.1.0] [[#OpenSaveDataImporter]]
 +
|-
 +
| 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]]
 +
|-
 +
| 69 || [6.0.0+] [[#CancelSuspendingImport]]
 +
|-
 +
| 70 || [10.0.0+] CancelSuspendingImportByAttribute
 +
|-
 +
| 80 || [11.0.0+] SwapSecondary
 +
|}
 +
 +
== GetChallenge ==
 +
No input/output, takes a type-0x6 output buffer containing the '''Challenge'''.
 +
 +
== SetKeySeedPackage ==
 +
No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''.
 +
 +
== OpenSaveDataExporter ==
 +
Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]].
 +
 +
== OpenSaveDataExporterForDiffExport ==
 +
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]].
 +
 +
== OpenSaveDataExporterByContext ==
 +
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]].
 +
 +
== OpenSaveDataImporterDeprecated ==
 +
Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]].
 +
 +
== OpenSaveDataImporterForDiffImport ==
 +
Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]].
 +
 +
== OpenSaveDataImporterForDuplicateDiffImport ==
 +
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 +
== OpenSaveDataImporter ==
 +
Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 +
== OpenSaveDataImporterByContext ==
 +
No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]].
 +
 +
== CancelSuspendingImport ==
 +
Takes an input u64 and a 0x10-byte struct, no output.
 +
 +
= ISaveDataDivisionExporter =
 +
This is "nn::fssrv::sf::ISaveDataDivisionExporter".
 +
 +
This was added with [[5.0.0]].
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#SetDivisionCount]]
 +
|-
 +
| 1 || [6.0.0+] [[#ReadSaveDataExtraData]]
 +
|-
 +
| 16 || [[#OpenSaveDataDiffChunkIterator]]
 +
|-
 +
| 48 || [[#OpenSaveDataChunkExporter]]
 +
|-
 +
| 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]]
 +
|-
 +
| 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]]
 +
|-
 +
| 66 || [6.0.0+] [[#CancelExport]]
 +
|-
 +
| 67 || [6.0.0+] [[#SuspendExport]]
 +
|-
 +
| 70 || [6.0.0-17.0.1] [[#GetKeySeed]]
 +
|-
 +
| 71 || [6.0.0+] [[#GetInitialDataMac]]
 +
|-
 +
| 72 || [6.0.0+] [[#FinalizeExport]]
 +
|-
 +
| 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]]
 +
|-
 +
| 74 || [18.0.0+] [[#GetKeySeed]]
 +
|-
 +
| 80 || [6.0.0+] [[#GetImportInitialDataAad]]
 +
|-
 +
| 81 || [6.0.0+] [[#SetExportInitialDataAad]]
 +
|-
 +
| 96 || [6.0.0+] [[#GetReportInfo]]
 +
|}
 +
 +
== SetDivisionCount ==
 +
Takes an input u32, no output.
 +
 +
== OpenSaveDataChunkExporter ==
 +
Takes an input u32, returns an [[#ISaveDataChunkExporter]].
 +
 +
== FinalizeFullExport ==
 +
No input, returns two 0x10-byte output structs.
 +
 +
== FinalizeDiffExport ==
 +
No input, returns an output 0x10-byte struct.
 +
 +
== CancelExport ==
 +
No input/output.
 +
 +
== SuspendExport ==
 +
No input/output, takes a type-0x6 output buffer.
 +
 +
== GetKeySeed ==
 +
No input, returns an output 0x10-byte struct.
 +
 +
== GetInitialDataMac ==
 +
No input, returns an output 0x10-byte struct.
 +
 +
== FinalizeExport ==
 +
No input/output.
 +
 +
== SetExportInitialDataAad ==
 +
Takes an input 0x20-byte struct, no output.
 +
 +
= ISaveDataDivisionImporter =
 +
This is "nn::fssrv::sf::ISaveDataDivisionImporter".
 +
 +
This was added with [[5.0.0]].
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [6.0.0+] [[#ReadSaveDataExtraData]]
 +
|-
 +
| 16 || [[#OpenSaveDataDiffChunkIterator]]
 +
|-
 +
| 32 || [[#InitializeImport]]
 +
|-
 +
| 33 || [[#FinalizeImport]]
 +
|-
 +
| 34 || [6.0.0+] [[#CancelImport]]
 +
|-
 +
| 35 || [6.0.0+] [[#GetImportContext]]
 +
|-
 +
| 36 || [6.0.0+] [[#SuspendImport]]
 +
|-
 +
| 37 || [11.0.0+] FinalizeImportWithoutSwap
 +
|-
 +
| 48 || [[#OpenSaveDataChunkImporter]]
 +
|-
 +
| 64 || [6.0.0+] [[#GetImportInitialDataAad]]
 +
|-
 +
| 80 || [6.0.0+] [[#GetReportInfo]]
 +
|}
 +
 +
== ReadSaveDataExtraData ==
 +
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 =
 +
This is "nn::fssrv::sf::ISaveDataChunkIterator".
 +
 +
This was added with [[5.0.0]].
 +
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
 
! Cmd || Name
 
! Cmd || Name
 
|-
 
|-
| 0 || BindEvent
+
| 0 || [[#Next]]
 +
|-
 +
| 1 || [[#IsEnd]]
 +
|-
 +
| 16 || [[#GetId]]
 +
|}
 +
 
 +
== Next ==
 +
No input/output.
 +
 
 +
== IsEnd ==
 +
No input, returns an output u8.
 +
 
 +
== GetId ==
 +
No input, returns an output u32.
 +
 
 +
= ISaveDataChunkExporter =
 +
This is "nn::fssrv::sf::ISaveDataChunkExporter".
 +
 
 +
This was added with [[5.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#Pull]]
 +
|-
 +
| 16 || [6.0.0+] [[#GetRestRawDataSize]]
 +
|}
 +
 
 +
== Pull ==
 +
Takes an input u64 and a type-0x6 output buffer, returns an output u64.
 +
 
 +
== GetRestRawDataSize ==
 +
No input, returns an output u64.
 +
 
 +
= ISaveDataChunkImporter =
 +
This is "nn::fssrv::sf::ISaveDataChunkImporter".
 +
 
 +
This was added with [[5.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#Push]]
 +
|}
 +
 
 +
== Push ==
 +
Takes an input u64 and a type-0x5 input buffer, no output.
 +
 
 +
= ISaveDataTransferProhibiter =
 +
This is "nn::fssrv::sf::ISaveDataTransferProhibiter".
 +
 
 +
This was added with [6.0.0+].
 +
 
 +
This doesn't seem to handle any commands (?).
 +
 
 +
= IMultiCommitManager =
 +
This is "nn::fssrv::sf::IMultiCommitManager".
 +
 
 +
This was added with [6.0.0+].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 1 || [[#Add]]
 +
|-
 +
| 2 || [[#Commit]]
 +
|}
 +
 
 +
== Add ==
 +
Takes an input [[#IFilesystem]], no output.
 +
 
 +
== Commit ==
 +
No input/output.
 +
 
 +
= IWiper =
 +
This is "nn::fssrv::sf::IWiper".
 +
 
 +
This was added with [[10.0.0]].
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| 0 || [[#Startup|Startup]]
 +
|-
 +
| 16 || [[#Process_2|Process]]
 +
|}
 +
 
 +
== Startup ==
 +
No input. Returns an u64.
 +
 
 +
== Process ==
 +
No input. Returns an u64.
 +
 
 +
= IStorageDeviceManager =
 +
This is "nn::fssrv::storage::sf::IStorageDeviceManager".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| N/A || IsInserted
 +
|-
 +
| N/A || IsHandleValid
 +
|-
 +
| N/A || OpenDetectionEvent
 +
|-
 +
| N/A || OpenOperator
 +
|-
 +
| N/A || OpenDevice
 +
|-
 +
| N/A || OpenStorage
 +
|-
 +
| N/A || Invalidate
 +
|}
 +
 
 +
= IStorageDeviceOperator =
 +
This is "nn::fssrv::storage::sf::IStorageDeviceOperator".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| N/A || Operate
 +
|-
 +
| N/A || OperateIn
 +
|-
 +
| N/A || OperateOut
 +
|-
 +
| N/A || OperateOut2
 +
|-
 +
| N/A || OperateInOut
 +
|-
 +
| N/A || OperateIn2Out
 +
|}
 +
 
 +
= IStorageDevice =
 +
This is "nn::fssrv::storage::sf::IStorageDevice".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Cmd || Name
 +
|-
 +
| N/A || GetHandle
 +
|-
 +
| N/A || IsHandleValid
 +
|-
 +
| N/A || OpenOperator
 +
|-
 +
| N/A || Read
 +
|-
 +
| N/A || Write
 +
|-
 +
| N/A || Flush
 +
|-
 +
| N/A || SetSize
 +
|-
 +
| N/A || GetSize
 +
|-
 +
| N/A || OperateRange
 +
|}
 +
 
 +
= FileSystemProxyType =
 +
This is "nn::fs::FileSystemProxyType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Code
 +
|-
 +
| 1 || Rom
 +
|-
 +
| 2 || Logo
 +
|-
 +
| 3 || Control
 +
|-
 +
| 4 || Manual
 +
|-
 +
| 5 || Meta
 +
|-
 +
| 6 || Data
 +
|-
 +
| 7 || Package
 +
|-
 +
| 8 || [4.0.0+] RegisteredUpdate
 
|}
 
|}
   −
= StorageId =
+
= ContentType =
 +
This is "nn::fs::ContentType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Meta
 +
|-
 +
| 1 || Control
 +
|-
 +
| 2 || Manual
 +
|-
 +
| 3 || Logo
 +
|-
 +
| 4 || Data
 +
|}
 +
 
 +
= ContentAttributes =
 +
This is "nn::fs::ContentAttributes".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 617: Line 1,915:  
| 0 || None
 
| 0 || None
 
|-
 
|-
| 1 || Host
+
| 15 || All
 +
|}
 +
 
 +
= ContentStorageId =
 +
This is "nn::fs::ContentStorageId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || System
 +
|-
 +
| 1 || User
 +
|-
 +
| 2 || SdCard
 +
|-
 +
| 3 || [16.0.0+] System0
 +
|}
 +
 
 +
= SaveDataSpaceId =
 +
This is "nn::fs::SaveDataSpaceId".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || System
 +
|-
 +
| 1 || User
 +
|-
 +
| 2 || SdSystem
 +
|-
 +
| 3 || [3.0.0+] Temporary
 +
|-
 +
| 4 || [4.0.0+] SdUser
 +
|-
 +
| 100 || [3.0.0+] ProperSystem
 +
|-
 +
| 101 || [3.0.0+] SafeMode
 +
|}
 +
 
 +
Determines the storage where the savedata is stored.
 +
 
 +
= SaveDataType =
 +
This is "nn::fs::SaveDataType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || System
 +
|-
 +
| 1 || Account
 +
|-
 +
| 2 || Bcat
 +
|-
 +
| 3 || Device
 +
|-
 +
| 4 || [3.0.0+] Temporary
 +
|-
 +
| 5 || [3.0.0+] Cache
 +
|-
 +
| 6 || [4.0.0+] SystemBcat
 +
|}
 +
 
 +
= SaveDataRank =
 +
This is "nn::fs::SaveDataRank".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Primary
 +
|-
 +
| 1 || Secondary
 +
|}
 +
 
 +
= SaveDataEnumerateOption =
 +
This is "nn::fs::SaveDataEnumerateOption".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 1 || AllRank
 +
|}
 +
 
 +
= SaveDataFlags =
 +
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
 +
|-
 +
| 35 || [16.0.0+] DeviceTreeBlob
 +
|-
 +
| 36 || [16.0.0+] System0
 +
|}
 +
 
 +
= SdCardSpeedMode =
 +
This is "nn::fs::SdCardSpeedMode".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Identification
 +
|-
 +
| 1 || DefaultSpeed
 +
|-
 +
| 2 || HighSpeed
 +
|-
 +
| 3 || Sdr12
 +
|-
 +
| 4 || Sdr25
 +
|-
 +
| 5 || Sdr50
 +
|-
 +
| 6 || Sdr104
 +
|-
 +
| 7 || Ddr50
 +
|-
 +
| 8 || Unknown
 +
|}
 +
 
 +
= MmcSpeedMode =
 +
This is "nn::fs::MmcSpeedMode".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Identification
 +
|-
 +
| 1 || LegacySpeed
 +
|-
 +
| 2 || HighSpeed
 +
|-
 +
| 3 || Hs200
 +
|-
 +
| 4 || Hs400
 +
|-
 +
| 5 || Unknown
 +
|}
 +
 
 +
= MmcPartition =
 +
This is "nn::fs::MmcPartition".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || UserData
 +
|-
 +
| 1 || BootPartition1
 +
|-
 +
| 2 || BootPartition2
 +
|}
 +
 
 +
= MemoryReportInfo =
 +
This is "nn::fs::MemoryReportInfo".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| PooledBufferFreeSizePeak
 +
|-
 +
| 0x8
 +
| 0x8
 +
| PooledBufferRetriedCount
 +
|-
 +
| 0x10
 +
| 0x8
 +
| PooledBufferReduceAllocationCount
 +
|-
 +
| 0x18
 +
| 0x8
 +
| BufferManagerFreeSizePeak
 +
|-
 +
| 0x20
 +
| 0x8
 +
| BufferManagerRetriedCount
 +
|-
 +
| 0x28
 +
| 0x8
 +
| ExpHeapFreeSizePeak
 +
|-
 +
| 0x30
 +
| 0x8
 +
| BufferPoolFreeSizePeak
 +
|-
 +
| 0x38
 +
| 0x8
 +
| PatrolReadAllocateBufferSuccessCount
 +
|-
 +
| 0x40
 +
| 0x8
 +
| PatrolReadAllocateBufferFailureCount
 +
|-
 +
| 0x48
 +
| 0x8
 +
| BufferManagerTotalAllocatableSizePeak
 +
|-
 +
| 0x50
 +
| 0x8
 +
| BufferPoolAllocateSizeMax
 +
|-
 +
| 0x58
 +
| 0x8
 +
| PooledBufferFailedIdealAllocationCountOnAsyncAccess
 +
|-
 +
| 0x60
 +
| 0x20
 +
| Reserved
 +
|}
 +
 
 +
= StorageErrorInfo =
 +
This is "nn::fs::StorageErrorInfo".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x4
 +
| NumActivationFailures
 +
|-
 +
| 0x4
 +
| 0x4
 +
| NumActivationErrorCorrections
 +
|-
 +
| 0x8
 +
| 0x4
 +
| NumReadWriteFailures
 +
|-
 +
| 0xC
 +
| 0x4
 +
| NumReadWriteErrorCorrections
 +
|}
 +
 
 +
= GameCardErrorInfo =
 +
This is "nn::fs::GameCardErrorInfo".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x2
 +
| GameCardCrcErrorCount
 +
|-
 +
| 0x2
 +
| 0x2
 +
| Reserved
 +
|-
 +
| 0x4
 +
| 0x2
 +
| AsicCrcErrorCount
 +
|-
 +
| 0x6
 +
| 0x2
 +
| Reserved
 +
|-
 +
| 0x8
 +
| 0x2
 +
| RefreshCount
 +
|-
 +
| 0xA
 +
| 0x2
 +
| Reserved
 +
|-
 +
| 0xC
 +
| 0x2
 +
| ReadRetryCount
 +
|-
 +
| 0xE
 +
| 0x2
 +
| TimeoutRetryErrorCount
 +
|}
 +
 
 +
= GameCardErrorReportInfo =
 +
This is "nn::fs::GameCardErrorReportInfo".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x10
 +
| [[#GameCardErrorInfo|ErrorInfo]]
 +
|-
 +
| 0x10
 +
| 0x2
 +
| AsicReinitializeFailureDetail
 +
|-
 +
| 0x12
 +
| 0x2
 +
| InsertionCount
 +
|-
 +
| 0x14
 +
| 0x2
 +
| RemovalCount
 +
|-
 +
| 0x16
 +
| 0x2
 +
| AsicReinitializeCount
 +
|-
 +
| 0x18
 +
| 0x4
 +
| AsicInitializeCount
 +
|-
 +
| 0x1C
 +
| 0x2
 +
| AsicReinitializeFailureCount
 +
|-
 +
| 0x1E
 +
| 0x2
 +
| AwakenFailureCount
 +
|-
 +
| 0x20
 +
| 0x2
 +
| Reserved
 +
|-
 +
| 0x22
 +
| 0x2
 +
| RefreshCount
 +
|-
 +
| 0x24
 +
| 0x4
 +
| LastReadErrorPageAddress
 +
|-
 +
| 0x28
 +
| 0x4
 +
| LastReadErrorPageCount
 +
|-
 +
| 0x2C
 +
| 0x4
 +
| AwakenCount
 +
|-
 +
| 0x30
 +
| 0x4
 +
| ReadCountFromInsert
 +
|-
 +
| 0x34
 +
| 0x4
 +
| ReadCountFromAwaken
 +
|-
 +
| 0x38
 +
| 0x8
 +
| Reserved
 +
|}
 +
 
 +
= GameCardHandle =
 +
This is "nn::fs::GameCardHandle". This is an u32.
 +
 
 +
= 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
 +
|}
 +
 
 +
= GameCardAttribute2 =
 +
This is "nn::fs::GameCardAttribute2".
 +
 
 +
= 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
 +
|}
 +
 
 +
= GameCardCompatibilityType =
 +
This is "nn::fs::GameCardCompatibilityType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || Global
 +
|-
 +
| 1 || China
 +
|}
 +
 
 +
= GameCardUpdatePartitionInfo =
 +
This is "nn::fs::GameCardUpdatePartitionInfo".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x4
 +
| Version
 +
|-
 +
| 0x4
 +
| 0x4
 +
| Reserved
 +
|-
 +
| 0x8
 +
| 0x8
 +
| Id
 +
|}
 +
 
 +
= GameCardIdSet =
 +
This is "nn::gc::GameCardIdSet".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x4
 +
| [[#CardId1|Id1]]
 +
|-
 +
| 0x4
 +
| 0x4
 +
| [[#CardId2|Id2]]
 +
|-
 +
| 0x8
 +
| 0x4
 +
| [[#CardId3|Id3]]
 +
|}
 +
 
 +
= CardId1 =
 +
This is "nn::gc::detail::CardId1".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x1
 +
| [[#MakerCodeForCardId1|MakerCode]]
 +
|-
 +
| 0x1
 +
| 0x1
 +
| [[#MemoryCapacity|MemoryCapacity]]
 +
|-
 +
| 0x2
 +
| 0x1
 +
| Reserved
 +
|-
 +
| 0x3
 +
| 0x1
 +
| MemoryType
 +
|}
 +
 
 +
= CardId2 =
 +
This is "nn::gc::detail::CardId2".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x1
 +
| CardSecurityNumber
 +
|-
 +
| 0x1
 +
| 0x1
 +
| CardType
 +
|-
 +
| 0x2
 +
| 0x2
 +
| Reserved
 +
|}
 +
 
 +
= CardId3 =
 +
This is "nn::gc::detail::CardId3".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x4
 +
| Reserved
 +
|}
 +
 
 +
= MakerCodeForCardId1 =
 +
This is "nn::gc::detail::MakerCodeForCardId1".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0x36 || Unknown
 +
|-
 +
| 0xC2 || MegaChips
 +
|-
 +
| 0xAE || Lapis
 +
|}
 +
 
 +
= MemoryCapacity =
 +
This is "nn::gc::detail::MemoryCapacity".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0xFA || 1GB
 +
|-
 +
| 0xF8 || 2GB
 +
|-
 +
| 0xF0 || 4GB
 +
|-
 +
| 0xE0 || 8GB
 +
|-
 +
| 0xE1 || 16GB
 +
|-
 +
| 0xE2 || 32GB
 +
|}
 +
 
 +
= RmaInformation =
 +
This is "nn::gc::RmaInformation". This is a 0x200-byte struct.
 +
 
 +
= GameCardCardHeader =
 +
This is a 0x600-byte struct.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x100
 +
| [[XCI#CardHeader|Signature]]
 +
|-
 +
| 0x100
 +
| 0x100
 +
| [[Lotus3#GetCardHeader|Header]]
 +
|-
 +
| 0x200
 +
| 0x400
 +
| [[XCI#NewCardHeaderCertArea|NewCardHeaderCertArea]]
 +
|}
 +
 
 +
= SimulatingDeviceType =
 +
This is "nn::fs::SimulatingDeviceType".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Value || Name
 +
|-
 +
| 0 || eMMC
 +
|-
 +
| 1 || SdCard
 
|-
 
|-
 
| 2 || GameCard
 
| 2 || GameCard
 +
|}
 +
 +
= SimulatingDeviceDetectionMode =
 +
This is "nn::fs::SimulatingDeviceDetectionMode".
 +
 +
{| class="wikitable" border="1"
 
|-
 
|-
| 3 || NandSystem
+
! Value || Name
 
|-
 
|-
| 4 || NandUser
+
| 0 || NoSimulation
 
|-
 
|-
| 5 || SdCard
+
| 1 || DeviceAttached
 +
|-
 +
| 2 || DeviceRemoved
 
|}
 
|}
   −
= ContentStorageId =
+
= 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"
 
{| class="wikitable" border="1"
 
|-
 
|-
 
! Value || Name
 
! Value || Name
 
|-
 
|-
| 0 || NandSystem
+
| 0 || None
 +
|-
 +
| 1 || Faster
 
|-
 
|-
| 1 || NandUser
+
| 2 || Slower
 
|-
 
|-
| 2 || SdCard
+
| 3 || Random
 
|}
 
|}
   −
= ContentPath =
+
= FspPath =
These are the 0x300 paths to NCA files for the various filesystems FS can access, beginning with @. They're passed via X descriptors, and returned via various [[Location Resolver services|ncm/lr]] commands.
+
This is "nn::fssrv::sf::FspPath". This is a 0x301-byte string.
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 647: Line 2,790:  
! Path || Notes
 
! Path || Notes
 
|-
 
|-
| @GcApp || Gamecard App partition (Partition 2)
+
| @SystemContent ||
 +
|-
 +
| @UserContent ||
 +
|-
 +
| @SdCardContent ||
 +
|-
 +
| @CalibFile ||
 +
|-
 +
| @Safe ||
 +
|-
 +
| @User ||
 +
|-
 +
| @System ||
 
|-
 
|-
| @GcS00000001 || Gamecard Contents.
+
| @Sdcard ||
 
|-
 
|-
| @SdCardContent || Installed SD card contents
+
| @Host ||
 
|-
 
|-
| @Sdcard || Raw SD card partition
+
| @GcApp || Gamecard App partition (Partition 2)
 
|-
 
|-
| @SystemContent || NandSystem partition.
+
| @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)
|-  
+
|-
| @UserContent || NandUser partition.
+
| [4.0.0+] @RegUpdate || Registered update partition
 
|}
 
|}
   −
=BisPartitionID=
+
= SaveDataAttribute =
* 0: Raw NAND sectors access for MMC [[Flash_Filesystem|boot]] partition 0.
+
This is "nn::fs::SaveDataAttribute".
* 10: Raw NAND sectors access for MMC [[Flash_Filesystem|boot]] partition 1.
  −
* Rest: see [[Flash_Filesystem|here]].
     −
=Save Struct=
   
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 676: Line 2,828:  
| 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
| 0x8
+
| 0x1
| ContentStorageId? 0 for SystemSaveData. 1 for SaveData. 2 for DeviceSaveData(with official user-processes all other fields are 0 for DeviceSaveData).
+
| [[#SaveDataType]]
 +
|-
 +
| 0x21
 +
| 0x1
 +
| [[#SaveDataRank]]
 +
|-
 +
| 0x22
 +
| 0x2
 +
| SaveDataIndex
 +
|-
 +
| 0x24
 +
| 0x4
 +
| Padding
 
|-
 
|-
 
| 0x28
 
| 0x28
Line 705: Line 2,869:  
Total size is 0x40-bytes.
 
Total size is 0x40-bytes.
   −
=SaveCreate Struct=
+
For DeviceSaveData, this struct is all-zero except for the [[#SaveDataType]] field (and optionally the ApplicationId if specified).
 +
 
 +
= SaveDataCreationInfo =
 +
This is "nn::fs::SaveDataCreationInfo".
 +
 
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
Line 714: Line 2,882:  
| 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 747: Line 2,915:  
Total size is 0x40-bytes.
 
Total size is 0x40-bytes.
   −
=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 =
 +
This is accessed using the same commands for SaveData with the same input u8. The [[#SaveDataAttribute]] is the same as DeviceSaveData (besides the SaveDataType), except that the [[NCM_services#ApplicationId|ApplicationId]] field is always set to <input ApplicationId> (unlike DeviceSaveData where it's optional). See above regarding [[#SaveDataCreationInfo]].
 +
 
 +
The 0x10-byte struct passed to [[#CreateSaveDataFileSystem]] has the first 0x5-bytes set to all-zero.
 +
 
 +
MountSystemBcatSaveData uses [[#OpenSaveDataFileSystemBySystemSaveDataId]] with [[#SaveDataSpaceId]] System. The [[#SaveDataAttribute]] is all-zero, except for the SaveDataType, and SystemSaveDataId is set to the input param.
 +
 
 +
= SaveDataInfo =
 +
This is "nn::fs::SaveDataInfo".
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! Offset
 +
! Size
 +
! Description
 +
|-
 +
| 0x0
 +
| 0x8
 +
| SaveDataId
 +
|-
 +
| 0x8
 +
| 0x1
 +
| [[#SaveDataSpaceId]]
 +
|-
 +
| 0x9
 +
| 0x1
 +
| [[#SaveDataType]]
 +
|-
 +
| 0xA
 +
| 0x6
 +
| Padding?
 +
|-
 +
| 0x10
 +
| 0x10
 +
| UserId
 +
|-
 +
| 0x20
 +
| 0x8
 +
| SystemSaveDataId (0 for regular SaveData)
 +
|-
 +
| 0x28
 +
| 0x8
 +
| [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData)
 +
|-
 +
| 0x30
 +
| 0x8
 +
| Raw saveimage size
 +
|-
 +
| 0x38
 +
| 0x2
 +
| SaveDataIndex
 +
|-
 +
| 0x3A
 +
| 0x1
 +
| [[#SaveDataRank]]
 +
|-
 +
| 0x3B
 +
| 0x25
 +
| Unknown. Usually zeros?
 +
|}
 +
 
 +
This is a 0x60-byte struct.
   −
=BcatSaveData=
+
= SaveDataFileSystemExtraData =
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 a 0x200-byte struct. Appears to match [[Savegames#Extra_data]].
   −
The 0x10-byte struct passed to [[#CreateSaveData]] has the first 0x5-bytes set to all-zero.
+
= InitialDataVersion2 =
 +
This is a 0x8210-byte struct used by [[#ISaveDataTransferManagerWithDivision]].
    
[[Category:Services]]
 
[[Category:Services]]

Navigation menu