Filesystem services: Difference between revisions
| (59 intermediate revisions by 5 users not shown) | |||
| Line 14: | Line 14: | ||
| == OpenCodeFileSystem == | == OpenCodeFileSystem == | ||
| Takes  | Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | ||
| [10.0.0+]  | [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 == | == IsArchivedProgram == | ||
| Takes an u64 ProcessId. Returns a bool (1 if the process id's [[# | Takes an input u64 ProcessId. Returns a bool (1 if the process id's [[#FspPath]] ends in ".nca"). | ||
| == SetCurrentProcess == | == SetCurrentProcess == | ||
| Takes  | Takes an input u64 ProcessId. No output. | ||
| = fsp-pr = | = fsp-pr = | ||
| Line 41: | Line 47: | ||
| == 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. | ||
| Line 70: | 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 | | 9 || [3.0.0+] OpenDataFileSystemByProgramId | ||
| |- | |||
| | 10 || [16.0.0+] [[#OpenFileSystemWithId]] | |||
| |- | |- | ||
| | 11 || [[#OpenBisFileSystem]] | | 11 || [[#OpenBisFileSystem]] | ||
| Line 101: | Line 113: | ||
| |- | |- | ||
| | 28 || [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute | | 28 || [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute | ||
| |- | |||
| | 29 || [19.0.0+] IsInitializationMode | |||
| |- | |- | ||
| | 30 || [[#OpenGameCardStorage]] | | 30 || [[#OpenGameCardStorage]] | ||
| Line 115: | Line 129: | ||
| |- | |- | ||
| | 36 || [9.0.0+] OpenHostFileSystemWithOption | | 36 || [9.0.0+] OpenHostFileSystemWithOption | ||
| |- | |||
| | 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2 | |||
| |- | |||
| | 38 || [20.0.0+] DetachSdCard | |||
| |- | |- | ||
| | 51 || [[#OpenSaveDataFileSystem]] | | 51 || [[#OpenSaveDataFileSystem]] | ||
| Line 191: | Line 209: | ||
| |- | |- | ||
| | 206 || [13.0.0+] OpenDataStorageByPath | | 206 || [13.0.0+] OpenDataStorageByPath | ||
| |- | |||
| | 207 || [15.0.0+] OpenDataFileSystemByDataId | |||
| |- | |- | ||
| | 400 || [[#OpenDeviceOperator]] | | 400 || [[#OpenDeviceOperator]] | ||
| Line 197: | 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 222: | 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 239: | 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 245: | 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 | ||
| |- | |||
| | 651 || [S2] | |||
| |- | |||
| | 660 || [S2] | |||
| |- | |- | ||
| | 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]] | | 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]] | ||
| Line 261: | Line 293: | ||
| |- | |- | ||
| | 810 || [7.0.0+] RegisterProgramIndexMapInfo | | 810 || [7.0.0+] RegisterProgramIndexMapInfo | ||
| |- | |||
| | 820 || [19.0.0+] GetContentStorageInfoIndex | |||
| |- | |- | ||
| | 1000 || [1.0.0-9.2.0] SetBisRootForHost | | 1000 || [1.0.0-9.2.0] SetBisRootForHost | ||
| Line 300: | Line 334: | ||
| | 1019 || [13.0.0+] UnsetDebugOption | | 1019 || [13.0.0+] UnsetDebugOption | ||
| |- | |- | ||
| | 1100 || [4.0.0+]  | | 1020 || [18.0.0+] OpenMemoryStressor | ||
| |- | |||
| | 1100 || [4.0.0-17.0.1] OverrideSaveDataTransferTokenSignVerificationKey | |||
| |- | |||
| | 1101 || [18.0.0+] OverrideSaveDataTransferKeyForTest | |||
| |- | |- | ||
| | 1110 || [6.0.0+] CorruptSaveDataFileSystemByOffset | | 1110 || [6.0.0+] CorruptSaveDataFileSystemByOffset | ||
| Line 307: | Line 345: | ||
| |- | |- | ||
| | 1300 || [10.0.0+] [[#OpenBisWiper]] | | 1300 || [10.0.0+] [[#OpenBisWiper]] | ||
| |- | |||
| | 1400 || [15.0.0+] NotifyErrorContextServiceReady | |||
| |} | |} | ||
| Line 315: | Line 355: | ||
| 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. | ||
| Line 343: | Line 385: | ||
| | 0x8 || CanMountImageAndVideoStorage ||0x8000000000001000 || RW || [[#OpenImageDirectoryFileSystem]] | | 0x8 || CanMountImageAndVideoStorage ||0x8000000000001000 || RW || [[#OpenImageDirectoryFileSystem]] | ||
| |- | |- | ||
| |  | | 0x9 || CanMountCustomStorage0 || 0x8000000000000000 || RW || OpenCustomStorageFileSystem | ||
| |- | |- | ||
| |  | | 0xA || CanMountBisCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisFileSystem]] | ||
| |- | |- | ||
| |  | | 0xB || CanMountBisSafeMode || 0x8000000000000080 || RW || [[#OpenBisFileSystem]] | ||
| |- | |- | ||
| |  | | 0xC || CanMountBisUser || 0x8000000000008080 || RW || [[#OpenBisFileSystem]] | ||
| |- | |- | ||
| |  | | 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]] | ||
| |- | |- | ||
| |  | | 0xE || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]] | ||
| |- | |- | ||
| |  | | 0xF || CanMountBisSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisFileSystem]] | ||
| |- | |- | ||
| |  | | 0x10 || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]] | ||
| |- | |- | ||
| |  | | 0x11 || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]] | ||
| |- | |- | ||
| |  | | 0x12 || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]] | ||
| |- | |- | ||
| |  | | 0x13 || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]] | ||
| |- | |- | ||
| |  | | 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]] | ||
| |- | |- | ||
| |  | | 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]] | ||
| |- | |- | ||
| |  | | 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x18 || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x19 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x1A || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x1B || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x1C || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x1D || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x1E || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x1F || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x20 || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x21 || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x22 || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x23 || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x24 || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x25 || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | 0x26 || CanOpenBisPartitionDeviceTreeBlob || 0x8000002000000080 || RW || [[#OpenBisStorage]] | ||
| |- | |- | ||
| |  | | [3.0.0+] 0x27 || CanOpenSdCardStorage || 0xC000000000200000 || RW ||   | ||
| |- | |- | ||
| |  | | [3.0.0+] 0x28 || CanOpenGameCardStorage || 0x8000000000000100 || RW || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1) | ||
| |- | |- | ||
| |  | | [4.0.0+] 0x29 || CanMountSystemDataPrivate || 0x8000000000100008 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]] | ||
| |- | |- | ||
| |  | | [5.0.0+] 0x2A || CanMountHost || 0xC000000000400000 || RW || [[#OpenHostFileSystem]] | ||
| |- | |- | ||
| |  | | [6.0.0+] 0x2B || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]] | ||
| |- | |- | ||
| |  | | [7.0.0+] 0x2C || CanOpenSaveDataInternalStorage || [-19.0.0] 0x8000000000000000 [20.0.0+] 0x8000000000000020 || RW || [[#OpenSaveDataInternalStorageFileSystem]] | ||
| |- | |- | ||
| |  | | [7.0.0+] 0x2D || CanMountTemporaryDirectory || 0xC000000000000000 || RW ||   | ||
| |- | |- | ||
| |  | | [11.0.0+] 0x2E || CanMountAllBaseFilesystem || 0x8000000000000000 || RW || OpenBaseFileSystem | ||
| |- | |- | ||
| |  | | [15.0.0+] 0x2F || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem | ||
| |} | |||
| === Call === | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| |  | ! OperationType || Name || Mask || Used by | ||
| |- | |- | ||
| |  | | 0x0 || CanInvalidateBisCache || 0x8000000000000080 || [[#InvalidateBisCache]] | ||
| |- | |- | ||
| |  | | 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x2 ||  || 0x8000100000000080 || | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x2 [20.0.0+] 0x3 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x3 [20.0.0+] 0x4 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x4 [20.0.0+] 0x5 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x5 [20.0.0+] 0x6 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x6 [20.0.0+] 0x7 || CanGetGameCardAsicCertificate || 0x8000000000000200 || GetGameCardAsicCertificate | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x8 ||  || 0x8000100000000080 || | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x9 ||  || 0x8000100000000080 || | ||
| |- | |- | ||
| |  | | [20.0.0+] 0xA ||  || 0x8000080000000000 || | ||
| |- | |- | ||
| |  | | [20.0.0+] 0xB ||  || 0x8000000000000010 || | ||
| |- | |- | ||
| |  | | [20.0.0+] 0xC ||  || 0x8000100000000080 || | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x7 [20.0.0+] 0xD || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]] | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x8 [20.0.0+] 0xE || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x9 [20.0.0+] 0xF || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId | ||
| |- | |- | ||
| |  | | [-19.0.0] 0xA [20.0.0+] 0x10 || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId | ||
| |- | |- | ||
| |  | | [-19.0.0] 0xB [20.0.0+] 0x11 || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion | ||
| |- | |- | ||
| |  | | [-19.0.0] 0xC [20.0.0+] 0x12 || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | ||
| |- | |- | ||
| |  | | [-19.0.0] 0xD [20.0.0+] 0x13 || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | ||
| |- | |- | ||
| |  | | [-19.0.0] 0xE [20.0.0+] 0x14 || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]] | ||
| |- | |- | ||
| |  | | [-19.0.0] 0xF [20.0.0+] 0x15 || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x10 [20.0.0+] 0x16 || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x11 [20.0.0+] 0x17 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]] | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x12 [20.0.0+] 0x18 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]] | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x13 [20.0.0+] 0x19 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x1A ||  || 0x8000000400080000 || | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x1B ||  || 0x8000000400080000 || | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x14 [20.0.0+] 0x1C || CanDebug || 0xC000000000000000 ||   | ||
| |- | |- | ||
| |  | | [-19.0.0] 0x15 [20.0.0+] 0x1D || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles | ||
| |- | |- | ||
| | [2.0.0-19.0.0] 0x16 [20.0.0+] 0x1E || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId | |||
| |- | |- | ||
| |  | | [2.0.0-19.0.0] 0x17 [20.0.0+] 0x1F || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId | ||
| |- | |- | ||
| |  | | [2.0.0-19.0.0] 0x18 [20.0.0+] 0x20 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId | ||
| |- | |- | ||
| |  | | [2.0.0-19.0.0] 0x19 [20.0.0+] 0x21 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]] | ||
| |- | |- | ||
| |  | | [2.0.0-19.0.0] 0x1A [20.0.0+] 0x22 || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem | ||
| |- | |- | ||
| |  | | [3.0.0-19.0.0] 0x1B [20.0.0+] 0x23 || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath | ||
| |- | |- | ||
| |  | | [3.0.0-19.0.0] 0x1C [20.0.0+] 0x24 || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey | ||
| |- | |- | ||
| |  | | [4.0.0-19.0.0] 0x1D [20.0.0+] 0x25 || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]] | ||
| |- | |- | ||
| |  | | [4.0.0-19.0.0] 0x1E [20.0.0+] 0x26 || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
| |- | |- | ||
| |  | | [4.0.0-19.0.0] 0x1F [20.0.0+] 0x27 || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
| |- | |- | ||
| |  | | [4.0.0-19.0.0] 0x20 [20.0.0+] 0x28 || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x21 [20.0.0+] 0x29 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x22 [20.0.0+] 0x2A || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x23 [20.0.0+] 0x2B || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x24 [20.0.0+] 0x2C || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x25 [20.0.0+] 0x2D || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x26 [20.0.0+] 0x2E || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]] | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x27 [20.0.0+] 0x2F || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]] | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x28 [20.0.0+] 0x30 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x29 [20.0.0+] 0x31 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x2A [20.0.0+] 0x32 || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]] | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x2B [20.0.0+] 0x33 || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]] | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x2C [20.0.0+] 0x34 || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]] | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x2D [20.0.0+] 0x35 || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]] | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x2E [20.0.0+] 0x36 || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol | ||
| |- | |- | ||
| |  | | [5.0.0-19.0.0] 0x2F [20.0.0+] 0x37 || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey | ||
| |- | |- | ||
| |  | | [5.1.0-19.0.0] 0x30 [20.0.0+] 0x38 || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]] | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x39 ||  || 0x8000000000200000 || | ||
| |- | |- | ||
| |  | | [6.0.0-19.0.0] 0x31 [20.0.0+] 0x3A || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]] | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x3B || CanOpenGameCardAwakenReadyEventNotifier || 0x8000000080000110 || OpenGameCardAwakenReadyEventNotifier | ||
| |- | |- | ||
| |  | | [6.0.0-19.0.0] 0x32 [20.0.0+] 0x3C || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier | ||
| |- | |- | ||
| |  | | [6.0.0-19.0.0] 0x33 [20.0.0+] 0x3D || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent | ||
| |- | |- | ||
| |  | | [6.0.0-19.0.0] 0x34 [20.0.0+] 0x3E || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]] | ||
| |- | |- | ||
| |  | | [6.0.0-19.0.0] 0x35 [20.0.0+] 0x3F || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent | ||
| |- | |- | ||
| |  | | [6.0.0-19.0.0] 0x36 [20.0.0+] 0x40 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected | ||
| |- | |- | ||
| |  | | [6.0.0-19.0.0] 0x37 [20.0.0+] 0x41 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure | ||
| |- | |- | ||
| |  | | [6.0.0-19.0.0] 0x38 [20.0.0+] 0x42 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure | ||
| |- | |- | ||
| |  | | [8.0.0-19.0.0] 0x39 [20.0.0+] 0x43 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize | ||
| |- | |- | ||
| |  | | [9.0.0-19.0.0] 0x3A [20.0.0+] 0x44 || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]] | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x45 ||   || 0x8000000000200000 || | ||
| |- | |- | ||
| | [ | | [9.0.0-19.0.0] 0x3B [20.0.0+] 0x46 || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility | ||
| |- | |- | ||
| |  | | [9.0.0-19.0.0] 0x3C [20.0.0+] 0x47 || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent | ||
| |- | |- | ||
| |  | | [9.0.0-19.0.0] 0x3D [20.0.0+] 0x48 || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]] | ||
| |- | |- | ||
| |  | | [9.0.0-19.0.0] 0x3E [20.0.0+] 0x49 || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo | ||
| |- | |- | ||
| | [ | | [9.0.0-19.0.0] 0x3F [20.0.0+] 0x4A || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence | ||
| |- | |- | ||
| |  | | [9.0.0-19.0.0] 0x40 [20.0.0+] 0x4B || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt | ||
| |- | |- | ||
| |  | | [9.0.0-19.0.0] 0x41 [20.0.0+] 0x4C || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]] | ||
| |- | |- | ||
| |  | | [10.0.0-19.0.0] 0x42 [20.0.0+] 0x4D || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]] | ||
| |- | |- | ||
| | [ | | [10.0.0-19.0.0] 0x43 [20.0.0+] 0x4E || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem | ||
| |- | |- | ||
| |  | | [10.2.0-19.0.0] 0x44 [20.0.0+] 0x4F || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]] | ||
| |- | |- | ||
| |  | | [11.0.0-19.0.0] 0x45 [20.0.0+] 0x50 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]] | ||
| |- | |- | ||
| |  | | [13.0.0-19.0.0] 0x46 [20.0.0+] 0x51 || CanOpenSaveDataTransferManagerForRepair || 0x8000000000000020 || [[#OpenSaveDataTransferManagerForRepair]] | ||
| |- | |- | ||
| | [ | | [13.0.0-19.0.0] 0x47 [20.0.0+] 0x52 || CanSetDebugConfiguration || 0x8000000000000000 || SetDebugOption, UnsetDebugOption | ||
| |- | |- | ||
| |  | | [15.0.0-19.0.0] 0x48 [20.0.0+] 0x53 || CanOpenDataStorageByPath || 0x8000000000000000 || OpenDataStorageByPath | ||
| |- | |- | ||
| |  | | [17.0.0-19.0.0] 0x49 [20.0.0+] 0x54|| CanNotifyErrorContextServiceReady || 0x8000004000000000 || NotifyErrorContextServiceReady | ||
| |- | |- | ||
| | [ | | [17.0.0-19.0.0] 0x4A || CanGetProgramId || 0x8000000008000000 || GetProgramId, Removed in 20.0.0 | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x55 || CanGetContentStorageInfo || 0x8000000000000800 || | ||
| |- | |- | ||
| | [ | | [20.0.0+] 0x56 || CanDetachSdCard || 0x8000000004000000 || | ||
| |- | |- | ||
| |  | | [20.0.0+] 0x57 || CanSetSdCardActivationMode || 0x8000000004000000 || | ||
| |} | |} | ||
| == | == OpenFileSystem == | ||
| Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#FileSystemProxyType]]. Returns an [[#IFileSystem]]. | |||
| [2.0.0+] This function was removed. | |||
| == SetCurrentProcess == | |||
| Takes an input u64 ProcessId. No output. | |||
| == OpenFileSystemWithPatch == | |||
| Takes an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | |||
| The [[#FileSystemProxyType]] must be '''Manual'''. | |||
| Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names. | |||
| == OpenFileSystemWithIdObsolete == | |||
| Takes a type-0x19 input buffer containing a [[#FspPath]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | |||
| The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0. | |||
| The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]]. | |||
| May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn't inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles. | |||
| The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''. | |||
| After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0. | |||
| When [[#FileSystemProxyType]] is '''Meta''', it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it's compared with the NCA [[NCM_services#ProgramId|ProgramId]], then an error is thrown on mismatch. | |||
| == OpenFileSystemWithId == | |||
| |  | Takes 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 == | |||
| Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#BisPartitionId]]. Returns an [[#IFileSystem]]. | |||
| Official user-process code sets instr[0] = 0 normally. | |||
| Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisStorage]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors. | |||
| == OpenBisStorage == | |||
| Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid [[#IStorage]] handle otherwise. | |||
| == InvalidateBisCache == | |||
| Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]]. | |||
| == DeleteSaveDataFileSystem == | |||
| Takes an input u64. | |||
| == CreateSaveDataFileSystem == | |||
| Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct which governs creation of a saveMeta file. | |||
| Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060 meta file size, +4 u8 = 1 meta index which dictates meta file name. | |||
| Creates non-system savedata. | |||
| == CreateSaveDataFileSystemBySystemSaveDataId == | |||
| Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]]. | |||
| Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | |||
| == OpenGameCardStorage == | |||
| Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]]. | |||
| |  | |||
| == OpenGameCardFileSystem == | |||
| Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]]. | |||
| Mounts a [[Gamecard_Partition|gamecard partition]]. | |||
| == CreateSaveDataFileSystemWithHashSalt == | |||
| Takes a total of 0xB0-bytes of input, no output. | |||
| == OpenSaveDataFileSystem == | |||
| Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8. | |||
| Returns an [[#IFileSystem]]. | |||
| Permissions aren't checked until the specified save is successfully found. | |||
| Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData). | |||
| |  | == OpenSaveDataFileSystemBySystemSaveDataId == | ||
| Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8. | |||
| Returns an [[#IFileSystem]]. | |||
| Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | |||
| == OpenReadOnlySaveDataFileSystem == | |||
| Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]], and returns an [[#IFileSystem]]. | |||
| Mounts SaveData as ReadOnly. | |||
| == ReadSaveDataFileSystemExtraDataBySaveDataSpaceId == | |||
| Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]]. | |||
| == ReadSaveDataFileSystemExtraData == | |||
| Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]]. | |||
| == OpenSaveDataInfoReader == | |||
| No input, returns an output [[#ISaveDataInfoReader]]. | |||
| == OpenSaveDataInfoReaderBySaveDataSpaceId == | |||
| Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]]. | |||
| == FindSaveDataWithFilter == | |||
| Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer. | |||
| == OpenSaveDataInfoReaderWithFilter == | |||
| Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]]. | |||
| |  | == OpenSaveDataTransferManager == | ||
| No input, returns an [[#ISaveDataTransferManager]]. | |||
| | [ | |||
| == OpenSaveDataTransferManagerVersion2 == | |||
| No input, returns an [[#ISaveDataTransferManagerWithDivision]]. | |||
| == OpenSaveDataTransferProhibiter == | |||
| Takes an input u64, returns an [[#ISaveDataTransferProhibiter]]. | |||
| == ListAccessibleSaveDataOwnerId == | |||
| Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer. | |||
| == OpenSaveDataTransferManagerForSaveDataRepair == | |||
| No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]]. | |||
| == OpenSaveDataMover == | |||
| Takes 2 input [[#SaveDataSpaceId]], an input u64 size and a TransferMemory handle. Returns an output [[#ISaveDataMover]]. | |||
| == OpenSaveDataTransferManagerForRepair == | |||
| No input, returns an output [[#ISaveDataTransferManagerForRepair]]. | |||
| == OpenContentStorageFileSystem == | |||
| Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202. | |||
| Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[NCM_services#ReadContentIdFile]]. | |||
| == OpenCloudBackupWorkStorageFileSystem == | |||
| Takes 4-bytes of input, returns an [[#IFileSystem]]. | |||
| == OpenCustomStorageFileSystem == | |||
| Takes a [[#CustomStorageId]]. Invalid values return 0x2EE202. | |||
| Returns an [[#IFileSystem]] from either User:/CustomStorage0 or Sdcard:/Nintendo/CustomStorage0. If on the SD card, an AesXtsFileSystem is created using a key source specifically for custom storage. | |||
| == OpenDataStorageByDataId == | |||
| Takes a [[NCM_services#StorageId|StorageID]] and a [[NCM_services#DataId|DataId]]. | |||
| Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives. | |||
| [[NCA|PublicData]] is exempt from the [[#Permissions|permissions]] check. | |||
| == OpenDataFileSystemWithProgramIndex == | |||
| Takes an input u8, returns an [[#IFileSystem]]. | |||
| == OpenDataStorageWithProgramIndex == | |||
| Takes an input u8, returns an [[#IStorage]]. | |||
| == OpenDeviceOperator == | |||
| This command returns a session to a port implementing the [[#IDeviceOperator]] interface. | |||
| == OpenSdCardDetectionEventNotifier == | |||
| This command returns a session to a port implementing the [[#IEventNotifier]] interface. | |||
| ==  | == OpenGameCardDetectionEventNotifier == | ||
| This command returns a session to a port implementing the [[#IEventNotifier]] interface. | |||
| == SimulateDeviceDetectionEvent == | |||
| Takes a total of 0xC-bytes of input, no output. | |||
| ==  | == VerifySaveDataFileSystem == | ||
| Takes a  | Takes an unknown input u64 and a type-0x6 output buffer. | ||
| The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02). | |||
| == GetSaveDataCommitId == | |||
| Takes an input u8 and u64, returns an output u64. | |||
| == SetSdCardEncryptionSeed == | |||
| Takes in the 0x10 byte SD card encryption seed, and loads it into FS-module state. | |||
| [[NS_Services|NS]]-module reads the 0x10 bytes from SdCard:/Nintendo/Contents/private, and compares them to the first 0x10 bytes of the ns_appman:/private (in [[Flash_Filesystem#System_Savegames|system savedata]] 0x8000000000000043). If they match, NS calls this command using bytes 0x10-0x20 from ns_appman:/private. The rest of this file (0x1F0 bytes total) is all-zero except for the byte at offset 0x20. This byte is set to 1 by NS if the SD card has been mounted successfully and is subsequently passed to SetSdCardAccessibility. | |||
| == OpenAccessFailureDetectionEventNotifier == | |||
| Takes 8-bytes of input and returns an [[#IEventNotifier]]. | |||
| [8.0.0+] Now takes an additional 8-bytes of input. | |||
| == SetSaveDataSize == | |||
| Takes two input u64s "size" and "journal_size", and writes them to fsp-srv object member variables. | |||
| These variables are normally initialized with 32 MiB (0x2000000) and 16 MiB (0x1000000), respectively. | |||
| These variables don't seem to be actually used anywhere else (?) | |||
| == SetSaveDataRootPath == | |||
| Takes an input path, and does snprintf(<fsp-srv object>->m_save_data_root_path, FS_MAX_PATH-1, "/%s", input_path); | |||
| This path is normally all-zero. When this path is non-zero, the internal OpenSaveDataFileSystem function will create a DirectorySaveDataFileSystem if the target save is a user-save + a directory exists, instead of the normal savedata filesystem object. | |||
| == SetGlobalAccessLogMode == | |||
| Takes an input u32. | |||
| ==  | == SetGlobalAccessLogMode == | ||
| Takes  | Takes an input u32. | ||
| ==  | == GetGlobalAccessLogMode == | ||
| Returns an output u32. | |||
| GlobalAccessLogMode is normally 0. | |||
| ==  | == OutputAccessLogToSdCard == | ||
| Takes a  | Takes a type-0x5 input buffer. | ||
| The input buffer is the string to output to the log. User-processes normally include a newline at the end. | |||
| User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set. | |||
| When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn't show up SD, unknown why. | |||
| The input buffer is written to the "$FsAccessLog:/FsAccessLog.txt" file, where "$FsAccessLog" is the SD-card mount-name. It's written to the current end of the file(appended). | |||
| ==  | == GetProgramIndexForAccessLog == | ||
| No input, returns two 32-bit values "version" and "program_index". | |||
| ==  | == OpenMultiCommitManager == | ||
| No input, returns an output [[#IMultiCommitManager]]. | |||
| == OpenBisWiper == | |||
| Takes an input u64 size and a TransferMemory handle. Returns an output [[#IWiper]]. | |||
| = | = IStorage = | ||
| This is "nn::fssrv::sf::IStorage". | |||
| This is the interface for a raw device, usually a block device. | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || [[#Read]] | |||
| |- | |||
| | 1 || [[#Write]] | |||
| |- | |||
| | 2 || [[#Flush]] | |||
| |- | |||
| | 3 || [[#SetSize]] | |||
| |- | |||
| | 4 || [[#GetSize]] | |||
| |- | |||
| | 5 || [4.0.0+] OperateRange | |||
| |} | |||
| == Read == | |||
| Takes a type-0x46 buffer, an offset and length. | |||
| == Write == | |||
| Takes a type-0x45 buffer, an offset and length. | |||
| ==  | == Flush == | ||
| No input. | |||
| == SetSize == | |||
| Takes a size. | |||
| == GetSize == | |||
| Returns a size. | |||
| = | = IFileSystem = | ||
| This is "nn::fssrv::sf::IFileSystem". | |||
| There are two main implementations of this interface: | |||
| * '''nn::fs::fsa::IFileSystem''': The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface. | |||
| * '''nn::fssrv::sf::IFileSystem''': Used for sending an IFileSystem over IPC. Not used outside of IPC code. | |||
| There are two adapter classes to convert between these interfaces: | |||
| * '''nn::fssrv::detail::FileSystemInterfaceAdapter''': Allows access to an nn::fs::fsa::IFileSystem via the nn::fssrv::sf::IFileSystem interface. | |||
| * '''nn::fs::detail::FileSystemServiceObjectAdapter''': Allows access to an nn::fssrv::sf::IFileSystem via the nn::fs::fsa::IFileSystem interface. | |||
| When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC. | |||
| Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it. | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || CreateFile | |||
| |- | |||
| | 1 || DeleteFile | |||
| |- | |||
| | 2 || CreateDirectory | |||
| |- | |||
| | 3 || DeleteDirectory | |||
| |- | |||
| | 4 || DeleteDirectoryRecursively | |||
| |- | |||
| | 5 || RenameFile | |||
| |- | |||
| | 6 || RenameDirectory | |||
| |- | |||
| | 7 || [[#GetEntryType]] | |||
| |- | |||
| | 8 || [[#OpenFile]] | |||
| |- | |||
| | 9 || [[#OpenDirectory]] | |||
| |- | |||
| | 10 || [[#Commit]] | |||
| |- | |||
| | 11 || [[#GetFreeSpaceSize]] | |||
| |- | |||
| | 12 || [[#GetTotalSpaceSize]] | |||
| |- | |||
| | 13 || [3.0.0+] [[#CleanDirectoryRecursively]] | |||
| |- | |||
| | 14 || [3.0.0+] [[#GetFileTimeStampRaw]] | |||
| |- | |||
| | 15 || [4.0.0+] QueryEntry | |||
| |- | |||
| | 16 || [15.0.0+] GetFileSystemAttribute | |||
| |} | |||
| ==  | == GetEntryType == | ||
| Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32. | |||
| ==  | == OpenFile == | ||
| Takes a type-0x19 input buffer for the path, and an u32 '''mode'''. '''mode''' controls how the file is opened, based on which bits are set: | |||
| * When bit 0 is set, the file is Readable: you can use the Read operation. | |||
| * When bit 1 is set, the file is Writable: you can use the Write operation. | |||
| * When bit 2 is set, the file is Appendable: unless this bit is set, you will not be able to write beyond the end of a file (such writes will result in an error 0x307202) | |||
| ==  | == OpenDirectory == | ||
| Takes a  | Takes a type-0x9 input buffer for the path and an u64 '''filter_flags'''. '''filter_flags''' controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files. | ||
| ==  | == Commit == | ||
| Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect. | |||
| ==  | == GetFreeSpaceSize == | ||
| Takes  | Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS. | ||
| ==  | == GetTotalSpaceSize == | ||
| Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used). | |||
| ==  | == CleanDirectoryRecursively == | ||
| Takes a  | Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path. | ||
| == GetFileTimeStampRaw == | |||
| Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8. | |||
| = | = IDirectory = | ||
| This is "nn::fssrv::sf::IDirectory". | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || [[#Read]] | |||
| |- | |||
| | 1 || [[#GetEntryCount]] | |||
| |} | |||
| Returns an  | == Read == | ||
| Takes a type-0x6 output buffer. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available. | |||
| The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..". | |||
| Returns  | == GetEntryCount == | ||
| Returns an u64 for the total number of readable entries. | |||
| = | = DirectoryEntry = | ||
| This is "nn::fs::DirectoryEntry". | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Offset || Size || Description | |||
| |- | |||
| | 0x0 || 0x301 || Path | |||
| |- | |||
| | 0x301 || 0x1 || File attributes (bit 0 = is directory; bit 1 = archive bit) | |||
| |- | |||
| | 0x302 || 0x2 || Padding? | |||
| |- | |||
| | 0x304 || 0x1 || [[#DirectoryEntryType]] | |||
| |- | |||
| | 0x305 || 0x3 || Padding? | |||
| |- | |||
| | 0x308 || 0x8 || Filesize, 0 for directories. | |||
| |} | |||
| = | = DirectoryEntryType = | ||
| This  | This is "nn::fs::DirectoryEntryType". | ||
| An s8 value indicating a directory entry type. The current values are: | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Value || Description | |||
| |- | |||
| | 0 || Directory | |||
| |- | |||
| | 1 || File | |||
| |} | |||
| = | = IFile = | ||
| This is "nn::fssrv::sf::IFile". | |||
| {| class="wikitable" border="1" | |||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || Read | |||
| |- | |||
| | 1 || Write | |||
| |- | |||
| | 2 || Flush | |||
| |- | |||
| | 3 || SetSize | |||
| |- | |||
| | 4 || GetSize | |||
| |- | |||
| | 5 || [4.0.0+] OperateRange | |||
| |- | |||
| | 6 || [12.0.0+] OperateRangeWithBuffer | |||
| |} | |||
| = | = ISaveDataInfoReader = | ||
| This is "nn::fssrv::sf::ISaveDataInfoReader". | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || [[#ReadSaveDataInfo]] | |||
| |} | |||
| == ReadSaveDataInfo == | |||
| Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]]. | |||
| This is used to get [[#SaveDataInfo]] for all savedata on the system (or all savedata for the current [[#SaveDataSpaceId]]). When used multiple times, it will resume reading where it left off, until no more entries are available (in that case the out u64 is value 0). | |||
| = IDeviceOperator = | |||
| This is "nn::fssrv::sf::IDeviceOperator". | |||
| = | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 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 | |||
| |- | |- | ||
| | 0 || [[# | | 8 || [20.0.0+] [S1] TryGetSdCardInfo | ||
| |- | |||
| | 100 || [[#GetMmcCid]] | |||
| |- | |||
| | 101 || [[#GetMmcSpeedMode]] | |||
| |- | |||
| | 110 || [[#EraseMmc]] | |||
| |- | |||
| | 111 || [[#GetMmcPartitionSize]] | |||
| |- | |||
| | 112 || [2.0.0+] [[#GetMmcPatrolCount]] | |||
| |- | |||
| | 113 || [2.0.0+] [[#GetAndClearMmcErrorInfo]] | |||
| |- | |||
| | 114 || [2.0.0+] [[#GetMmcExtendedCsd]] | |||
| |- | |||
| | 115 || [4.0.0+] [[#SuspendMmcPatrol]] | |||
| |- | |- | ||
| |  | | 116 || [4.0.0+] [[#ResumeMmcPatrol]] | ||
| |- | |- | ||
| |  | | 117 || [17.0.0+] [[#EraseMmcWithRange]] | ||
| |- | |- | ||
| |  | | 118 || [20.0.0+] MarkBeforeEraseMmcPartitionUserData | ||
| |- | |- | ||
| |  | | 119 || [20.0.0+] CheckAfterEraseMmcPartitionUserData | ||
| |- | |- | ||
| |  | | 200 || [S1] [[#IsGameCardInserted]] | ||
| |- | |- | ||
| | 201 || [S1] [[#EraseGameCard]] | |||
| |- | |- | ||
| |  | | 202 || [S1] [[#GetGameCardHandle]] | ||
| |- | |- | ||
| |  | | 203 || [S1] [[#GetGameCardUpdatePartitionInfo]] | ||
| |- | |- | ||
| |  | | 204 || [S1] [[#FinalizeGameCardDriver]] | ||
| |- | |- | ||
| |  | | 205 || [S1] [[#GetGameCardAttribute]] | ||
| |- | |- | ||
| |  | | 206 || [S1] [[#GetGameCardDeviceCertificate]] | ||
| |- | |- | ||
| |  | | 207 || [S1] [[#GetGameCardAsicInfo]] | ||
| |- | |- | ||
| |  | | 208 || [S1] [[#GetGameCardIdSet]] | ||
| |- | |- | ||
| |  | | 209 || [S1] [[#WriteToGameCardDirectly]] | ||
| |- | |- | ||
| |  | | 210 || [S1] [[#SetVerifyWriteEnalbleFlag]] | ||
| |- | |- | ||
| |  | | 211 || [S1] [[#GetGameCardImageHash]] | ||
| |- | |- | ||
| |  | | 212 || [S1] [2.0.0+] [[#GetGameCardDeviceIdForProdCard]] | ||
| |- | |- | ||
| |  | | 213 || [S1] [2.0.0+] [[#EraseAndWriteParamDirectly]] | ||
| |- | |- | ||
| |  | | 214 || [S1] [2.0.0+] [[#ReadParamDirectly]] | ||
| |- | |||
| | 215 || [S1] [2.0.0+] [[#ForceEraseGameCard]] | |||
| |- | |||
| | 216 || [S1] [2.0.0+] [[#GetGameCardErrorInfo]] | |||
| |- | |||
| | 217 || [S1] [2.1.0+] [[#GetGameCardErrorReportInfo]] | |||
| |- | |||
| | 218 || [S1] [3.0.0+] [[#GetGameCardDeviceId]] | |||
| |- | |||
| | 219 || [S1] [8.0.0+] [[#ChallengeCardExistence]] | |||
| |- | |||
| | 220 || [S1] [9.0.0+] [[#GetGameCardCompatibilityType]] | |||
| |- | |||
| | 221 || [S1] [17.0.0+] [[#GetGameCardAsicCertificate]] | |||
| |- | |||
| | 222 || [S1] [18.0.0+] [[#GetGameCardCardHeader]] | |||
| |- | |||
| | 223 || [S1] [19.0.0+] [[#SetGameCardSessionCreationDelay]] | |||
| |- | |||
| | 224 || [S1] [19.0.0+] [[#GetGameCardApplicationIdList]] | |||
| |- | |||
| | 225 || [S1] [20.0.0+] RegisterGameCardConfigurationData | |||
| |- | |||
| | 226 || [S1] [20.0.0+] GetGameCardDetailedErrorReportInfo | |||
| |- | |||
| | 300 || [[#SetSpeedEmulationMode]] | |||
| |- | |||
| | 301 || [[#GetSpeedEmulationMode]] | |||
| |- | |||
| | 302 || [18.0.0+] [[#SetApplicationStorageSpeed]] | |||
| |- | |||
| | 303 || [20.0.0+] SetGameCardClockRateForSpeedEmulation | |||
| |- | |||
| | 304 || [20.0.0+] ClearGameCardClockRateForSpeedEmulation | |||
| |- | |||
| | 400 || [5.0.0+] [[#SuspendSdmmcControl]] | |||
| |- | |||
| | 401 || [5.0.0+] [[#ResumeSdmmcControl]] | |||
| |- | |||
| | 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]] | |||
| |- | |- | ||
| |  | | 500 || [6.0.0+] [[#SetDeviceSimulationEvent]] | ||
| |- | |- | ||
| |  | | 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]] | ||
| |- | |- | ||
| |  | | 800 || [S2] [[#OpenStorageDeviceManager]] | ||
| |} | |} | ||
| ==  | == IsSdCardInserted == | ||
| No input. Returns an output bool. | |||
| ==  | == GetSdCardSpeedMode == | ||
| No input. Returns an output [[#SdCardSpeedMode]]. | |||
| == GetSdCardCid == | |||
| Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | |||
| ==  | == GetSdCardUserAreaSize == | ||
| No input. Returns an output s64 '''SdCardUserAreaSize'''. | |||
| ==  | == GetSdCardProtectedAreaSize == | ||
| No input. Returns an output s64 '''SdCardProtectedAreaSize'''. | |||
| ==  | == GetAndClearSdCardErrorInfo == | ||
| Takes a type- | 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- | 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. | |||
| ==  | == 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-0x6 output buffer | Takes a type-0x5 input buffer '''FwBuffer''', a type-0x6 output buffer containing [[#RmaInformation]] and two input s64s '''FwBufferSize''' and '''RmaInformationSize'''. No output. | ||
| == GetGameCardIdSet == | |||
| Takes a type-0x6 output buffer containing a [[#GameCardIdSet]] and an input s64 '''BufferSize'''. No output. | |||
| =  | == WriteToGameCardDirectly == | ||
| Takes a type-0x6 output buffer and two input s64s '''Offset''' and '''BufferSize'''. No output. | |||
| == SetVerifyWriteEnalbleFlag == | |||
| Takes an input bool. No output. | |||
| == GetGameCardImageHash == | |||
| Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output. | |||
| == GetGameCardDeviceIdForProdCard == | |||
| Takes a type-0x5 input buffer '''CardHeaderForDev''', a type-0x6 output buffer and two input s64s '''CardHeaderForDevSize''' and '''BufferSize'''. No output. | |||
| == EraseAndWriteParamDirectly == | |||
| Takes a type-0x5 input buffer and an input s64 '''BufferSize'''. No output. | |||
| == ReadParamDirectly == | |||
| Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | |||
| == ForceEraseGameCard == | |||
| No input/output. | |||
| == GetGameCardErrorInfo == | |||
| No input. Returns an output [[#GameCardErrorInfo]]. | |||
| == GetGameCardErrorReportInfo == | |||
| No input. Returns an output [[#GameCardErrorReportInfo]]. | |||
| == GetGameCardDeviceId == | |||
| Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | |||
| == ChallengeCardExistence == | |||
| Takes a type-0x6 output buffer, two type-0x5 input buffers and an input [[#GameCardHandle]]. No output. | |||
| [9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]]. | |||
| == GetGameCardCompatibilityType == | |||
| Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardCompatibilityType]]. | |||
| == GetGameCardAsicCertificate == | |||
| Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | |||
| == GetGameCardCardHeader == | |||
| Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output. | |||
| == SetGameCardSessionCreationDelay == | |||
| Takes two input bools and an input u32. No output. | |||
| == GetGameCardApplicationIdList == | |||
| Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. Returns an output u16. | |||
| == SetSpeedEmulationMode == | |||
| Takes an input [[#SpeedEmulationMode]]. No output. | |||
| == GetSpeedEmulationMode == | |||
| No input. Returns an output [[#SpeedEmulationMode]]. | |||
| == SetApplicationStorageSpeed == | |||
| Takes an input s32. No output. | |||
| == SuspendSdmmcControl == | |||
| No input/output. | |||
| == ResumeSdmmcControl == | |||
| No input/output. | |||
| == GetSdmmcConnectionStatus == | |||
| Takes a total of 4-bytes of input. Returns a total of 8-bytes of output. | |||
| == SetDeviceSimulationEvent ==  | |||
| Takes a total of 0x14-bytes of input. No output. | |||
| == ClearDeviceSimulationEvent == | |||
| Takes a total of 4-bytes of input. No output. | |||
| == OpenStorageDeviceManager == | |||
| Takes a byte. Returns an [[#IStorageDeviceManager]]. | |||
| = IEventNotifier = | |||
| This is "nn::fssrv::sf::IEventNotifier". | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| |  | ! Cmd || Name | ||
| |- | |- | ||
| |  | | 0 || [[#GetEventHandle]] | ||
| |} | |||
| == GetEventHandle == | |||
| No input, returns an output Event handle. With official sw the EventClearMode is user-specified. | |||
| = ISaveDataTransferManager = | |||
| This is "nn::fssrv::sf::ISaveDataTransferManager". | |||
| This was added with [[4.0.0]]. | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| |  | ! Cmd || Name | ||
| |- | |- | ||
| |  | | 0 || [[#GetChallenge]] | ||
| |- | |- | ||
| |  | | 16 || [[#SetToken]] | ||
| |- | |- | ||
| |  | | 32 || [[#OpenSaveDataExporter]] | ||
| |- | |- | ||
| |  | | 64 || [[#OpenSaveDataImporter]] | ||
| |- | |} | ||
| == GetChallenge == | |||
| No input/output, takes a type-0x6 output buffer. | |||
| == SetToken == | |||
| No input/output, takes a type-0x5 input buffer. | |||
| == OpenSaveDataExporter == | |||
| Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]]. | |||
| == OpenSaveDataImporter == | |||
| Takes an input u8 [[#SaveDataSpaceId]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]]. | |||
| = ISaveDataTransferManagerForSaveDataRepair = | |||
| This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair". | |||
| |  | This was added with [[9.0.0]]. | ||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| |  | ! Cmd || Name | ||
| |- | |- | ||
| |  | | 0 || [[#GetChallenge]] | ||
| |- | |- | ||
| |  | | 16 || [[#SetKeyPackage]] | ||
| |- | |- | ||
| |  | | 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]] | ||
| |- | |- | ||
| |  | | 81 || [[#PrepareOpenSaveDataImporter]] | ||
| |- | |- | ||
| |  | | 90 || [[#OpenSaveDataImporter]] | ||
| |- | |- | ||
| |  | | 91 || [[#OpenSaveDataImporter2]] | ||
| |- | |- | ||
| |  | | 100 || [[#OpenSaveDataExporterWithKey]] | ||
| |- | |- | ||
| |  | | 110 || [[#OpenSaveDataImporterWithKey]] | ||
| |} | |} | ||
| ==  | == SetKeyPackage == | ||
| No input | No input/output, takes a type-0x5 input buffer. | ||
| ==  | == OpenSaveDataExporterAndGetEncryptedKey == | ||
| Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an [[#ISaveDataDivisionExporter]]. | |||
| ==  | == PrepareOpenSaveDataImporter == | ||
| Takes a type- | 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  | Takes a total of 0x20-bytes of input, returns an [[#ISaveDataDivisionExporter]]. | ||
| ==  | == OpenSaveDataImporterWithKey == | ||
| Takes a type- | Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | ||
| [17.0.0+] Now only takes 0x18-bytes of input and an additional type-0x5 input buffer. | |||
| = | = ISaveDataMover = | ||
| This is "nn::fssrv::sf::ISaveDataMover". | |||
| This was added with [[10.0.0]]. | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 8 || [[#Register]] | |||
| |- | |||
| | 16 || [[#Process]] | |||
| |- | |||
| | 18 || [[#Cancel]] | |||
| |} | |||
| ==  | == Register == | ||
| Takes  | Takes an input u64, no output. | ||
| ==  | == Process == | ||
| Takes  | Takes an input u64, returns an output u64. | ||
| ==  | == Cancel == | ||
| No input/output. | No input/output. | ||
| = | = ISaveDataTransferManagerForRepair = | ||
| This is "nn::fssrv::sf::ISaveDataTransferManagerForRepair". | |||
| This was added with [[11.0.0]]. | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 80 || [[#OpenSaveDataExporter]] | |||
| |- | |||
| | 90 || [[#OpenSaveDataImporter]] | |||
| |} | |||
| ==  | == OpenSaveDataExporter == | ||
| Takes  | Takes a total of 0x10-bytes of input, returns an [[#ISaveDataDivisionExporter]]. | ||
| ==  | == OpenSaveDataImporter == | ||
| Takes 1-byte of input, a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | |||
| = | = ISaveDataExporter = | ||
| This is "nn::fssrv::sf::ISaveDataExporter". | |||
| This was added with [[4.0.0]]. | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || [[#GetSaveDataInfo]] | |||
| |- | |||
| | 1 || [[#GetRestSize]] | |||
| |- | |||
| | 16 || [[#Pull]] | |||
| |- | |||
| | 17 || [[#PullInitialData]] | |||
| |} | |||
| ==  | == GetSaveDataInfo == | ||
| No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer. | |||
| The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw. | |||
| ==  | == GetRestSize == | ||
| No input, returns an output u64. | |||
| ==  | == Pull == | ||
| Takes a type-0x6 output buffer, an  | Takes a type-0x6 output buffer, returns an output u64. | ||
| ==  | == PullInitialData == | ||
| No input/output, takes a type-0x6 output buffer. | |||
| = | = ISaveDataImporter = | ||
| This is "nn::fssrv::sf::ISaveDataImporter". | |||
| This was added with [[4.0.0]]. | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || [[#GetSaveDataInfo]] | |||
| |- | |||
| | 1 || [[#GetRestSize]] | |||
| |- | |||
| | 16 || [[#Push]] | |||
| |- | |||
| | 17 || [[#Finalize]] | |||
| |} | |||
| ==  | == GetSaveDataInfo == | ||
| No input | 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 | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || [[# | | 0 || [[#GetChallenge]] | ||
| |- | |- | ||
| | 8 || [18.0.0+] SetMode | |||
| |- | |- | ||
| |  | | 9 || [18.0.0+] SetAttribute | ||
| |- | |- | ||
| | 16 || [[# | | 16 || [[#SetKeySeedPackage]] | ||
| |- | |||
| | 17 || [20.0.0+] SetLocalKeySeedPackage | |||
| |- | |- | ||
| | 32 || [[#OpenSaveDataExporter]] | | 32 || [[#OpenSaveDataExporter]] | ||
| |- | |- | ||
| | 64 || [[#OpenSaveDataImporter]] | | 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 == | == GetChallenge == | ||
| No input/output, takes a type-0x6 output buffer. | No input/output, takes a type-0x6 output buffer containing the '''Challenge'''. | ||
| ==  | == SetKeySeedPackage == | ||
| No input/output, takes a type-0x5 input buffer. | No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''. | ||
| == OpenSaveDataExporter == | == OpenSaveDataExporter == | ||
| Takes an input u8 [[#SaveDataSpaceId]] and u64 | Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]]. | ||
| ==  | == OpenSaveDataExporterForDiffExport == | ||
| Takes an input u8 [[#SaveDataSpaceId]]  | 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]]. | |||
| This was added with [[ | == 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" | ||
| Line 1,660: | Line 1,660: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || [[# | | 0 || [[#SetDivisionCount]] | ||
| |- | |- | ||
| |  | | 1 || [6.0.0+] [[#ReadSaveDataExtraData]] | ||
| |- | |- | ||
| |  | | 16 || [[#OpenSaveDataDiffChunkIterator]] | ||
| |- | |- | ||
| |  | | 48 || [[#OpenSaveDataChunkExporter]] | ||
| |- | |- | ||
| |  | | 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]] | ||
| |- | |- | ||
| |  | | 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]] | ||
| |- | |- | ||
| |  | | 66 || [6.0.0+] [[#CancelExport]] | ||
| |- | |- | ||
| |  | | 67 || [6.0.0+] [[#SuspendExport]] | ||
| |- | |||
| | 70 || [6.0.0-17.0.1] [[#GetKeySeed]] | |||
| |- | |||
| | 71 || [6.0.0+] [[#GetInitialDataMac]] | |||
| |- | |||
| | 72 || [6.0.0+] [[#FinalizeExport]] | |||
| |- | |||
| | 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]] | |||
| |- | |||
| | 74 || [18.0.0+] [[#GetKeySeed]] | |||
| |- | |||
| | 75 || [20.0.0+] GetLocalKeySeedPackage | |||
| |- | |||
| | 80 || [6.0.0+] [[#GetImportInitialDataAad]] | |||
| |- | |||
| | 81 || [6.0.0+] [[#SetExportInitialDataAad]] | |||
| |- | |||
| | 96 || [6.0.0+] [[#GetReportInfo]] | |||
| |} | |} | ||
| ==  | == SetDivisionCount == | ||
| Takes an input u32, no output. | |||
| ==  | == OpenSaveDataChunkExporter == | ||
| Takes  | 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  | Takes an input 0x20-byte struct, no output. | ||
| =  | = ISaveDataDivisionImporter = | ||
| This is "nn::fssrv::sf:: | This is "nn::fssrv::sf::ISaveDataDivisionImporter". | ||
| This was added with [[ | This was added with [[5.0.0]]. | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 1,707: | Line 1,734: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| |  | | 0 || [6.0.0+] [[#ReadSaveDataExtraData]] | ||
| |- | |||
| | 16 || [[#OpenSaveDataDiffChunkIterator]] | |||
| |- | |||
| | 32 || [[#InitializeImport]] | |||
| |- | |- | ||
| |  | | 33 || [[#FinalizeImport]] | ||
| |- | |- | ||
| |  | | 34 || [6.0.0+] [[#CancelImport]] | ||
| | | |- | ||
| | 35 || [6.0.0+] [[#GetImportContext]] | |||
| |- | |||
| | 36 || [6.0.0+] [[#SuspendImport]] | |||
| |- | |||
| | 37 || [11.0.0+] FinalizeImportWithoutSwap | |||
| |- | |- | ||
| | 48 || [[#OpenSaveDataChunkImporter]] | |||
| |- | |- | ||
| |  | | 64 || [6.0.0+] [[#GetImportInitialDataAad]] | ||
| |- | |- | ||
| |  | | 80 || [6.0.0+] [[#GetReportInfo]] | ||
| |} | |} | ||
| ==  | == ReadSaveDataExtraData == | ||
| No input/output, takes a type-0x6 output buffer. | |||
| ==  | == OpenSaveDataDiffChunkIterator == | ||
| No input, returns an [[#ISaveDataChunkIterator]]. | |||
| =  | == InitializeImport == | ||
| This is "nn::fssrv::sf:: | No input, returns an output u64. | ||
| == FinalizeImport == | |||
| No input/output. | |||
| == CancelImport == | |||
| No input/output. | |||
| == GetImportContext == | |||
| No input/output, takes a type-0x6 output buffer. | |||
| == SuspendImport == | |||
| No input/output. | |||
| == OpenSaveDataChunkImporter == | |||
| Takes an input u32, returns an [[#ISaveDataChunkImporter]]. | |||
| == GetImportInitialDataAad ==  | |||
| No input, returns an output 0x20-byte struct. | |||
| == GetReportInfo == | |||
| No input, returns an output 0x20-byte struct. | |||
| = ISaveDataChunkIterator = | |||
| This is "nn::fssrv::sf::ISaveDataChunkIterator". | |||
| This was added with [[ | This was added with [[5.0.0]]. | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 1,752: | Line 1,796: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || [[# | | 0 || [[#Next]] | ||
| |- | |- | ||
| | 1 || [[# | | 1 || [[#IsEnd]]   | ||
| |- | |- | ||
| | 16 || [[# | | 16 || [[#GetId]]   | ||
| |} | |} | ||
| ==  | == Next == | ||
| No input/output | No input/output. | ||
| == IsEnd == | |||
| No input, returns an output u8. | |||
| ==  | == GetId == | ||
| No input, returns an output  | No input, returns an output u32. | ||
| = | = ISaveDataChunkExporter = | ||
| This is "nn::fssrv::sf::ISaveDataChunkExporter". | |||
| This was added with [[5.0.0]]. | |||
| This was added with [[ | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 1,784: | Line 1,821: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 || [[# | | 0 || [[#Pull]] | ||
| |- | |- | ||
| | 16 || [6.0.0+] [[#GetRestRawDataSize]] | |||
| | 16 || [ | |||
| |} | |} | ||
| ==  | == Pull == | ||
| Takes an input u64 and a type-0x6 output buffer, returns an output u64. | |||
| == GetRestRawDataSize == | |||
| No input, returns an output u64. | |||
| = ISaveDataChunkImporter = | |||
| This is "nn::fssrv::sf::ISaveDataChunkImporter". | |||
| This was added with [[5.0.0]]. | |||
| ==  | {| class="wikitable" border="1" | ||
| |- | |||
| ! Cmd || Name | |||
| |- | |||
| | 0 || [[#Push]] | |||
| |} | |||
| == Push == | == 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:: | This is "nn::fssrv::sf::IMultiCommitManager". | ||
| This was added with [ | This was added with [6.0.0+]. | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 1,816: | Line 1,863: | ||
| ! Cmd || Name | ! 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". | |||
| This is "nn::fssrv::sf:: | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 1,887: | Line 1,936: | ||
| ! Cmd || Name | ! Cmd || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || Operate | ||
| |- | |- | ||
| | 1 ||  | | 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" | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| !  | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || System | ||
| |- | |- | ||
| | 1 ||  | | 1 || User | ||
| |- | |- | ||
| |  | | 2 || SdCard | ||
| |- | |||
| | 3 || [16.0.0+] System0 | |||
| |} | |} | ||
| = | = SaveDataSpaceId = | ||
| This is "nn::fs::SaveDataSpaceId". | |||
| This is "nn:: | |||
| {| class="wikitable" border="1" | {| 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". | |||
| This is "nn:: | |||
| {| class="wikitable" border="1" | {| 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". | |||
| This  | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| !  | ! Value || Name | ||
| |- | |- | ||
| |  | | 0 || Primary | ||
| |- | |- | ||
| |  | | 1 || Secondary | ||
| |} | |} | ||
| = | = SaveDataEnumerateOption = | ||
| This is "nn::fs::SaveDataEnumerateOption". | |||
| This is "nn::fs:: | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| !  | ! Value || Name | ||
| |- | |- | ||
| |  | | 1 || AllRank | ||
| |} | |} | ||
| = | = SaveDataFlags = | ||
| This is "nn::fs::SaveDataFlags". | |||
| This is "nn::fs:: | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,120: | Line 2,126: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| |  | | 1 || KeepAfterResettingSystemSaveData | ||
| |- | |- | ||
| |  | | 2 || KeepAfterRefurbishment | ||
| |- | |- | ||
| |  | | 4 || KeepAfterResettingSystemSaveDataWithoutUserSaveData | ||
| |- | |- | ||
| | 8 || NeedsSecureDelete | |||
| | 8 ||  | |||
| |} | |} | ||
| =  | = SaveDataMetaType = | ||
| This is "nn::fs:: | This is "nn::fs::SaveDataMetaType". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,146: | Line 2,142: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || None | ||
| |- | |- | ||
| | 1 ||  | | 1 || Thumbnail | ||
| |- | |- | ||
| | 2 ||  | | 2 || ExtensionContext | ||
| |} | |} | ||
| =  | = ImageDirectoryId = | ||
| This is "nn::fs:: | This is "nn::fs::ImageDirectoryId". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,164: | Line 2,156: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || Nand | ||
| |- | |- | ||
| | 1  | | 1 || SdCard | ||
| |} | |} | ||
| =  | = CloudBackupWorkStorageId = | ||
| This is "nn::fs:: | This is "nn::fs::CloudBackupWorkStorageId". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,178: | Line 2,168: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || Nand | ||
| |- | |- | ||
| | 1 ||  | | 1 || SdCard | ||
| |} | |||
| = CustomStorageId = | |||
| This is "nn::fs::CustomStorageId". | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| |  | ! Value || Name | ||
| |- | |- | ||
| |  | | 0 || System | ||
| |- | |- | ||
| |  | | 1 || SdCard | ||
| |} | |} | ||
| = Priority = | |||
| This is "nn::fs::Priority". | |||
| =  | |||
| This is "nn::fs:: | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,202: | Line 2,192: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || Realtime | ||
| |- | |- | ||
| | 1 ||  | | 1 || Normal | ||
| |- | |- | ||
| | 2 ||  | | 2 || Low | ||
| |} | |} | ||
| =  | = PriorityRaw = | ||
| This is "nn::fs:: | This is "nn::fs::PriorityRaw". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,224: | Line 2,206: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || Realtime | ||
| |- | |||
| | 1 || Normal | |||
| |- | |||
| | 2 || Low | |||
| |- | |- | ||
| |  | | 3 || Background | ||
| |} | |} | ||
| =  | = AbortSpecifier = | ||
| This is "nn::fs:: | This is "nn::fs::AbortSpecifier". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,236: | Line 2,222: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 1 ||  | | 0 || Default | ||
| |} | |- | ||
| | 1 || Abort | |||
| |- | |||
| | 2 || ReturnResult | |||
| |} | |||
| =  | = OperationId = | ||
| This is "nn::fs:: | This is "nn::fs::OperationId". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,246: | Line 2,236: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| |  | | 0 || Clear | ||
| |- | |- | ||
| |  | | 1 || ClearSignature | ||
| |- | |- | ||
| |  | | 2 || InvalidateCache | ||
| |- | |- | ||
| |  | | 3 || QueryRange | ||
| |} | |} | ||
| =  | = MountHostOption = | ||
| This is "nn::fs:: | This is "nn::fs::MountHostOption". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,262: | Line 2,252: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 1 || PseudoCaseSensitive | |||
| | 1 ||  | |||
| |} | |} | ||
| =  | = BisPartitionId = | ||
| This is "nn::fs:: | This is "nn::fs::BisPartitionId". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,276: | Line 2,262: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 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:: | This is "nn::fs::SdCardSpeedMode". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,342: | Line 2,308: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || Identification | ||
| |- | |- | ||
| | 1 ||  | | 1 || DefaultSpeed | ||
| |- | |- | ||
| | 2 ||  | | 2 || HighSpeed | ||
| |- | |- | ||
| | 3 || Sdr12 | |||
| |- | |||
| | 4 || Sdr25 | |||
| |- | |- | ||
| |  | | 5 || Sdr50 | ||
| |- | |- | ||
| |  | | 6 || Sdr104 | ||
| |- | |- | ||
| |  | | 7 || Ddr50 | ||
| |- | |- | ||
| |  | | 8 || Unknown | ||
| |} | |} | ||
| =  | = MmcSpeedMode = | ||
| This is "nn::fs:: | This is "nn::fs::MmcSpeedMode". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,372: | Line 2,334: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 1 ||  | | 0 || Identification | ||
| |- | |||
| | 1 || LegacySpeed | |||
| |- | |||
| | 2 || HighSpeed | |||
| |- | |||
| | 3 || Hs200 | |||
| |- | |||
| | 4 || Hs400 | |||
| |- | |||
| | 5 || Unknown | |||
| |} | |} | ||
| =  | = MmcPartition = | ||
| This is "nn::fs:: | This is "nn::fs::MmcPartition". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,382: | Line 2,354: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || UserData | ||
| |- | |- | ||
| |  | | 1 || BootPartition1 | ||
| |- | |- | ||
| |  | | 2 || BootPartition2 | ||
| |} | |||
| = HostControllerStatus = | |||
| This is "nn::sdcard::HostControllerStatus". | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |- | ||
| |  | | 0x0 | ||
| | 0xC | |||
| |   | |||
| |} | |||
| = MemoryReportInfo = | |||
| This is "nn::fs::MemoryReportInfo". | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |- | ||
| |  | | 0x0 | ||
| | 0x8 | |||
| | PooledBufferFreeSizePeak | |||
| |- | |- | ||
| |  | | 0x8 | ||
| | 0x8 | |||
| | PooledBufferRetriedCount | |||
| |- | |- | ||
| |  | | 0x10 | ||
| | 0x8 | |||
| | PooledBufferReduceAllocationCount | |||
| |- | |- | ||
| |  | | 0x18 | ||
| | 0x8 | |||
| | BufferManagerFreeSizePeak | |||
| |- | |- | ||
| |  | | 0x20 | ||
| | 0x8 | |||
| | BufferManagerRetriedCount | |||
| |- | |||
| | 0x28 | |||
| | 0x8 | |||
| | ExpHeapFreeSizePeak | |||
| |- | |||
| | 0x30 | |||
| | 0x8 | |||
| | BufferPoolFreeSizePeak | |||
| |- | |- | ||
| |  | | 0x38 | ||
| | 0x8 | |||
| | PatrolReadAllocateBufferSuccessCount | |||
| |- | |- | ||
| |  | | 0x40 | ||
| | 0x8 | |||
| | PatrolReadAllocateBufferFailureCount | |||
| |- | |- | ||
| |  | | 0x48 | ||
| | 0x8 | |||
| | BufferManagerTotalAllocatableSizePeak | |||
| |- | |- | ||
| |  | | 0x50 | ||
| | 0x8 | |||
| | BufferPoolAllocateSizeMax | |||
| |- | |- | ||
| |  | | 0x58 | ||
| | 0x8 | |||
| | PooledBufferFailedIdealAllocationCountOnAsyncAccess | |||
| |- | |- | ||
| |  | | 0x60 | ||
| | 0x20 | |||
| | Reserved | |||
| |} | |} | ||
| =  | = StorageErrorInfo = | ||
| This is "nn::fs:: | This is "nn::fs::StorageErrorInfo". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| !  | ! Offset | ||
| ! Size | |||
| ! Description | |||
| |- | |- | ||
| |  | | 0x0 | ||
| | 0x4 | |||
| | NumActivationFailures | |||
| |- | |- | ||
| |  | | 0x4 | ||
| | 0x4 | |||
| | NumActivationErrorCorrections | |||
| |- | |- | ||
| |  | | 0x8 | ||
| | 0x4 | |||
| | NumReadWriteFailures | |||
| |- | |- | ||
| |  | | 0xC | ||
| | 0x4 | |||
| | NumReadWriteErrorCorrections | |||
| |  | |||
| | | |||
| |} | |} | ||
| =  | = GameCardErrorInfo = | ||
| This is "nn::fs:: | This is "nn::fs::GameCardErrorInfo". | ||
| {| class="wikitable" border="1" | {| 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:: | This is "nn::fs::GameCardErrorReportInfo". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,487: | Line 2,515: | ||
| |- | |- | ||
| | 0x0 | | 0x0 | ||
| |  | | 0x10 | ||
| |  | | [[#GameCardErrorInfo|ErrorInfo]] | ||
| |- | |- | ||
| |  | | 0x10 | ||
| |  | | 0x2 | ||
| |  | | AsicReinitializeFailureDetail | ||
| |- | |- | ||
| |  | | 0x12 | ||
| |  | | 0x2 | ||
| |  | | InsertionCount | ||
| |- | |- | ||
| |  | | 0x14 | ||
| |  | | 0x2 | ||
| |  | | RemovalCount | ||
| |- | |- | ||
| | 0x16 | |||
| | 0x2 | |||
| | AsicReinitializeCount | |||
| |- | |- | ||
| |  | | 0x18 | ||
| | 0x4 | | 0x4 | ||
| |  | | AsicInitializeCount | ||
| |- | |- | ||
| |  | | 0x1C | ||
| |  | | 0x2 | ||
| |  | | AsicReinitializeFailureCount | ||
| |- | |- | ||
| |  | | 0x1E | ||
| |  | | 0x2 | ||
| |  | | AwakenFailureCount | ||
| |- | |- | ||
| |  | | 0x20 | ||
| | 0x2 | |||
| | Reserved | |||
| |- | |||
| | 0x22 | |||
| | 0x2 | |||
| | RefreshCount | |||
| |- | |||
| | 0x24 | |||
| | 0x4 | |||
| | LastReadErrorPageAddress | |||
| |- | |||
| | 0x28 | |||
| | 0x4 | |||
| | LastReadErrorPageCount | |||
| |- | |||
| | 0x2C | |||
| | 0x4 | | 0x4 | ||
| |  | | AwakenCount | ||
| |- | |||
| | 0x30 | |||
| | 0x4 | |||
| | ReadCountFromInsert | |||
| |- | |||
| | 0x34 | |||
| | 0x4 | |||
| | ReadCountFromAwaken | |||
| |- | |||
| | 0x38 | |||
| | 0x8 | |||
| | Reserved  | |||
| |} | |} | ||
| = GameCardHandle = | = GameCardHandle = | ||
| Line 2,582: | Line 2,629: | ||
| | 16 || [9.0.0+] DifferentRegionCupToGlobalDeviceFlag | | 16 || [9.0.0+] DifferentRegionCupToGlobalDeviceFlag | ||
| |} | |} | ||
| = GameCardAttribute2 = | |||
| This is "nn::fs::GameCardAttribute2". | |||
| = GameCardSize = | = GameCardSize = | ||
| Line 2,649: | Line 2,699: | ||
| |} | |} | ||
| =  | = GameCardIdSet = | ||
| This is "nn::gc:: | This is "nn::gc::GameCardIdSet". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,659: | Line 2,709: | ||
| |- | |- | ||
| | 0x0 | | 0x0 | ||
| |  | | 0x4 | ||
| |  | | [[#CardId1|Id1]] | ||
| |- | |- | ||
| | 0x1 | | 0x4 | ||
| | 0x1 | | 0x4 | ||
| | MemoryCapacity | | [[#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 | | 0x2 | ||
| Line 2,672: | Line 2,744: | ||
| | 0x3 | | 0x3 | ||
| | 0x1 | | 0x1 | ||
| | MemoryType | | [[#MemoryType|MemoryType]] | ||
| |} | |} | ||
| Line 2,686: | Line 2,758: | ||
| | 0x0 | | 0x0 | ||
| | 0x1 | | 0x1 | ||
| | CardSecurityNumber | | [[#CardSecurityNumber|CardSecurityNumber]] | ||
| |- | |- | ||
| | 0x1 | | 0x1 | ||
| | 0x1 | | 0x1 | ||
| | CardType | | [[#CardType|CardType]] | ||
| |- | |- | ||
| | 0x2 | | 0x2 | ||
| Line 2,711: | Line 2,783: | ||
| |} | |} | ||
| =  | = MakerCodeForCardId1 = | ||
| This is "nn::gc:: | This is "nn::gc::detail::MakerCodeForCardId1". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| !  | ! Value || Name | ||
| |- | |- | ||
| |  | | 0xC2 || MegaChips | ||
| |  | |||
| |  | |||
| |- | |- | ||
| |  | | 0xAE || Lapis | ||
| |  | |||
| |  | |||
| |- | |- | ||
| |  | | 0x36 ||   | ||
| |  | |||
| |  | |||
| |} | |} | ||
| =  | = MemoryCapacity = | ||
| This is "nn::gc:: | This is "nn::gc::detail::MemoryCapacity". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| |  | | 0xFA || 1GB | ||
| |- | |||
| | 0xF8 || 2GB | |||
| |- | |||
| | 0xF0 || 4GB | |||
| |- | |||
| | 0xE0 || 8GB | |||
| |- | |- | ||
| |  | | 0xE1 || 16GB | ||
| |- | |- | ||
| |  | | 0xE2 || 32GB | ||
| |} | |} | ||
| =  | = MemoryType = | ||
| This is "nn:: | This is "nn::gc::detail::MemoryType". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,757: | Line 2,824: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| |  | | 0x1 || T1RomFast | ||
| |- | |||
| | 0x2 || T2RomFast | |||
| |- | |||
| | 0x9 || T1NandFast | |||
| |- | |||
| | 0xA || T2NandFast | |||
| |- | |||
| | 0x21 || T1RomLate | |||
| |- | |||
| | 0x22 || T2RomLate | |||
| |- | |- | ||
| |  | | 0x29 || T1NandLate | ||
| |- | |- | ||
| |  | | 0x2A || T2NandLate | ||
| |} | |} | ||
| =  | = CardSecurityNumber = | ||
| This is "nn:: | This is "nn::gc::detail::CardSecurityNumber". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,771: | Line 2,848: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 0 ||  | | 0 || 0 | ||
| |- | |||
| | 1 || 1 | |||
| |- | |- | ||
| |  | | 2 || 2 | ||
| |- | |- | ||
| |  | | 3 || 3 | ||
| |- | |- | ||
| |  | | 4 || 4 | ||
| |} | |} | ||
| =  | = CardType = | ||
| This is "nn:: | This is "nn::gc::detail::CardType". | ||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,787: | Line 2,866: | ||
| ! Value || Name | ! Value || Name | ||
| |- | |- | ||
| | 1 ||  | | 0 || Rom | ||
| |- | |||
| | 1 || WritableDevT1 | |||
| |- | |||
| | 2 || WritableProdT1 | |||
| |- | |- | ||
| |  | | 3 || WritableDevT2 | ||
| |- | |||
| | 4 || WritableProdT2 | |||
| |} | |} | ||
| =  | = RmaInformation = | ||
| This is "nn:: | This is "nn::gc::RmaInformation". This is a 0x200-byte struct. | ||
| = GameCardCardHeader = | |||
| This is a 0x600-byte struct. | |||
| {| class="wikitable" border="1" | {| 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" | {| 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:: | This is "nn::fs::SimulatingDeviceTargetOperation". | ||
| {| class="wikitable" border="1" | {| 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. | |||
| =  | |||
| This is "nn:: | |||
| {| class="wikitable" border="1" | {| 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". | |||
| This is "nn::fs:: | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| Line 2,961: | Line 3,050: | ||
| | 0x0 | | 0x0 | ||
| | 0x8 | | 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 | | 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 | | 0x1 | ||
| | [[#SaveDataType]] | | [[#SaveDataType]] | ||
| |- | |- | ||
| | 0xA | | 0x21 | ||
| | 0x6 | | 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? | | Padding? | ||
| |- | |- | ||
| | 0x10 | | 0x10 | ||
| | 0x10 | | 0x10 | ||
| | UserId | | UserId | ||
| |- | |- | ||
| | 0x20 | | 0x20 | ||
| | 0x8 | | 0x8 | ||
| | SystemSaveDataId (0 for regular SaveData) | | SystemSaveDataId (0 for regular SaveData) | ||
| |- | |- | ||
| | 0x28 | | 0x28 | ||
| | 0x8 | | 0x8 | ||
| | [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData) | | [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData) | ||
| |- | |- | ||
| | 0x30 | | 0x30 | ||
| | 0x8 | | 0x8 | ||
| | Raw saveimage size | | Raw saveimage size | ||
| |- | |- | ||
| | 0x38 | | 0x38 | ||
| | 0x2 | | 0x2 | ||
| | SaveDataIndex | | SaveDataIndex | ||
| |- | |- | ||
| | 0x3A | | 0x3A | ||
| | 0x1 | | 0x1 | ||
| | [[#SaveDataRank]] | | [[#SaveDataRank]] | ||
| |- | |- | ||
| | 0x3B | | 0x3B | ||
| | 0x25 | | 0x25 | ||
| | Unknown. Usually zeros? | | 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]] | ||