Filesystem services: Difference between revisions
No edit summary  | 
				|||
| (150 intermediate revisions by 11 users not shown) | |||
| Line 4: | Line 4: | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
! Cmd || Name   | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 ||   | | 0 || [[#OpenCodeFileSystem]]  | ||
|-  | |-  | ||
| 1 || IsArchivedProgram   | | 1 || [[#IsArchivedProgram]]  | ||
|-  | |-  | ||
| 2 || [4.0.0+] SetCurrentProcess   | | 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+] Now takes an additional type-0x1A output buffer.  | |||
[16.0.0+] Now takes an additional input [[#ContentAttributes]].  | |||
[17.0.0+] Now takes a type-0x6 output buffer instead of a type-0x1A output buffer.  | |||
[20.0.0+] Now no longer takes a type-0x19 input buffer containing a [[#FspPath]] and instead takes an input [[NCM_services#StorageId|StorageId]].  | |||
== IsArchivedProgram ==  | |||
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 =  | ||
| Line 18: | Line 35: | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
! Cmd || Name   | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 || [[#RegisterProgram]]   | | 0 || [[#RegisterProgram]]  | ||
|-  | |-  | ||
| 1 || [[#UnregisterProgram]]   | | 1 || [[#UnregisterProgram]]  | ||
|-  | |-  | ||
| 2 || [4.0.0+] SetCurrentProcess   | | 2 || [4.0.0+] [[#SetCurrentProcess]]  | ||
|-  | |-  | ||
| 256 || [[#SetEnabledProgramVerification]]   | | 256 || [1.0.0-9.2.0] [[#SetEnabledProgramVerification]]  | ||
|}  | |}  | ||
== RegisterProgram ==  | == RegisterProgram ==  | ||
Takes   | Takes an input [[NCM_services#StorageId|StorageId]], an input u64 ProcessId, an input [[NCM_services#ProgramId|ProgramId]], a type-0x5 input buffer containing an [[NPDM#ACID|ACID]] [[NPDM#FsAccessControl|FsAccessControl]], and a type-0x5 input buffer containing an [[NPDM#ACI0|ACI0]] [[NPDM#FsAccessControl|FsAccessControl]].  | ||
Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.  | Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.  | ||
[20.0.0+] Now takes an additional input [[#FsAccessControlRestrictionMode]].  | |||
== UnregisterProgram ==  | == UnregisterProgram ==  | ||
Takes   | Takes an input u64 ProcessId. No output.  | ||
Removes registered FS permissions for that PID.  | |||
== SetEnabledProgramVerification ==  | == SetEnabledProgramVerification ==  | ||
Takes an input bool. No output.  | |||
When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.  | When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.  | ||
[10.0.0+] This was moved to [[Loader_services|Loader]].  | |||
= fsp-srv =  | = fsp-srv =  | ||
| Line 57: | Line 80: | ||
| 7 || [2.0.0+] [[#OpenFileSystemWithPatch]]  | | 7 || [2.0.0+] [[#OpenFileSystemWithPatch]]  | ||
|-  | |-  | ||
| 8 || [  | | 8 || [16.0.0+] [[#OpenFileSystemWithIdObsolete]] ([2.0.0-15.0.1] OpenFileSystemWithId)  | ||
|-  | |-  | ||
| 9 || [3.0.0+]   | | 9 || [3.0.0+] OpenDataFileSystemByProgramId  | ||
|-  | |||
| 10 || [16.0.0+] [[#OpenFileSystemWithId]]  | |||
|-  | |-  | ||
| 11 || [[#OpenBisFileSystem]]  | | 11 || [[#OpenBisFileSystem]]  | ||
| Line 88: | Line 113: | ||
|-  | |-  | ||
| 28 || [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute  | | 28 || [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute  | ||
|-  | |||
| 29 || [19.0.0+] IsInitializationMode  | |||
|-  | |-  | ||
| 30 || [[#OpenGameCardStorage]]  | | 30 || [[#OpenGameCardStorage]]  | ||
| Line 99: | Line 126: | ||
| 34 || [5.0.0+] GetCacheStorageSize  | | 34 || [5.0.0+] GetCacheStorageSize  | ||
|-  | |-  | ||
| 35 || [6.0.0+]   | | 35 || [6.0.0+] [[#CreateSaveDataFileSystemWithHashSalt]]  | ||
|-  | |||
| 36 || [9.0.0+] OpenHostFileSystemWithOption  | |||
|-  | |||
| 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2  | |||
|-  | |||
| 38 || [20.0.0+] DetachSdCard  | |||
|-  | |-  | ||
| 51 || [[#OpenSaveDataFileSystem]]  | | 51 || [[#OpenSaveDataFileSystem]]  | ||
| Line 105: | Line 138: | ||
| 52 || [[#OpenSaveDataFileSystemBySystemSaveDataId]]  | | 52 || [[#OpenSaveDataFileSystemBySystemSaveDataId]]  | ||
|-  | |-  | ||
| 53 || [2.0.0+] OpenReadOnlySaveDataFileSystem  | | 53 || [2.0.0+] [[#OpenReadOnlySaveDataFileSystem]]  | ||
|-  | |-  | ||
| 57 || [3.0.0+] [[#ReadSaveDataFileSystemExtraDataBySaveDataSpaceId]]  | | 57 || [3.0.0+] [[#ReadSaveDataFileSystemExtraDataBySaveDataSpaceId]]  | ||
| Line 117: | Line 150: | ||
| 61 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]]  | | 61 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]]  | ||
|-  | |-  | ||
| 62 || [5.0.0+]   | | 62 || [5.0.0+] OpenSaveDataInfoReaderOnlyCacheStorage  | ||
|-  | |-  | ||
| 64 || [5.0.0+] OpenSaveDataInternalStorageFileSystem  | | 64 || [5.0.0+] OpenSaveDataInternalStorageFileSystem  | ||
| Line 123: | Line 156: | ||
| 65 || [5.0.0+] UpdateSaveDataMacForDebug  | | 65 || [5.0.0+] UpdateSaveDataMacForDebug  | ||
|-  | |-  | ||
| 66 || [5.0.0+]   | | 66 || [5.0.0+] WriteSaveDataFileSystemExtraDataWithMask  | ||
|-  | |-  | ||
| 67 || [6.0.0+] FindSaveDataWithFilter   | | 67 || [6.0.0+] [[#FindSaveDataWithFilter]]  | ||
|-  | |-  | ||
| 68 || [6.0.0+]   | | 68 || [6.0.0+] [[#OpenSaveDataInfoReaderWithFilter]]  | ||
|-  | |||
| 69 || [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute  | |||
|-  | |||
| 70 || [8.0.0+] WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute  | |||
|-  | |||
| 71 || [10.0.0+] ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute  | |||
|-  | |-  | ||
| 80 || OpenSaveDataMetaFile  | | 80 || OpenSaveDataMetaFile  | ||
|-  | |-  | ||
| 81 || [4.0.0+]   | | 81 || [4.0.0+] [[#OpenSaveDataTransferManager]]  | ||
|-  | |-  | ||
| 82 || [5.0.0+]   | | 82 || [5.0.0+] [[#OpenSaveDataTransferManagerVersion2]]  | ||
|-  | |-  | ||
| 83 || [6.0.0+]   | | 83 || [6.0.0+] [[#OpenSaveDataTransferProhibiter]]  | ||
|-  | |-  | ||
| 84 || [6.0.0+]   | | 84 || [6.0.0+] [[#ListAccessibleSaveDataOwnerId]]  | ||
|-  | |||
| 85 || [9.0.0+] [[#OpenSaveDataTransferManagerForSaveDataRepair]]  | |||
|-  | |||
| 86 || [10.0.0+] [[#OpenSaveDataMover]]  | |||
|-  | |||
| 87 || [11.0.0+] [[#OpenSaveDataTransferManagerForRepair]]  | |||
|-  | |-  | ||
| 100 || OpenImageDirectoryFileSystem  | | 100 || OpenImageDirectoryFileSystem  | ||
|-  | |||
| 101 || [11.0.0+] OpenBaseFileSystem  | |||
|-  | |||
| 102 || [12.0.0+] FormatBaseFileSystem  | |||
|-  | |-  | ||
| 110 || [[#OpenContentStorageFileSystem]]  | | 110 || [[#OpenContentStorageFileSystem]]  | ||
|-  | |-  | ||
| 120 || [6.0.0  | | 120 || [6.0.0-9.2.0] [[#OpenCloudBackupWorkStorageFileSystem]]  | ||
|-  | |||
| 130 || [7.0.0+] [[#OpenCustomStorageFileSystem]]  | |||
|-  | |-  | ||
| 200 || OpenDataStorageByCurrentProcess  | | 200 || OpenDataStorageByCurrentProcess  | ||
| Line 152: | Line 203: | ||
|-  | |-  | ||
| 203 || OpenPatchDataStorageByCurrentProcess  | | 203 || OpenPatchDataStorageByCurrentProcess  | ||
|-  | |||
| 204 || [7.0.0+] [[#OpenDataFileSystemWithProgramIndex]]  | |||
|-  | |||
| 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]]  | |||
|-  | |||
| 206 || [13.0.0+] OpenDataStorageByPath  | |||
|-  | |||
| 207 || [15.0.0+] OpenDataFileSystemByDataId  | |||
|-  | |-  | ||
| 400 || [[#OpenDeviceOperator]]  | | 400 || [[#OpenDeviceOperator]]  | ||
| Line 158: | Line 217: | ||
|-  | |-  | ||
| 501 || [[#OpenGameCardDetectionEventNotifier]]  | | 501 || [[#OpenGameCardDetectionEventNotifier]]  | ||
|-  | |||
| 502 || [20.0.0+] OpenSdCardAwakenReadyEventNotifier  | |||
|-  | |||
| 503 || [19.0.0+] OpenGameCardAwakenReadyEventNotifier  | |||
|-  | |-  | ||
| 510 || [5.0.0+] OpenSystemDataUpdateEventNotifier  | | 510 || [5.0.0+] OpenSystemDataUpdateEventNotifier  | ||
| Line 163: | Line 226: | ||
| 511 || [5.0.0+] NotifySystemDataUpdateEvent  | | 511 || [5.0.0+] NotifySystemDataUpdateEvent  | ||
|-  | |-  | ||
| 520 || [6.0.0+]   | | 520 || [6.0.0+] [[#SimulateDeviceDetectionEvent]]  | ||
|-  | |-  | ||
| 600 || [1.0.0-3.0.2] SetCurrentPosixTime  | | 600 || [1.0.0-3.0.2] SetCurrentPosixTime  | ||
| Line 183: | Line 246: | ||
| 608 || [2.0.0+] UnregisterAllExternalKey  | | 608 || [2.0.0+] UnregisterAllExternalKey  | ||
|-  | |-  | ||
| 609 || [2.0.0  | | 609 || [2.0.0-15.0.1] GetRightsIdByPath  | ||
|-  | |-  | ||
| 610 || [3.0.0+] GetRightsIdAndKeyGenerationByPath  | | 610 || [3.0.0+] GetRightsIdAndKeyGenerationByPath  | ||
| Line 198: | Line 261: | ||
|-  | |-  | ||
| 616 || [6.0.0+] [[#GetSaveDataCommitId]]  | | 616 || [6.0.0+] [[#GetSaveDataCommitId]]  | ||
|-  | |||
| 617 || [7.0.0+] UnregisterExternalKey  | |||
|-  | |||
| 618 || [17.0.0+] GetProgramId  | |||
|-  | |-  | ||
| 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]  | | 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]  | ||
| Line 205: | Line 272: | ||
| 631 || [4.0.0+] IsSdCardAccessible  | | 631 || [4.0.0+] IsSdCardAccessible  | ||
|-  | |-  | ||
| 640 || [4.0.0  | | 632 || [19.0.0+] TestExternalKey  | ||
|-  | |||
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid  | |||
|-  | |||
| 650 || [S2]  | |||
|-  | |-  | ||
| 700 || [5.0.0+]   | | 651 || [S2]  | ||
|-  | |||
| 660 || [S2]  | |||
|-  | |||
| 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]]  | |||
|-  | |-  | ||
| 701 || [5.0.0+] GetAccessFailureDetectionEvent  | | 701 || [5.0.0+] GetAccessFailureDetectionEvent  | ||
| Line 217: | Line 292: | ||
| 720 || [5.0.0+] AbandonAccessFailure  | | 720 || [5.0.0+] AbandonAccessFailure  | ||
|-  | |-  | ||
| 800 || [2.0.0+]   | | 800 || [2.0.0+] GetAndClearErrorInfo  | ||
|-  | |-  | ||
|   | | 810 || [7.0.0+] RegisterProgramIndexMapInfo  | ||
|-  | |-  | ||
|   | | 820 || [19.0.0+] GetContentStorageInfoIndex  | ||
|-  | |-  | ||
| 1002 || SetSaveDataRootPath  | | 1000 || [1.0.0-9.2.0] SetBisRootForHost  | ||
|-  | |||
| 1001 || [[#SetSaveDataSize]]  | |||
|-  | |||
| 1002 || [[#SetSaveDataRootPath]]  | |||
|-  | |-  | ||
| 1003 || DisableAutoSaveDataCreation  | | 1003 || DisableAutoSaveDataCreation  | ||
| Line 239: | Line 318: | ||
| 1009 || [4.0.0+] GetAndClearMemoryReportInfo  | | 1009 || [4.0.0+] GetAndClearMemoryReportInfo  | ||
|-  | |-  | ||
| 1010 || [5.1.0  | | 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 ==  | |||
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]].  | |||
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.  | |||
Note that the functions check whether or not at least one bit is set in the mask. This means that, you don't need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000.  | |||
If nn::spl::IsDebugMode() is disabled (retail behavior), the FS sysmodule masks the permission descriptor with 0x3FFFFFFFFFFFFFFF upon process registration.  | |||
If the code were to request an invalid input type, panic. But this never happens.  | |||
The output values for [[#ReadWrite]] CanMountRegisteredUpdatePartition and [[#Call]] CanRegisterUpdatePartition are masked with the cached value of [[SMC#IsDebugMode|DebugMode]].  | |||
=== ReadWrite ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |-  | ||
|   | ! 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]]  | ||
|-  | |-  | ||
|   | | 0x8 || CanMountImageAndVideoStorage ||0x8000000000001000 || RW || [[#OpenImageDirectoryFileSystem]]  | ||
|-  | |-  | ||
|   | | 0x9 || CanMountCustomStorage0 || 0x8000000000000000 || RW || OpenCustomStorageFileSystem  | ||
|-  | |-  | ||
|   | | 0xA || CanMountBisCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisFileSystem]]  | ||
|-  | |-  | ||
|   | | 0xB || CanMountBisSafeMode || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]  | ||
|-  | |-  | ||
|   | | 0xC || CanMountBisUser || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]  | ||
|-  | |-  | ||
|   | | 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]]  | ||
|-  | |-  | ||
|   | | 0xE || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]  | ||
|-  | |-  | ||
|   | | 0xF || CanMountBisSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisFileSystem]]  | ||
|-  | |-  | ||
|   | | 0x10 || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]]  | ||
|-  | |-  | ||
|   | | 0x11 || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]]  | ||
|-  | |-  | ||
|   | | 0x12 || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]]  | ||
|-  | |-  | ||
|   | | 0x13 || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]  | ||
|-  | |-  | ||
|   | | 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]]  | ||
|-  | |-  | ||
|   | | 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]]  | ||
|-  | |-  | ||
|   | | 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]]  | ||
|-  | |-  | ||
|   | | 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]]  | ||
|-  | |-  | ||
|   | | 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 || [-19.0.0] 0x8000000000000000 [20.0.0+] 0x8000000000000020 || RW || [[#OpenSaveDataInternalStorageFileSystem]]  | ||
|-  | |-  | ||
|   | | [7.0.0+] 0x2D || CanMountTemporaryDirectory || 0xC000000000000000 || RW ||    | ||
|-  | |-  | ||
|   | | [11.0.0+] 0x2E || CanMountAllBaseFilesystem || 0x8000000000000000 || RW || OpenBaseFileSystem  | ||
|-  | |-  | ||
|   | | [15.0.0+] 0x2F || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem  | ||
|}  | |||
=== Call ===  | |||
{| class="wikitable" border="1"  | |||
|-  | |-  | ||
|   | ! OperationType || Name || Mask || Used by  | ||
|-  | |-  | ||
|   | | 0x0 || CanInvalidateBisCache || 0x8000000000000080 || [[#InvalidateBisCache]]  | ||
|-  | |-  | ||
|   | | 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc  | ||
|-  | |-  | ||
|   | | [20.0.0+] 0x2 ||  || 0x8000100000000080 ||  | ||
|-  | |-  | ||
|   | | [-19.0.0] 0x2 [20.0.0+] 0x3 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate  | ||
|-  | |-  | ||
|   | | [-19.0.0] 0x3 [20.0.0+] 0x4 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet  | ||
|-  | |-  | ||
|   | | [-19.0.0] 0x4 [20.0.0+] 0x5 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver  | ||
|-  | |-  | ||
|   | | [-19.0.0] 0x5 [20.0.0+] 0x6 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x6 [20.0.0+] 0x7 || CanGetGameCardAsicCertificate || 0x8000000000000200 || GetGameCardAsicCertificate  | ||
|-  | |-  | ||
| [  | | [20.0.0+] 0x8 ||  || 0x8000100000000080 ||  | ||
|-  | |-  | ||
| [  | | [20.0.0+] 0x9 ||  || 0x8000100000000080 ||  | ||
|-  | |-  | ||
| [  | | [20.0.0+] 0xA ||  || 0x8000080000000000 ||  | ||
|-  | |-  | ||
| [  | | [20.0.0+] 0xB ||  || 0x8000000000000010 ||  | ||
|-  | |-  | ||
| [  | | [20.0.0+] 0xC ||  || 0x8000100000000080 ||  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x7 [20.0.0+] 0xD || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]]  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x8 [20.0.0+] 0xE || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x9 [20.0.0+] 0xF || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0xA [20.0.0+] 0x10 || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0xB [20.0.0+] 0x11 || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0xC [20.0.0+] 0x12 || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0xD [20.0.0+] 0x13 || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]]  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0xE [20.0.0+] 0x14 || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]]  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0xF [20.0.0+] 0x15 || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x10 [20.0.0+] 0x16 || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x11 [20.0.0+] 0x17 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]]  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x12 [20.0.0+] 0x18 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]]  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x13 [20.0.0+] 0x19 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode  | ||
|-  | |-  | ||
| [  | | [20.0.0+] 0x1A ||  || 0x8000000400080000 ||  | ||
|-  | |-  | ||
| [  | | [20.0.0+] 0x1B ||  || 0x8000000400080000 ||  | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x14 [20.0.0+] 0x1C || CanDebug || 0xC000000000000000 ||    | ||
|-  | |-  | ||
| [  | | [-19.0.0] 0x15 [20.0.0+] 0x1D || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles  | ||
|-  | |-  | ||
| [  | | [2.0.0-19.0.0] 0x16 [20.0.0+] 0x1E || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId  | ||
|-  | |-  | ||
| [  | | [2.0.0-19.0.0] 0x17 [20.0.0+] 0x1F || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId  | ||
|-  | |-  | ||
| [  | | [2.0.0-19.0.0] 0x18 [20.0.0+] 0x20 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId  | ||
|-  | |-  | ||
| [  | | [2.0.0-19.0.0] 0x19 [20.0.0+] 0x21 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]]  | ||
|-  | |-  | ||
| [  | | [2.0.0-19.0.0] 0x1A [20.0.0+] 0x22 || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem  | ||
|-  | |-  | ||
| [  | | [3.0.0-19.0.0] 0x1B [20.0.0+] 0x23 || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath  | ||
|-  | |-  | ||
| [  | | [3.0.0-19.0.0] 0x1C [20.0.0+] 0x24 || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey  | ||
|-  | |-  | ||
| [  | | [4.0.0-19.0.0] 0x1D [20.0.0+] 0x25 || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]]  | ||
|-  | |-  | ||
| [  | | [4.0.0-19.0.0] 0x1E [20.0.0+] 0x26 || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask  | ||
|-  | |-  | ||
| [  | | [4.0.0-19.0.0] 0x1F [20.0.0+] 0x27 || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask  | ||
|-  | |-  | ||
| [  | | [4.0.0-19.0.0] 0x20 [20.0.0+] 0x28 || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask  | ||
|-  | |-  | ||
| [  | | [5.0.0-19.0.0] 0x21 [20.0.0+] 0x29 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask  | ||
|  | |-  | ||
| [5.0.0-19.0.0] 0x22 [20.0.0+] 0x2A || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem  | |||
|-  | |||
| [5.0.0-19.0.0] 0x23 [20.0.0+] 0x2B || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem  | |||
|-  | |||
[  | | [5.0.0-19.0.0] 0x24 [20.0.0+] 0x2C || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem  | ||
|-  | |||
| [5.0.0-19.0.0] 0x25 [20.0.0+] 0x2D || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition  | |||
|-  | |||
| [5.0.0-19.0.0] 0x26 [20.0.0+] 0x2E || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]]  | |||
|-  | |||
| [5.0.0-19.0.0] 0x27 [20.0.0+] 0x2F || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]]  | |||
|-  | |||
| [5.0.0-19.0.0] 0x28 [20.0.0+] 0x30 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair  | |||
|-  | |||
| [5.0.0-19.0.0] 0x29 [20.0.0+] 0x31 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair  | |||
|-  | |||
| [5.0.0-19.0.0] 0x2A [20.0.0+] 0x32 || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]]  | |||
|-  | |||
| [5.0.0-19.0.0] 0x2B [20.0.0+] 0x33 || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]]  | |||
|-  | |||
| [5.0.0-19.0.0] 0x2C [20.0.0+] 0x34 || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]]  | |||
|-  | |||
| [5.0.0-19.0.0] 0x2D [20.0.0+] 0x35 || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]]  | |||
|-  | |||
| [5.0.0-19.0.0] 0x2E [20.0.0+] 0x36 || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol  | |||
|-  | |||
| [5.0.0-19.0.0] 0x2F [20.0.0+] 0x37 || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey  | |||
|-  | |||
| [5.1.0-19.0.0] 0x30 [20.0.0+] 0x38 || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]]  | |||
|-  | |||
| [20.0.0+] 0x39 ||  || 0x8000000000200000 ||  | |||
|-  | |||
| [6.0.0-19.0.0] 0x31 [20.0.0+] 0x3A || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]]  | |||
|-  | |||
| [20.0.0+] 0x3B || CanOpenGameCardAwakenReadyEventNotifier || 0x8000000080000110 || OpenGameCardAwakenReadyEventNotifier  | |||
|-  | |||
| [6.0.0-19.0.0] 0x32 [20.0.0+] 0x3C || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier  | |||
|-  | |||
| [6.0.0-19.0.0] 0x33 [20.0.0+] 0x3D || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent  | |||
|-  | |||
| [6.0.0-19.0.0] 0x34 [20.0.0+] 0x3E || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]]  | |||
|-  | |||
| [6.0.0-19.0.0] 0x35 [20.0.0+] 0x3F || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent  | |||
|-  | |||
| [6.0.0-19.0.0] 0x36 [20.0.0+] 0x40 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected  | |||
|-  | |||
| [6.0.0-19.0.0] 0x37 [20.0.0+] 0x41 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure  | |||
|-  | |||
| [6.0.0-19.0.0] 0x38 [20.0.0+] 0x42 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure  | |||
|-  | |||
| [8.0.0-19.0.0] 0x39 [20.0.0+] 0x43 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize  | |||
|-  | |||
| [9.0.0-19.0.0] 0x3A [20.0.0+] 0x44 || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]]  | |||
|-  | |||
| [20.0.0+] 0x45 ||   || 0x8000000000200000 ||  | |||
|-  | |||
| [9.0.0-19.0.0] 0x3B [20.0.0+] 0x46 || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility  | |||
|-  | |||
| [9.0.0-19.0.0] 0x3C [20.0.0+] 0x47 || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent  | |||
|-  | |||
| [9.0.0-19.0.0] 0x3D [20.0.0+] 0x48 || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]]  | |||
|-  | |||
| [9.0.0-19.0.0] 0x3E [20.0.0+] 0x49 || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo  | |||
|-  | |||
| [9.0.0-19.0.0] 0x3F [20.0.0+] 0x4A || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence  | |||
|-  | |||
| [9.0.0-19.0.0] 0x40 [20.0.0+] 0x4B || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt  | |||
|-  | |||
| [9.0.0-19.0.0] 0x41 [20.0.0+] 0x4C || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]]  | |||
|-  | |||
| [10.0.0-19.0.0] 0x42 [20.0.0+] 0x4D || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]]  | |||
|-  | |||
| [10.0.0-19.0.0] 0x43 [20.0.0+] 0x4E || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem  | |||
|-  | |||
| [10.2.0-19.0.0] 0x44 [20.0.0+] 0x4F || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]]  | |||
|-  | |||
| [11.0.0-19.0.0] 0x45 [20.0.0+] 0x50 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]]  | |||
|-  | |||
| [13.0.0-19.0.0] 0x46 [20.0.0+] 0x51 || CanOpenSaveDataTransferManagerForRepair || 0x8000000000000020 || [[#OpenSaveDataTransferManagerForRepair]]  | |||
|-  | |||
| [13.0.0-19.0.0] 0x47 [20.0.0+] 0x52 || CanSetDebugConfiguration || 0x8000000000000000 || SetDebugOption, UnsetDebugOption  | |||
|-  | |||
| [15.0.0-19.0.0] 0x48 [20.0.0+] 0x53 || CanOpenDataStorageByPath || 0x8000000000000000 || OpenDataStorageByPath  | |||
|-  | |||
| [17.0.0-19.0.0] 0x49 [20.0.0+] 0x54|| CanNotifyErrorContextServiceReady || 0x8000004000000000 || NotifyErrorContextServiceReady  | |||
|-  | |||
| [17.0.0-19.0.0] 0x4A || CanGetProgramId || 0x8000000008000000 || GetProgramId, Removed in 20.0.0  | |||
|-  | |||
| [20.0.0+] 0x55 || CanGetContentStorageInfo || 0x8000000000000800 ||  | |||
|-  | |||
| [20.0.0+] 0x56 || CanDetachSdCard || 0x8000000004000000 ||  | |||
|-  | |||
| [20.0.0+] 0x57 || CanSetSdCardActivationMode || 0x8000000004000000 ||  | |||
|}  | |||
==   | == OpenFileSystem ==  | ||
Takes an input   | Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#FileSystemProxyType]]. Returns an [[#IFileSystem]].  | ||
[2.0.0+] This function was removed.  | |||
== SetCurrentProcess ==  | |||
Takes an input u64 ProcessId. No output.  | |||
== OpenFileSystemWithPatch ==  | |||
Takes an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].  | |||
The [[#FileSystemProxyType]] must be '''Manual'''.  | |||
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.  | |||
==   | == OpenFileSystemWithIdObsolete ==  | ||
Takes   | Takes a type-0x19 input buffer containing a [[#FspPath]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].  | ||
The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.  | |||
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.  | |||
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.  | |||
After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.  | |||
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.  | |||
==   | == OpenFileSystemWithId ==  | ||
Takes an input   | 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]].  | ||
Returns an [[#IFileSystem]].  | == OpenBisFileSystem ==  | ||
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#BisPartitionId]]. 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 [[#OpenBisStorage]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.  | |||
==   | == OpenBisStorage ==  | ||
Takes   | 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 ==  | ||
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]].  | |||
==   | == DeleteSaveDataFileSystem ==  | ||
Takes an input   | Takes an input u64.  | ||
==   | == CreateSaveDataFileSystem ==  | ||
Takes a [[#  | 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 meta file size, +4 u8 = 1 meta index which dictates meta file name.  | |||
Creates non-system savedata.  | |||
== CreateSaveDataFileSystemBySystemSaveDataId ==  | |||
Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]].  | |||
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.  | |||
==   | == OpenGameCardStorage ==  | ||
Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]].  | |||
==   | == OpenGameCardFileSystem ==  | ||
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]].  | |||
Mounts a [[Gamecard_Partition|gamecard partition]].  | |||
== CreateSaveDataFileSystemWithHashSalt ==  | |||
Takes a total of 0xB0-bytes of input, no output.  | |||
==   | == OpenSaveDataFileSystem ==  | ||
Takes an input u8 and   | 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]].  | |||
Permissions aren't checked until the specified save is successfully found.  | |||
Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData).  | |||
==   | == OpenSaveDataFileSystemBySystemSaveDataId ==  | ||
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8.  | |||
Returns an [[#IFileSystem]].  | |||
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.  | |||
== 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.  | |||
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 ==  | |||
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.  | |||
[[NCA|PublicData]] is exempt from the [[#Permissions|permissions]] check.  | |||
== OpenDataFileSystemWithProgramIndex ==  | |||
Takes an input u8, returns an [[#IFileSystem]].  | |||
|   | |||
==   | == OpenDataStorageWithProgramIndex ==  | ||
Takes   | Takes an input u8, returns an [[#IStorage]].  | ||
==   | == OpenDeviceOperator ==  | ||
This command returns a session to a port implementing the [[#IDeviceOperator]] interface.  | |||
== OpenSdCardDetectionEventNotifier ==  | |||
This command returns a session to a port implementing the [[#IEventNotifier]] interface.  | |||
== OpenGameCardDetectionEventNotifier ==  | |||
This command returns a session to a port implementing the [[#IEventNotifier]] interface.  | |||
== SimulateDeviceDetectionEvent ==  | |||
Takes a total of 0xC-bytes of input, no output.  | |||
==   | == VerifySaveDataFileSystem ==  | ||
Takes a type-  | 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).  | |||
==   | == GetSaveDataCommitId ==  | ||
Takes   | Takes an input u8 and u64, returns an output u64.  | ||
==   | == SetSdCardEncryptionSeed ==  | ||
Takes   | 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   | 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 (?)  | |||
=   | == SetSaveDataRootPath ==  | ||
Takes an input path, and does snprintf(<fsp-srv object>->m_save_data_root_path, FS_MAX_PATH-1, "/%s", input_path);  | |||
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 ==  | |||
Takes an input u32.  | |||
== GetGlobalAccessLogMode ==  | |||
Returns an output u32.  | |||
GlobalAccessLogMode is normally 0.  | |||
== OutputAccessLogToSdCard ==  | |||
Takes a type-0x5 input buffer.  | |||
The input buffer is the string to output to the log. User-processes normally include a newline at the end.  | |||
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set.  | |||
When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn't show up SD, unknown why.  | |||
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 a   | Takes an input u64 size and a TransferMemory handle. Returns an output [[#IWiper]].  | ||
This is   | = IStorage =  | ||
This is "nn::fssrv::sf::IStorage".  | |||
This is the interface for a raw device, usually a block device.  | |||
This is   | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
| Line 787: | Line 890: | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 ||   | | 0 || [[#Read]]  | ||
|-  | |-  | ||
| 1 ||   | | 1 || [[#Write]]  | ||
|-  | |-  | ||
| 2 || [  | | 2 || [[#Flush]]  | ||
|-  | |-  | ||
| 3 || [  | | 3 || [[#SetSize]]  | ||
|-  | |-  | ||
| 4 || [  | | 4 || [[#GetSize]]  | ||
|-  | |-  | ||
| 5 || [  | | 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 =  | |||
This is "nn::fssrv::sf::IFileSystem".  | |||
There are two main implementations of this interface:  | |||
* '''nn::fs::fsa::IFileSystem''': The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface.  | |||
* '''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"  | |||
|-  | |-  | ||
|   | ! Cmd || Name  | ||
|-  | |-  | ||
|   | | 0 || CreateFile  | ||
|-  | |-  | ||
|   | | 1 || DeleteFile  | ||
|-  | |-  | ||
|   | | 2 || CreateDirectory  | ||
|-  | |-  | ||
|   | | 3 || DeleteDirectory  | ||
|-  | |-  | ||
|   | | 4 || DeleteDirectoryRecursively  | ||
|-  | |-  | ||
|   | | 5 || RenameFile  | ||
|-  | |-  | ||
|   | | 6 || RenameDirectory  | ||
|-  | |-  | ||
|   | | 7 || [[#GetEntryType]]  | ||
|-  | |-  | ||
|   | | 8 || [[#OpenFile]]  | ||
|-  | |-  | ||
|   | | 9 || [[#OpenDirectory]]  | ||
|-  | |-  | ||
|   | | 10 || [[#Commit]]  | ||
|-  | |-  | ||
|   | | 11 || [[#GetFreeSpaceSize]]  | ||
|-  | |-  | ||
|   | | 12 || [[#GetTotalSpaceSize]]  | ||
|-  | |-  | ||
|   | | 13 || [3.0.0+] [[#CleanDirectoryRecursively]]  | ||
|-  | |-  | ||
|   | | 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 ==  | ||
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect.  | |||
=   | == GetFreeSpaceSize ==  | ||
This is "nn::fssrv::sf::  | 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 =  | |||
This is "nn::fssrv::sf::IDirectory".  | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
| Line 885: | Line 1,008: | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 ||   | | 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"  | {| 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.  | ||
|}  | |}  | ||
This   | = 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 || File  | |||
|}  | |||
=  | = IFile =  | ||
This is "nn::fssrv::sf::IFile".  | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 ||   | | 0 || Read  | ||
|-  | |-  | ||
| 1 ||   | | 1 || Write  | ||
|-  | |||
| 2 || Flush  | |||
|-  | |||
| 3 || SetSize  | |||
|-  | |||
| 4 || GetSize  | |||
|-  | |-  | ||
|   | | 5 || [4.0.0+] OperateRange  | ||
|-  | |-  | ||
|   | | 6 || [12.0.0+] OperateRangeWithBuffer  | ||
|}  | |}  | ||
This   | = 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 =  | ||
This is "nn::fssrv::sf::IDeviceOperator".  | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 || [[#  | | 0 || [[#IsSdCardInserted]]  | ||
|-  | |||
| 1 || [[#GetSdCardSpeedMode]]  | |||
|-  | |||
| 2 || [2.0.0+] [[#GetSdCardCid]]  | |||
|-  | |-  | ||
|   | | 3 || [2.0.0+] [[#GetSdCardUserAreaSize]]  | ||
|-  | |-  | ||
|   | | 4 || [2.0.0+] [[#GetSdCardProtectedAreaSize]]  | ||
|-  | |-  | ||
|   | | 5 || [2.0.0+] [[#GetAndClearSdCardErrorInfo]]  | ||
|  | |-  | ||
| 6 || [17.0.0+] [[#GetSdCardHostControllerStatus]]  | |||
|-  | |||
| 7 || [20.0.0+] SetSdCardActivationMode  | |||
|-  | |-  | ||
| 8 || [20.0.0+] [S1] TryGetSdCardInfo  | |||
|-  | |-  | ||
|   | | 100 || [[#GetMmcCid]]  | ||
|-  | |-  | ||
|   | | 101 || [[#GetMmcSpeedMode]]  | ||
|-  | |-  | ||
|   | | 110 || [[#EraseMmc]]  | ||
|-  | |-  | ||
|   | | 111 || [[#GetMmcPartitionSize]]  | ||
|-  | |-  | ||
|   | | 112 || [2.0.0+] [[#GetMmcPatrolCount]]  | ||
|-  | |-  | ||
|   | | 113 || [2.0.0+] [[#GetAndClearMmcErrorInfo]]  | ||
|-  | |-  | ||
|   | | 114 || [2.0.0+] [[#GetMmcExtendedCsd]]  | ||
|-  | |-  | ||
|   | | 115 || [4.0.0+] [[#SuspendMmcPatrol]]  | ||
|-  | |-  | ||
|   | | 116 || [4.0.0+] [[#ResumeMmcPatrol]]  | ||
|-  | |-  | ||
|   | | 117 || [17.0.0+] [[#EraseMmcWithRange]]  | ||
|-  | |-  | ||
|   | | 118 || [20.0.0+] MarkBeforeEraseMmcPartitionUserData  | ||
|  | |-  | ||
| 119 || [20.0.0+] CheckAfterEraseMmcPartitionUserData  | |||
|-  | |||
| 200 || [S1] [[#IsGameCardInserted]]  | |||
|-  | |||
| 201 || [S1] [[#EraseGameCard]]  | |||
|-  | |||
| 202 || [S1] [[#GetGameCardHandle]]  | |||
|-  | |||
| 203 || [S1] [[#GetGameCardUpdatePartitionInfo]]  | |||
|-  | |||
| 204 || [S1] [[#FinalizeGameCardDriver]]  | |||
|-  | |||
| 205 || [S1] [[#GetGameCardAttribute]]  | |||
|-  | |||
| 206 || [S1] [[#GetGameCardDeviceCertificate]]  | |||
|-  | |||
| 207 || [S1] [[#GetGameCardAsicInfo]]  | |||
|-  | |||
| 208 || [S1] [[#GetGameCardIdSet]]  | |||
|-  | |||
| 209 || [S1] [[#WriteToGameCardDirectly]]  | |||
|-  | |||
| 210 || [S1] [[#SetVerifyWriteEnalbleFlag]]  | |||
|-  | |||
| 211 || [S1] [[#GetGameCardImageHash]]  | |||
|-  | |||
| 212 || [S1] [2.0.0+] [[#GetGameCardDeviceIdForProdCard]]  | |||
|-  | |||
| 213 || [S1] [2.0.0+] [[#EraseAndWriteParamDirectly]]  | |||
|-  | |||
| 214 || [S1] [2.0.0+] [[#ReadParamDirectly]]  | |||
|-  | |||
| 215 || [S1] [2.0.0+] [[#ForceEraseGameCard]]  | |||
|-  | |-  | ||
| 216 || [S1] [2.0.0+] [[#GetGameCardErrorInfo]]  | |||
|-  | |-  | ||
|   | | 217 || [S1] [2.1.0+] [[#GetGameCardErrorReportInfo]]  | ||
|-  | |-  | ||
|   | | 218 || [S1] [3.0.0+] [[#GetGameCardDeviceId]]  | ||
|-  | |-  | ||
|   | | 219 || [S1] [8.0.0+] [[#ChallengeCardExistence]]  | ||
|-  | |-  | ||
|   | | 220 || [S1] [9.0.0+] [[#GetGameCardCompatibilityType]]  | ||
|-  | |-  | ||
|   | | 221 || [S1] [17.0.0+] [[#GetGameCardAsicCertificate]]  | ||
|-  | |-  | ||
|   | | 222 || [S1] [18.0.0+] [[#GetGameCardCardHeader]]  | ||
|-  | |-  | ||
|   | | 223 || [S1] [19.0.0+] [[#SetGameCardSessionCreationDelay]]  | ||
|-  | |-  | ||
|   | | 224 || [S1] [19.0.0+] [[#GetGameCardApplicationIdList]]  | ||
|-  | |-  | ||
|   | | 225 || [S1] [20.0.0+] RegisterGameCardConfigurationData  | ||
|-  | |-  | ||
|   | | 226 || [S1] [20.0.0+] GetGameCardDetailedErrorReportInfo  | ||
|-  | |-  | ||
|   | | 300 || [[#SetSpeedEmulationMode]]  | ||
|-  | |-  | ||
|   | | 301 || [[#GetSpeedEmulationMode]]  | ||
|-  | |-  | ||
|   | | 302 || [18.0.0+] [[#SetApplicationStorageSpeed]]  | ||
|-  | |-  | ||
|   | | 303 || [20.0.0+] SetGameCardClockRateForSpeedEmulation  | ||
|-  | |-  | ||
|   | | 304 || [20.0.0+] ClearGameCardClockRateForSpeedEmulation  | ||
|-  | |-  | ||
|   | | 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]]  | ||
|-  | |-  | ||
|   | | 800 || [S2] [[#OpenStorageDeviceManager]]  | ||
|}  | |}  | ||
== 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'''.  | |||
== GetSdCardHostControllerStatus ==  | |||
No input. Returns an output [[#HostControllerStatus]].  | |||
== 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.  | |||
== EraseMmcWithRange ==  | |||
Takes an input [[#MmcPartition]] and two input u64s. No 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 ==  | ||
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.  | |||
[19.0.0+] Now returns an output s64 '''OutSize''' which can be 0x200 or 0x400.  | |||
=   | == 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.  | |||
=   | == SetGameCardSessionCreationDelay ==  | ||
Takes two input bools and an input u32. No output.  | |||
== GetGameCardApplicationIdList ==  | |||
Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. Returns an output u16.  | |||
== SetSpeedEmulationMode ==  | |||
Takes an input [[#SpeedEmulationMode]]. No output.  | |||
== GetSpeedEmulationMode ==  | |||
No input. Returns an output [[#SpeedEmulationMode]].  | |||
== SetApplicationStorageSpeed ==  | |||
|   | Takes an input s32. No output.  | ||
== SuspendSdmmcControl ==  | |||
No input/output.  | |||
== 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.  | |||
== OpenStorageDeviceManager ==  | |||
Takes a byte. Returns an [[#IStorageDeviceManager]].  | |||
= 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"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
!   | ! Cmd || Name  | ||
|-  | |-  | ||
|   | | 0 || [[#GetChallenge]]  | ||
|   | |||
|   | |||
|-  | |-  | ||
|   | | 16 || [[#SetKeyPackage]]  | ||
|   | |||
|   | |||
|-  | |-  | ||
|   | | 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]  | ||
|   | |||
|   | |||
|-  | |-  | ||
|   | | 81 || [[#PrepareOpenSaveDataImporter]]  | ||
|   | |||
| [[#  | |||
|-  | |-  | ||
|   | | 90 || [[#OpenSaveDataImporter]]  | ||
|   | |||
|   | |||
|-  | |-  | ||
|   | | 91 || [[#OpenSaveDataImporter2]]  | ||
|   | |||
|   | |||
|-  | |-  | ||
|   | | 100 || [[#OpenSaveDataExporterWithKey]]  | ||
|   | |||
|   | |||
|-  | |-  | ||
| 0x28  | | 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"  | {| 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 =  | ||
{| class="wikitable" border="1"  | 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]]  | ||
|   | |||
|   | |||
|-  | |-  | ||
| 0x10  | | 17 || [[#Finalize]]  | ||
| 0x10  | |}  | ||
|   | |||
|-  | == GetSaveDataInfo ==  | ||
| 0x20  | No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.  | ||
| 0x8  | |||
|   | The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.  | ||
|-  | |||
| 0x28  | == GetRestSize ==  | ||
| 0x8  | 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]]  | |||
|-  | |||
| 17 || [20.0.0+] SetLocalKeySeedPackage  | |||
|-  | |||
| 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]]  | |||
|-  | |||
| 75 || [20.0.0+] GetLocalKeySeedPackage  | |||
|-  | |||
| 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"  | |||
|-  | |||
! Cmd || Name  | |||
|-  | |||
| 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 =  | |||
[S2] This is "nn::fssrv::storage::sf::IStorageDeviceManager".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Cmd || Name  | |||
|-  | |||
| 0 || IsInserted  | |||
|-  | |||
| 1 || IsHandleValid  | |||
|-  | |||
| 2 || [[#OpenDetectionEvent]]  | |||
|-  | |||
| 3 || Returns an [[#IEventNotifier]].  | |||
|-  | |||
| 10 || [[#OpenOperator]]  | |||
|-  | |||
| 20 || [[#OpenDevice]]  | |||
|-  | |||
| 21 || [[#OpenStorage]]  | |||
|-  | |||
| 34 || Invalidate  | |||
|}  | |||
== OpenDetectionEvent ==  | |||
Returns an [[#IEventNotifier]].  | |||
== OpenOperator ==  | |||
Returns an [[#IStorageDeviceOperator]].  | |||
== OpenDevice ==  | |||
Returns an [[#IStorageDevice]].  | |||
== OpenStorage ==  | |||
Returns an [[#IStorage]].  | |||
= IStorageDeviceOperator =  | |||
[S2] This is "nn::fssrv::storage::sf::IStorageDeviceOperator".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Cmd || Name  | |||
|-  | |||
| 0 || Operate  | |||
|-  | |||
| 1 || OperateIn  | |||
|-  | |||
| 10 || OperateOut  | |||
|-  | |||
| 11 || OperateOut2  | |||
|-  | |||
| 20 || OperateInOut  | |||
|-  | |||
| 21 || OperateIn2Out  | |||
|}  | |||
= IStorageDevice =  | |||
[S2] This is "nn::fssrv::storage::sf::IStorageDevice".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Cmd || Name  | |||
|-  | |||
| 0 || GetHandle  | |||
|-  | |||
| 1 || IsHandleValid  | |||
|-  | |||
| 10 || OpenOperator  | |||
|-  | |||
| 20 || Read  | |||
|-  | |||
| 21 || Write  | |||
|-  | |||
| 22 || Flush  | |||
|-  | |||
| 23 || SetSize  | |||
|-  | |||
| 24 || GetSize  | |||
|-  | |||
| 25 || OperateRange  | |||
|}  | |||
= FileSystemProxyType =  | |||
This is "nn::fs::FileSystemProxyType".  | |||
sdknso converts the input [[#ContentType|ContentType]] to a FileSystemProxyType, for use with the cmd input.  | |||
{| 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  | |||
|}  | |||
= 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"  | |||
|-  | |||
! Value || Name  | |||
|-  | |||
| 0 || None  | |||
|-  | |||
| 1 || [S2]  | |||
|-  | |||
| 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  | |||
|}  | |||
= HostControllerStatus =  | |||
This is "nn::sdcard::HostControllerStatus".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0xC  | |||
|   | |||
|}  | |||
= 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|MemoryType]]  | |||
|}  | |||
= CardId2 =  | |||
This is "nn::gc::detail::CardId2".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x1  | |||
| [[#CardSecurityNumber|CardSecurityNumber]]  | |||
|-  | |||
| 0x1  | |||
| 0x1  | |||
| [[#CardType|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  | |||
|-  | |||
| 0xC2 || MegaChips  | |||
|-  | |||
| 0xAE || Lapis  | |||
|-  | |||
| 0x36 ||   | |||
|}  | |||
= 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  | |||
|}  | |||
= MemoryType =  | |||
This is "nn::gc::detail::MemoryType".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Value || Name  | |||
|-  | |||
| 0x1 || T1RomFast  | |||
|-  | |||
| 0x2 || T2RomFast  | |||
|-  | |||
| 0x9 || T1NandFast  | |||
|-  | |||
| 0xA || T2NandFast  | |||
|-  | |||
| 0x21 || T1RomLate  | |||
|-  | |||
| 0x22 || T2RomLate  | |||
|-  | |||
| 0x29 || T1NandLate  | |||
|-  | |||
| 0x2A || T2NandLate  | |||
|}  | |||
= CardSecurityNumber =  | |||
This is "nn::gc::detail::CardSecurityNumber".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Value || Name  | |||
|-  | |||
| 0 || 0  | |||
|-  | |||
| 1 || 1  | |||
|-  | |||
| 2 || 2  | |||
|-  | |||
| 3 || 3  | |||
|-  | |||
| 4 || 4  | |||
|}  | |||
= CardType =  | |||
This is "nn::gc::detail::CardType".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Value || Name  | |||
|-  | |||
| 0 || Rom  | |||
|-  | |||
| 1 || WritableDevT1  | |||
|-  | |||
| 2 || WritableProdT1  | |||
|-  | |||
| 3 || WritableDevT2  | |||
|-  | |||
| 4 || WritableProdT2  | |||
|}  | |||
= 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]]  | |||
|}  | |||
= GameCardAsicProductionFirmware =  | |||
This is the [[Lotus3#AsicFirmware|firmware]] for reading production Gamecards.  | |||
Embedded in "nn::gc::detail::EmbeddedDataHolder::g_FwReadBuffer" when in production mode.  | |||
[4.0.0+] This firmware was updated to provide support for new Gamecards.  | |||
[9.0.0+] This firmware was updated.  | |||
[11.0.0+] This firmware was updated.  | |||
[12.0.0+] This firmware was updated.  | |||
[14.0.0+] This firmware was updated.  | |||
= GameCardAsicDevelopmentFirmware =  | |||
This is the [[Lotus3#AsicFirmware|firmware]] for reading development Gamecards.  | |||
Embedded in "nn::gc::detail::EmbeddedDataHolder::g_FwReadBuffer" when in development mode.  | |||
[9.0.0+] This firmware was updated.  | |||
[11.0.0+] This firmware was updated.  | |||
[14.0.0+] This firmware was updated.  | |||
= GameCardAsicWriterFirmware =  | |||
This is the [[Lotus3#AsicFirmware|firmware]] for writing development Gamecards.  | |||
Embedded in "nn::gc::detail::EmbeddedDataHolder::g_FwWriterBuffer".  | |||
= SimulatingDeviceType =  | |||
This is "nn::fs::SimulatingDeviceType".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Value || Name  | |||
|-  | |||
| 0 || eMMC  | |||
|-  | |||
| 1 || SdCard  | |||
|-  | |||
| 2 || GameCard  | |||
|}  | |||
= SimulatingDeviceDetectionMode =  | |||
This is "nn::fs::SimulatingDeviceDetectionMode".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Value || Name  | |||
|-  | |||
| 0 || NoSimulation  | |||
|-  | |||
| 1 || DeviceAttached  | |||
|-  | |||
| 2 || DeviceRemoved  | |||
|}  | |||
= SimulatingDeviceAccessFailureEventType =  | |||
This is "nn::fs::SimulatingDeviceAccessFailureEventType".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Value || Name  | |||
|-  | |||
| 0 || None  | |||
|-  | |||
| 1 || AccessTimeoutFailure  | |||
|-  | |||
| 2 || AccessFailure  | |||
|-  | |||
| 3 || DataCorruption  | |||
|}  | |||
= SimulatingDeviceTargetOperation =  | |||
This is "nn::fs::SimulatingDeviceTargetOperation".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Value || Name  | |||
|-  | |||
| 1 || Read  | |||
|-  | |||
| 2 || Write  | |||
|}  | |||
= SpeedEmulationMode =  | |||
This is "nn::fs::SpeedEmulationMode".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Value || Name  | |||
|-  | |||
| 0 || None  | |||
|-  | |||
| 1 || Faster  | |||
|-  | |||
| 2 || Slower  | |||
|-  | |||
| 3 || Random  | |||
|}  | |||
= FspPath =  | |||
This is "nn::fssrv::sf::FspPath". This is a 0x301-byte string.  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Path || Notes  | |||
|-  | |||
| @SystemContent ||  | |||
|-   | |||
| @UserContent ||  | |||
|-  | |||
| @SdCardContent ||  | |||
|-  | |||
| @CalibFile ||  | |||
|-  | |||
| @Safe ||  | |||
|-  | |||
| @User ||  | |||
|-  | |||
| @System ||  | |||
|-  | |||
| @Sdcard ||  | |||
|-  | |||
| @Host ||  | |||
|-  | |||
| @GcApp || Gamecard App partition (Partition 2)  | |||
|-  | |||
| @GcXYYYYYYYY || Gamecard Contents. X is the partition type (U - Update, N - Normal, S - Secure). Y is the gamecard handle as a 32-bit hex value   | |||
|-  | |||
| @upp || Gamecard update partition (Partition 0)  | |||
|-  | |||
| [4.0.0+] @RegUpdate || Registered update partition  | |||
|}  | |||
= SaveDataAttribute =  | |||
This is "nn::fs::SaveDataAttribute".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
| [[NCM_services#ApplicationId|ApplicationId]] (0 for SystemSaveData)</br>SaveData: 0 can be used for accessing the savedata associated with the current FS session [[NCM_services#ApplicationId|ApplicationId]], otherwise when set this is the [[NCM_services#ApplicationId|ApplicationId]] associated with the savedata to access.  | |||
|-  | |||
| 0x8  | |||
| 0x10  | |||
| UserId</br>For user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]].  | |||
|-  | |||
| 0x18  | |||
| 0x8  | |||
| [[Flash_Filesystem|SystemSaveDataId]] (0 for SaveData)  | |||
|-  | |||
| 0x20  | |||
| 0x1  | |||
| [[#SaveDataType]]  | |||
|-  | |||
| 0x21  | |||
| 0x1  | |||
| [[#SaveDataRank]]  | |||
|-  | |||
| 0x22  | |||
| 0x2  | |||
| SaveDataIndex  | |||
|-  | |||
| 0x24  | |||
| 0x4  | |||
| Padding  | |||
|-  | |||
| 0x28  | |||
| 0x8  | |||
| 0 for SystemSaveData/SaveData.  | |||
|-  | |||
| 0x30  | |||
| 0x8  | |||
| 0 for SystemSaveData/SaveData.  | |||
|-  | |||
| 0x38  | |||
| 0x8  | |||
| 0 for SystemSaveData/SaveData.  | |||
|}  | |||
Total size is 0x40-bytes.  | |||
For DeviceSaveData, this struct is all-zero except for the [[#SaveDataType]] field (and optionally the ApplicationId if specified).  | |||
= SaveDataCreationInfo =  | |||
This is "nn::fs::SaveDataCreationInfo".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Offset  | |||
! Size  | |||
! Description  | |||
|-  | |||
| 0x0  | |||
| 0x8  | |||
| SaveDataSize  | |||
|-  | |||
| 0x8  | |||
| 0x8  | |||
| JournalSize  | |||
|-  | |||
| 0x10  | |||
| 0x8  | |||
| AvailableSize</br>0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData.  | |||
|-  | |||
| 0x18  | |||
| 0x8  | |||
| OwnerId</br>Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[NCM_services#ProgramId|ProgramId]] of the bcat-sysmodule.  | |||
|-  | |||
| 0x20  | |||
| 0x4  | |||
| [[#SaveDataFlags]]</br>Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData.  | |||
|-  | |||
| 0x24  | |||
| 0x1  | |||
| [[#SaveDataSpaceId]]</br>Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData.  | |||
|-  | |||
| 0x25  | |||
| 0x1  | |||
| Unknown. 0 for SystemSaveData/SaveData.  | |||
|-  | |||
| 0x26  | |||
| 0x1A  | |||
| Not initialized for SystemSaveData/SaveData.  | |||
|}  | |||
Total size is 0x40-bytes.  | |||
= DeviceSaveData =  | |||
This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the [[#SaveDataAttribute]].  | |||
= BcatSaveData =  | |||
This is accessed using the same commands for SaveData with the same input u8. The [[#SaveDataAttribute]] is the same as DeviceSaveData (besides the SaveDataType), except that the [[NCM_services#ApplicationId|ApplicationId]] field is always set to <input ApplicationId> (unlike DeviceSaveData where it's optional). See above regarding [[#SaveDataCreationInfo]].  | |||
The 0x10-byte struct passed to [[#CreateSaveDataFileSystem]] has the first 0x5-bytes set to all-zero.  | |||
MountSystemBcatSaveData uses [[#OpenSaveDataFileSystemBySystemSaveDataId]] with [[#SaveDataSpaceId]] System. The [[#SaveDataAttribute]] is all-zero, except for the SaveDataType, and SystemSaveDataId is set to the input param.  | |||
= SaveDataInfo =  | |||
This is "nn::fs::SaveDataInfo".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! 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.  | |||
= SaveDataFileSystemExtraData =  | |||
This is a 0x200-byte struct. Appears to match [[Savegames#Extra_data]].  | |||
= InitialDataVersion2 =  | |||
This is a 0x8210-byte struct used by [[#ISaveDataTransferManagerWithDivision]].  | |||
= FsAccessControlRestrictionMode =  | |||
This is "nn::fs::FsAccessControlRestrictionMode".  | |||
{| class="wikitable" border="1"  | |||
|-  | |||
! Value || Name  | |||
|-  | |-  | ||
|   | | 0 ||    | ||
|   | |||
|   | |||
|}  | |}  | ||
[[Category:Services]]  | [[Category:Services]]  | ||