Filesystem services: Difference between revisions
| (125 intermediate revisions by 9 users not shown) | |||
| Line 4: | Line 4: | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
! Cmd || Name   | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 ||   | | 0 || [[#OpenCodeFileSystem]]  | ||
|-  | |-  | ||
| 1 ||   | | 1 || [[#IsArchivedProgram]]  | ||
|-  | |-  | ||
| 2 || [4.0.0+] SetCurrentProcess   | | 2 || [4.0.0+] [[#SetCurrentProcess]]  | ||
|}  | |}  | ||
== OpenCodeFileSystem ==  | |||
Takes 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+] 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  | | 69 || [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute  | ||
|-  | |-  | ||
| 70 || [8.0.0+]   | | 70 || [8.0.0+] WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute  | ||
|-  | |||
| 71 || [10.0.0+] ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute  | |||
|-  | |-  | ||
| 80 || OpenSaveDataMetaFile  | | 80 || OpenSaveDataMetaFile  | ||
|-  | |-  | ||
| 81 || [4.0.0+] OpenSaveDataTransferManager   | | 81 || [4.0.0+] [[#OpenSaveDataTransferManager]]  | ||
|-  | |||
| 82 || [5.0.0+] [[#OpenSaveDataTransferManagerVersion2]]  | |||
|-  | |||
| 83 || [6.0.0+] [[#OpenSaveDataTransferProhibiter]]  | |||
|-  | |||
| 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+]   | | 130 || [7.0.0+] [[#OpenCustomStorageFileSystem]]  | ||
|-  | |-  | ||
| 200 || OpenDataStorageByCurrentProcess  | | 200 || OpenDataStorageByCurrentProcess  | ||
| Line 159: | Line 204: | ||
| 203 || OpenPatchDataStorageByCurrentProcess  | | 203 || OpenPatchDataStorageByCurrentProcess  | ||
|-  | |-  | ||
| 204 || [7.0.0+]   | | 204 || [7.0.0+] [[#OpenDataFileSystemWithProgramIndex]]  | ||
|-  | |-  | ||
| 205 || [7.0.0+]   | | 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]]  | ||
|-  | |||
| 206 || [13.0.0+] OpenDataStorageByPath  | |||
|-  | |||
| 207 || [15.0.0+] OpenDataFileSystemByDataId  | |||
|-  | |-  | ||
| 400 || [[#OpenDeviceOperator]]  | | 400 || [[#OpenDeviceOperator]]  | ||
| Line 168: | 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 173: | 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 193: | 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 210: | Line 263: | ||
|-  | |-  | ||
| 617 || [7.0.0+] UnregisterExternalKey  | | 617 || [7.0.0+] UnregisterExternalKey  | ||
|-  | |||
| 618 || [17.0.0+] GetProgramId  | |||
|-  | |-  | ||
| 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]  | | 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]]  | ||
| Line 216: | Line 271: | ||
|-  | |-  | ||
| 631 || [4.0.0+] IsSdCardAccessible  | | 631 || [4.0.0+] IsSdCardAccessible  | ||
|-  | |||
| 632 || [19.0.0+] TestExternalKey  | |||
|-  | |-  | ||
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid  | | 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid  | ||
|-  | |-  | ||
| 700 || [5.0.0+] [[#  | | 650 || [S2]  | ||
|-  | |||
| 651 || [S2]  | |||
|-  | |||
| 660 || [S2]  | |||
|-  | |||
| 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]]  | |||
|-  | |-  | ||
| 701 || [5.0.0+] GetAccessFailureDetectionEvent  | | 701 || [5.0.0+] GetAccessFailureDetectionEvent  | ||
| Line 229: | 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  | | 810 || [7.0.0+] RegisterProgramIndexMapInfo  | ||
|-  | |-  | ||
| 1000 || SetBisRootForHost  | | 820 || [19.0.0+] GetContentStorageInfoIndex  | ||
|-  | |||
| 1000 || [1.0.0-9.2.0] SetBisRootForHost  | |||
|-  | |-  | ||
| 1001 || [[#SetSaveDataSize]]  | | 1001 || [[#SetSaveDataSize]]  | ||
| Line 255: | Line 320: | ||
| 1010 || [5.1.0-6.2.0] SetDataStorageRedirectTarget  | | 1010 || [5.1.0-6.2.0] SetDataStorageRedirectTarget  | ||
|-  | |-  | ||
| 1011 || [7.0.0+]   | | 1011 || [7.0.0+] [[#GetProgramIndexForAccessLog]]  | ||
|-  | |||
| 1012 || [9.0.0+] GetFsStackUsage  | |||
|-  | |||
| 1013 || [9.0.0+] UnsetSaveDataRootPath  | |||
|-  | |||
| 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  | ||
|}  | |}  | ||
| Line 270: | Line 357: | ||
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.  | 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.  | If the code were to request an invalid input type, panic. But this never happens.  | ||
===   | The output values for [[#ReadWrite]] CanMountRegisteredUpdatePartition and [[#Call]] CanRegisterUpdatePartition are masked with the cached value of [[SMC#IsDebugMode|DebugMode]].  | ||
=== ReadWrite ===  | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
!   | ! AccessibilityType || 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"  | {| 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  | | [5.0.0-19.0.0] 0x21 [20.0.0+] 0x29 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask  | ||
|-  | |-  | ||
| [5.0.0  | | [5.0.0-19.0.0] 0x22 [20.0.0+] 0x2A || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem  | ||
|-  | |-  | ||
| [5.0.0  | | [5.0.0-19.0.0] 0x23 [20.0.0+] 0x2B || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem  | ||
|-  | |-  | ||
| [5.0.0  | | [5.0.0-19.0.0] 0x24 [20.0.0+] 0x2C || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem  | ||
|-  | |-  | ||
| [5.0.0  | | [5.0.0-19.0.0] 0x25 [20.0.0+] 0x2D || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition  | ||
|-  | |-  | ||
| [5.0.0  | | [5.0.0-19.0.0] 0x26 [20.0.0+] 0x2E || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]]  | ||
|-  | |-  | ||
| [5.0.0  | | [5.0.0-19.0.0] 0x27 [20.0.0+] 0x2F || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]]  | ||
|-  | |-  | ||
| [5.0.0  | | [5.0.0-19.0.0] 0x28 [20.0.0+] 0x30 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair  | ||
|-  | |-  | ||
| [5.0.0  | | [5.0.0-19.0.0] 0x29 [20.0.0+] 0x31 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair  | ||
|-  | |-  | ||
| [5.0.0  | | [5.0.0-19.0.0] 0x2A [20.0.0+] 0x32 || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]]  | ||
|-  | |-  | ||
| [5.  | | [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  | | [6.0.0-19.0.0] 0x31 [20.0.0+] 0x3A || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]]  | ||
|-  | |-  | ||
| [  | | [20.0.0+] 0x3B || CanOpenGameCardAwakenReadyEventNotifier || 0x8000000080000110 || OpenGameCardAwakenReadyEventNotifier  | ||
|-  | |-  | ||
| [8.0.0+]   | | [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  | |||
== OpenFileSystem ==  | |-  | ||
Takes a type-0x19 input buffer   | | [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 a type-0x19 input buffer containing a [[#FspPath]] and an input [[#FileSystemProxyType]]. Returns an [[#IFileSystem]].  | |||
[2.0.0+] This function was removed.  | [2.0.0+] This function was removed.  | ||
== SetCurrentProcess ==  | == SetCurrentProcess ==  | ||
Takes   | Takes an input u64 ProcessId. No output.  | ||
== OpenFileSystemWithPatch ==  | == OpenFileSystemWithPatch ==  | ||
Takes an input [[#  | 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.  | Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.  | ||
==   | == OpenFileSystemWithIdObsolete ==  | ||
Takes a type-0x19 input buffer, an [[#  | 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 '''  | The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0.  | ||
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].  | The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]].  | ||
| Line 517: | Line 674: | ||
May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn't inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.  | May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn't inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles.  | ||
The official "MountApplicationPackage" func uses this with in64=0 and [[#  | The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''.  | ||
After the [[#  | After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0.  | ||
When [[#  | 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 a type-0x19 input buffer containing a [[#FspPath]], an input [[#ContentAttributes]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]].  | |||
== OpenBisFileSystem ==  | == OpenBisFileSystem ==  | ||
Takes a type-0x19 input buffer   | 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.  | Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisStorage]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors.  | ||
| Line 538: | Line 700: | ||
== CreateSaveDataFileSystem ==  | == CreateSaveDataFileSystem ==  | ||
Takes a 0x40-byte   | Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct which governs creation of a saveMeta file.  | ||
Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1.  | Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060 meta file size, +4 u8 = 1 meta index which dictates meta file name.  | ||
Creates   | Creates non-system savedata.  | ||
== CreateSaveDataFileSystemBySystemSaveDataId ==  | == CreateSaveDataFileSystemBySystemSaveDataId ==  | ||
Takes a 0x40-byte   | Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]].  | ||
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.  | Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.  | ||
| Line 556: | Line 718: | ||
Mounts a [[Gamecard_Partition|gamecard partition]].  | Mounts a [[Gamecard_Partition|gamecard partition]].  | ||
== CreateSaveDataFileSystemWithHashSalt ==  | |||
Takes a total of 0xB0-bytes of input, no output.  | |||
== OpenSaveDataFileSystem ==  | == OpenSaveDataFileSystem ==  | ||
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte   | Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8.  | ||
Returns an [[#IFileSystem]].  | Returns an [[#IFileSystem]].  | ||
| Line 567: | Line 732: | ||
== OpenSaveDataFileSystemBySystemSaveDataId ==  | == OpenSaveDataFileSystemBySystemSaveDataId ==  | ||
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte   | Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8.  | ||
Returns an [[#IFileSystem]].  | Returns an [[#IFileSystem]].  | ||
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition.  | 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 ==  | == ReadSaveDataFileSystemExtraDataBySaveDataSpaceId ==  | ||
| Line 584: | Line 754: | ||
== OpenSaveDataInfoReaderBySaveDataSpaceId ==  | == OpenSaveDataInfoReaderBySaveDataSpaceId ==  | ||
Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]].  | Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]].  | ||
== FindSaveDataWithFilter ==  | |||
Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer.  | |||
== OpenSaveDataInfoReaderWithFilter ==  | |||
Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]].  | |||
== OpenSaveDataTransferManager ==  | |||
No input, returns an [[#ISaveDataTransferManager]].  | |||
== OpenSaveDataTransferManagerVersion2 ==  | |||
No input, returns an [[#ISaveDataTransferManagerWithDivision]].  | |||
== OpenSaveDataTransferProhibiter ==  | |||
Takes an input u64, returns an [[#ISaveDataTransferProhibiter]].  | |||
== ListAccessibleSaveDataOwnerId ==  | |||
Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer.  | |||
== OpenSaveDataTransferManagerForSaveDataRepair ==  | |||
No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]].  | |||
== 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 ==  | == OpenContentStorageFileSystem ==  | ||
| Line 589: | Line 786: | ||
Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]].  | Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]].  | ||
== OpenCloudBackupWorkStorageFileSystem ==  | |||
Takes 4-bytes of input, returns an [[#IFileSystem]].  | |||
== OpenCustomStorageFileSystem ==  | |||
Takes a [[#CustomStorageId]]. Invalid values return 0x2EE202.  | |||
Returns an [[#IFileSystem]] from either User:/CustomStorage0 or Sdcard:/Nintendo/CustomStorage0. If on the SD card, an AesXtsFileSystem is created using a key source specifically for custom storage.  | |||
== OpenDataStorageByDataId ==  | == OpenDataStorageByDataId ==  | ||
Takes a [[#StorageId]] and a   | Takes a [[NCM_services#StorageId|StorageID]] and a [[NCM_services#DataId|DataId]].  | ||
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.  | Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives.  | ||
[[NCA|PublicData]] is exempt from the [[#Permissions|permissions]] check.  | |||
== OpenDataFileSystemWithProgramIndex ==  | |||
Takes an input u8, returns an [[#IFileSystem]].  | |||
== OpenDataStorageWithProgramIndex ==  | |||
Takes an input u8, returns an [[#IStorage]].  | |||
== OpenDeviceOperator ==  | == OpenDeviceOperator ==  | ||
| Line 603: | Line 816: | ||
== OpenGameCardDetectionEventNotifier ==  | == OpenGameCardDetectionEventNotifier ==  | ||
This command returns a session to a port implementing the [[#IEventNotifier]] interface.  | This command returns a session to a port implementing the [[#IEventNotifier]] interface.  | ||
== SimulateDeviceDetectionEvent ==  | |||
Takes a total of 0xC-bytes of input, no output.  | |||
== VerifySaveDataFileSystem ==  | == VerifySaveDataFileSystem ==  | ||
| Line 615: | Line 831: | ||
Takes in the 0x10 byte SD card encryption seed, and loads it into FS-module state.  | 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   | [[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]].  | Takes 8-bytes of input and returns an [[#IEventNotifier]].  | ||
| Line 655: | Line 871: | ||
The input buffer is written to the "$FsAccessLog:/FsAccessLog.txt" file, where "$FsAccessLog" is the SD-card mount-name. It's written to the current end of the file(appended).  | The input buffer is written to the "$FsAccessLog:/FsAccessLog.txt" file, where "$FsAccessLog" is the SD-card mount-name. It's written to the current end of the file(appended).  | ||
== GetProgramIndexForAccessLog ==  | |||
No input, returns two 32-bit values "version" and "program_index".  | |||
== OpenMultiCommitManager ==  | |||
No input, returns an output [[#IMultiCommitManager]].  | |||
== OpenBisWiper ==  | |||
Takes an input u64 size and a TransferMemory handle. Returns an output [[#IWiper]].  | |||
= IStorage =  | = IStorage =  | ||
| Line 663: | Line 888: | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
! Cmd || Name   | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 || Read   | | 0 || [[#Read]]  | ||
|-  | |-  | ||
| 1 || Write   | | 1 || [[#Write]]  | ||
|-  | |-  | ||
| 2 || Flush   | | 2 || [[#Flush]]  | ||
|-  | |-  | ||
| 3 || SetSize   | | 3 || [[#SetSize]]  | ||
|-  | |-  | ||
| 4 || GetSize   | | 4 || [[#GetSize]]  | ||
|-  | |-  | ||
| 5 || [4.0.0+] OperateRange   | | 5 || [4.0.0+] OperateRange  | ||
|}  | |}  | ||
== Read ==  | |||
Takes a type-0x46 buffer, an offset and length.  | |||
== Write ==  | |||
Takes a type-0x45 buffer, an offset and length.  | |||
== Flush ==  | |||
No input.  | |||
== SetSize ==  | |||
Takes a size.  | |||
== GetSize ==  | |||
Returns a size.  | |||
= IFileSystem =  | = IFileSystem =  | ||
| Line 683: | Line 923: | ||
There are two main implementations of this interface:  | 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"  | {| class="wikitable" border="1"  | ||
| Line 721: | Line 969: | ||
|-  | |-  | ||
| 15 || [4.0.0+] QueryEntry  | | 15 || [4.0.0+] QueryEntry  | ||
|-  | |||
| 16 || [15.0.0+] GetFileSystemAttribute  | |||
|}  | |}  | ||
| Line 823: | Line 1,073: | ||
|-  | |-  | ||
| 5 || [4.0.0+] OperateRange  | | 5 || [4.0.0+] OperateRange  | ||
|-  | |||
| 6 || [12.0.0+] OperateRangeWithBuffer  | |||
|}  | |}  | ||
| Line 847: | Line 1,099: | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 || IsSdCardInserted  | | 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]]  | |||
|-  | |-  | ||
| 0 ||   | | 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  | No input. Returns an output s64 '''SdCardUserAreaSize'''.  | ||
==   | == GetSdCardProtectedAreaSize ==  | ||
No input. Returns an output s64 '''SdCardProtectedAreaSize'''.  | |||
==   | == GetAndClearSdCardErrorInfo ==  | ||
Takes   | 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  | Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output.  | ||
==   | == SuspendMmcPatrol ==  | ||
No input/output  | 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 ==  | ||
No   | 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   | Takes a type-0x5 input buffer '''CardHeaderForDev''', a type-0x6 output buffer and two input s64s '''CardHeaderForDevSize''' and '''BufferSize'''. No output.  | ||
==   | == EraseAndWriteParamDirectly ==  | ||
Takes   | 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   | Takes a total of 4-bytes of input. Returns a total of 8-bytes of output.  | ||
==   | == SetDeviceSimulationEvent ==    | ||
Takes   | Takes a total of 0x14-bytes of input. No output.  | ||
==   | == ClearDeviceSimulationEvent ==  | ||
Takes a total of 4-bytes of input. No output.  | |||
==   | == OpenStorageDeviceManager ==  | ||
Takes   | Takes a byte. Returns an [[#IStorageDeviceManager]].  | ||
=   | = IEventNotifier =  | ||
This is "nn::fssrv::sf::  | This is "nn::fssrv::sf::IEventNotifier".  | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
| Line 1,116: | Line 1,382: | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
| 0   | | 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]].  | |||
This   | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
| Line 1,154: | Line 1,397: | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 || [  | | 0 || [[#GetChallenge]]  | ||
|-  | |-  | ||
| 16 ||   | | 16 || [[#SetToken]]  | ||
|-  | |-  | ||
| 32 ||   | | 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]].  | |||
This   | = ISaveDataTransferManagerForSaveDataRepair =  | ||
This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair".  | |||
This was added with [[9.0.0]].  | |||
This   | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
| Line 1,184: | Line 1,427: | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 ||   | | 0 || [[#GetChallenge]]  | ||
|-  | |||
| 16 || [[#SetKeyPackage]]  | |||
|-  | |||
| 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]]  | |||
|-  | |||
| 81 || [[#PrepareOpenSaveDataImporter]]  | |||
|-  | |||
| 90 || [[#OpenSaveDataImporter]]  | |||
|-  | |-  | ||
|   | | 91 || [[#OpenSaveDataImporter2]]  | ||
|-  | |-  | ||
|   | | 100 || [[#OpenSaveDataExporterWithKey]]  | ||
|-  | |||
| 110 || [[#OpenSaveDataImporterWithKey]]  | |||
|}  | |}  | ||
== SetKeyPackage ==  | |||
No input/output, takes a type-0x5 input buffer.  | |||
=   | == OpenSaveDataExporterAndGetEncryptedKey ==  | ||
This is "nn::fssrv::sf::  | 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"  | {| class="wikitable" border="1"  | ||
| Line 1,200: | Line 1,476: | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
|   | | 8 || [[#Register]]  | ||
|-  | |-  | ||
| 16 || [  | | 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]].  | |||
This   | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
| Line 1,215: | Line 1,501: | ||
! Cmd || Name  | ! 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   | This is "nn::fssrv::sf::ISaveDataExporter".  | ||
This   | This was added with [[4.0.0]].  | ||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
! Cmd || Name  | ! Cmd || Name  | ||
|-  | |-  | ||
|   | | 0 || [[#GetSaveDataInfo]]  | ||
|-  | |-  | ||
|   | | 1 || [[#GetRestSize]]  | ||
|-  | |||
| 16 || [[#Pull]]  | |||
|-  | |||
| 17 || [[#PullInitialData]]  | |||
|}  | |}  | ||
This was added with [[  | == GetSaveDataInfo ==  | ||
No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer.  | |||
The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw.  | |||
== GetRestSize ==  | |||
No input, returns an output u64.  | |||
== Pull ==  | |||
Takes a type-0x6 output buffer, returns an output u64.  | |||
== PullInitialData ==  | |||
No input/output, takes a type-0x6 output buffer.  | |||
= ISaveDataImporter =  | |||
This is "nn::fssrv::sf::ISaveDataImporter".  | |||
This was added with [[4.0.0]].  | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
!   | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 ||   | | 0 || [[#GetSaveDataInfo]]  | ||
|-  | |-  | ||
| 1 ||   | | 1 || [[#GetRestSize]]  | ||
|-  | |-  | ||
|   | | 16 || [[#Push]]  | ||
|-  | |-  | ||
|   | | 17 || [[#Finalize]]  | ||
|}  | |}  | ||
=   | == GetSaveDataInfo ==  | ||
No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer.  | |||
The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw.  | |||
== GetRestSize ==  | |||
No input, returns an output u64.  | |||
== Push ==  | |||
No input/output, takes a type-0x5 input buffer.  | |||
== Finalize ==  | |||
No input/output.  | |||
= ISaveDataTransferManagerWithDivision =  | |||
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".  | |||
This was added with [[5.0.0]].  | |||
{| class="wikitable" border="1"  | {| class="wikitable" border="1"  | ||
|-  | |-  | ||
!   | ! Cmd || Name  | ||
|-  | |-  | ||
| 0 ||   | | 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"  | {| 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 ==  | ||
{| class="wikitable" border="1"  | 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]]  | ||
|   | |||
| 0   | |||
|-  | |-  | ||
|   | | 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]]  | ||
|   | |||
| 0   | |||
|-  | |-  | ||
|   | | 80 || [6.0.0+] [[#GetReportInfo]]  | ||
|   | |||
| 0   | |||
|}  | |}  | ||
== 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 ==  | ||
{| class="wikitable" border="1"  | 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   | This is "nn::fssrv::sf::ISaveDataChunkImporter".  | ||
This was added with [[5.0.0]].  | |||
{| class="wikitable" border="1"  | {| 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  | | 0x10  | ||
| 0x10  | | 0x8  | ||
|   | | PooledBufferReduceAllocationCount  | ||
|-  | |-  | ||
| 0x20  | | 0x18  | ||
| 0x8  | | 0x8  | ||
|   | | BufferManagerFreeSizePeak  | ||
|-  | |-  | ||
| 0x28  | | 0x20  | ||
| 0x8  | | 0x8  | ||
|   | | BufferManagerRetriedCount  | ||
|-  | |-  | ||
| 0x30  | | 0x28  | ||
| 0x8  | | 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]]  | ||