Difference between revisions of "Filesystem services"
(269 intermediate revisions by 16 users not shown) | |||
Line 1: | Line 1: | ||
= fsp-ldr = | = fsp-ldr = | ||
+ | This is "nn::fssrv::sf::IFileSystemProxyForLoader". | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! Cmd || Name || | + | ! Cmd || Name |
+ | |- | ||
+ | | 0 || [[#OpenCodeFileSystem]] | ||
|- | |- | ||
− | | | + | | 1 || [[#IsArchivedProgram]] |
|- | |- | ||
− | | | + | | 2 || [4.0.0+] [[#SetCurrentProcess]] |
|} | |} | ||
+ | |||
+ | == OpenCodeFileSystem == | ||
+ | Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | ||
+ | |||
+ | [10.0.0+] This now takes an additional type-0x1A output buffer. | ||
+ | |||
+ | [16.0.0+] This now takes an additional input [[#ContentAttributes]]. | ||
+ | |||
+ | [17.0.0+] This now takes a type-0x6 output buffer instead of a type-0x1A output buffer. | ||
+ | |||
+ | == IsArchivedProgram == | ||
+ | Takes an input u64 ProcessId. Returns a bool (1 if the process id's [[#FspPath]] ends in ".nca"). | ||
+ | |||
+ | == SetCurrentProcess == | ||
+ | Takes an input u64 ProcessId. No output. | ||
= fsp-pr = | = fsp-pr = | ||
+ | This is "nn::fssrv::sf::IProgramRegistry". | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! Cmd || Name | + | ! Cmd || Name |
|- | |- | ||
− | | 0 || | + | | 0 || [[#RegisterProgram]] |
|- | |- | ||
− | | 1 || | + | | 1 || [[#UnregisterProgram]] |
|- | |- | ||
− | | | + | | 2 || [4.0.0+] [[#SetCurrentProcess]] |
+ | |- | ||
+ | | 256 || [1.0.0-9.2.0] [[#SetEnabledProgramVerification]] | ||
|} | |} | ||
+ | |||
+ | == RegisterProgram == | ||
+ | Takes a [[NCM_services#StorageId|StorageId]], an u64 ProcessId, a [[NCM_services#ProgramId|ProgramId]], a 0x1C type-A buffer for the [[NPDM#FS_Access_Header| FS Access Header]], and a 0x2C type-A buffer for the [[NPDM#FS_Access_Control| FS Access Control]] | ||
+ | |||
+ | Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid. | ||
+ | |||
+ | == UnregisterProgram == | ||
+ | Takes a pid. Removes registered FS permissions for that PID. | ||
== SetEnabledProgramVerification == | == SetEnabledProgramVerification == | ||
Seems to sets a global flag to inputval & 1. | Seems to sets a global flag to inputval & 1. | ||
− | When the flag is zero, it will set ret=0 instead of ret={error} when verifying | + | When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort. |
+ | |||
+ | [10.0.0+] This was moved to [[Loader_services|Loader]]. | ||
= fsp-srv = | = fsp-srv = | ||
+ | This is "nn::fssrv::sf::IFileSystemProxy". | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | 0 || | + | | 0 || [1.0.0] [[#OpenFileSystem]] |
|- | |- | ||
− | | 1 || [[# | + | | 1 || [[#SetCurrentProcess]] |
|- | |- | ||
− | | 2 || | + | | 2 || OpenDataFileSystemByCurrentProcess |
|- | |- | ||
− | | 7 || [[# | + | | 7 || [2.0.0+] [[#OpenFileSystemWithPatch]] |
|- | |- | ||
− | | 8 || [[# | + | | 8 || [16.0.0+] [[#OpenFileSystemWithIdObsolete]] ([2.0.0-15.0.1] OpenFileSystemWithId) |
|- | |- | ||
− | | | + | | 9 || [3.0.0+] OpenDataFileSystemByProgramId |
|- | |- | ||
− | | 12 || [[# | + | | 10 || [16.0.0+] [[#OpenFileSystemWithId]] |
+ | |- | ||
+ | | 11 || [[#OpenBisFileSystem]] | ||
+ | |- | ||
+ | | 12 || [[#OpenBisStorage]] | ||
|- | |- | ||
| 13 || InvalidateBisCache | | 13 || InvalidateBisCache | ||
|- | |- | ||
− | | 17 || | + | | 17 || OpenHostFileSystem |
+ | |- | ||
+ | | 18 || OpenSdCardFileSystem | ||
+ | |- | ||
+ | | 19 || [2.0.0+] FormatSdCardFileSystem | ||
+ | |- | ||
+ | | 21 || [[#DeleteSaveDataFileSystem]] | ||
+ | |- | ||
+ | | 22 || [[#CreateSaveDataFileSystem]] | ||
+ | |- | ||
+ | | 23 || [[#CreateSaveDataFileSystemBySystemSaveDataId]] | ||
+ | |- | ||
+ | | 24 || RegisterSaveDataFileSystemAtomicDeletion | ||
|- | |- | ||
− | | | + | | 25 || [2.0.0+] DeleteSaveDataFileSystemBySaveDataSpaceId |
|- | |- | ||
− | | | + | | 26 || [2.0.0+] FormatSdCardDryRun |
|- | |- | ||
− | | | + | | 27 || [2.0.0+] IsExFatSupported |
|- | |- | ||
− | | | + | | 28 || [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute |
|- | |- | ||
− | | | + | | 29 || [19.0.0+] IsInitializationMode |
|- | |- | ||
− | | | + | | 30 || [[#OpenGameCardStorage]] |
|- | |- | ||
− | | | + | | 31 || [[#OpenGameCardFileSystem]] |
|- | |- | ||
− | | | + | | 32 || [3.0.0+] ExtendSaveDataFileSystem |
|- | |- | ||
− | | | + | | 33 || [5.0.0+] DeleteCacheStorage |
|- | |- | ||
− | | | + | | 34 || [5.0.0+] GetCacheStorageSize |
|- | |- | ||
− | | | + | | 35 || [6.0.0+] [[#CreateSaveDataFileSystemWithHashSalt]] |
|- | |- | ||
− | | | + | | 36 || [9.0.0+] OpenHostFileSystemWithOption |
|- | |- | ||
− | | | + | | 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2 |
|- | |- | ||
− | | | + | | 51 || [[#OpenSaveDataFileSystem]] |
|- | |- | ||
− | | | + | | 52 || [[#OpenSaveDataFileSystemBySystemSaveDataId]] |
|- | |- | ||
− | | | + | | 53 || [2.0.0+] [[#OpenReadOnlySaveDataFileSystem]] |
|- | |- | ||
− | | | + | | 57 || [3.0.0+] [[#ReadSaveDataFileSystemExtraDataBySaveDataSpaceId]] |
|- | |- | ||
− | | | + | | 58 || [[#ReadSaveDataFileSystemExtraData]] |
|- | |- | ||
− | | | + | | 59 || [2.0.0+] WriteSaveDataFileSystemExtraData |
|- | |- | ||
− | | | + | | 60 || [[#OpenSaveDataInfoReader]] |
|- | |- | ||
− | | | + | | 61 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]] |
|- | |- | ||
− | | | + | | 62 || [5.0.0+] OpenSaveDataInfoReaderOnlyCacheStorage |
|- | |- | ||
− | | | + | | 64 || [5.0.0+] OpenSaveDataInternalStorageFileSystem |
|- | |- | ||
− | | 203 || | + | | 65 || [5.0.0+] UpdateSaveDataMacForDebug |
+ | |- | ||
+ | | 66 || [5.0.0+] WriteSaveDataFileSystemExtraDataWithMask | ||
+ | |- | ||
+ | | 67 || [6.0.0+] [[#FindSaveDataWithFilter]] | ||
+ | |- | ||
+ | | 68 || [6.0.0+] [[#OpenSaveDataInfoReaderWithFilter]] | ||
+ | |- | ||
+ | | 69 || [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute | ||
+ | |- | ||
+ | | 70 || [8.0.0+] WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute | ||
+ | |- | ||
+ | | 71 || [10.0.0+] ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute | ||
+ | |- | ||
+ | | 80 || OpenSaveDataMetaFile | ||
+ | |- | ||
+ | | 81 || [4.0.0+] [[#OpenSaveDataTransferManager]] | ||
+ | |- | ||
+ | | 82 || [5.0.0+] [[#OpenSaveDataTransferManagerVersion2]] | ||
+ | |- | ||
+ | | 83 || [6.0.0+] [[#OpenSaveDataTransferProhibiter]] | ||
+ | |- | ||
+ | | 84 || [6.0.0+] [[#ListAccessibleSaveDataOwnerId]] | ||
+ | |- | ||
+ | | 85 || [9.0.0+] [[#OpenSaveDataTransferManagerForSaveDataRepair]] | ||
+ | |- | ||
+ | | 86 || [10.0.0+] [[#OpenSaveDataMover]] | ||
+ | |- | ||
+ | | 87 || [11.0.0+] [[#OpenSaveDataTransferManagerForRepair]] | ||
+ | |- | ||
+ | | 100 || OpenImageDirectoryFileSystem | ||
+ | |- | ||
+ | | 101 || [11.0.0+] OpenBaseFileSystem | ||
+ | |- | ||
+ | | 102 || [12.0.0+] FormatBaseFileSystem | ||
+ | |- | ||
+ | | 110 || [[#OpenContentStorageFileSystem]] | ||
+ | |- | ||
+ | | 120 || [6.0.0-9.2.0] [[#OpenCloudBackupWorkStorageFileSystem]] | ||
+ | |- | ||
+ | | 130 || [7.0.0+] [[#OpenCustomStorageFileSystem]] | ||
+ | |- | ||
+ | | 200 || OpenDataStorageByCurrentProcess | ||
+ | |- | ||
+ | | 201 || [3.0.0+] OpenDataStorageByProgramId | ||
+ | |- | ||
+ | | 202 || [[#OpenDataStorageByDataId]] | ||
+ | |- | ||
+ | | 203 || OpenPatchDataStorageByCurrentProcess | ||
+ | |- | ||
+ | | 204 || [7.0.0+] [[#OpenDataFileSystemWithProgramIndex]] | ||
+ | |- | ||
+ | | 205 || [7.0.0+] [[#OpenDataStorageWithProgramIndex]] | ||
+ | |- | ||
+ | | 206 || [13.0.0+] OpenDataStorageByPath | ||
+ | |- | ||
+ | | 207 || [15.0.0+] OpenDataFileSystemByDataId | ||
|- | |- | ||
| 400 || [[#OpenDeviceOperator]] | | 400 || [[#OpenDeviceOperator]] | ||
Line 103: | Line 210: | ||
| 501 || [[#OpenGameCardDetectionEventNotifier]] | | 501 || [[#OpenGameCardDetectionEventNotifier]] | ||
|- | |- | ||
− | | 600 || SetCurrentPosixTime | + | | 503 || [19.0.0+] OpenGameCardAwakenReadyEventNotifier |
+ | |- | ||
+ | | 510 || [5.0.0+] OpenSystemDataUpdateEventNotifier | ||
+ | |- | ||
+ | | 511 || [5.0.0+] NotifySystemDataUpdateEvent | ||
+ | |- | ||
+ | | 520 || [6.0.0+] [[#SimulateDeviceDetectionEvent]] | ||
+ | |- | ||
+ | | 600 || [1.0.0-3.0.2] SetCurrentPosixTime | ||
|- | |- | ||
| 601 || QuerySaveDataTotalSize | | 601 || QuerySaveDataTotalSize | ||
|- | |- | ||
− | | 602 || [[# | + | | 602 || [[#VerifySaveDataFileSystem]] |
|- | |- | ||
− | | 603 || | + | | 603 || CorruptSaveDataFileSystem |
|- | |- | ||
| 604 || CreatePaddingFile | | 604 || CreatePaddingFile | ||
Line 115: | Line 230: | ||
| 605 || DeleteAllPaddingFiles | | 605 || DeleteAllPaddingFiles | ||
|- | |- | ||
− | | 606 || GetRightsId | + | | 606 || [2.0.0+] GetRightsId |
+ | |- | ||
+ | | 607 || [2.0.0+] RegisterExternalKey | ||
+ | |- | ||
+ | | 608 || [2.0.0+] UnregisterAllExternalKey | ||
|- | |- | ||
− | | | + | | 609 || [2.0.0-15.0.1] GetRightsIdByPath |
|- | |- | ||
− | | | + | | 610 || [3.0.0+] GetRightsIdAndKeyGenerationByPath |
|- | |- | ||
− | | | + | | 611 || [4.0.0+] SetCurrentPosixTimeWithTimeDifference |
|- | |- | ||
− | | | + | | 612 || [4.0.0+] GetFreeSpaceSizeForSaveData |
|- | |- | ||
− | | | + | | 613 || [4.0.0+] VerifySaveDataFileSystemBySaveDataSpaceId |
|- | |- | ||
− | | | + | | 614 || [4.0.0+] CorruptSaveDataFileSystemBySaveDataSpaceId |
|- | |- | ||
− | | | + | | 615 || [5.0.0+] QuerySaveDataInternalStorageTotalSize |
|- | |- | ||
− | | 1002 || SetSaveDataRootPath | + | | 616 || [6.0.0+] [[#GetSaveDataCommitId]] |
+ | |- | ||
+ | | 617 || [7.0.0+] UnregisterExternalKey | ||
+ | |- | ||
+ | | 618 || [17.0.0+] GetProgramId | ||
+ | |- | ||
+ | | 620 || [2.0.0+] [[#SetSdCardEncryptionSeed]] | ||
+ | |- | ||
+ | | 630 || [4.0.0+] SetSdCardAccessibility | ||
+ | |- | ||
+ | | 631 || [4.0.0+] IsSdCardAccessible | ||
+ | |- | ||
+ | | 632 || [19.0.0+] TestExternalKey | ||
+ | |- | ||
+ | | 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid | ||
+ | |- | ||
+ | | 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]] | ||
+ | |- | ||
+ | | 701 || [5.0.0+] GetAccessFailureDetectionEvent | ||
+ | |- | ||
+ | | 702 || [5.0.0+] IsAccessFailureDetected | ||
+ | |- | ||
+ | | 710 || [5.0.0+] ResolveAccessFailure | ||
+ | |- | ||
+ | | 720 || [5.0.0+] AbandonAccessFailure | ||
+ | |- | ||
+ | | 800 || [2.0.0+] GetAndClearErrorInfo | ||
+ | |- | ||
+ | | 810 || [7.0.0+] RegisterProgramIndexMapInfo | ||
+ | |- | ||
+ | | 820 || [19.0.0+] GetContentStorageInfoIndex | ||
+ | |- | ||
+ | | 1000 || [1.0.0-9.2.0] SetBisRootForHost | ||
+ | |- | ||
+ | | 1001 || [[#SetSaveDataSize]] | ||
+ | |- | ||
+ | | 1002 || [[#SetSaveDataRootPath]] | ||
|- | |- | ||
| 1003 || DisableAutoSaveDataCreation | | 1003 || DisableAutoSaveDataCreation | ||
Line 140: | Line 295: | ||
|- | |- | ||
| 1006 || [[#OutputAccessLogToSdCard]] | | 1006 || [[#OutputAccessLogToSdCard]] | ||
+ | |- | ||
+ | | 1007 || [4.0.0+] RegisterUpdatePartition | ||
+ | |- | ||
+ | | 1008 || [4.0.0+] OpenRegisteredUpdatePartition | ||
+ | |- | ||
+ | | 1009 || [4.0.0+] GetAndClearMemoryReportInfo | ||
+ | |- | ||
+ | | 1010 || [5.1.0-6.2.0] SetDataStorageRedirectTarget | ||
+ | |- | ||
+ | | 1011 || [7.0.0+] [[#GetProgramIndexForAccessLog]] | ||
+ | |- | ||
+ | | 1012 || [9.0.0+] GetFsStackUsage | ||
+ | |- | ||
+ | | 1013 || [9.0.0+] UnsetSaveDataRootPath | ||
+ | |- | ||
+ | | 1014 || [10.0.0-10.2.0] OutputMultiProgramTagAccessLog | ||
+ | |- | ||
+ | | 1016 || [11.0.0+] FlushAccessLogOnSdCard | ||
+ | |- | ||
+ | | 1017 || [11.0.0+] OutputApplicationInfoAccessLog | ||
+ | |- | ||
+ | | 1018 || [13.0.0+] SetDebugOption | ||
+ | |- | ||
+ | | 1019 || [13.0.0+] UnsetDebugOption | ||
+ | |- | ||
+ | | 1020 || [18.0.0+] OpenMemoryStressor | ||
+ | |- | ||
+ | | 1100 || [4.0.0-17.0.1] OverrideSaveDataTransferTokenSignVerificationKey | ||
+ | |- | ||
+ | | 1101 || [18.0.0+] OverrideSaveDataTransferKeyForTest | ||
+ | |- | ||
+ | | 1110 || [6.0.0+] CorruptSaveDataFileSystemByOffset | ||
+ | |- | ||
+ | | 1200 || [6.0.0+] [[#OpenMultiCommitManager]] | ||
+ | |- | ||
+ | | 1300 || [10.0.0+] [[#OpenBisWiper]] | ||
+ | |- | ||
+ | | 1400 || [15.0.0+] NotifyErrorContextServiceReady | ||
|} | |} | ||
− | == | + | == Permissions == |
− | + | Every time permissions are checked, the process registration [[#fsp-pr]] is loaded using the session processID. The permission data is populated with data from the [[NPDM]]. | |
+ | |||
+ | If the processID is <= 6 (which happens only for built-in sysmodules), it will use a hardcoded registration data. The default mask in this case is 0x8000000000000000. | ||
+ | |||
+ | Note that the functions check whether or not at least one bit is set in the mask. This means that, you don't need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000. | ||
+ | |||
+ | If the code were to request an invalid input type, panic. But this never happens. | ||
+ | |||
+ | The output values for [[#ReadWrite]] CanMountRegisteredUpdatePartition and [[#Call]] CanRegisterUpdatePartition are masked with the cached value of [[SMC#IsDebugMode|DebugMode]]. | ||
− | == | + | === ReadWrite === |
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! AccessibilityType || Name || Mask || Permission || Used by |
+ | |- | ||
+ | | 0x0 || CanMountLogo || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]] | ||
+ | |- | ||
+ | | 0x1 || CanMountContentMeta || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]] | ||
+ | |- | ||
+ | | 0x2 || CanMountContentControl || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]] | ||
+ | |- | ||
+ | | 0x3 || CanMountContentManual || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]] | ||
+ | |- | ||
+ | | 0x4 || CanMountContentData || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]] | ||
+ | |- | ||
+ | | 0x5 || CanMountApplicationPackage || 0x8000000000000801 || R- || [[#OpenFileSystem]], [[#OpenFileSystemWithPatch]], [[#OpenFileSystemWithId]] | ||
+ | |- | ||
+ | | 0x6 || CanMountSaveDataStorage || 0x8000000000000000 || RW || | ||
+ | |- | ||
+ | | 0x7 || CanMountContentStorage || 0x8000000000000800 || RW || [[#OpenContentStorageFileSystem]] | ||
+ | |- | ||
+ | | 0x8 || CanMountImageAndVideoStorage ||0x8000000000001000 || RW || [[#OpenImageDirectoryFileSystem]] | ||
+ | |- | ||
+ | | 0x9 || CanMountCustomStorage0 || 0x8000000000000000 || RW || OpenCustomStorageFileSystem | ||
+ | |- | ||
+ | | 0xA || CanMountBisCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisFileSystem]] | ||
+ | |- | ||
+ | | 0xB || CanMountBisSafeMode || 0x8000000000000080 || RW || [[#OpenBisFileSystem]] | ||
+ | |- | ||
+ | | 0xC || CanMountBisUser || 0x8000000000008080 || RW || [[#OpenBisFileSystem]] | ||
+ | |- | ||
+ | | 0xD || CanMountBisSystem || 0x8000000000008080 || RW || [[#OpenBisFileSystem]] | ||
+ | |- | ||
+ | | 0xE || CanMountBisSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisFileSystem]] | ||
+ | |- | ||
+ | | 0xF || CanMountBisSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisFileSystem]] | ||
+ | |- | ||
+ | | 0x10 || CanMountSdCard || 0xC000000000200000 || RW || [[#OpenSdCardFileSystem]] | ||
+ | |- | ||
+ | | 0x11 || CanMountGameCard || 0x8000000000000010 || R- || [[#OpenGameCardFileSystem]] | ||
+ | |- | ||
+ | | 0x12 || CanMountDeviceSaveData || 0x8000000000040020 || RW || [[#OpenSaveDataFileSystem]] | ||
+ | |- | ||
+ | | 0x13 || CanMountSystemSaveData || 0x8000000000000028 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]] | ||
+ | |- | ||
+ | | 0x14 || CanMountOthersSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystem]] | ||
+ | |- | ||
+ | | 0x15 || CanMountOthersSystemSaveData || 0x8000000000000020 || RW || [[#OpenSaveDataFileSystemBySystemSaveDataId]] | ||
+ | |- | ||
+ | | 0x16 || CanOpenBisPartitionBootPartition1Root || 0x8000000000010082 || RW || [[#OpenBisStorage]] | ||
+ | |- | ||
+ | | 0x17 || CanOpenBisPartitionBootPartition2Root || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
+ | |- | ||
+ | | 0x18 || CanOpenBisPartitionUserDataRoot || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
+ | |- | ||
+ | | 0x19 || CanOpenBisPartitionBootConfigAndPackage2Part1 || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
+ | |- | ||
+ | | 0x1A || CanOpenBisPartitionBootConfigAndPackage2Part2 || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
+ | |- | ||
+ | | 0x1B || CanOpenBisPartitionBootConfigAndPackage2Part3 || 0x8000000000010080 || RW || [[#OpenBisStorage]] | ||
|- | |- | ||
− | | | + | | 0x1C || CanOpenBisPartitionBootConfigAndPackage2Part4 || 0x8000000000010080 || RW || [[#OpenBisStorage]] |
|- | |- | ||
− | | | + | | 0x1D || CanOpenBisPartitionBootConfigAndPackage2Part5 || 0x8000000000010080 || RW || [[#OpenBisStorage]] |
|- | |- | ||
− | | | + | | 0x1E || CanOpenBisPartitionBootConfigAndPackage2Part6 || 0x8000000000010080 || RW || [[#OpenBisStorage]] |
− | | | ||
− | | | ||
− | | | ||
− | | | ||
|- | |- | ||
− | | | + | | 0x1F || CanOpenBisPartitionCalibrationBinary || 0x8000000000000084 || RW || [[#OpenBisStorage]] |
|- | |- | ||
− | | | + | | 0x20 || CanOpenBisPartitionCalibrationFile || 0x8000000000000084 || RW || [[#OpenBisStorage]] |
|- | |- | ||
− | | | + | | 0x21 || CanOpenBisPartitionSafeMode || 0x8000000000000080 || RW || [[#OpenBisStorage]] |
|- | |- | ||
− | | 4 || | + | | 0x22 || CanOpenBisPartitionUser || 0x8000000000000080 || RW || [[#OpenBisStorage]] |
+ | |- | ||
+ | | 0x23 || CanOpenBisPartitionSystem || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
+ | |- | ||
+ | | 0x24 || CanOpenBisPartitionSystemProperEncryption || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
+ | |- | ||
+ | | 0x25 || CanOpenBisPartitionSystemProperPartition || 0x8000000000000080 || RW || [[#OpenBisStorage]] | ||
+ | |- | ||
+ | | 0x26 || CanOpenBisPartitionDeviceTreeBlob || 0x8000002000000080 || RW || [[#OpenBisStorage]] | ||
+ | |- | ||
+ | | [3.0.0+] 0x27 || CanOpenSdCardStorage || 0xC000000000200000 || RW || | ||
+ | |- | ||
+ | | [3.0.0+] 0x28 || CanOpenGameCardStorage || 0x8000000000000100 || RW || [[#OpenGameCardStorage]], [[#EraseGameCard]] (bit1), [[#WriteToGameCard]] (bit1), [[#GetGameCardErrorInfo]] (bit1), [[#EraseAndWriteParamDirectly]] (bit1), [[#ReadParamDirectly]] (bit1), [[#ForceEraseGameCard]] (bit1) | ||
+ | |- | ||
+ | | [4.0.0+] 0x29 || CanMountSystemDataPrivate || 0x8000000000100008 || R- || [[#OpenFileSystem]], [[#OpenDataStorageByDataId]] | ||
+ | |- | ||
+ | | [5.0.0+] 0x2A || CanMountHost || 0xC000000000400000 || RW || [[#OpenHostFileSystem]] | ||
+ | |- | ||
+ | | [6.0.0+] 0x2B || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]] | ||
+ | |- | ||
+ | | [7.0.0+] 0x2C || CanOpenSaveDataInternalStorage || 0x8000000000000000 || RW || [[#OpenSaveDataInternalStorageFileSystem]] | ||
+ | |- | ||
+ | | [7.0.0+] 0x2D || CanMountTemporaryDirectory || 0xC000000000000000 || RW || | ||
+ | |- | ||
+ | | [11.0.0+] 0x2E || CanMountAllBaseFilesystem || 0x8000000000000000 || RW || OpenBaseFileSystem | ||
+ | |- | ||
+ | | [15.0.0+] 0x2F || CanNotMount || 0x0000000000000000 || -- || OpenCustomStorageFileSystem | ||
|} | |} | ||
− | == | + | === Call === |
− | Takes an input | + | {| class="wikitable" border="1" |
+ | |- | ||
+ | ! OperationType || Name || Mask || Used by | ||
+ | |- | ||
+ | | 0x0 || CanInvalidateBisCache || 0x8000000000000080 || [[#InvalidateBisCache]] | ||
+ | |- | ||
+ | | 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc | ||
+ | |- | ||
+ | | 0x2 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate | ||
+ | |- | ||
+ | | 0x3 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet | ||
+ | |- | ||
+ | | 0x4 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver | ||
+ | |- | ||
+ | | 0x5 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo | ||
+ | |- | ||
+ | | 0x6 || CanGetGameCardAsicCertificate || 0x8000000000000200 || GetGameCardAsicCertificate | ||
+ | |- | ||
+ | | 0x7 || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]] | ||
+ | |- | ||
+ | | 0x8 || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion | ||
+ | |- | ||
+ | | 0x9 || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId | ||
+ | |- | ||
+ | | 0xA || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId | ||
+ | |- | ||
+ | | 0xB || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion | ||
+ | |- | ||
+ | | 0xC || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | ||
+ | |- | ||
+ | | 0xD || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | ||
+ | |- | ||
+ | | 0xE || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]] | ||
+ | |- | ||
+ | | 0xF || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile | ||
+ | |- | ||
+ | | 0x10 || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference | ||
+ | |- | ||
+ | | 0x11 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]] | ||
+ | |- | ||
+ | | 0x12 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]] | ||
+ | |- | ||
+ | | 0x13 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode | ||
+ | |- | ||
+ | | 0x14 || CanDebug || 0xC000000000000000 || | ||
+ | |- | ||
+ | | 0x15 || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles | ||
+ | |- | ||
+ | | [2.0.0+] 0x16 || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId | ||
+ | |- | ||
+ | | [2.0.0+] 0x17 || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId | ||
+ | |- | ||
+ | | [2.0.0+] 0x18 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId | ||
+ | |- | ||
+ | | [2.0.0+] 0x19 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]] | ||
+ | |- | ||
+ | | [2.0.0+] 0x1A || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem | ||
+ | |- | ||
+ | | [3.0.0+] 0x1B || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath | ||
+ | |- | ||
+ | | [3.0.0+] 0x1C || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey | ||
+ | |- | ||
+ | | [4.0.0+] 0x1D || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]] | ||
+ | |- | ||
+ | | [4.0.0+] 0x1E || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
+ | |- | ||
+ | | [4.0.0+] 0x1F || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
+ | |- | ||
+ | | [4.0.0+] 0x20 || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
+ | |- | ||
+ | | [5.0.0+] 0x21 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
+ | |- | ||
+ | | [5.0.0+] 0x22 || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem | ||
+ | |- | ||
+ | | [5.0.0+] 0x23 || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem | ||
+ | |- | ||
+ | | [5.0.0+] 0x24 || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem | ||
+ | |- | ||
+ | | [5.0.0+] 0x25 || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition | ||
+ | |- | ||
+ | | [5.0.0+] 0x26 || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]] | ||
+ | |- | ||
+ | | [5.0.0+] 0x27 || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]] | ||
+ | |- | ||
+ | | [5.0.0+] 0x28 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair | ||
+ | |- | ||
+ | | [5.0.0+] 0x29 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair | ||
+ | |- | ||
+ | | [5.0.0+] 0x2A || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]] | ||
+ | |- | ||
+ | | [5.0.0+] 0x2B || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]] | ||
+ | |- | ||
+ | | [5.0.0+] 0x2C || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]] | ||
+ | |- | ||
+ | | [5.0.0+] 0x2D || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]] | ||
+ | |- | ||
+ | | [5.0.0+] 0x2E || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol | ||
+ | |- | ||
+ | | [5.0.0+] 0x2F || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey | ||
+ | |- | ||
+ | | [5.1.0+] 0x30 || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]] | ||
+ | |- | ||
+ | | [6.0.0+] 0x31 || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]] | ||
+ | |- | ||
+ | | [6.0.0+] 0x32 || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier | ||
+ | |- | ||
+ | | [6.0.0+] 0x33 || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent | ||
+ | |- | ||
+ | | [6.0.0+] 0x34 || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]] | ||
+ | |- | ||
+ | | [6.0.0+] 0x35 || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent | ||
+ | |- | ||
+ | | [6.0.0+] 0x36 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected | ||
+ | |- | ||
+ | | [6.0.0+] 0x37 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure | ||
+ | |- | ||
+ | | [6.0.0+] 0x38 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure | ||
+ | |- | ||
+ | | [8.0.0+] 0x39 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize | ||
+ | |- | ||
+ | | [9.0.0+] 0x3A || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]] | ||
+ | |- | ||
+ | | [9.0.0+] 0x3B || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility | ||
+ | |- | ||
+ | | [9.0.0+] 0x3C || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent | ||
+ | |- | ||
+ | | [9.0.0+] 0x3D || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]] | ||
+ | |- | ||
+ | | [9.0.0+] 0x3E || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo | ||
+ | |- | ||
+ | | [9.0.0+] 0x3F || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence | ||
+ | |- | ||
+ | | [9.0.0+] 0x40 || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt | ||
+ | |- | ||
+ | | [9.0.0+] 0x41 || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]] | ||
+ | |- | ||
+ | | [10.0.0+] 0x42 || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]] | ||
+ | |- | ||
+ | | [10.0.0+] 0x43 || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem | ||
+ | |- | ||
+ | | [10.2.0+] 0x44 || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]] | ||
+ | |- | ||
+ | | [11.0.0+] 0x45 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]] | ||
+ | |- | ||
+ | | [13.0.0+] 0x46 || CanOpenSaveDataTransferManagerForRepair || 0x8000000000000020 || [[#OpenSaveDataTransferManagerForRepair]] | ||
+ | |- | ||
+ | | [13.0.0+] 0x47 || CanSetDebugConfiguration || 0x8000000000000000 || SetDebugOption, UnsetDebugOption | ||
+ | |- | ||
+ | | [15.0.0+] 0x48 || CanOpenDataStorageByPath || 0x8000000000000000 || OpenDataStorageByPath | ||
+ | |- | ||
+ | | [17.0.0+] 0x49 || CanNotifyErrorContextServiceReady || 0x8000004000000000 || NotifyErrorContextServiceReady | ||
+ | |- | ||
+ | | [17.0.0+] 0x4A || CanGetProgramId || 0x8000000008000000 || GetProgramId | ||
+ | |} | ||
+ | |||
+ | == 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. | ||
− | Returns an [[#IFileSystem]]. | + | == OpenFileSystemWithPatch == |
+ | Takes an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | ||
− | + | Web-applet loads the [[#FileSystemProxyType]] (which must be '''Manual''') from u32_table[inparam]. | |
− | + | Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names. | |
− | |||
− | + | == OpenFileSystemWithIdObsolete == | |
+ | Takes a type-0x19 input buffer containing a [[#FspPath]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | ||
− | The | + | 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. | 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'''. |
− | |||
− | Returns an [[#IFileSystem]]. | + | 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 [[# | + | 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. | 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. | Takes an input u64. | ||
− | == | + | == CreateSaveDataFileSystem == |
− | Takes a 0x40-byte | + | Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct which governs creation of a saveMeta file. |
− | Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060, +4 u8 = 1. | + | Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060 meta file size, +4 u8 = 1 meta index which dictates meta file name. |
− | Creates | + | Creates non-system savedata. |
− | == | + | == CreateSaveDataFileSystemBySystemSaveDataId == |
− | Takes a 0x40-byte | + | Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]]. |
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | ||
− | == | + | == OpenGameCardStorage == |
+ | Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]]. | ||
− | Takes | + | == OpenGameCardFileSystem == |
+ | Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]]. | ||
− | + | Mounts a [[Gamecard_Partition|gamecard partition]]. | |
− | |||
− | |||
− | |||
− | + | == CreateSaveDataFileSystemWithHashSalt == | |
+ | Takes a total of 0xB0-bytes of input, no output. | ||
− | == | + | == OpenSaveDataFileSystem == |
− | Takes an input u8 and a 0x40-byte | + | Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8. |
Returns an [[#IFileSystem]]. | Returns an [[#IFileSystem]]. | ||
Line 230: | Line 683: | ||
Permissions aren't checked until the specified save is successfully found. | Permissions aren't checked until the specified save is successfully found. | ||
− | Only one process can mount a given savedata at any given time (this includes | + | 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 and a 0x40-byte | + | Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8. |
Returns an [[#IFileSystem]]. | Returns an [[#IFileSystem]]. | ||
Line 239: | Line 692: | ||
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | ||
− | == | + | == OpenReadOnlySaveDataFileSystem == |
+ | Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]], and returns an [[#IFileSystem]]. | ||
+ | |||
+ | Mounts SaveData as ReadOnly. | ||
+ | |||
+ | == ReadSaveDataFileSystemExtraDataBySaveDataSpaceId == | ||
+ | Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]]. | ||
+ | |||
+ | == ReadSaveDataFileSystemExtraData == | ||
+ | Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]]. | ||
+ | |||
+ | == OpenSaveDataInfoReader == | ||
+ | No input, returns an output [[#ISaveDataInfoReader]]. | ||
+ | |||
+ | == OpenSaveDataInfoReaderBySaveDataSpaceId == | ||
+ | Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]]. | ||
+ | |||
+ | == FindSaveDataWithFilter == | ||
+ | Takes a total of 0x50-bytes of input, returns 8-bytes of output and a type-0x6 output buffer. | ||
+ | |||
+ | == OpenSaveDataInfoReaderWithFilter == | ||
+ | Takes a total of 0x50-bytes of input, returns an [[#ISaveDataInfoReader]]. | ||
+ | |||
+ | == OpenSaveDataTransferManager == | ||
+ | No input, returns an [[#ISaveDataTransferManager]]. | ||
+ | |||
+ | == OpenSaveDataTransferManagerVersion2 == | ||
+ | No input, returns an [[#ISaveDataTransferManagerWithDivision]]. | ||
+ | |||
+ | == OpenSaveDataTransferProhibiter == | ||
+ | Takes an input u64, returns an [[#ISaveDataTransferProhibiter]]. | ||
+ | |||
+ | == ListAccessibleSaveDataOwnerId == | ||
+ | Takes a total of 0x10-bytes of input, returns 4-bytes of output and a type-0x6 output buffer. | ||
+ | |||
+ | == OpenSaveDataTransferManagerForSaveDataRepair == | ||
+ | No input, returns an output [[#ISaveDataTransferManagerForSaveDataRepair]]. | ||
+ | |||
+ | == OpenSaveDataMover == | ||
+ | Takes 2 input [[#SaveDataSpaceId]], an input u64 size and a TransferMemory handle. Returns an output [[#ISaveDataMover]]. | ||
+ | |||
+ | == OpenSaveDataTransferManagerForRepair == | ||
+ | No input, returns an output [[#ISaveDataTransferManagerForRepair]]. | ||
+ | |||
+ | == OpenContentStorageFileSystem == | ||
Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202. | Takes a [[#ContentStorageId]]. Invalid values return 0x2EE202. | ||
− | Returns an [[#IFileSystem]] with NCA files. The read data from these files is identical to the data read by [[ | + | 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. | ||
+ | |||
+ | == OpenDataFileSystemWithProgramIndex == | ||
+ | Takes an input u8, returns an [[#IFileSystem]]. | ||
+ | |||
+ | == OpenDataStorageWithProgramIndex == | ||
+ | Takes an input u8, returns an [[#IStorage]]. | ||
== OpenDeviceOperator == | == OpenDeviceOperator == | ||
Line 253: | Line 769: | ||
This command returns a session to a port implementing the [[#IEventNotifier]] interface. | This command returns a session to a port implementing the [[#IEventNotifier]] interface. | ||
− | == | + | == SimulateDeviceDetectionEvent == |
+ | Takes a total of 0xC-bytes of input, no output. | ||
+ | |||
+ | == VerifySaveDataFileSystem == | ||
Takes an unknown input u64 and a type-0x6 output buffer. | Takes an unknown input u64 and a type-0x6 output buffer. | ||
The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02). | The input u64 high-byte must be non-zero, otherwise an [[Error_codes|error]] is returned(0xE02). | ||
+ | |||
+ | == GetSaveDataCommitId == | ||
+ | Takes an input u8 and u64, returns an output u64. | ||
+ | |||
+ | == SetSdCardEncryptionSeed == | ||
+ | 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 == | == SetGlobalAccessLogMode == | ||
Line 273: | Line 820: | ||
User-processes only use this when the value previously loaded from [[#GetGlobalAccessLogMode]] has bit1 set. | 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 = | = IStorage = | ||
+ | This is "nn::fssrv::sf::IStorage". | ||
+ | |||
This is the interface for a raw device, usually a block device. | This is the interface for a raw device, usually a block device. | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! Cmd || Name || | + | ! 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 = | = IFileSystem = | ||
+ | This is "nn::fssrv::sf::IFileSystem". | ||
+ | |||
There are two main implementations of this interface: | There are two main implementations of this interface: | ||
− | * ''' | + | * '''nn::fs::fsa::IFileSystem''': The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface. |
− | * ''' | + | * '''nn::fssrv::sf::IFileSystem''': Used for sending an IFileSystem over IPC. Not used outside of IPC code. |
+ | |||
+ | There are two adapter classes to convert between these interfaces: | ||
+ | |||
+ | * '''nn::fssrv::detail::FileSystemInterfaceAdapter''': Allows access to an nn::fs::fsa::IFileSystem via the nn::fssrv::sf::IFileSystem interface. | ||
+ | * '''nn::fs::detail::FileSystemServiceObjectAdapter''': Allows access to an nn::fssrv::sf::IFileSystem via the nn::fs::fsa::IFileSystem interface. | ||
+ | |||
+ | When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC. | ||
+ | Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it. | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 317: | Line 904: | ||
| 6 || RenameDirectory | | 6 || RenameDirectory | ||
|- | |- | ||
− | | 7 || GetEntryType | + | | 7 || [[#GetEntryType]] |
+ | |- | ||
+ | | 8 || [[#OpenFile]] | ||
+ | |- | ||
+ | | 9 || [[#OpenDirectory]] | ||
+ | |- | ||
+ | | 10 || [[#Commit]] | ||
+ | |- | ||
+ | | 11 || [[#GetFreeSpaceSize]] | ||
|- | |- | ||
− | | | + | | 12 || [[#GetTotalSpaceSize]] |
|- | |- | ||
− | | | + | | 13 || [3.0.0+] [[#CleanDirectoryRecursively]] |
|- | |- | ||
− | | | + | | 14 || [3.0.0+] [[#GetFileTimeStampRaw]] |
|- | |- | ||
− | | | + | | 15 || [4.0.0+] QueryEntry |
|- | |- | ||
− | | | + | | 16 || [15.0.0+] GetFileSystemAttribute |
|} | |} | ||
+ | |||
+ | == GetEntryType == | ||
+ | Takes a type-0x9 input buffer for the path and returns [[#DirectoryEntryType]] as an output u32. | ||
+ | |||
+ | == OpenFile == | ||
+ | Takes a type-0x19 input buffer for the path, and an u32 '''mode'''. '''mode''' controls how the file is opened, based on which bits are set: | ||
+ | |||
+ | * When bit 0 is set, the file is Readable: you can use the Read operation. | ||
+ | * When bit 1 is set, the file is Writable: you can use the Write operation. | ||
+ | * When bit 2 is set, the file is Appendable: unless this bit is set, you will not be able to write beyond the end of a file (such writes will result in an error 0x307202) | ||
+ | |||
+ | == OpenDirectory == | ||
+ | Takes a type-0x9 input buffer for the path and an u64 '''filter_flags'''. '''filter_flags''' controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files. | ||
== Commit == | == Commit == | ||
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect. | Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect. | ||
+ | |||
+ | == GetFreeSpaceSize == | ||
+ | Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS. | ||
+ | |||
+ | == GetTotalSpaceSize == | ||
+ | Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used). | ||
+ | |||
+ | == CleanDirectoryRecursively == | ||
+ | Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path. | ||
+ | |||
+ | == GetFileTimeStampRaw == | ||
+ | Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8. | ||
= IDirectory = | = IDirectory = | ||
+ | This is "nn::fssrv::sf::IDirectory". | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | 0 || Read | + | | 0 || [[#Read]] |
+ | |- | ||
+ | | 1 || [[#GetEntryCount]] | ||
+ | |} | ||
+ | |||
+ | == Read == | ||
+ | Takes a type-0x6 output buffer. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available. | ||
+ | |||
+ | The output buffer contains the read array of [[#DirectoryEntry]]. This doesn't include entries for "." and "..". | ||
+ | |||
+ | == GetEntryCount == | ||
+ | Returns an u64 for the total number of readable entries. | ||
+ | |||
+ | = DirectoryEntry = | ||
+ | This is "nn::fs::DirectoryEntry". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset || Size || Description | ||
+ | |- | ||
+ | | 0x0 || 0x301 || Path | ||
+ | |- | ||
+ | | 0x301 || 0x1 || File attributes (bit 0 = is directory; bit 1 = archive bit) | ||
+ | |- | ||
+ | | 0x302 || 0x2 || Padding? | ||
+ | |- | ||
+ | | 0x304 || 0x1 || [[#DirectoryEntryType]] | ||
+ | |- | ||
+ | | 0x305 || 0x3 || Padding? | ||
+ | |- | ||
+ | | 0x308 || 0x8 || Filesize, 0 for directories. | ||
+ | |} | ||
+ | |||
+ | = DirectoryEntryType = | ||
+ | This is "nn::fs::DirectoryEntryType". | ||
+ | |||
+ | An s8 value indicating a directory entry type. The current values are: | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Description | ||
+ | |- | ||
+ | | 0 || Directory | ||
|- | |- | ||
− | | 1 || | + | | 1 || File |
|} | |} | ||
= IFile = | = IFile = | ||
+ | This is "nn::fssrv::sf::IFile". | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 357: | Line 1,023: | ||
|- | |- | ||
| 4 || GetSize | | 4 || GetSize | ||
+ | |- | ||
+ | | 5 || [4.0.0+] OperateRange | ||
+ | |- | ||
+ | | 6 || [12.0.0+] OperateRangeWithBuffer | ||
|} | |} | ||
= ISaveDataInfoReader = | = ISaveDataInfoReader = | ||
+ | This is "nn::fssrv::sf::ISaveDataInfoReader". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#ReadSaveDataInfo]] | ||
+ | |} | ||
+ | |||
+ | == ReadSaveDataInfo == | ||
+ | Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]]. | ||
+ | |||
+ | This is used to get [[#SaveDataInfo]] for all savedata on the system (or all savedata for the current [[#SaveDataSpaceId]]). When used multiple times, it will resume reading where it left off, until no more entries are available (in that case the out u64 is value 0). | ||
= IDeviceOperator = | = IDeviceOperator = | ||
+ | This is "nn::fssrv::sf::IDeviceOperator". | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | 0 || IsSdCardInserted | + | | 0 || [[#IsSdCardInserted]] |
+ | |- | ||
+ | | 1 || [[#GetSdCardSpeedMode]] | ||
|- | |- | ||
− | | | + | | 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]] |
|- | |- | ||
− | | | + | | 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]] |
|- | |- | ||
− | | 202 || GetGameCardHandle | + | | 200 || [[#IsGameCardInserted]] |
+ | |- | ||
+ | | 201 || [[#EraseGameCard]] | ||
+ | |- | ||
+ | | 202 || [[#GetGameCardHandle]] | ||
|- | |- | ||
| 203 || [[#GetGameCardUpdatePartitionInfo]] | | 203 || [[#GetGameCardUpdatePartitionInfo]] | ||
|- | |- | ||
− | | 204 || FinalizeGameCardDriver | + | | 204 || [[#FinalizeGameCardDriver]] |
|- | |- | ||
− | | 205 || GetGameCardAttribute | + | | 205 || [[#GetGameCardAttribute]] |
|- | |- | ||
− | | 206 || GetGameCardDeviceCertificate | + | | 206 || [[#GetGameCardDeviceCertificate]] |
|- | |- | ||
− | | 207 || GetGameCardAsicInfo | + | | 207 || [[#GetGameCardAsicInfo]] |
|- | |- | ||
− | | 208 || GetGameCardIdSet | + | | 208 || [[#GetGameCardIdSet]] |
|- | |- | ||
− | | 209 || | + | | 209 || [[#WriteToGameCardDirectly]] |
|- | |- | ||
− | | 210 || SetVerifyWriteEnalbleFlag | + | | 210 || [[#SetVerifyWriteEnalbleFlag]] |
|- | |- | ||
− | | 211 || GetGameCardImageHash | + | | 211 || [[#GetGameCardImageHash]] |
|- | |- | ||
− | | 212 || | + | | 212 || [2.0.0+] [[#GetGameCardDeviceIdForProdCard]] |
|- | |- | ||
− | | 213 || | + | | 213 || [2.0.0+] [[#EraseAndWriteParamDirectly]] |
|- | |- | ||
− | | 214 || | + | | 214 || [2.0.0+] [[#ReadParamDirectly]] |
|- | |- | ||
− | | 215 || | + | | 215 || [2.0.0+] [[#ForceEraseGameCard]] |
|- | |- | ||
− | | 216 || | + | | 216 || [2.0.0+] [[#GetGameCardErrorInfo]] |
|- | |- | ||
− | | 217 || [2.1.0+] | + | | 217 || [2.1.0+] [[#GetGameCardErrorReportInfo]] |
|- | |- | ||
− | | | + | | 218 || [3.0.0+] [[#GetGameCardDeviceId]] |
|- | |- | ||
− | | 301 || GetSpeedEmulationMode | + | | 219 || [8.0.0+] [[#ChallengeCardExistence]] |
+ | |- | ||
+ | | 220 || [9.0.0+] [[#GetGameCardCompatibilityType]] | ||
+ | |- | ||
+ | | 221 || [17.0.0+] [[#GetGameCardAsicCertificate]] | ||
+ | |- | ||
+ | | 222 || [18.0.0+] [[#GetGameCardCardHeader]] | ||
+ | |- | ||
+ | | 223 || [19.0.0+] [[#SetGameCardSessionCreationDelay]] | ||
+ | |- | ||
+ | | 224 || [19.0.0+] [[#GetGameCardApplicationIdList]] | ||
+ | |- | ||
+ | | 300 || [[#SetSpeedEmulationMode]] | ||
+ | |- | ||
+ | | 301 || [[#GetSpeedEmulationMode]] | ||
+ | |- | ||
+ | | 302 || [18.0.0+] [[#SetApplicationStorageSpeed]] | ||
+ | |- | ||
+ | | 400 || [5.0.0+] [[#SuspendSdmmcControl]] | ||
+ | |- | ||
+ | | 401 || [5.0.0+] [[#ResumeSdmmcControl]] | ||
+ | |- | ||
+ | | 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]] | ||
+ | |- | ||
+ | | 500 || [6.0.0+] [[#SetDeviceSimulationEvent]] | ||
+ | |- | ||
+ | | 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]] | ||
|} | |} | ||
+ | |||
+ | == IsSdCardInserted == | ||
+ | No input. Returns an output bool. | ||
+ | |||
+ | == GetSdCardSpeedMode == | ||
+ | No input. Returns an output [[#SdCardSpeedMode]]. | ||
+ | |||
+ | == GetSdCardCid == | ||
+ | Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | ||
+ | |||
+ | == GetSdCardUserAreaSize == | ||
+ | No input. Returns an output s64 '''SdCardUserAreaSize'''. | ||
+ | |||
+ | == GetSdCardProtectedAreaSize == | ||
+ | No input. Returns an output s64 '''SdCardProtectedAreaSize'''. | ||
+ | |||
+ | == GetAndClearSdCardErrorInfo == | ||
+ | Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''. | ||
+ | |||
+ | == GetSdCardHostControllerStatus == | ||
+ | No input. Returns an output [[#HostControllerStatus]]. | ||
+ | |||
+ | == GetMmcCid == | ||
+ | Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | ||
+ | |||
+ | == GetMmcSpeedMode == | ||
+ | No input. Returns an output [[#MmcSpeedMode]]. | ||
+ | |||
+ | == EraseMmc == | ||
+ | Takes an input [[#MmcPartition]]. No output. | ||
+ | |||
+ | == GetMmcPartitionSize == | ||
+ | Takes an input [[#MmcPartition]]. Returns an output s64 '''MmcPartitionSize'''. | ||
+ | |||
+ | == GetMmcPatrolCount == | ||
+ | No input. Returns an output u32 '''MmcPatrolCount'''. | ||
+ | |||
+ | == GetAndClearMmcErrorInfo == | ||
+ | Takes a type-0x6 output buffer '''LogBuffer''' and an input s64 '''LogBufferSize'''. Returns an output [[#StorageErrorInfo]] and an output s64 '''LogSize'''. | ||
+ | |||
+ | == GetMmcExtendedCsd == | ||
+ | Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | ||
+ | |||
+ | == SuspendMmcPatrol == | ||
+ | No input/output. | ||
+ | |||
+ | == ResumeMmcPatrol == | ||
+ | No input/output. | ||
+ | |||
+ | == EraseMmcWithRange == | ||
+ | Takes an input [[#MmcPartition]] and two input u64s. No output. | ||
+ | |||
+ | == IsGameCardInserted == | ||
+ | No input. Returns an output bool. | ||
+ | |||
+ | == EraseGameCard == | ||
+ | Takes an input [[#GameCardSize]] and an input u64 '''NormalAreaSize'''. No output. | ||
+ | |||
+ | == GetGameCardHandle == | ||
+ | No input. Returns an output [[#GameCardHandle]]. | ||
== GetGameCardUpdatePartitionInfo == | == GetGameCardUpdatePartitionInfo == | ||
+ | Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardUpdatePartitionInfo]]. | ||
− | + | == FinalizeGameCardDriver == | |
+ | No input/output. | ||
− | + | == GetGameCardAttribute == | |
− | + | Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardAttribute]]. | |
− | [[ | + | == GetGameCardDeviceCertificate == |
+ | Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output. | ||
+ | |||
+ | [19.0.0+] Now returns an output s64 '''OutSize''' which can be 0x200 or 0x400. | ||
+ | |||
+ | == GetGameCardAsicInfo == | ||
+ | Takes a type-0x5 input buffer '''FwBuffer''', a type-0x6 output buffer containing [[#RmaInformation]] and two input s64s '''FwBufferSize''' and '''RmaInformationSize'''. No output. | ||
+ | |||
+ | == GetGameCardIdSet == | ||
+ | Takes a type-0x6 output buffer containing a [[#GameCardIdSet]] and an input s64 '''BufferSize'''. No output. | ||
+ | |||
+ | == WriteToGameCardDirectly == | ||
+ | Takes a type-0x6 output buffer and two input s64s '''Offset''' and '''BufferSize'''. No output. | ||
+ | |||
+ | == SetVerifyWriteEnalbleFlag == | ||
+ | Takes an input bool. No output. | ||
+ | |||
+ | == GetGameCardImageHash == | ||
+ | Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output. | ||
+ | |||
+ | == GetGameCardDeviceIdForProdCard == | ||
+ | Takes a type-0x5 input buffer '''CardHeaderForDev''', a type-0x6 output buffer and two input s64s '''CardHeaderForDevSize''' and '''BufferSize'''. No output. | ||
+ | |||
+ | == EraseAndWriteParamDirectly == | ||
+ | Takes a type-0x5 input buffer and an input s64 '''BufferSize'''. No output. | ||
+ | |||
+ | == ReadParamDirectly == | ||
+ | Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | ||
+ | |||
+ | == ForceEraseGameCard == | ||
+ | No input/output. | ||
+ | |||
+ | == GetGameCardErrorInfo == | ||
+ | No input. Returns an output [[#GameCardErrorInfo]]. | ||
+ | |||
+ | == GetGameCardErrorReportInfo == | ||
+ | No input. Returns an output [[#GameCardErrorReportInfo]]. | ||
+ | |||
+ | == GetGameCardDeviceId == | ||
+ | Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | ||
+ | |||
+ | == ChallengeCardExistence == | ||
+ | Takes a type-0x6 output buffer, two type-0x5 input buffers and an input [[#GameCardHandle]]. No output. | ||
+ | |||
+ | [9.0.0+] The [[Account_services|account]] system module uses this as part of a new challenge-response mechanism for [[Network#aauth|application authentication]]. | ||
+ | |||
+ | == GetGameCardCompatibilityType == | ||
+ | Takes an input [[#GameCardHandle]]. Returns an output [[#GameCardCompatibilityType]]. | ||
+ | |||
+ | == GetGameCardAsicCertificate == | ||
+ | Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | ||
+ | |||
+ | == GetGameCardCardHeader == | ||
+ | Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. No output. | ||
+ | |||
+ | == SetGameCardSessionCreationDelay == | ||
+ | Takes two input bools and an input u32. No output. | ||
+ | |||
+ | == GetGameCardApplicationIdList == | ||
+ | Takes a type-0x6 output buffer, an input s64 '''BufferSize''' and an input [[#GameCardHandle]]. Returns an output u16. | ||
+ | |||
+ | == SetSpeedEmulationMode == | ||
+ | Takes an input [[#SpeedEmulationMode]]. No output. | ||
+ | |||
+ | == GetSpeedEmulationMode == | ||
+ | No input. Returns an output [[#SpeedEmulationMode]]. | ||
+ | |||
+ | == SetApplicationStorageSpeed == | ||
+ | Takes an input s32. No output. | ||
+ | |||
+ | == SuspendSdmmcControl == | ||
+ | No input/output. | ||
+ | |||
+ | == ResumeSdmmcControl == | ||
+ | No input/output. | ||
+ | |||
+ | == GetSdmmcConnectionStatus == | ||
+ | Takes a total of 4-bytes of input. Returns a total of 8-bytes of output. | ||
+ | |||
+ | == SetDeviceSimulationEvent == | ||
+ | Takes a total of 0x14-bytes of input. No output. | ||
+ | |||
+ | == ClearDeviceSimulationEvent == | ||
+ | Takes a total of 4-bytes of input. No output. | ||
= IEventNotifier = | = IEventNotifier = | ||
+ | This is "nn::fssrv::sf::IEventNotifier". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#GetEventHandle]] | ||
+ | |} | ||
+ | |||
+ | == GetEventHandle == | ||
+ | No input, returns an output Event handle. With official sw the EventClearMode is user-specified. | ||
+ | |||
+ | = ISaveDataTransferManager = | ||
+ | This is "nn::fssrv::sf::ISaveDataTransferManager". | ||
+ | |||
+ | This was added with [[4.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#GetChallenge]] | ||
+ | |- | ||
+ | | 16 || [[#SetToken]] | ||
+ | |- | ||
+ | | 32 || [[#OpenSaveDataExporter]] | ||
+ | |- | ||
+ | | 64 || [[#OpenSaveDataImporter]] | ||
+ | |} | ||
+ | |||
+ | == GetChallenge == | ||
+ | No input/output, takes a type-0x6 output buffer. | ||
+ | |||
+ | == SetToken == | ||
+ | No input/output, takes a type-0x5 input buffer. | ||
+ | |||
+ | == OpenSaveDataExporter == | ||
+ | Takes an input u8 [[#SaveDataSpaceId]] and u64, returns an [[#ISaveDataExporter]]. | ||
+ | |||
+ | == OpenSaveDataImporter == | ||
+ | Takes an input u8 [[#SaveDataSpaceId]] and a 0x10-byte userID, and a type-0x5 input buffer. Returns an output u64 and an [[#ISaveDataImporter]]. | ||
+ | |||
+ | = ISaveDataTransferManagerForSaveDataRepair = | ||
+ | This is "nn::fssrv::sf::ISaveDataTransferManagerForSaveDataRepair". | ||
+ | |||
+ | This was added with [[9.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#GetChallenge]] | ||
+ | |- | ||
+ | | 16 || [[#SetKeyPackage]] | ||
+ | |- | ||
+ | | 80 || [[#OpenSaveDataExporterAndGetEncryptedKey]] | ||
+ | |- | ||
+ | | 81 || [[#PrepareOpenSaveDataImporter]] | ||
+ | |- | ||
+ | | 90 || [[#OpenSaveDataImporter]] | ||
+ | |- | ||
+ | | 91 || [[#OpenSaveDataImporter2]] | ||
+ | |- | ||
+ | | 100 || [[#OpenSaveDataExporterWithKey]] | ||
+ | |- | ||
+ | | 110 || [[#OpenSaveDataImporterWithKey]] | ||
+ | |} | ||
+ | |||
+ | == SetKeyPackage == | ||
+ | No input/output, takes a type-0x5 input buffer. | ||
+ | |||
+ | == OpenSaveDataExporterAndGetEncryptedKey == | ||
+ | Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an [[#ISaveDataDivisionExporter]]. | ||
+ | |||
+ | == PrepareOpenSaveDataImporter == | ||
+ | Takes a type-0x1A output buffer to receive a RsaEncryptedKey. | ||
+ | |||
+ | == OpenSaveDataImporter == | ||
+ | Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an [[#ISaveDataDivisionImporter]]. | ||
+ | |||
+ | == OpenSaveDataImporter2 == | ||
+ | Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | ||
+ | |||
+ | == OpenSaveDataExporterWithKey == | ||
+ | Takes a total of 0x20-bytes of input, returns an [[#ISaveDataDivisionExporter]]. | ||
+ | |||
+ | == OpenSaveDataImporterWithKey == | ||
+ | Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | ||
+ | |||
+ | [17.0.0+] Now only takes 0x18-bytes of input and an additional type-0x5 input buffer. | ||
+ | |||
+ | = ISaveDataMover = | ||
+ | This is "nn::fssrv::sf::ISaveDataMover". | ||
+ | |||
+ | This was added with [[10.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 8 || [[#Register]] | ||
+ | |- | ||
+ | | 16 || [[#Process]] | ||
+ | |- | ||
+ | | 18 || [[#Cancel]] | ||
+ | |} | ||
+ | |||
+ | == Register == | ||
+ | Takes an input u64, no output. | ||
+ | |||
+ | == Process == | ||
+ | Takes an input u64, returns an output u64. | ||
+ | |||
+ | == Cancel == | ||
+ | No input/output. | ||
+ | |||
+ | = ISaveDataTransferManagerForRepair = | ||
+ | This is "nn::fssrv::sf::ISaveDataTransferManagerForRepair". | ||
+ | |||
+ | This was added with [[11.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 80 || [[#OpenSaveDataExporter]] | ||
+ | |- | ||
+ | | 90 || [[#OpenSaveDataImporter]] | ||
+ | |} | ||
+ | |||
+ | == OpenSaveDataExporter == | ||
+ | Takes a total of 0x10-bytes of input, returns an [[#ISaveDataDivisionExporter]]. | ||
+ | |||
+ | == OpenSaveDataImporter == | ||
+ | Takes 1-byte of input, a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | ||
+ | |||
+ | = ISaveDataExporter = | ||
+ | This is "nn::fssrv::sf::ISaveDataExporter". | ||
+ | |||
+ | This was added with [[4.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#GetSaveDataInfo]] | ||
+ | |- | ||
+ | | 1 || [[#GetRestSize]] | ||
+ | |- | ||
+ | | 16 || [[#Pull]] | ||
+ | |- | ||
+ | | 17 || [[#PullInitialData]] | ||
+ | |} | ||
+ | |||
+ | == GetSaveDataInfo == | ||
+ | No input/output, takes a type-0x1A [[#SaveDataInfo]] output buffer. | ||
+ | |||
+ | The actual name for this is the SaveDataExporter constructor. This is used automatically after [[#OpenSaveDataExporter]] by official sw. | ||
+ | |||
+ | == GetRestSize == | ||
+ | No input, returns an output u64. | ||
+ | |||
+ | == Pull == | ||
+ | Takes a type-0x6 output buffer, returns an output u64. | ||
+ | |||
+ | == PullInitialData == | ||
+ | No input/output, takes a type-0x6 output buffer. | ||
+ | |||
+ | = ISaveDataImporter = | ||
+ | This is "nn::fssrv::sf::ISaveDataImporter". | ||
+ | |||
+ | This was added with [[4.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#GetSaveDataInfo]] | ||
+ | |- | ||
+ | | 1 || [[#GetRestSize]] | ||
+ | |- | ||
+ | | 16 || [[#Push]] | ||
+ | |- | ||
+ | | 17 || [[#Finalize]] | ||
+ | |} | ||
+ | |||
+ | == GetSaveDataInfo == | ||
+ | No input/output, takes a type-0x1A [[#GetSaveDataInfo]] output buffer. | ||
+ | |||
+ | The actual name for this is the SaveDataImporter constructor. This is used automatically after [[#OpenSaveDataImporter]] by official sw. | ||
+ | |||
+ | == GetRestSize == | ||
+ | No input, returns an output u64. | ||
+ | |||
+ | == Push == | ||
+ | No input/output, takes a type-0x5 input buffer. | ||
+ | |||
+ | == Finalize == | ||
+ | No input/output. | ||
+ | |||
+ | = ISaveDataTransferManagerWithDivision = | ||
+ | This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision". | ||
+ | |||
+ | This was added with [[5.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#GetChallenge]] | ||
+ | |- | ||
+ | | 8 || [18.0.0+] SetMode | ||
+ | |- | ||
+ | | 9 || [18.0.0+] SetAttribute | ||
+ | |- | ||
+ | | 16 || [[#SetKeySeedPackage]] | ||
+ | |- | ||
+ | | 32 || [[#OpenSaveDataExporter]] | ||
+ | |- | ||
+ | | 33 || [[#OpenSaveDataExporterForDiffExport]] | ||
+ | |- | ||
+ | | 34 || [6.0.0+] [[#OpenSaveDataExporterByContext]] | ||
+ | |- | ||
+ | | 63 || [17.0.0+] OpenSaveDataImporter | ||
+ | |- | ||
+ | | 64 || [6.0.0-17.0.1] [[#OpenSaveDataImporterDeprecated]] ([5.0.0-5.1.0] OpenSaveDataImporter) | ||
+ | |- | ||
+ | | 65 || [5.0.0-17.0.1] [[#OpenSaveDataImporterForDiffImport]] | ||
+ | |- | ||
+ | | 66 || [6.0.0-17.0.1] [[#OpenSaveDataImporterForDuplicateDiffImport]] | ||
+ | |- | ||
+ | | 67 || [6.0.0-16.1.0] [[#OpenSaveDataImporter]] | ||
+ | |- | ||
+ | | 68 || [6.0.0+] [[#OpenSaveDataImporterByContext]] | ||
+ | |- | ||
+ | | 69 || [6.0.0+] [[#CancelSuspendingImport]] | ||
+ | |- | ||
+ | | 70 || [10.0.0+] CancelSuspendingImportByAttribute | ||
+ | |- | ||
+ | | 80 || [11.0.0+] SwapSecondary | ||
+ | |} | ||
+ | |||
+ | == GetChallenge == | ||
+ | No input/output, takes a type-0x6 output buffer containing the '''Challenge'''. | ||
+ | |||
+ | == SetKeySeedPackage == | ||
+ | No input/output, takes a type-0x5 input buffer containing the '''KeySeedPackage'''. | ||
+ | |||
+ | == OpenSaveDataExporter == | ||
+ | Takes an input u8 [[#SaveDataSpaceId]] and u64. Returns an [[#ISaveDataDivisionExporter]]. | ||
+ | |||
+ | == OpenSaveDataExporterForDiffExport == | ||
+ | Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionExporter]]. | ||
+ | |||
+ | == OpenSaveDataExporterByContext == | ||
+ | No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionExporter]]. | ||
+ | |||
+ | == OpenSaveDataImporterDeprecated == | ||
+ | Takes an input u8 [[#SaveDataSpaceId]], a 0x10-byte userID, and a type-0x5 input buffer [[#InitialDataVersion2]]. Returns an [[#ISaveDataDivisionImporter]]. | ||
+ | |||
+ | == OpenSaveDataImporterForDiffImport == | ||
+ | Takes an input u8 [[#SaveDataSpaceId]], an u64, and a type-0x5 input buffer [[#InitialDataVersion2]], returns an [[#ISaveDataDivisionImporter]]. | ||
+ | |||
+ | == OpenSaveDataImporterForDuplicateDiffImport == | ||
+ | Takes an input u8 and an u64, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | ||
+ | |||
+ | == OpenSaveDataImporter == | ||
+ | Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | ||
+ | |||
+ | == OpenSaveDataImporterByContext == | ||
+ | No input/output, takes a type-0x5 input buffer, returns an [[#ISaveDataDivisionImporter]]. | ||
+ | |||
+ | == CancelSuspendingImport == | ||
+ | Takes an input u64 and a 0x10-byte struct, no output. | ||
+ | |||
+ | = ISaveDataDivisionExporter = | ||
+ | This is "nn::fssrv::sf::ISaveDataDivisionExporter". | ||
+ | |||
+ | This was added with [[5.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#SetDivisionCount]] | ||
+ | |- | ||
+ | | 1 || [6.0.0+] [[#ReadSaveDataExtraData]] | ||
+ | |- | ||
+ | | 16 || [[#OpenSaveDataDiffChunkIterator]] | ||
+ | |- | ||
+ | | 48 || [[#OpenSaveDataChunkExporter]] | ||
+ | |- | ||
+ | | 64 || [6.0.0-8.1.0] [[#FinalizeFullExport]] | ||
+ | |- | ||
+ | | 65 || [6.0.0-8.1.0] [[#FinalizeDiffExport]] | ||
+ | |- | ||
+ | | 66 || [6.0.0+] [[#CancelExport]] | ||
+ | |- | ||
+ | | 67 || [6.0.0+] [[#SuspendExport]] | ||
+ | |- | ||
+ | | 70 || [6.0.0-17.0.1] [[#GetKeySeed]] | ||
+ | |- | ||
+ | | 71 || [6.0.0+] [[#GetInitialDataMac]] | ||
+ | |- | ||
+ | | 72 || [6.0.0+] [[#FinalizeExport]] | ||
+ | |- | ||
+ | | 73 || [9.0.0+] [[#GetInitialDataMacKeyGeneration]] | ||
+ | |- | ||
+ | | 74 || [18.0.0+] [[#GetKeySeed]] | ||
+ | |- | ||
+ | | 80 || [6.0.0+] [[#GetImportInitialDataAad]] | ||
+ | |- | ||
+ | | 81 || [6.0.0+] [[#SetExportInitialDataAad]] | ||
+ | |- | ||
+ | | 96 || [6.0.0+] [[#GetReportInfo]] | ||
+ | |} | ||
+ | |||
+ | == SetDivisionCount == | ||
+ | Takes an input u32, no output. | ||
+ | |||
+ | == OpenSaveDataChunkExporter == | ||
+ | Takes an input u32, returns an [[#ISaveDataChunkExporter]]. | ||
+ | |||
+ | == FinalizeFullExport == | ||
+ | No input, returns two 0x10-byte output structs. | ||
+ | |||
+ | == FinalizeDiffExport == | ||
+ | No input, returns an output 0x10-byte struct. | ||
+ | |||
+ | == CancelExport == | ||
+ | No input/output. | ||
+ | |||
+ | == SuspendExport == | ||
+ | No input/output, takes a type-0x6 output buffer. | ||
+ | |||
+ | == GetKeySeed == | ||
+ | No input, returns an output 0x10-byte struct. | ||
+ | |||
+ | == GetInitialDataMac == | ||
+ | No input, returns an output 0x10-byte struct. | ||
+ | |||
+ | == FinalizeExport == | ||
+ | No input/output. | ||
+ | |||
+ | == SetExportInitialDataAad == | ||
+ | Takes an input 0x20-byte struct, no output. | ||
+ | |||
+ | = ISaveDataDivisionImporter = | ||
+ | This is "nn::fssrv::sf::ISaveDataDivisionImporter". | ||
+ | |||
+ | This was added with [[5.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [6.0.0+] [[#ReadSaveDataExtraData]] | ||
+ | |- | ||
+ | | 16 || [[#OpenSaveDataDiffChunkIterator]] | ||
+ | |- | ||
+ | | 32 || [[#InitializeImport]] | ||
+ | |- | ||
+ | | 33 || [[#FinalizeImport]] | ||
+ | |- | ||
+ | | 34 || [6.0.0+] [[#CancelImport]] | ||
+ | |- | ||
+ | | 35 || [6.0.0+] [[#GetImportContext]] | ||
+ | |- | ||
+ | | 36 || [6.0.0+] [[#SuspendImport]] | ||
+ | |- | ||
+ | | 37 || [11.0.0+] FinalizeImportWithoutSwap | ||
+ | |- | ||
+ | | 48 || [[#OpenSaveDataChunkImporter]] | ||
+ | |- | ||
+ | | 64 || [6.0.0+] [[#GetImportInitialDataAad]] | ||
+ | |- | ||
+ | | 80 || [6.0.0+] [[#GetReportInfo]] | ||
+ | |} | ||
+ | |||
+ | == ReadSaveDataExtraData == | ||
+ | No input/output, takes a type-0x6 output buffer. | ||
+ | |||
+ | == OpenSaveDataDiffChunkIterator == | ||
+ | No input, returns an [[#ISaveDataChunkIterator]]. | ||
+ | |||
+ | == InitializeImport == | ||
+ | No input, returns an output u64. | ||
+ | |||
+ | == FinalizeImport == | ||
+ | No input/output. | ||
+ | |||
+ | == CancelImport == | ||
+ | No input/output. | ||
+ | |||
+ | == GetImportContext == | ||
+ | No input/output, takes a type-0x6 output buffer. | ||
+ | |||
+ | == SuspendImport == | ||
+ | No input/output. | ||
+ | |||
+ | == OpenSaveDataChunkImporter == | ||
+ | Takes an input u32, returns an [[#ISaveDataChunkImporter]]. | ||
+ | |||
+ | == GetImportInitialDataAad == | ||
+ | No input, returns an output 0x20-byte struct. | ||
+ | |||
+ | == GetReportInfo == | ||
+ | No input, returns an output 0x20-byte struct. | ||
+ | |||
+ | = ISaveDataChunkIterator = | ||
+ | This is "nn::fssrv::sf::ISaveDataChunkIterator". | ||
+ | |||
+ | This was added with [[5.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#Next]] | ||
+ | |- | ||
+ | | 1 || [[#IsEnd]] | ||
+ | |- | ||
+ | | 16 || [[#GetId]] | ||
+ | |} | ||
+ | |||
+ | == Next == | ||
+ | No input/output. | ||
+ | |||
+ | == IsEnd == | ||
+ | No input, returns an output u8. | ||
+ | |||
+ | == GetId == | ||
+ | No input, returns an output u32. | ||
+ | |||
+ | = ISaveDataChunkExporter = | ||
+ | This is "nn::fssrv::sf::ISaveDataChunkExporter". | ||
+ | |||
+ | This was added with [[5.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#Pull]] | ||
+ | |- | ||
+ | | 16 || [6.0.0+] [[#GetRestRawDataSize]] | ||
+ | |} | ||
+ | |||
+ | == Pull == | ||
+ | Takes an input u64 and a type-0x6 output buffer, returns an output u64. | ||
+ | |||
+ | == GetRestRawDataSize == | ||
+ | No input, returns an output u64. | ||
+ | |||
+ | = ISaveDataChunkImporter = | ||
+ | This is "nn::fssrv::sf::ISaveDataChunkImporter". | ||
+ | |||
+ | This was added with [[5.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#Push]] | ||
+ | |} | ||
+ | |||
+ | == Push == | ||
+ | Takes an input u64 and a type-0x5 input buffer, no output. | ||
+ | |||
+ | = ISaveDataTransferProhibiter = | ||
+ | This is "nn::fssrv::sf::ISaveDataTransferProhibiter". | ||
+ | |||
+ | This was added with [6.0.0+]. | ||
+ | |||
+ | This doesn't seem to handle any commands (?). | ||
+ | |||
+ | = IMultiCommitManager = | ||
+ | This is "nn::fssrv::sf::IMultiCommitManager". | ||
+ | |||
+ | This was added with [6.0.0+]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 1 || [[#Add]] | ||
+ | |- | ||
+ | | 2 || [[#Commit]] | ||
+ | |} | ||
+ | |||
+ | == Add == | ||
+ | Takes an input [[#IFilesystem]], no output. | ||
+ | |||
+ | == Commit == | ||
+ | No input/output. | ||
+ | |||
+ | = IWiper = | ||
+ | This is "nn::fssrv::sf::IWiper". | ||
+ | |||
+ | This was added with [[10.0.0]]. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | 0 || [[#Startup|Startup]] | ||
+ | |- | ||
+ | | 16 || [[#Process_2|Process]] | ||
+ | |} | ||
+ | |||
+ | == Startup == | ||
+ | No input. Returns an u64. | ||
+ | |||
+ | == Process == | ||
+ | No input. Returns an u64. | ||
+ | |||
+ | = IStorageDeviceManager = | ||
+ | This is "nn::fssrv::storage::sf::IStorageDeviceManager". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | N/A || IsInserted | ||
+ | |- | ||
+ | | N/A || IsHandleValid | ||
+ | |- | ||
+ | | N/A || OpenDetectionEvent | ||
+ | |- | ||
+ | | N/A || OpenOperator | ||
+ | |- | ||
+ | | N/A || OpenDevice | ||
+ | |- | ||
+ | | N/A || OpenStorage | ||
+ | |- | ||
+ | | N/A || Invalidate | ||
+ | |} | ||
+ | |||
+ | = IStorageDeviceOperator = | ||
+ | This is "nn::fssrv::storage::sf::IStorageDeviceOperator". | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
− | | | + | | N/A || Operate |
+ | |- | ||
+ | | N/A || OperateIn | ||
+ | |- | ||
+ | | N/A || OperateOut | ||
+ | |- | ||
+ | | N/A || OperateOut2 | ||
+ | |- | ||
+ | | N/A || OperateInOut | ||
+ | |- | ||
+ | | N/A || OperateIn2Out | ||
+ | |} | ||
+ | |||
+ | = IStorageDevice = | ||
+ | This is "nn::fssrv::storage::sf::IStorageDevice". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Cmd || Name | ||
+ | |- | ||
+ | | N/A || GetHandle | ||
+ | |- | ||
+ | | N/A || IsHandleValid | ||
+ | |- | ||
+ | | N/A || OpenOperator | ||
+ | |- | ||
+ | | N/A || Read | ||
+ | |- | ||
+ | | N/A || Write | ||
+ | |- | ||
+ | | N/A || Flush | ||
+ | |- | ||
+ | | N/A || SetSize | ||
+ | |- | ||
+ | | N/A || GetSize | ||
+ | |- | ||
+ | | N/A || OperateRange | ||
|} | |} | ||
− | = | + | = FileSystemProxyType = |
+ | This is "nn::fs::FileSystemProxyType". | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Value || Name | ! Value || Name | ||
|- | |- | ||
− | | 0 || | + | | 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 | ||
+ | |- | ||
+ | | 15 || All | ||
|} | |} | ||
= ContentStorageId = | = ContentStorageId = | ||
+ | This is "nn::fs::ContentStorageId". | ||
+ | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! Value || Name | ! Value || Name | ||
|- | |- | ||
− | | 0 || | + | | 0 || System |
|- | |- | ||
− | | 1 || | + | | 1 || User |
|- | |- | ||
| 2 || SdCard | | 2 || SdCard | ||
+ | |- | ||
+ | | 3 || [16.0.0+] System0 | ||
|} | |} | ||
− | = | + | = SaveDataSpaceId = |
+ | This is "nn::fs::SaveDataSpaceId". | ||
− | + | {| class="wikitable" border="1" | |
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || System | ||
+ | |- | ||
+ | | 1 || User | ||
+ | |- | ||
+ | | 2 || SdSystem | ||
+ | |- | ||
+ | | 3 || [3.0.0+] Temporary | ||
+ | |- | ||
+ | | 4 || [4.0.0+] SdUser | ||
+ | |- | ||
+ | | 100 || [3.0.0+] ProperSystem | ||
+ | |- | ||
+ | | 101 || [3.0.0+] SafeMode | ||
+ | |} | ||
+ | |||
+ | Determines the storage where the savedata is stored. | ||
+ | |||
+ | = SaveDataType = | ||
+ | This is "nn::fs::SaveDataType". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || System | ||
+ | |- | ||
+ | | 1 || Account | ||
+ | |- | ||
+ | | 2 || Bcat | ||
+ | |- | ||
+ | | 3 || Device | ||
+ | |- | ||
+ | | 4 || [3.0.0+] Temporary | ||
+ | |- | ||
+ | | 5 || [3.0.0+] Cache | ||
+ | |- | ||
+ | | 6 || [4.0.0+] SystemBcat | ||
+ | |} | ||
+ | |||
+ | = SaveDataRank = | ||
+ | This is "nn::fs::SaveDataRank". | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
− | ! | + | ! Value || Name |
+ | |- | ||
+ | | 0 || Primary | ||
+ | |- | ||
+ | | 1 || Secondary | ||
+ | |} | ||
+ | |||
+ | = SaveDataEnumerateOption = | ||
+ | This is "nn::fs::SaveDataEnumerateOption". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 1 || AllRank | ||
+ | |} | ||
+ | |||
+ | = SaveDataFlags = | ||
+ | This is "nn::fs::SaveDataFlags". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 1 || KeepAfterResettingSystemSaveData | ||
+ | |- | ||
+ | | 2 || KeepAfterRefurbishment | ||
+ | |- | ||
+ | | 4 || KeepAfterResettingSystemSaveDataWithoutUserSaveData | ||
+ | |- | ||
+ | | 8 || NeedsSecureDelete | ||
+ | |} | ||
+ | |||
+ | = SaveDataMetaType = | ||
+ | This is "nn::fs::SaveDataMetaType". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || None | ||
+ | |- | ||
+ | | 1 || Thumbnail | ||
+ | |- | ||
+ | | 2 || ExtensionContext | ||
+ | |} | ||
+ | |||
+ | = ImageDirectoryId = | ||
+ | This is "nn::fs::ImageDirectoryId". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Nand | ||
+ | |- | ||
+ | | 1 || SdCard | ||
+ | |} | ||
+ | |||
+ | = CloudBackupWorkStorageId = | ||
+ | This is "nn::fs::CloudBackupWorkStorageId". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Nand | ||
+ | |- | ||
+ | | 1 || SdCard | ||
+ | |} | ||
+ | |||
+ | = CustomStorageId = | ||
+ | This is "nn::fs::CustomStorageId". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || System | ||
+ | |- | ||
+ | | 1 || SdCard | ||
+ | |} | ||
+ | |||
+ | = Priority = | ||
+ | This is "nn::fs::Priority". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Realtime | ||
+ | |- | ||
+ | | 1 || Normal | ||
+ | |- | ||
+ | | 2 || Low | ||
+ | |} | ||
+ | |||
+ | = PriorityRaw = | ||
+ | This is "nn::fs::PriorityRaw". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Realtime | ||
+ | |- | ||
+ | | 1 || Normal | ||
+ | |- | ||
+ | | 2 || Low | ||
+ | |- | ||
+ | | 3 || Background | ||
+ | |} | ||
+ | |||
+ | = AbortSpecifier = | ||
+ | This is "nn::fs::AbortSpecifier". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Default | ||
+ | |- | ||
+ | | 1 || Abort | ||
+ | |- | ||
+ | | 2 || ReturnResult | ||
+ | |} | ||
+ | |||
+ | = OperationId = | ||
+ | This is "nn::fs::OperationId". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Clear | ||
+ | |- | ||
+ | | 1 || ClearSignature | ||
+ | |- | ||
+ | | 2 || InvalidateCache | ||
+ | |- | ||
+ | | 3 || QueryRange | ||
+ | |} | ||
+ | |||
+ | = MountHostOption = | ||
+ | This is "nn::fs::MountHostOption". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 1 || PseudoCaseSensitive | ||
+ | |} | ||
+ | |||
+ | = BisPartitionId = | ||
+ | This is "nn::fs::BisPartitionId". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || BootPartition1Root | ||
+ | |- | ||
+ | | 10 || BootPartition2Root | ||
+ | |- | ||
+ | | 20 || UserDataRoot | ||
+ | |- | ||
+ | | 21 || BootConfigAndPackage2Part1 | ||
+ | |- | ||
+ | | 22 || BootConfigAndPackage2Part2 | ||
+ | |- | ||
+ | | 23 || BootConfigAndPackage2Part3 | ||
+ | |- | ||
+ | | 24 || BootConfigAndPackage2Part4 | ||
+ | |- | ||
+ | | 25 || BootConfigAndPackage2Part5 | ||
+ | |- | ||
+ | | 26 || BootConfigAndPackage2Part6 | ||
+ | |- | ||
+ | | 27 || CalibrationBinary | ||
+ | |- | ||
+ | | 28 || CalibrationFile | ||
+ | |- | ||
+ | | 29 || SafeMode | ||
+ | |- | ||
+ | | 30 || User | ||
+ | |- | ||
+ | | 31 || System | ||
+ | |- | ||
+ | | 32 || SystemProperEncryption | ||
+ | |- | ||
+ | | 33 || SystemProperPartition | ||
+ | |- | ||
+ | | 34 || SignedSystemPartitionOnSafeMode | ||
+ | |- | ||
+ | | 35 || [16.0.0+] DeviceTreeBlob | ||
+ | |- | ||
+ | | 36 || [16.0.0+] System0 | ||
+ | |} | ||
+ | |||
+ | = SdCardSpeedMode = | ||
+ | This is "nn::fs::SdCardSpeedMode". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Identification | ||
+ | |- | ||
+ | | 1 || DefaultSpeed | ||
+ | |- | ||
+ | | 2 || HighSpeed | ||
+ | |- | ||
+ | | 3 || Sdr12 | ||
+ | |- | ||
+ | | 4 || Sdr25 | ||
+ | |- | ||
+ | | 5 || Sdr50 | ||
+ | |- | ||
+ | | 6 || Sdr104 | ||
+ | |- | ||
+ | | 7 || Ddr50 | ||
+ | |- | ||
+ | | 8 || Unknown | ||
+ | |} | ||
+ | |||
+ | = MmcSpeedMode = | ||
+ | This is "nn::fs::MmcSpeedMode". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Identification | ||
+ | |- | ||
+ | | 1 || LegacySpeed | ||
+ | |- | ||
+ | | 2 || HighSpeed | ||
+ | |- | ||
+ | | 3 || Hs200 | ||
|- | |- | ||
− | | | + | | 4 || Hs400 |
|- | |- | ||
− | | | + | | 5 || Unknown |
+ | |} | ||
+ | |||
+ | = MmcPartition = | ||
+ | This is "nn::fs::MmcPartition". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
|- | |- | ||
− | | | + | ! Value || Name |
|- | |- | ||
− | | | + | | 0 || UserData |
|- | |- | ||
− | | | + | | 1 || BootPartition1 |
|- | |- | ||
− | | | + | | 2 || BootPartition2 |
− | |||
− | |||
|} | |} | ||
+ | = HostControllerStatus = | ||
+ | This is "nn::sdcard::HostControllerStatus". | ||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0xC | ||
+ | | | ||
+ | |} | ||
− | = | + | = MemoryReportInfo = |
− | + | This is "nn::fs::MemoryReportInfo". | |
− | |||
− | |||
− | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 521: | Line 2,298: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | | + | | PooledBufferFreeSizePeak |
|- | |- | ||
| 0x8 | | 0x8 | ||
+ | | 0x8 | ||
+ | | PooledBufferRetriedCount | ||
+ | |- | ||
| 0x10 | | 0x10 | ||
− | | | + | | 0x8 |
+ | | PooledBufferReduceAllocationCount | ||
|- | |- | ||
| 0x18 | | 0x18 | ||
| 0x8 | | 0x8 | ||
− | | | + | | BufferManagerFreeSizePeak |
+ | |- | ||
+ | | 0x20 | ||
+ | | 0x8 | ||
+ | | BufferManagerRetriedCount | ||
+ | |- | ||
+ | | 0x28 | ||
+ | | 0x8 | ||
+ | | ExpHeapFreeSizePeak | ||
+ | |- | ||
+ | | 0x30 | ||
+ | | 0x8 | ||
+ | | BufferPoolFreeSizePeak | ||
+ | |- | ||
+ | | 0x38 | ||
+ | | 0x8 | ||
+ | | PatrolReadAllocateBufferSuccessCount | ||
+ | |- | ||
+ | | 0x40 | ||
+ | | 0x8 | ||
+ | | PatrolReadAllocateBufferFailureCount | ||
+ | |- | ||
+ | | 0x48 | ||
+ | | 0x8 | ||
+ | | BufferManagerTotalAllocatableSizePeak | ||
+ | |- | ||
+ | | 0x50 | ||
+ | | 0x8 | ||
+ | | BufferPoolAllocateSizeMax | ||
+ | |- | ||
+ | | 0x58 | ||
+ | | 0x8 | ||
+ | | PooledBufferFailedIdealAllocationCountOnAsyncAccess | ||
+ | |- | ||
+ | | 0x60 | ||
+ | | 0x20 | ||
+ | | Reserved | ||
+ | |} | ||
+ | |||
+ | = StorageErrorInfo = | ||
+ | This is "nn::fs::StorageErrorInfo". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x4 | ||
+ | | NumActivationFailures | ||
+ | |- | ||
+ | | 0x4 | ||
+ | | 0x4 | ||
+ | | NumActivationErrorCorrections | ||
+ | |- | ||
+ | | 0x8 | ||
+ | | 0x4 | ||
+ | | NumReadWriteFailures | ||
+ | |- | ||
+ | | 0xC | ||
+ | | 0x4 | ||
+ | | NumReadWriteErrorCorrections | ||
+ | |} | ||
+ | |||
+ | = GameCardErrorInfo = | ||
+ | This is "nn::fs::GameCardErrorInfo". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x2 | ||
+ | | GameCardCrcErrorCount | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x2 | ||
+ | | Reserved | ||
+ | |- | ||
+ | | 0x4 | ||
+ | | 0x2 | ||
+ | | AsicCrcErrorCount | ||
+ | |- | ||
+ | | 0x6 | ||
+ | | 0x2 | ||
+ | | Reserved | ||
+ | |- | ||
+ | | 0x8 | ||
+ | | 0x2 | ||
+ | | RefreshCount | ||
+ | |- | ||
+ | | 0xA | ||
+ | | 0x2 | ||
+ | | Reserved | ||
+ | |- | ||
+ | | 0xC | ||
+ | | 0x2 | ||
+ | | ReadRetryCount | ||
+ | |- | ||
+ | | 0xE | ||
+ | | 0x2 | ||
+ | | TimeoutRetryErrorCount | ||
+ | |} | ||
+ | |||
+ | = GameCardErrorReportInfo = | ||
+ | This is "nn::fs::GameCardErrorReportInfo". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x10 | ||
+ | | [[#GameCardErrorInfo|ErrorInfo]] | ||
+ | |- | ||
+ | | 0x10 | ||
+ | | 0x2 | ||
+ | | AsicReinitializeFailureDetail | ||
+ | |- | ||
+ | | 0x12 | ||
+ | | 0x2 | ||
+ | | InsertionCount | ||
+ | |- | ||
+ | | 0x14 | ||
+ | | 0x2 | ||
+ | | RemovalCount | ||
+ | |- | ||
+ | | 0x16 | ||
+ | | 0x2 | ||
+ | | AsicReinitializeCount | ||
+ | |- | ||
+ | | 0x18 | ||
+ | | 0x4 | ||
+ | | AsicInitializeCount | ||
+ | |- | ||
+ | | 0x1C | ||
+ | | 0x2 | ||
+ | | AsicReinitializeFailureCount | ||
+ | |- | ||
+ | | 0x1E | ||
+ | | 0x2 | ||
+ | | AwakenFailureCount | ||
|- | |- | ||
| 0x20 | | 0x20 | ||
+ | | 0x2 | ||
+ | | Reserved | ||
+ | |- | ||
+ | | 0x22 | ||
+ | | 0x2 | ||
+ | | RefreshCount | ||
+ | |- | ||
+ | | 0x24 | ||
+ | | 0x4 | ||
+ | | LastReadErrorPageAddress | ||
+ | |- | ||
+ | | 0x28 | ||
+ | | 0x4 | ||
+ | | LastReadErrorPageCount | ||
+ | |- | ||
+ | | 0x2C | ||
+ | | 0x4 | ||
+ | | AwakenCount | ||
+ | |- | ||
+ | | 0x30 | ||
+ | | 0x4 | ||
+ | | ReadCountFromInsert | ||
+ | |- | ||
+ | | 0x34 | ||
+ | | 0x4 | ||
+ | | ReadCountFromAwaken | ||
+ | |- | ||
+ | | 0x38 | ||
| 0x8 | | 0x8 | ||
− | | | + | | Reserved |
+ | |} | ||
+ | |||
+ | = GameCardHandle = | ||
+ | This is "nn::fs::GameCardHandle". This is an u32. | ||
+ | |||
+ | = GameCardPartition = | ||
+ | This is "nn::fs::GameCardPartition". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Update | ||
+ | |- | ||
+ | | 1 || Normal | ||
+ | |- | ||
+ | | 2 || Secure | ||
+ | |- | ||
+ | | 3 || [4.0.0+] Logo | ||
+ | |} | ||
+ | |||
+ | = GameCardPartitionRaw = | ||
+ | This is "nn::fs::GameCardPartitionRaw". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || NormalReadOnly | ||
+ | |- | ||
+ | | 1 || SecureReadOnly | ||
+ | |- | ||
+ | | 2 || RootWriteOnly | ||
+ | |} | ||
+ | |||
+ | = GameCardAttribute = | ||
+ | This is "nn::fs::GameCardAttribute". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 1 || AutoBootFlag | ||
+ | |- | ||
+ | | 2 || HistoryEraseFlag | ||
+ | |- | ||
+ | | 4 || [4.0.0+] RepairToolFlag | ||
+ | |- | ||
+ | | 8 || [9.0.0+] DifferentRegionCupToTerraDeviceFlag | ||
+ | |- | ||
+ | | 16 || [9.0.0+] DifferentRegionCupToGlobalDeviceFlag | ||
+ | |} | ||
+ | |||
+ | = GameCardAttribute2 = | ||
+ | This is "nn::fs::GameCardAttribute2". | ||
+ | |||
+ | = GameCardSize = | ||
+ | This is "nn::fs::GameCardSize". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 1 || Size1GB | ||
+ | |- | ||
+ | | 2 || Size2GB | ||
+ | |- | ||
+ | | 4 || Size4GB | ||
+ | |- | ||
+ | | 8 || Size8GB | ||
+ | |- | ||
+ | | 16 || Size16GB | ||
+ | |- | ||
+ | | 32 || Size32GB | ||
+ | |} | ||
+ | |||
+ | = GameCardClockRate = | ||
+ | This is "nn::fs::GameCardClockRate". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 25 || ClockRate25MHz | ||
+ | |- | ||
+ | | 50 || ClockRate50MHz | ||
+ | |} | ||
+ | |||
+ | = GameCardCompatibilityType = | ||
+ | This is "nn::fs::GameCardCompatibilityType". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || Global | ||
+ | |- | ||
+ | | 1 || China | ||
+ | |} | ||
+ | |||
+ | = GameCardUpdatePartitionInfo = | ||
+ | This is "nn::fs::GameCardUpdatePartitionInfo". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x4 | ||
+ | | Version | ||
+ | |- | ||
+ | | 0x4 | ||
+ | | 0x4 | ||
+ | | Reserved | ||
+ | |- | ||
+ | | 0x8 | ||
+ | | 0x8 | ||
+ | | Id | ||
+ | |} | ||
+ | |||
+ | = GameCardIdSet = | ||
+ | This is "nn::gc::GameCardIdSet". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x4 | ||
+ | | [[#CardId1|Id1]] | ||
+ | |- | ||
+ | | 0x4 | ||
+ | | 0x4 | ||
+ | | [[#CardId2|Id2]] | ||
+ | |- | ||
+ | | 0x8 | ||
+ | | 0x4 | ||
+ | | [[#CardId3|Id3]] | ||
+ | |} | ||
+ | |||
+ | = CardId1 = | ||
+ | This is "nn::gc::detail::CardId1". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | [[#MakerCodeForCardId1|MakerCode]] | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | [[#MemoryCapacity|MemoryCapacity]] | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x1 | ||
+ | | Reserved | ||
+ | |- | ||
+ | | 0x3 | ||
+ | | 0x1 | ||
+ | | MemoryType | ||
+ | |} | ||
+ | |||
+ | = CardId2 = | ||
+ | This is "nn::gc::detail::CardId2". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x1 | ||
+ | | CardSecurityNumber | ||
+ | |- | ||
+ | | 0x1 | ||
+ | | 0x1 | ||
+ | | CardType | ||
+ | |- | ||
+ | | 0x2 | ||
+ | | 0x2 | ||
+ | | Reserved | ||
+ | |} | ||
+ | |||
+ | = CardId3 = | ||
+ | This is "nn::gc::detail::CardId3". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x4 | ||
+ | | Reserved | ||
+ | |} | ||
+ | |||
+ | = MakerCodeForCardId1 = | ||
+ | This is "nn::gc::detail::MakerCodeForCardId1". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0xC2 || MegaChips | ||
+ | |- | ||
+ | | 0xAE || Lapis | ||
+ | |- | ||
+ | | 0x36 || | ||
+ | |} | ||
+ | |||
+ | = MemoryCapacity = | ||
+ | This is "nn::gc::detail::MemoryCapacity". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0xFA || 1GB | ||
+ | |- | ||
+ | | 0xF8 || 2GB | ||
+ | |- | ||
+ | | 0xF0 || 4GB | ||
+ | |- | ||
+ | | 0xE0 || 8GB | ||
+ | |- | ||
+ | | 0xE1 || 16GB | ||
+ | |- | ||
+ | | 0xE2 || 32GB | ||
+ | |} | ||
+ | |||
+ | = RmaInformation = | ||
+ | This is "nn::gc::RmaInformation". This is a 0x200-byte struct. | ||
+ | |||
+ | = GameCardCardHeader = | ||
+ | This is a 0x600-byte struct. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x100 | ||
+ | | [[XCI#CardHeader|Signature]] | ||
+ | |- | ||
+ | | 0x100 | ||
+ | | 0x100 | ||
+ | | [[Lotus3#GetCardHeader|Header]] | ||
+ | |- | ||
+ | | 0x200 | ||
+ | | 0x400 | ||
+ | | [[XCI#NewCardHeaderCertArea|NewCardHeaderCertArea]] | ||
+ | |} | ||
+ | |||
+ | = SimulatingDeviceType = | ||
+ | This is "nn::fs::SimulatingDeviceType". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || eMMC | ||
+ | |- | ||
+ | | 1 || SdCard | ||
+ | |- | ||
+ | | 2 || GameCard | ||
+ | |} | ||
+ | |||
+ | = SimulatingDeviceDetectionMode = | ||
+ | This is "nn::fs::SimulatingDeviceDetectionMode". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || NoSimulation | ||
+ | |- | ||
+ | | 1 || DeviceAttached | ||
+ | |- | ||
+ | | 2 || DeviceRemoved | ||
+ | |} | ||
+ | |||
+ | = SimulatingDeviceAccessFailureEventType = | ||
+ | This is "nn::fs::SimulatingDeviceAccessFailureEventType". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || None | ||
+ | |- | ||
+ | | 1 || AccessTimeoutFailure | ||
+ | |- | ||
+ | | 2 || AccessFailure | ||
+ | |- | ||
+ | | 3 || DataCorruption | ||
+ | |} | ||
+ | |||
+ | = SimulatingDeviceTargetOperation = | ||
+ | This is "nn::fs::SimulatingDeviceTargetOperation". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 1 || Read | ||
+ | |- | ||
+ | | 2 || Write | ||
+ | |} | ||
+ | |||
+ | = SpeedEmulationMode = | ||
+ | This is "nn::fs::SpeedEmulationMode". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Value || Name | ||
+ | |- | ||
+ | | 0 || None | ||
+ | |- | ||
+ | | 1 || Faster | ||
+ | |- | ||
+ | | 2 || Slower | ||
+ | |- | ||
+ | | 3 || Random | ||
+ | |} | ||
+ | |||
+ | = FspPath = | ||
+ | This is "nn::fssrv::sf::FspPath". This is a 0x301-byte string. | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Path || Notes | ||
+ | |- | ||
+ | | @SystemContent || | ||
+ | |- | ||
+ | | @UserContent || | ||
+ | |- | ||
+ | | @SdCardContent || | ||
+ | |- | ||
+ | | @CalibFile || | ||
+ | |- | ||
+ | | @Safe || | ||
+ | |- | ||
+ | | @User || | ||
+ | |- | ||
+ | | @System || | ||
+ | |- | ||
+ | | @Sdcard || | ||
+ | |- | ||
+ | | @Host || | ||
+ | |- | ||
+ | | @GcApp || Gamecard App partition (Partition 2) | ||
+ | |- | ||
+ | | @GcXYYYYYYYY || Gamecard Contents. X is the partition type (U - Update, N - Normal, S - Secure). Y is the gamecard handle as a 32-bit hex value | ||
+ | |- | ||
+ | | @upp || Gamecard update partition (Partition 0) | ||
+ | |- | ||
+ | | [4.0.0+] @RegUpdate || Registered update partition | ||
+ | |} | ||
+ | |||
+ | = SaveDataAttribute = | ||
+ | This is "nn::fs::SaveDataAttribute". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x8 | ||
+ | | [[NCM_services#ApplicationId|ApplicationId]] (0 for SystemSaveData)</br>SaveData: 0 can be used for accessing the savedata associated with the current FS session [[NCM_services#ApplicationId|ApplicationId]], otherwise when set this is the [[NCM_services#ApplicationId|ApplicationId]] associated with the savedata to access. | ||
+ | |- | ||
+ | | 0x8 | ||
+ | | 0x10 | ||
+ | | UserId</br>For user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from [[Account_services]]. | ||
+ | |- | ||
+ | | 0x18 | ||
+ | | 0x8 | ||
+ | | [[Flash_Filesystem|SystemSaveDataId]] (0 for SaveData) | ||
+ | |- | ||
+ | | 0x20 | ||
+ | | 0x1 | ||
+ | | [[#SaveDataType]] | ||
+ | |- | ||
+ | | 0x21 | ||
+ | | 0x1 | ||
+ | | [[#SaveDataRank]] | ||
+ | |- | ||
+ | | 0x22 | ||
+ | | 0x2 | ||
+ | | SaveDataIndex | ||
+ | |- | ||
+ | | 0x24 | ||
+ | | 0x4 | ||
+ | | Padding | ||
|- | |- | ||
| 0x28 | | 0x28 | ||
Line 550: | Line 2,912: | ||
Total size is 0x40-bytes. | 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" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 559: | Line 2,925: | ||
| 0x0 | | 0x0 | ||
| 0x8 | | 0x8 | ||
− | | | + | | SaveDataSize |
|- | |- | ||
| 0x8 | | 0x8 | ||
| 0x8 | | 0x8 | ||
− | | | + | | JournalSize |
|- | |- | ||
| 0x10 | | 0x10 | ||
| 0x8 | | 0x8 | ||
− | | 0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData. | + | | AvailableSize</br>0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData. |
|- | |- | ||
| 0x18 | | 0x18 | ||
| 0x8 | | 0x8 | ||
− | | Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[ | + | | OwnerId</br>Official user-processes only uses 0 here for SystemSaveData/SaveData. For the dedicated save-creation code with SaveData/DeviceSaveData, this value comes from an input param with official user-processes. For BcatSaveData, this is the hard-coded [[NCM_services#ProgramId|ProgramId]] of the bcat-sysmodule. |
|- | |- | ||
| 0x20 | | 0x20 | ||
| 0x4 | | 0x4 | ||
− | | Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData. | + | | [[#SaveDataFlags]]</br>Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData. |
|- | |- | ||
| 0x24 | | 0x24 | ||
| 0x1 | | 0x1 | ||
− | | Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData. | + | | [[#SaveDataSpaceId]]</br>Official user-processes only uses 0 here for SystemSaveData, 1 for SaveData/DeviceSaveData/BcatSaveData. |
|- | |- | ||
| 0x25 | | 0x25 | ||
| 0x1 | | 0x1 | ||
− | | 0 for SystemSaveData/SaveData. | + | | Unknown. 0 for SystemSaveData/SaveData. |
|- | |- | ||
| 0x26 | | 0x26 | ||
Line 592: | Line 2,958: | ||
Total size is 0x40-bytes. | Total size is 0x40-bytes. | ||
− | =DeviceSaveData= | + | = DeviceSaveData = |
− | This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the | + | This is accessed using the same commands for SaveData with the same input u8, the only difference compared to SaveData is the [[#SaveDataAttribute]]. |
+ | |||
+ | = BcatSaveData = | ||
+ | This is accessed using the same commands for SaveData with the same input u8. The [[#SaveDataAttribute]] is the same as DeviceSaveData (besides the SaveDataType), except that the [[NCM_services#ApplicationId|ApplicationId]] field is always set to <input ApplicationId> (unlike DeviceSaveData where it's optional). See above regarding [[#SaveDataCreationInfo]]. | ||
+ | |||
+ | The 0x10-byte struct passed to [[#CreateSaveDataFileSystem]] has the first 0x5-bytes set to all-zero. | ||
+ | |||
+ | MountSystemBcatSaveData uses [[#OpenSaveDataFileSystemBySystemSaveDataId]] with [[#SaveDataSpaceId]] System. The [[#SaveDataAttribute]] is all-zero, except for the SaveDataType, and SystemSaveDataId is set to the input param. | ||
+ | |||
+ | = SaveDataInfo = | ||
+ | This is "nn::fs::SaveDataInfo". | ||
+ | |||
+ | {| class="wikitable" border="1" | ||
+ | |- | ||
+ | ! Offset | ||
+ | ! Size | ||
+ | ! Description | ||
+ | |- | ||
+ | | 0x0 | ||
+ | | 0x8 | ||
+ | | SaveDataId | ||
+ | |- | ||
+ | | 0x8 | ||
+ | | 0x1 | ||
+ | | [[#SaveDataSpaceId]] | ||
+ | |- | ||
+ | | 0x9 | ||
+ | | 0x1 | ||
+ | | [[#SaveDataType]] | ||
+ | |- | ||
+ | | 0xA | ||
+ | | 0x6 | ||
+ | | Padding? | ||
+ | |- | ||
+ | | 0x10 | ||
+ | | 0x10 | ||
+ | | UserId | ||
+ | |- | ||
+ | | 0x20 | ||
+ | | 0x8 | ||
+ | | SystemSaveDataId (0 for regular SaveData) | ||
+ | |- | ||
+ | | 0x28 | ||
+ | | 0x8 | ||
+ | | [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData) | ||
+ | |- | ||
+ | | 0x30 | ||
+ | | 0x8 | ||
+ | | Raw saveimage size | ||
+ | |- | ||
+ | | 0x38 | ||
+ | | 0x2 | ||
+ | | SaveDataIndex | ||
+ | |- | ||
+ | | 0x3A | ||
+ | | 0x1 | ||
+ | | [[#SaveDataRank]] | ||
+ | |- | ||
+ | | 0x3B | ||
+ | | 0x25 | ||
+ | | Unknown. Usually zeros? | ||
+ | |} | ||
+ | |||
+ | This is a 0x60-byte struct. | ||
− | = | + | = SaveDataFileSystemExtraData = |
− | This is | + | This is a 0x200-byte struct. Appears to match [[Savegames#Extra_data]]. |
− | + | = InitialDataVersion2 = | |
+ | This is a 0x8210-byte struct used by [[#ISaveDataTransferManagerWithDivision]]. | ||
[[Category:Services]] | [[Category:Services]] |
Latest revision as of 23:49, 26 October 2024
fsp-ldr
This is "nn::fssrv::sf::IFileSystemProxyForLoader".
Cmd | Name |
---|---|
0 | #OpenCodeFileSystem |
1 | #IsArchivedProgram |
2 | [4.0.0+] #SetCurrentProcess |
OpenCodeFileSystem
Takes a type-0x19 input buffer containing a #FspPath and an input ProgramId. Returns an #IFileSystem.
[10.0.0+] This now takes an additional type-0x1A output buffer.
[16.0.0+] This now takes an additional input #ContentAttributes.
[17.0.0+] This now takes a type-0x6 output buffer instead of a type-0x1A output buffer.
IsArchivedProgram
Takes an input u64 ProcessId. Returns a bool (1 if the process id's #FspPath ends in ".nca").
SetCurrentProcess
Takes an input u64 ProcessId. No output.
fsp-pr
This is "nn::fssrv::sf::IProgramRegistry".
Cmd | Name |
---|---|
0 | #RegisterProgram |
1 | #UnregisterProgram |
2 | [4.0.0+] #SetCurrentProcess |
256 | [1.0.0-9.2.0] #SetEnabledProgramVerification |
RegisterProgram
Takes a StorageId, an u64 ProcessId, a ProgramId, a 0x1C type-A buffer for the FS Access Header, and a 0x2C type-A buffer for the FS Access Control
Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid.
UnregisterProgram
Takes a pid. Removes registered FS permissions for that PID.
SetEnabledProgramVerification
Seems to sets a global flag to inputval & 1.
When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key NPDM ACID signature fails. This also skips verifying the NCA Header signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort.
[10.0.0+] This was moved to Loader.
fsp-srv
This is "nn::fssrv::sf::IFileSystemProxy".
Cmd | Name |
---|---|
0 | [1.0.0] #OpenFileSystem |
1 | #SetCurrentProcess |
2 | OpenDataFileSystemByCurrentProcess |
7 | [2.0.0+] #OpenFileSystemWithPatch |
8 | [16.0.0+] #OpenFileSystemWithIdObsolete ([2.0.0-15.0.1] OpenFileSystemWithId) |
9 | [3.0.0+] OpenDataFileSystemByProgramId |
10 | [16.0.0+] #OpenFileSystemWithId |
11 | #OpenBisFileSystem |
12 | #OpenBisStorage |
13 | InvalidateBisCache |
17 | OpenHostFileSystem |
18 | OpenSdCardFileSystem |
19 | [2.0.0+] FormatSdCardFileSystem |
21 | #DeleteSaveDataFileSystem |
22 | #CreateSaveDataFileSystem |
23 | #CreateSaveDataFileSystemBySystemSaveDataId |
24 | RegisterSaveDataFileSystemAtomicDeletion |
25 | [2.0.0+] DeleteSaveDataFileSystemBySaveDataSpaceId |
26 | [2.0.0+] FormatSdCardDryRun |
27 | [2.0.0+] IsExFatSupported |
28 | [4.0.0+] DeleteSaveDataFileSystemBySaveDataAttribute |
29 | [19.0.0+] IsInitializationMode |
30 | #OpenGameCardStorage |
31 | #OpenGameCardFileSystem |
32 | [3.0.0+] ExtendSaveDataFileSystem |
33 | [5.0.0+] DeleteCacheStorage |
34 | [5.0.0+] GetCacheStorageSize |
35 | [6.0.0+] #CreateSaveDataFileSystemWithHashSalt |
36 | [9.0.0+] OpenHostFileSystemWithOption |
37 | [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2 |
51 | #OpenSaveDataFileSystem |
52 | #OpenSaveDataFileSystemBySystemSaveDataId |
53 | [2.0.0+] #OpenReadOnlySaveDataFileSystem |
57 | [3.0.0+] #ReadSaveDataFileSystemExtraDataBySaveDataSpaceId |
58 | #ReadSaveDataFileSystemExtraData |
59 | [2.0.0+] WriteSaveDataFileSystemExtraData |
60 | #OpenSaveDataInfoReader |
61 | #OpenSaveDataInfoReaderBySaveDataSpaceId |
62 | [5.0.0+] OpenSaveDataInfoReaderOnlyCacheStorage |
64 | [5.0.0+] OpenSaveDataInternalStorageFileSystem |
65 | [5.0.0+] UpdateSaveDataMacForDebug |
66 | [5.0.0+] WriteSaveDataFileSystemExtraDataWithMask |
67 | [6.0.0+] #FindSaveDataWithFilter |
68 | [6.0.0+] #OpenSaveDataInfoReaderWithFilter |
69 | [8.0.0+] ReadSaveDataFileSystemExtraDataBySaveDataAttribute |
70 | [8.0.0+] WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute |
71 | [10.0.0+] ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute |
80 | OpenSaveDataMetaFile |
81 | [4.0.0+] #OpenSaveDataTransferManager |
82 | [5.0.0+] #OpenSaveDataTransferManagerVersion2 |
83 | [6.0.0+] #OpenSaveDataTransferProhibiter |
84 | [6.0.0+] #ListAccessibleSaveDataOwnerId |
85 | [9.0.0+] #OpenSaveDataTransferManagerForSaveDataRepair |
86 | [10.0.0+] #OpenSaveDataMover |
87 | [11.0.0+] #OpenSaveDataTransferManagerForRepair |
100 | OpenImageDirectoryFileSystem |
101 | [11.0.0+] OpenBaseFileSystem |
102 | [12.0.0+] FormatBaseFileSystem |
110 | #OpenContentStorageFileSystem |
120 | [6.0.0-9.2.0] #OpenCloudBackupWorkStorageFileSystem |
130 | [7.0.0+] #OpenCustomStorageFileSystem |
200 | OpenDataStorageByCurrentProcess |
201 | [3.0.0+] OpenDataStorageByProgramId |
202 | #OpenDataStorageByDataId |
203 | OpenPatchDataStorageByCurrentProcess |
204 | [7.0.0+] #OpenDataFileSystemWithProgramIndex |
205 | [7.0.0+] #OpenDataStorageWithProgramIndex |
206 | [13.0.0+] OpenDataStorageByPath |
207 | [15.0.0+] OpenDataFileSystemByDataId |
400 | #OpenDeviceOperator |
500 | #OpenSdCardDetectionEventNotifier |
501 | #OpenGameCardDetectionEventNotifier |
503 | [19.0.0+] OpenGameCardAwakenReadyEventNotifier |
510 | [5.0.0+] OpenSystemDataUpdateEventNotifier |
511 | [5.0.0+] NotifySystemDataUpdateEvent |
520 | [6.0.0+] #SimulateDeviceDetectionEvent |
600 | [1.0.0-3.0.2] SetCurrentPosixTime |
601 | QuerySaveDataTotalSize |
602 | #VerifySaveDataFileSystem |
603 | CorruptSaveDataFileSystem |
604 | CreatePaddingFile |
605 | DeleteAllPaddingFiles |
606 | [2.0.0+] GetRightsId |
607 | [2.0.0+] RegisterExternalKey |
608 | [2.0.0+] UnregisterAllExternalKey |
609 | [2.0.0-15.0.1] GetRightsIdByPath |
610 | [3.0.0+] GetRightsIdAndKeyGenerationByPath |
611 | [4.0.0+] SetCurrentPosixTimeWithTimeDifference |
612 | [4.0.0+] GetFreeSpaceSizeForSaveData |
613 | [4.0.0+] VerifySaveDataFileSystemBySaveDataSpaceId |
614 | [4.0.0+] CorruptSaveDataFileSystemBySaveDataSpaceId |
615 | [5.0.0+] QuerySaveDataInternalStorageTotalSize |
616 | [6.0.0+] #GetSaveDataCommitId |
617 | [7.0.0+] UnregisterExternalKey |
618 | [17.0.0+] GetProgramId |
620 | [2.0.0+] #SetSdCardEncryptionSeed |
630 | [4.0.0+] SetSdCardAccessibility |
631 | [4.0.0+] IsSdCardAccessible |
632 | [19.0.0+] TestExternalKey |
640 | [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid |
700 | [5.0.0+] #OpenAccessFailureDetectionEventNotifier |
701 | [5.0.0+] GetAccessFailureDetectionEvent |
702 | [5.0.0+] IsAccessFailureDetected |
710 | [5.0.0+] ResolveAccessFailure |
720 | [5.0.0+] AbandonAccessFailure |
800 | [2.0.0+] GetAndClearErrorInfo |
810 | [7.0.0+] RegisterProgramIndexMapInfo |
820 | [19.0.0+] GetContentStorageInfoIndex |
1000 | [1.0.0-9.2.0] SetBisRootForHost |
1001 | #SetSaveDataSize |
1002 | #SetSaveDataRootPath |
1003 | DisableAutoSaveDataCreation |
1004 | #SetGlobalAccessLogMode |
1005 | #GetGlobalAccessLogMode |
1006 | #OutputAccessLogToSdCard |
1007 | [4.0.0+] RegisterUpdatePartition |
1008 | [4.0.0+] OpenRegisteredUpdatePartition |
1009 | [4.0.0+] GetAndClearMemoryReportInfo |
1010 | [5.1.0-6.2.0] SetDataStorageRedirectTarget |
1011 | [7.0.0+] #GetProgramIndexForAccessLog |
1012 | [9.0.0+] GetFsStackUsage |
1013 | [9.0.0+] UnsetSaveDataRootPath |
1014 | [10.0.0-10.2.0] OutputMultiProgramTagAccessLog |
1016 | [11.0.0+] FlushAccessLogOnSdCard |
1017 | [11.0.0+] OutputApplicationInfoAccessLog |
1018 | [13.0.0+] SetDebugOption |
1019 | [13.0.0+] UnsetDebugOption |
1020 | [18.0.0+] OpenMemoryStressor |
1100 | [4.0.0-17.0.1] OverrideSaveDataTransferTokenSignVerificationKey |
1101 | [18.0.0+] OverrideSaveDataTransferKeyForTest |
1110 | [6.0.0+] CorruptSaveDataFileSystemByOffset |
1200 | [6.0.0+] #OpenMultiCommitManager |
1300 | [10.0.0+] #OpenBisWiper |
1400 | [15.0.0+] NotifyErrorContextServiceReady |
Permissions
Every time permissions are checked, the process registration #fsp-pr is loaded using the session processID. The permission data is populated with data from the NPDM.
If the processID is <= 6 (which happens only for built-in sysmodules), it will use a hardcoded registration data. The default mask in this case is 0x8000000000000000.
Note that the functions check whether or not at least one bit is set in the mask. This means that, you don't need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000.
If the code were to request an invalid input type, panic. But this never happens.
The output values for #ReadWrite CanMountRegisteredUpdatePartition and #Call CanRegisterUpdatePartition are masked with the cached value of DebugMode.
ReadWrite
AccessibilityType | Name | Mask | Permission | Used by |
---|---|---|---|---|
0x0 | CanMountLogo | 0x8000000000000801 | R- | #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId |
0x1 | CanMountContentMeta | 0x8000000000000801 | R- | #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId |
0x2 | CanMountContentControl | 0x8000000000000801 | R- | #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId |
0x3 | CanMountContentManual | 0x8000000000000801 | R- | #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId |
0x4 | CanMountContentData | 0x8000000000000801 | R- | #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId |
0x5 | CanMountApplicationPackage | 0x8000000000000801 | R- | #OpenFileSystem, #OpenFileSystemWithPatch, #OpenFileSystemWithId |
0x6 | CanMountSaveDataStorage | 0x8000000000000000 | RW | |
0x7 | CanMountContentStorage | 0x8000000000000800 | RW | #OpenContentStorageFileSystem |
0x8 | CanMountImageAndVideoStorage | 0x8000000000001000 | RW | #OpenImageDirectoryFileSystem |
0x9 | CanMountCustomStorage0 | 0x8000000000000000 | RW | OpenCustomStorageFileSystem |
0xA | CanMountBisCalibrationFile | 0x8000000000000084 | RW | #OpenBisFileSystem |
0xB | CanMountBisSafeMode | 0x8000000000000080 | RW | #OpenBisFileSystem |
0xC | CanMountBisUser | 0x8000000000008080 | RW | #OpenBisFileSystem |
0xD | CanMountBisSystem | 0x8000000000008080 | RW | #OpenBisFileSystem |
0xE | CanMountBisSystemProperEncryption | 0x8000000000000080 | RW | #OpenBisFileSystem |
0xF | CanMountBisSystemProperPartition | 0x8000000000000080 | RW | #OpenBisFileSystem |
0x10 | CanMountSdCard | 0xC000000000200000 | RW | #OpenSdCardFileSystem |
0x11 | CanMountGameCard | 0x8000000000000010 | R- | #OpenGameCardFileSystem |
0x12 | CanMountDeviceSaveData | 0x8000000000040020 | RW | #OpenSaveDataFileSystem |
0x13 | CanMountSystemSaveData | 0x8000000000000028 | RW | #OpenSaveDataFileSystemBySystemSaveDataId |
0x14 | CanMountOthersSaveData | 0x8000000000000020 | RW | #OpenSaveDataFileSystem |
0x15 | CanMountOthersSystemSaveData | 0x8000000000000020 | RW | #OpenSaveDataFileSystemBySystemSaveDataId |
0x16 | CanOpenBisPartitionBootPartition1Root | 0x8000000000010082 | RW | #OpenBisStorage |
0x17 | CanOpenBisPartitionBootPartition2Root | 0x8000000000010080 | RW | #OpenBisStorage |
0x18 | CanOpenBisPartitionUserDataRoot | 0x8000000000000080 | RW | #OpenBisStorage |
0x19 | CanOpenBisPartitionBootConfigAndPackage2Part1 | 0x8000000000010080 | RW | #OpenBisStorage |
0x1A | CanOpenBisPartitionBootConfigAndPackage2Part2 | 0x8000000000010080 | RW | #OpenBisStorage |
0x1B | CanOpenBisPartitionBootConfigAndPackage2Part3 | 0x8000000000010080 | RW | #OpenBisStorage |
0x1C | CanOpenBisPartitionBootConfigAndPackage2Part4 | 0x8000000000010080 | RW | #OpenBisStorage |
0x1D | CanOpenBisPartitionBootConfigAndPackage2Part5 | 0x8000000000010080 | RW | #OpenBisStorage |
0x1E | CanOpenBisPartitionBootConfigAndPackage2Part6 | 0x8000000000010080 | RW | #OpenBisStorage |
0x1F | CanOpenBisPartitionCalibrationBinary | 0x8000000000000084 | RW | #OpenBisStorage |
0x20 | CanOpenBisPartitionCalibrationFile | 0x8000000000000084 | RW | #OpenBisStorage |
0x21 | CanOpenBisPartitionSafeMode | 0x8000000000000080 | RW | #OpenBisStorage |
0x22 | CanOpenBisPartitionUser | 0x8000000000000080 | RW | #OpenBisStorage |
0x23 | CanOpenBisPartitionSystem | 0x8000000000000080 | RW | #OpenBisStorage |
0x24 | CanOpenBisPartitionSystemProperEncryption | 0x8000000000000080 | RW | #OpenBisStorage |
0x25 | CanOpenBisPartitionSystemProperPartition | 0x8000000000000080 | RW | #OpenBisStorage |
0x26 | CanOpenBisPartitionDeviceTreeBlob | 0x8000002000000080 | RW | #OpenBisStorage |
[3.0.0+] 0x27 | CanOpenSdCardStorage | 0xC000000000200000 | RW | |
[3.0.0+] 0x28 | CanOpenGameCardStorage | 0x8000000000000100 | RW | #OpenGameCardStorage, #EraseGameCard (bit1), #WriteToGameCard (bit1), #GetGameCardErrorInfo (bit1), #EraseAndWriteParamDirectly (bit1), #ReadParamDirectly (bit1), #ForceEraseGameCard (bit1) |
[4.0.0+] 0x29 | CanMountSystemDataPrivate | 0x8000000000100008 | R- | #OpenFileSystem, #OpenDataStorageByDataId |
[5.0.0+] 0x2A | CanMountHost | 0xC000000000400000 | RW | #OpenHostFileSystem |
[6.0.0+] 0x2B | CanMountRegisteredUpdatePartition | 0x8000000000010000 | R- | #OpenRegisteredUpdatePartition |
[7.0.0+] 0x2C | CanOpenSaveDataInternalStorage | 0x8000000000000000 | RW | #OpenSaveDataInternalStorageFileSystem |
[7.0.0+] 0x2D | CanMountTemporaryDirectory | 0xC000000000000000 | RW | |
[11.0.0+] 0x2E | CanMountAllBaseFilesystem | 0x8000000000000000 | RW | OpenBaseFileSystem |
[15.0.0+] 0x2F | CanNotMount | 0x0000000000000000 | -- | OpenCustomStorageFileSystem |
Call
OperationType | Name | Mask | Used by |
---|---|---|---|
0x0 | CanInvalidateBisCache | 0x8000000000000080 | #InvalidateBisCache |
0x1 | CanEraseMmc | 0x8000000000000080 | EraseMmc |
0x2 | CanGetGameCardDeviceCertificate | 0x8000000000000010 | GetGameCardDeviceCertificate |
0x3 | CanGetGameCardIdSet | 0x8000000000000010 | GetGameCardIdSet |
0x4 | CanFinalizeGameCardDriver | 0x8000000000000200 | FinalizeGameCardDriver |
0x5 | CanGetGameCardAsicInfo | 0x8000000000000200 | GetGameCardAsicInfo |
0x6 | CanGetGameCardAsicCertificate | 0x8000000000000200 | GetGameCardAsicCertificate |
0x7 | CanCreateSaveData | 0x8000000000002020 | #CreateSaveDataFileSystem |
0x8 | CanDeleteSaveData | 0x8000000000000060 | #DeleteSaveDataFileSystem, RegisterSaveDataFileSystemAtomicDeletion |
0x9 | CanCreateSystemSaveData | 0x8000000000000028 | CreateSaveDataFileSystemBySystemSaveDataId |
0xA | CanCreateOthersSystemSaveData | 0x8000000000000020 | CreateSaveDataFileSystemBySystemSaveDataId |
0xB | CanDeleteSystemSaveData | 0x8000000000004028 | #DeleteSaveDataFileSystem, RegisterSaveDataFileSystemAtomicDeletion |
0xC | CanOpenSaveDataInfoReader | 0x8000000000000060 | #OpenSaveDataInfoReaderBySaveDataSpaceId, #OpenSaveDataInfoReader |
0xD | CanOpenSaveDataInfoReaderForSystem | 0x8000000000004020 | #OpenSaveDataInfoReaderBySaveDataSpaceId, #OpenSaveDataInfoReader |
0xE | CanOpenSaveDataInfoReaderForInternal | 0x8000000000000040 | #OpenSaveDataInfoReaderWithFilter |
0xF | CanOpenSaveDataMetaFile | 0x8000000000020000 | OpenSaveDataMetaFile |
0x10 | CanSetCurrentPosixTime | 0x8000000000000400 | SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference |
0x11 | CanReadSaveDataFileSystemExtraData | 0x8000000000004060 | #ReadSaveDataFileSystemExtraData |
0x12 | CanSetGlobalAccessLogMode | 0x8000000000080000 | #SetGlobalAccessLogMode |
0x13 | CanSetSpeedEmulationMode | 0x8000000000080000 | SetSpeedEmulationMode |
0x14 | CanDebug | 0xC000000000000000 | |
0x15 | CanFillBis | 0xC000000000800000 | CreatePaddingFile, DeleteAllPaddingFiles |
[2.0.0+] 0x16 | CanCorruptSaveData | 0xC000000001000000 | CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId |
[2.0.0+] 0x17 | CanCorruptSystemSaveData | 0x8000000001000060 | CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId |
[2.0.0+] 0x18 | CanVerifySaveData | 0x8000000000000060 | #VerifySaveDataFileSystem, VerifySaveDataFileSystemBySaveDataSpaceId |
[2.0.0+] 0x19 | CanDebugSaveData | 0xC000000002000000 | #CreateSaveDataFileSystem, #OpenSaveDataFileSystem, #SetSaveDataRootPath |
[2.0.0+] 0x1A | CanFormatSdCard | 0x8000000004000000 | FormatSdCardFileSystem |
[3.0.0+] 0x1B | CanGetRightsId | 0x8000000008000000 | GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath |
[3.0.0+] 0x1C | CanRegisterExternalKey | 0x8000000010000000 | RegisterExternalKey, UnregisterAllExternalKey |
[4.0.0+] 0x1D | CanSetEncryptionSeed | 0x8000000000000800 | #SetSdCardEncryptionSeed |
[4.0.0+] 0x1E | CanWriteSaveDataFileSystemExtraDataTimeStamp | 0x8000000000000020 | WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask |
[4.0.0+] 0x1F | CanWriteSaveDataFileSystemExtraDataFlags | 0x8000000000004020 | WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask |
[4.0.0+] 0x20 | CanWriteSaveDataFileSystemExtraDataCommitId | 0x8000000000000020 | WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask |
[5.0.0+] 0x21 | CanWriteSaveDataFileSystemExtraDataAll | 0x8000000000000000 | WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask |
[5.0.0+] 0x22 | CanExtendSaveData | 0x8000000000002020 | ExtendSaveDataFileSystem |
[5.0.0+] 0x23 | CanExtendSystemSaveData | 0x8000000000000028 | ExtendSaveDataFileSystem |
[5.0.0+] 0x24 | CanExtendOthersSystemSaveData | 0x8000000000000020 | ExtendSaveDataFileSystem |
[5.0.0+] 0x25 | CanRegisterUpdatePartition | 0x8000000020000000 | RegisterUpdatePartition |
[5.0.0+] 0x26 | CanOpenSaveDataTransferManager | 0x8000000040000000 | #OpenSaveDataTransferManager |
[5.0.0+] 0x27 | CanOpenSaveDataTransferManagerVersion2 | 0x8000000200000000 | #OpenSaveDataTransferManagerVersion2 |
[5.0.0+] 0x28 | CanOpenSaveDataTransferManagerForSaveDataRepair | 0x8000000200000000 | OpenSaveDataTransferManagerForSaveDataRepair |
[5.0.0+] 0x29 | CanOpenSaveDataTransferManagerForSaveDataRepairTool | 0x8000000000000000 | OpenSaveDataTransferManagerForSaveDataRepair |
[5.0.0+] 0x2A | CanOpenOpenSaveDataTransferProhibiter | 0x8000000200002000 | #OpenSaveDataTransferProhibiter |
[5.0.0+] 0x2B | CanOpenSaveDataMover | 0x8000001000000000 | #OpenSaveDataMover |
[5.0.0+] 0x2C | CanOpenBisWiper | 0x8000000000000800 | #OpenBisWiper |
[5.0.0+] 0x2D | CanListAccessibleSaveDataOwnerId | 0x8000000240002000 | #ListAccessibleSaveDataOwnerId |
[5.0.0+] 0x2E | CanControlMmcPatrol | 0x8000000000000000 | SuspendMmcPatrol, ResumeMmcPatrol |
[5.0.0+] 0x2F | CanOverrideSaveDataTransferTokenSignVerificationKey | 0x8000000000000000 | OverrideSaveDataTransferTokenSignVerificationKey |
[5.1.0+] 0x30 | CanOpenSdCardDetectionEventNotifier | 0x8000000080200000 | #OpenSdCardDetectionEventNotifier |
[6.0.0+] 0x31 | CanOpenGameCardDetectionEventNotifier | 0x8000000080000110 | #OpenGameCardDetectionEventNotifier |
[6.0.0+] 0x32 | CanOpenSystemDataUpdateEventNotifier | 0x8000000000100008 | OpenSystemDataUpdateEventNotifier |
[6.0.0+] 0x33 | CanNotifySystemDataUpdateEvent | 0x8000000000010000 | NotifySystemDataUpdateEvent |
[6.0.0+] 0x34 | CanOpenAccessFailureDetectionEventNotifier | 0x8000000100000000 | #OpenAccessFailureDetectionEventNotifier |
[6.0.0+] 0x35 | CanGetAccessFailureDetectionEvent | 0x8000000100000000 | GetAccessFailureDetectionEvent |
[6.0.0+] 0x36 | CanIsAccessFailureDetected | 0x8000000100000000 | IsAccessFailureDetected |
[6.0.0+] 0x37 | CanResolveAccessFailure | 0x8000000100000000 | ResolveAccessFailure |
[6.0.0+] 0x38 | CanAbandonAccessFailure | 0x8000000100000000 | AbandonAccessFailure |
[8.0.0+] 0x39 | CanQuerySaveDataInternalStorageTotalSize | 0x8000000040000000 | QuerySaveDataInternalStorageTotalSize |
[9.0.0+] 0x3A | CanGetSaveDataCommitId | 0x8000000200000020 | #GetSaveDataCommitId |
[9.0.0+] 0x3B | CanSetSdCardAccessibility | 0x8000000000200000 | SetSdCardAccessibility |
[9.0.0+] 0x3C | CanSimulateDevice | 0x4000000000000000 | SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent |
[9.0.0+] 0x3D | CanCreateSaveDataWithHashSalt | 0x8000000000000000 | #CreateSaveDataFileSystem, #CreateSaveDataFileSystemWithHashSalt |
[9.0.0+] 0x3E | CanRegisterProgramIndexMapInfo | 0x8000000400000000 | RegisterProgramIndexMapInfo |
[9.0.0+] 0x3F | CanChallengeCardExistence | 0x8000000000000010 | ChallengeCardExistence |
[9.0.0+] 0x40 | CanCreateOwnSaveData | 0x8000000800000000 | #CreateSaveDataFileSystem, CreateSaveDataFileSystemWithHashSalt |
[9.0.0+] 0x41 | CanDeleteOwnSaveData | 0x8000000800000000 | #DeleteSaveDataFileSystem |
[10.0.0+] 0x42 | CanReadOwnSaveDataFileSystemExtraData | 0x8000000800000000 | #ReadSaveDataFileSystemExtraData |
[10.0.0+] 0x43 | CanExtendOwnSaveData | 0x8000000800000000 | ExtendSaveDataFileSystem |
[10.2.0+] 0x44 | CanOpenOwnSaveDataTransferProhibiter | 0x8000000800000000 | #OpenSaveDataTransferProhibiter |
[11.0.0+] 0x45 | CanFindOwnSaveDataWithFilter | 0x8000000800000000 | #FindSaveDataWithFilter |
[13.0.0+] 0x46 | CanOpenSaveDataTransferManagerForRepair | 0x8000000000000020 | #OpenSaveDataTransferManagerForRepair |
[13.0.0+] 0x47 | CanSetDebugConfiguration | 0x8000000000000000 | SetDebugOption, UnsetDebugOption |
[15.0.0+] 0x48 | CanOpenDataStorageByPath | 0x8000000000000000 | OpenDataStorageByPath |
[17.0.0+] 0x49 | CanNotifyErrorContextServiceReady | 0x8000004000000000 | NotifyErrorContextServiceReady |
[17.0.0+] 0x4A | CanGetProgramId | 0x8000000008000000 | GetProgramId |
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 ProgramId. Returns an #IFileSystem.
Web-applet loads the #FileSystemProxyType (which must be Manual) from u32_table[inparam].
Note: web-applet strings refer to both this cmd and #OpenFileSystemWithId as "MountContent", but official nn_sf_sync symbols use "OpenXX" names.
OpenFileSystemWithIdObsolete
Takes a type-0x19 input buffer containing a #FspPath, an input #FileSystemProxyType and an input ProgramId. Returns an #IFileSystem.
The #IFileSystem must be Meta if the NCA type is 0.
The input buffer is the output string path from 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 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 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 NAND partition.
OpenGameCardStorage
Takes two input u32s (gamecard handle, partition ID), and returns an #IStorage for the 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.
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 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 StorageID and a DataId.
Returns a domain object ID implementing the #IStorage interface for data archives.
OpenDataFileSystemWithProgramIndex
Takes an input u8, returns an #IFileSystem.
OpenDataStorageWithProgramIndex
Takes an input u8, returns an #IStorage.
OpenDeviceOperator
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 an unknown input u64 and a type-0x6 output buffer.
The input u64 high-byte must be non-zero, otherwise an 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-module reads the 0x10 bytes from SdCard:/Nintendo/Contents/private, and compares them to the first 0x10 bytes of the ns_appman:/private (in 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 an input u32.
GetGlobalAccessLogMode
Returns an output u32.
GlobalAccessLogMode is normally 0.
OutputAccessLogToSdCard
Takes a type-0x5 input buffer.
The input buffer is the string to output to the log. User-processes normally include a newline at the end.
User-processes only use this when the value previously loaded from #GetGlobalAccessLogMode has bit1 set.
When bit1 in GlobalAccessLogMode is clear, FS-module will just return 0 for OutputAccessLogToSdCard. However even with that set the log doesn't show up SD, unknown why.
The input buffer is written to the "$FsAccessLog:/FsAccessLog.txt" file, where "$FsAccessLog" is the SD-card mount-name. It's written to the current end of the file(appended).
GetProgramIndexForAccessLog
No input, returns two 32-bit values "version" and "program_index".
OpenMultiCommitManager
No input, returns an output #IMultiCommitManager.
OpenBisWiper
Takes 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.
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.
Cmd | Name |
---|---|
0 | CreateFile |
1 | DeleteFile |
2 | CreateDirectory |
3 | DeleteDirectory |
4 | DeleteDirectoryRecursively |
5 | RenameFile |
6 | RenameDirectory |
7 | #GetEntryType |
8 | #OpenFile |
9 | #OpenDirectory |
10 | #Commit |
11 | #GetFreeSpaceSize |
12 | #GetTotalSpaceSize |
13 | [3.0.0+] #CleanDirectoryRecursively |
14 | [3.0.0+] #GetFileTimeStampRaw |
15 | [4.0.0+] QueryEntry |
16 | [15.0.0+] GetFileSystemAttribute |
GetEntryType
Takes a type-0x9 input buffer for the path and returns #DirectoryEntryType as an output u32.
OpenFile
Takes a type-0x19 input buffer for the path, and an u32 mode. mode controls how the file is opened, based on which bits are set:
- When bit 0 is set, the file is Readable: you can use the Read operation.
- When bit 1 is set, the file is Writable: you can use the Write operation.
- When bit 2 is set, the file is Appendable: unless this bit is set, you will not be able to write beyond the end of a file (such writes will result in an error 0x307202)
OpenDirectory
Takes a type-0x9 input buffer for the path and an u64 filter_flags. filter_flags controls what type of entries are read by the #IDirectory: bitmask 0x1 = directories, bitmask 0x2 = files.
Commit
Like 3DS, this has to be used after writing to savedata for the changes to take affect.
GetFreeSpaceSize
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS.
GetTotalSpaceSize
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used).
CleanDirectoryRecursively
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path.
GetFileTimeStampRaw
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8.
IDirectory
This is "nn::fssrv::sf::IDirectory".
Cmd | Name |
---|---|
0 | #Read |
1 | #GetEntryCount |
Read
Takes a type-0x6 output buffer. Returns an output u64(?) for the total number of read entries, this is 0 when no more entries are available.
The output buffer contains the read array of #DirectoryEntry. This doesn't include entries for "." and "..".
GetEntryCount
Returns an u64 for the total number of readable entries.
DirectoryEntry
This is "nn::fs::DirectoryEntry".
Offset | Size | Description |
---|---|---|
0x0 | 0x301 | Path |
0x301 | 0x1 | File attributes (bit 0 = is directory; bit 1 = archive bit) |
0x302 | 0x2 | Padding? |
0x304 | 0x1 | #DirectoryEntryType |
0x305 | 0x3 | Padding? |
0x308 | 0x8 | Filesize, 0 for directories. |
DirectoryEntryType
This is "nn::fs::DirectoryEntryType".
An s8 value indicating a directory entry type. The current values are:
Value | Description |
---|---|
0 | Directory |
1 | File |
IFile
This is "nn::fssrv::sf::IFile".
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".
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".
IsSdCardInserted
No input. Returns an output bool.
GetSdCardSpeedMode
No input. Returns an output #SdCardSpeedMode.
GetSdCardCid
Takes a type-0x6 output buffer and an input s64 BufferSize. No output.
GetSdCardUserAreaSize
No input. Returns an output s64 SdCardUserAreaSize.
GetSdCardProtectedAreaSize
No input. Returns an output s64 SdCardProtectedAreaSize.
GetAndClearSdCardErrorInfo
Takes a type-0x6 output buffer LogBuffer and an input s64 LogBufferSize. Returns an output #StorageErrorInfo and an output s64 LogSize.
GetSdCardHostControllerStatus
No input. Returns an output #HostControllerStatus.
GetMmcCid
Takes a type-0x6 output buffer and an input s64 BufferSize. No output.
GetMmcSpeedMode
No input. Returns an output #MmcSpeedMode.
EraseMmc
Takes an input #MmcPartition. No output.
GetMmcPartitionSize
Takes an input #MmcPartition. Returns an output s64 MmcPartitionSize.
GetMmcPatrolCount
No input. Returns an output u32 MmcPatrolCount.
GetAndClearMmcErrorInfo
Takes a type-0x6 output buffer LogBuffer and an input s64 LogBufferSize. Returns an output #StorageErrorInfo and an output s64 LogSize.
GetMmcExtendedCsd
Takes a type-0x6 output buffer and an input s64 BufferSize. No output.
SuspendMmcPatrol
No input/output.
ResumeMmcPatrol
No input/output.
EraseMmcWithRange
Takes an input #MmcPartition and two input u64s. No output.
IsGameCardInserted
No input. Returns an output bool.
EraseGameCard
Takes an input #GameCardSize and an input u64 NormalAreaSize. No output.
GetGameCardHandle
No input. Returns an output #GameCardHandle.
GetGameCardUpdatePartitionInfo
Takes an input #GameCardHandle. Returns an output #GameCardUpdatePartitionInfo.
FinalizeGameCardDriver
No input/output.
GetGameCardAttribute
Takes an input #GameCardHandle. Returns an output #GameCardAttribute.
GetGameCardDeviceCertificate
Takes a type-0x6 output buffer, an input s64 BufferSize and an input #GameCardHandle. No output.
[19.0.0+] Now returns an output s64 OutSize which can be 0x200 or 0x400.
GetGameCardAsicInfo
Takes a type-0x5 input buffer FwBuffer, a type-0x6 output buffer containing #RmaInformation and two input s64s FwBufferSize and RmaInformationSize. No output.
GetGameCardIdSet
Takes a type-0x6 output buffer containing a #GameCardIdSet and an input s64 BufferSize. No output.
WriteToGameCardDirectly
Takes a type-0x6 output buffer and two input s64s Offset and BufferSize. No output.
SetVerifyWriteEnalbleFlag
Takes an input bool. No output.
GetGameCardImageHash
Takes a type-0x6 output buffer, an input s64 BufferSize and an input #GameCardHandle. No output.
GetGameCardDeviceIdForProdCard
Takes a type-0x5 input buffer CardHeaderForDev, a type-0x6 output buffer and two input s64s CardHeaderForDevSize and BufferSize. No output.
EraseAndWriteParamDirectly
Takes a type-0x5 input buffer and an input s64 BufferSize. No output.
ReadParamDirectly
Takes a type-0x6 output buffer and an input s64 BufferSize. No output.
ForceEraseGameCard
No input/output.
GetGameCardErrorInfo
No input. Returns an output #GameCardErrorInfo.
GetGameCardErrorReportInfo
No input. Returns an output #GameCardErrorReportInfo.
GetGameCardDeviceId
Takes a type-0x6 output buffer and an input s64 BufferSize. No output.
ChallengeCardExistence
Takes a type-0x6 output buffer, two type-0x5 input buffers and an input #GameCardHandle. No output.
[9.0.0+] The account system module uses this as part of a new challenge-response mechanism for 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.
IEventNotifier
This is "nn::fssrv::sf::IEventNotifier".
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.
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.
SetKeyPackage
No input/output, takes a type-0x5 input buffer.
OpenSaveDataExporterAndGetEncryptedKey
Takes a total of 0x10-bytes of input and a type-0x1A output buffer to receive a RsaEncryptedKey. Returns an #ISaveDataDivisionExporter.
PrepareOpenSaveDataImporter
Takes a type-0x1A output buffer to receive a RsaEncryptedKey.
OpenSaveDataImporter
Takes a total of 0x18-bytes of input and two type-0x5 input buffers, returns an #ISaveDataDivisionImporter.
OpenSaveDataImporter2
Takes a total of 0x18-bytes of input and a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.
OpenSaveDataExporterWithKey
Takes a total of 0x20-bytes of input, returns an #ISaveDataDivisionExporter.
OpenSaveDataImporterWithKey
Takes a total of 0x28-bytes of input and a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.
[17.0.0+] Now only takes 0x18-bytes of input and an additional type-0x5 input buffer.
ISaveDataMover
This is "nn::fssrv::sf::ISaveDataMover".
This was added with 10.0.0.
Cmd | Name |
---|---|
8 | #Register |
16 | #Process |
18 | #Cancel |
Register
Takes an input u64, no output.
Process
Takes an input u64, returns an output u64.
Cancel
No input/output.
ISaveDataTransferManagerForRepair
This is "nn::fssrv::sf::ISaveDataTransferManagerForRepair".
This was added with 11.0.0.
Cmd | Name |
---|---|
80 | #OpenSaveDataExporter |
90 | #OpenSaveDataImporter |
OpenSaveDataExporter
Takes a total of 0x10-bytes of input, returns an #ISaveDataDivisionExporter.
OpenSaveDataImporter
Takes 1-byte of input, a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.
ISaveDataExporter
This is "nn::fssrv::sf::ISaveDataExporter".
This was added with 4.0.0.
Cmd | Name |
---|---|
0 | #GetSaveDataInfo |
1 | #GetRestSize |
16 | #Pull |
17 | #PullInitialData |
GetSaveDataInfo
No input/output, takes a type-0x1A #SaveDataInfo output buffer.
The actual name for this is the SaveDataExporter constructor. This is used automatically after #OpenSaveDataExporter by official sw.
GetRestSize
No input, returns an output u64.
Pull
Takes a type-0x6 output buffer, returns an output u64.
PullInitialData
No input/output, takes a type-0x6 output buffer.
ISaveDataImporter
This is "nn::fssrv::sf::ISaveDataImporter".
This was added with 4.0.0.
Cmd | Name |
---|---|
0 | #GetSaveDataInfo |
1 | #GetRestSize |
16 | #Push |
17 | #Finalize |
GetSaveDataInfo
No input/output, takes a type-0x1A #GetSaveDataInfo output buffer.
The actual name for this is the SaveDataImporter constructor. This is used automatically after #OpenSaveDataImporter by official sw.
GetRestSize
No input, returns an output u64.
Push
No input/output, takes a type-0x5 input buffer.
Finalize
No input/output.
ISaveDataTransferManagerWithDivision
This is "nn::fssrv::sf::ISaveDataTransferManagerWithDivision".
This was added with 5.0.0.
Cmd | Name |
---|---|
0 | #GetChallenge |
8 | [18.0.0+] SetMode |
9 | [18.0.0+] SetAttribute |
16 | #SetKeySeedPackage |
32 | #OpenSaveDataExporter |
33 | #OpenSaveDataExporterForDiffExport |
34 | [6.0.0+] #OpenSaveDataExporterByContext |
63 | [17.0.0+] OpenSaveDataImporter |
64 | [6.0.0-17.0.1] #OpenSaveDataImporterDeprecated ([5.0.0-5.1.0] OpenSaveDataImporter) |
65 | [5.0.0-17.0.1] #OpenSaveDataImporterForDiffImport |
66 | [6.0.0-17.0.1] #OpenSaveDataImporterForDuplicateDiffImport |
67 | [6.0.0-16.1.0] #OpenSaveDataImporter |
68 | [6.0.0+] #OpenSaveDataImporterByContext |
69 | [6.0.0+] #CancelSuspendingImport |
70 | [10.0.0+] CancelSuspendingImportByAttribute |
80 | [11.0.0+] SwapSecondary |
GetChallenge
No input/output, takes a type-0x6 output buffer containing the Challenge.
SetKeySeedPackage
No input/output, takes a type-0x5 input buffer containing the KeySeedPackage.
OpenSaveDataExporter
Takes an input u8 #SaveDataSpaceId and u64. Returns an #ISaveDataDivisionExporter.
OpenSaveDataExporterForDiffExport
Takes an input u8 #SaveDataSpaceId, an u64, and a type-0x5 input buffer #InitialDataVersion2. Returns an #ISaveDataDivisionExporter.
OpenSaveDataExporterByContext
No input/output, takes a type-0x5 input buffer, returns an #ISaveDataDivisionExporter.
OpenSaveDataImporterDeprecated
Takes an input u8 #SaveDataSpaceId, a 0x10-byte userID, and a type-0x5 input buffer #InitialDataVersion2. Returns an #ISaveDataDivisionImporter.
OpenSaveDataImporterForDiffImport
Takes an input u8 #SaveDataSpaceId, an u64, and a type-0x5 input buffer #InitialDataVersion2, returns an #ISaveDataDivisionImporter.
OpenSaveDataImporterForDuplicateDiffImport
Takes an input u8 and an u64, and a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.
OpenSaveDataImporter
Takes an input u8, an u8(bool), a 0x10-byte struct, and a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.
OpenSaveDataImporterByContext
No input/output, takes a type-0x5 input buffer, returns an #ISaveDataDivisionImporter.
CancelSuspendingImport
Takes an input u64 and a 0x10-byte struct, no output.
ISaveDataDivisionExporter
This is "nn::fssrv::sf::ISaveDataDivisionExporter".
This was added with 5.0.0.
Cmd | Name |
---|---|
0 | #SetDivisionCount |
1 | [6.0.0+] #ReadSaveDataExtraData |
16 | #OpenSaveDataDiffChunkIterator |
48 | #OpenSaveDataChunkExporter |
64 | [6.0.0-8.1.0] #FinalizeFullExport |
65 | [6.0.0-8.1.0] #FinalizeDiffExport |
66 | [6.0.0+] #CancelExport |
67 | [6.0.0+] #SuspendExport |
70 | [6.0.0-17.0.1] #GetKeySeed |
71 | [6.0.0+] #GetInitialDataMac |
72 | [6.0.0+] #FinalizeExport |
73 | [9.0.0+] #GetInitialDataMacKeyGeneration |
74 | [18.0.0+] #GetKeySeed |
80 | [6.0.0+] #GetImportInitialDataAad |
81 | [6.0.0+] #SetExportInitialDataAad |
96 | [6.0.0+] #GetReportInfo |
SetDivisionCount
Takes an input u32, no output.
OpenSaveDataChunkExporter
Takes an input u32, returns an #ISaveDataChunkExporter.
FinalizeFullExport
No input, returns two 0x10-byte output structs.
FinalizeDiffExport
No input, returns an output 0x10-byte struct.
CancelExport
No input/output.
SuspendExport
No input/output, takes a type-0x6 output buffer.
GetKeySeed
No input, returns an output 0x10-byte struct.
GetInitialDataMac
No input, returns an output 0x10-byte struct.
FinalizeExport
No input/output.
SetExportInitialDataAad
Takes an input 0x20-byte struct, no output.
ISaveDataDivisionImporter
This is "nn::fssrv::sf::ISaveDataDivisionImporter".
This was added with 5.0.0.
Cmd | Name |
---|---|
0 | [6.0.0+] #ReadSaveDataExtraData |
16 | #OpenSaveDataDiffChunkIterator |
32 | #InitializeImport |
33 | #FinalizeImport |
34 | [6.0.0+] #CancelImport |
35 | [6.0.0+] #GetImportContext |
36 | [6.0.0+] #SuspendImport |
37 | [11.0.0+] FinalizeImportWithoutSwap |
48 | #OpenSaveDataChunkImporter |
64 | [6.0.0+] #GetImportInitialDataAad |
80 | [6.0.0+] #GetReportInfo |
ReadSaveDataExtraData
No input/output, takes a type-0x6 output buffer.
OpenSaveDataDiffChunkIterator
No input, returns an #ISaveDataChunkIterator.
InitializeImport
No input, returns an output u64.
FinalizeImport
No input/output.
CancelImport
No input/output.
GetImportContext
No input/output, takes a type-0x6 output buffer.
SuspendImport
No input/output.
OpenSaveDataChunkImporter
Takes an input u32, returns an #ISaveDataChunkImporter.
GetImportInitialDataAad
No input, returns an output 0x20-byte struct.
GetReportInfo
No input, returns an output 0x20-byte struct.
ISaveDataChunkIterator
This is "nn::fssrv::sf::ISaveDataChunkIterator".
This was added with 5.0.0.
Cmd | Name |
---|---|
0 | #Next |
1 | #IsEnd |
16 | #GetId |
Next
No input/output.
IsEnd
No input, returns an output u8.
GetId
No input, returns an output u32.
ISaveDataChunkExporter
This is "nn::fssrv::sf::ISaveDataChunkExporter".
This was added with 5.0.0.
Cmd | Name |
---|---|
0 | #Pull |
16 | [6.0.0+] #GetRestRawDataSize |
Pull
Takes an input u64 and a type-0x6 output buffer, returns an output u64.
GetRestRawDataSize
No input, returns an output u64.
ISaveDataChunkImporter
This is "nn::fssrv::sf::ISaveDataChunkImporter".
This was added with 5.0.0.
Cmd | Name |
---|---|
0 | #Push |
Push
Takes an input u64 and a type-0x5 input buffer, no output.
ISaveDataTransferProhibiter
This is "nn::fssrv::sf::ISaveDataTransferProhibiter".
This was added with [6.0.0+].
This doesn't seem to handle any commands (?).
IMultiCommitManager
This is "nn::fssrv::sf::IMultiCommitManager".
This was added with [6.0.0+].
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.
Cmd | Name |
---|---|
0 | Startup |
16 | Process |
Startup
No input. Returns an u64.
Process
No input. Returns an u64.
IStorageDeviceManager
This is "nn::fssrv::storage::sf::IStorageDeviceManager".
Cmd | Name |
---|---|
N/A | IsInserted |
N/A | IsHandleValid |
N/A | OpenDetectionEvent |
N/A | OpenOperator |
N/A | OpenDevice |
N/A | OpenStorage |
N/A | Invalidate |
IStorageDeviceOperator
This is "nn::fssrv::storage::sf::IStorageDeviceOperator".
Cmd | Name |
---|---|
N/A | Operate |
N/A | OperateIn |
N/A | OperateOut |
N/A | OperateOut2 |
N/A | OperateInOut |
N/A | OperateIn2Out |
IStorageDevice
This is "nn::fssrv::storage::sf::IStorageDevice".
Cmd | Name |
---|---|
N/A | GetHandle |
N/A | IsHandleValid |
N/A | OpenOperator |
N/A | Read |
N/A | Write |
N/A | Flush |
N/A | SetSize |
N/A | GetSize |
N/A | OperateRange |
FileSystemProxyType
This is "nn::fs::FileSystemProxyType".
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".
Value | Name |
---|---|
0 | Meta |
1 | Control |
2 | Manual |
3 | Logo |
4 | Data |
ContentAttributes
This is "nn::fs::ContentAttributes".
Value | Name |
---|---|
0 | None |
15 | All |
ContentStorageId
This is "nn::fs::ContentStorageId".
Value | Name |
---|---|
0 | System |
1 | User |
2 | SdCard |
3 | [16.0.0+] System0 |
SaveDataSpaceId
This is "nn::fs::SaveDataSpaceId".
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".
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".
Value | Name |
---|---|
0 | Primary |
1 | Secondary |
SaveDataEnumerateOption
This is "nn::fs::SaveDataEnumerateOption".
Value | Name |
---|---|
1 | AllRank |
SaveDataFlags
This is "nn::fs::SaveDataFlags".
Value | Name |
---|---|
1 | KeepAfterResettingSystemSaveData |
2 | KeepAfterRefurbishment |
4 | KeepAfterResettingSystemSaveDataWithoutUserSaveData |
8 | NeedsSecureDelete |
SaveDataMetaType
This is "nn::fs::SaveDataMetaType".
Value | Name |
---|---|
0 | None |
1 | Thumbnail |
2 | ExtensionContext |
ImageDirectoryId
This is "nn::fs::ImageDirectoryId".
Value | Name |
---|---|
0 | Nand |
1 | SdCard |
CloudBackupWorkStorageId
This is "nn::fs::CloudBackupWorkStorageId".
Value | Name |
---|---|
0 | Nand |
1 | SdCard |
CustomStorageId
This is "nn::fs::CustomStorageId".
Value | Name |
---|---|
0 | System |
1 | SdCard |
Priority
This is "nn::fs::Priority".
Value | Name |
---|---|
0 | Realtime |
1 | Normal |
2 | Low |
PriorityRaw
This is "nn::fs::PriorityRaw".
Value | Name |
---|---|
0 | Realtime |
1 | Normal |
2 | Low |
3 | Background |
AbortSpecifier
This is "nn::fs::AbortSpecifier".
Value | Name |
---|---|
0 | Default |
1 | Abort |
2 | ReturnResult |
OperationId
This is "nn::fs::OperationId".
Value | Name |
---|---|
0 | Clear |
1 | ClearSignature |
2 | InvalidateCache |
3 | QueryRange |
MountHostOption
This is "nn::fs::MountHostOption".
Value | Name |
---|---|
1 | PseudoCaseSensitive |
BisPartitionId
This is "nn::fs::BisPartitionId".
Value | Name |
---|---|
0 | BootPartition1Root |
10 | BootPartition2Root |
20 | UserDataRoot |
21 | BootConfigAndPackage2Part1 |
22 | BootConfigAndPackage2Part2 |
23 | BootConfigAndPackage2Part3 |
24 | BootConfigAndPackage2Part4 |
25 | BootConfigAndPackage2Part5 |
26 | BootConfigAndPackage2Part6 |
27 | CalibrationBinary |
28 | CalibrationFile |
29 | SafeMode |
30 | User |
31 | System |
32 | SystemProperEncryption |
33 | SystemProperPartition |
34 | SignedSystemPartitionOnSafeMode |
35 | [16.0.0+] DeviceTreeBlob |
36 | [16.0.0+] System0 |
SdCardSpeedMode
This is "nn::fs::SdCardSpeedMode".
Value | Name |
---|---|
0 | Identification |
1 | DefaultSpeed |
2 | HighSpeed |
3 | Sdr12 |
4 | Sdr25 |
5 | Sdr50 |
6 | Sdr104 |
7 | Ddr50 |
8 | Unknown |
MmcSpeedMode
This is "nn::fs::MmcSpeedMode".
Value | Name |
---|---|
0 | Identification |
1 | LegacySpeed |
2 | HighSpeed |
3 | Hs200 |
4 | Hs400 |
5 | Unknown |
MmcPartition
This is "nn::fs::MmcPartition".
Value | Name |
---|---|
0 | UserData |
1 | BootPartition1 |
2 | BootPartition2 |
HostControllerStatus
This is "nn::sdcard::HostControllerStatus".
Offset | Size | Description |
---|---|---|
0x0 | 0xC |
MemoryReportInfo
This is "nn::fs::MemoryReportInfo".
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | PooledBufferFreeSizePeak |
0x8 | 0x8 | PooledBufferRetriedCount |
0x10 | 0x8 | PooledBufferReduceAllocationCount |
0x18 | 0x8 | BufferManagerFreeSizePeak |
0x20 | 0x8 | BufferManagerRetriedCount |
0x28 | 0x8 | ExpHeapFreeSizePeak |
0x30 | 0x8 | BufferPoolFreeSizePeak |
0x38 | 0x8 | PatrolReadAllocateBufferSuccessCount |
0x40 | 0x8 | PatrolReadAllocateBufferFailureCount |
0x48 | 0x8 | BufferManagerTotalAllocatableSizePeak |
0x50 | 0x8 | BufferPoolAllocateSizeMax |
0x58 | 0x8 | PooledBufferFailedIdealAllocationCountOnAsyncAccess |
0x60 | 0x20 | Reserved |
StorageErrorInfo
This is "nn::fs::StorageErrorInfo".
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | NumActivationFailures |
0x4 | 0x4 | NumActivationErrorCorrections |
0x8 | 0x4 | NumReadWriteFailures |
0xC | 0x4 | NumReadWriteErrorCorrections |
GameCardErrorInfo
This is "nn::fs::GameCardErrorInfo".
Offset | Size | Description |
---|---|---|
0x0 | 0x2 | GameCardCrcErrorCount |
0x2 | 0x2 | Reserved |
0x4 | 0x2 | AsicCrcErrorCount |
0x6 | 0x2 | Reserved |
0x8 | 0x2 | RefreshCount |
0xA | 0x2 | Reserved |
0xC | 0x2 | ReadRetryCount |
0xE | 0x2 | TimeoutRetryErrorCount |
GameCardErrorReportInfo
This is "nn::fs::GameCardErrorReportInfo".
Offset | Size | Description |
---|---|---|
0x0 | 0x10 | ErrorInfo |
0x10 | 0x2 | AsicReinitializeFailureDetail |
0x12 | 0x2 | InsertionCount |
0x14 | 0x2 | RemovalCount |
0x16 | 0x2 | AsicReinitializeCount |
0x18 | 0x4 | AsicInitializeCount |
0x1C | 0x2 | AsicReinitializeFailureCount |
0x1E | 0x2 | AwakenFailureCount |
0x20 | 0x2 | Reserved |
0x22 | 0x2 | RefreshCount |
0x24 | 0x4 | LastReadErrorPageAddress |
0x28 | 0x4 | LastReadErrorPageCount |
0x2C | 0x4 | AwakenCount |
0x30 | 0x4 | ReadCountFromInsert |
0x34 | 0x4 | ReadCountFromAwaken |
0x38 | 0x8 | Reserved |
GameCardHandle
This is "nn::fs::GameCardHandle". This is an u32.
GameCardPartition
This is "nn::fs::GameCardPartition".
Value | Name |
---|---|
0 | Update |
1 | Normal |
2 | Secure |
3 | [4.0.0+] Logo |
GameCardPartitionRaw
This is "nn::fs::GameCardPartitionRaw".
Value | Name |
---|---|
0 | NormalReadOnly |
1 | SecureReadOnly |
2 | RootWriteOnly |
GameCardAttribute
This is "nn::fs::GameCardAttribute".
Value | Name |
---|---|
1 | AutoBootFlag |
2 | HistoryEraseFlag |
4 | [4.0.0+] RepairToolFlag |
8 | [9.0.0+] DifferentRegionCupToTerraDeviceFlag |
16 | [9.0.0+] DifferentRegionCupToGlobalDeviceFlag |
GameCardAttribute2
This is "nn::fs::GameCardAttribute2".
GameCardSize
This is "nn::fs::GameCardSize".
Value | Name |
---|---|
1 | Size1GB |
2 | Size2GB |
4 | Size4GB |
8 | Size8GB |
16 | Size16GB |
32 | Size32GB |
GameCardClockRate
This is "nn::fs::GameCardClockRate".
Value | Name |
---|---|
25 | ClockRate25MHz |
50 | ClockRate50MHz |
GameCardCompatibilityType
This is "nn::fs::GameCardCompatibilityType".
Value | Name |
---|---|
0 | Global |
1 | China |
GameCardUpdatePartitionInfo
This is "nn::fs::GameCardUpdatePartitionInfo".
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Version |
0x4 | 0x4 | Reserved |
0x8 | 0x8 | Id |
GameCardIdSet
This is "nn::gc::GameCardIdSet".
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Id1 |
0x4 | 0x4 | Id2 |
0x8 | 0x4 | Id3 |
CardId1
This is "nn::gc::detail::CardId1".
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | MakerCode |
0x1 | 0x1 | MemoryCapacity |
0x2 | 0x1 | Reserved |
0x3 | 0x1 | MemoryType |
CardId2
This is "nn::gc::detail::CardId2".
Offset | Size | Description |
---|---|---|
0x0 | 0x1 | CardSecurityNumber |
0x1 | 0x1 | CardType |
0x2 | 0x2 | Reserved |
CardId3
This is "nn::gc::detail::CardId3".
Offset | Size | Description |
---|---|---|
0x0 | 0x4 | Reserved |
MakerCodeForCardId1
This is "nn::gc::detail::MakerCodeForCardId1".
Value | Name |
---|---|
0xC2 | MegaChips |
0xAE | Lapis |
0x36 |
MemoryCapacity
This is "nn::gc::detail::MemoryCapacity".
Value | Name |
---|---|
0xFA | 1GB |
0xF8 | 2GB |
0xF0 | 4GB |
0xE0 | 8GB |
0xE1 | 16GB |
0xE2 | 32GB |
RmaInformation
This is "nn::gc::RmaInformation". This is a 0x200-byte struct.
GameCardCardHeader
This is a 0x600-byte struct.
Offset | Size | Description |
---|---|---|
0x0 | 0x100 | Signature |
0x100 | 0x100 | Header |
0x200 | 0x400 | NewCardHeaderCertArea |
SimulatingDeviceType
This is "nn::fs::SimulatingDeviceType".
Value | Name |
---|---|
0 | eMMC |
1 | SdCard |
2 | GameCard |
SimulatingDeviceDetectionMode
This is "nn::fs::SimulatingDeviceDetectionMode".
Value | Name |
---|---|
0 | NoSimulation |
1 | DeviceAttached |
2 | DeviceRemoved |
SimulatingDeviceAccessFailureEventType
This is "nn::fs::SimulatingDeviceAccessFailureEventType".
Value | Name |
---|---|
0 | None |
1 | AccessTimeoutFailure |
2 | AccessFailure |
3 | DataCorruption |
SimulatingDeviceTargetOperation
This is "nn::fs::SimulatingDeviceTargetOperation".
Value | Name |
---|---|
1 | Read |
2 | Write |
SpeedEmulationMode
This is "nn::fs::SpeedEmulationMode".
Value | Name |
---|---|
0 | None |
1 | Faster |
2 | Slower |
3 | Random |
FspPath
This is "nn::fssrv::sf::FspPath". This is a 0x301-byte string.
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".
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | ApplicationId (0 for SystemSaveData) SaveData: 0 can be used for accessing the savedata associated with the current FS session ApplicationId, otherwise when set this is the ApplicationId associated with the savedata to access. |
0x8 | 0x10 | UserId For user-specific savedata(saveuser) when set, otherwise when zero this indicates the common savedata(savecommon). This is loaded from Account_services. |
0x18 | 0x8 | SystemSaveDataId (0 for SaveData) |
0x20 | 0x1 | #SaveDataType |
0x21 | 0x1 | #SaveDataRank |
0x22 | 0x2 | SaveDataIndex |
0x24 | 0x4 | Padding |
0x28 | 0x8 | 0 for SystemSaveData/SaveData. |
0x30 | 0x8 | 0 for SystemSaveData/SaveData. |
0x38 | 0x8 | 0 for SystemSaveData/SaveData. |
Total size is 0x40-bytes.
For DeviceSaveData, this struct is all-zero except for the #SaveDataType field (and optionally the ApplicationId if specified).
SaveDataCreationInfo
This is "nn::fs::SaveDataCreationInfo".
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | SaveDataSize |
0x8 | 0x8 | JournalSize |
0x10 | 0x8 | AvailableSize 0x4000 for SystemSaveData/SaveData/DeviceSaveData/BcatSaveData. |
0x18 | 0x8 | OwnerId 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 ProgramId of the bcat-sysmodule. |
0x20 | 0x4 | #SaveDataFlags Written using an input param for official user-processes. Hard-coded 0 for BcatSaveData. |
0x24 | 0x1 | #SaveDataSpaceId 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 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".
Offset | Size | Description |
---|---|---|
0x0 | 0x8 | SaveDataId |
0x8 | 0x1 | #SaveDataSpaceId |
0x9 | 0x1 | #SaveDataType |
0xA | 0x6 | Padding? |
0x10 | 0x10 | UserId |
0x20 | 0x8 | SystemSaveDataId (0 for regular SaveData) |
0x28 | 0x8 | ApplicationId (for regular SaveData) |
0x30 | 0x8 | Raw saveimage size |
0x38 | 0x2 | SaveDataIndex |
0x3A | 0x1 | #SaveDataRank |
0x3B | 0x25 | Unknown. Usually zeros? |
This is a 0x60-byte struct.
SaveDataFileSystemExtraData
This is a 0x200-byte struct. Appears to match Savegames#Extra_data.
InitialDataVersion2
This is a 0x8210-byte struct used by #ISaveDataTransferManagerWithDivision.