Filesystem services: Difference between revisions
(24 intermediate revisions by 3 users not shown) | |||
Line 16: | Line 16: | ||
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | ||
[10.0.0+] | [10.0.0+] Now takes an additional type-0x1A output buffer. | ||
[16.0.0+] | [16.0.0+] Now takes an additional input [[#ContentAttributes]]. | ||
[17.0.0+] | [17.0.0+] Now takes a type-0x6 output buffer instead of a type-0x1A output buffer. | ||
[20.0.0+] Now no longer takes a type-0x19 input buffer containing a [[#FspPath]] and instead takes an input [[NCM_services#StorageId|StorageId]]. | |||
== IsArchivedProgram == | == IsArchivedProgram == | ||
Line 45: | Line 47: | ||
== RegisterProgram == | == RegisterProgram == | ||
Takes | Takes an input [[NCM_services#StorageId|StorageId]], an input u64 ProcessId, an input [[NCM_services#ProgramId|ProgramId]], a type-0x5 input buffer containing an [[NPDM#ACID|ACID]] [[NPDM#FsAccessControl|FsAccessControl]], and a type-0x5 input buffer containing an [[NPDM#ACI0|ACI0]] [[NPDM#FsAccessControl|FsAccessControl]]. | ||
Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid. | Final FS permissions are stored as (ACI0_perms & ACID_perms). Will panic(svcBreak) when buffer sizes from ipc-rawdata are invalid. | ||
[20.0.0+] Now takes an additional input [[#FsAccessControlRestrictionMode]]. | |||
== UnregisterProgram == | == UnregisterProgram == | ||
Takes | Takes an input u64 ProcessId. No output. | ||
Removes registered FS permissions for that PID. | |||
== SetEnabledProgramVerification == | == SetEnabledProgramVerification == | ||
Takes an input bool. No output. | |||
When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort. | When the flag is zero, it will set ret=0 instead of ret={error} when verifying the fixed-key [[NPDM]] ACID signature fails. This also skips verifying the [[NCA_Format|NCA Header]] signature using the ACID key. Note that if verifying the fixed-key ACID signature is successful, and verifying the ACID-key NCA header signature fails, it will throw an error and abort. | ||
Line 125: | Line 131: | ||
|- | |- | ||
| 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2 | | 37 || [14.0.0+] CreateSaveDataFileSystemWithCreationInfo2 | ||
|- | |||
| 38 || [20.0.0+] DetachSdCard | |||
|- | |- | ||
| 51 || [[#OpenSaveDataFileSystem]] | | 51 || [[#OpenSaveDataFileSystem]] | ||
Line 209: | Line 217: | ||
|- | |- | ||
| 501 || [[#OpenGameCardDetectionEventNotifier]] | | 501 || [[#OpenGameCardDetectionEventNotifier]] | ||
|- | |||
| 502 || [20.0.0+] OpenSdCardAwakenReadyEventNotifier | |||
|- | |- | ||
| 503 || [19.0.0+] OpenGameCardAwakenReadyEventNotifier | | 503 || [19.0.0+] OpenGameCardAwakenReadyEventNotifier | ||
Line 265: | Line 275: | ||
|- | |- | ||
| 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid | | 640 || [4.0.0-7.0.1] IsSignedSystemPartitionOnSdCardValid | ||
|- | |||
| 651 || [S2] | |||
|- | |||
| 660 || [S2] | |||
|- | |- | ||
| 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]] | | 700 || [5.0.0+] [[#OpenAccessFailureDetectionEventNotifier]] | ||
Line 341: | Line 355: | ||
Note that the functions check whether or not at least one bit is set in the mask. This means that, you don't need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000. | Note that the functions check whether or not at least one bit is set in the mask. This means that, you don't need to set 0xFFFFFFFFFFFFFFFF to get all permissions: it suffices to set 0x8000000000000000. | ||
If nn::spl::IsDebugMode() is disabled (retail behavior), the FS sysmodule masks the permission descriptor with 0x3FFFFFFFFFFFFFFF upon process registration. | |||
If the code were to request an invalid input type, panic. But this never happens. | If the code were to request an invalid input type, panic. But this never happens. | ||
Line 439: | Line 455: | ||
| [6.0.0+] 0x2B || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]] | | [6.0.0+] 0x2B || CanMountRegisteredUpdatePartition || 0x8000000000010000 || R- || [[#OpenRegisteredUpdatePartition]] | ||
|- | |- | ||
| [7.0.0+] 0x2C || CanOpenSaveDataInternalStorage || 0x8000000000000000 || RW || [[#OpenSaveDataInternalStorageFileSystem]] | | [7.0.0+] 0x2C || CanOpenSaveDataInternalStorage || [-19.0.0] 0x8000000000000000 [20.0.0+] 0x8000000000000020 || RW || [[#OpenSaveDataInternalStorageFileSystem]] | ||
|- | |- | ||
| [7.0.0+] 0x2D || CanMountTemporaryDirectory || 0xC000000000000000 || RW || | | [7.0.0+] 0x2D || CanMountTemporaryDirectory || 0xC000000000000000 || RW || | ||
Line 449: | Line 465: | ||
=== Call === | === Call === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! OperationType || Name || Mask || Used by | ||
|- | |- | ||
| 0x0 || | | 0x0 || CanInvalidateBisCache || 0x8000000000000080 || [[#InvalidateBisCache]] | ||
|- | |- | ||
| 0x1 || | | 0x1 || CanEraseMmc || 0x8000000000000080 || EraseMmc | ||
|- | |- | ||
| 0x2 || | | [20.0.0+] 0x2 || || 0x8000100000000080 || | ||
|- | |- | ||
| 0x3 || | | [-19.0.0] 0x2 [20.0.0+] 0x3 || CanGetGameCardDeviceCertificate || 0x8000000000000010 || GetGameCardDeviceCertificate | ||
|- | |- | ||
| 0x4 || | | [-19.0.0] 0x3 [20.0.0+] 0x4 || CanGetGameCardIdSet || 0x8000000000000010 || GetGameCardIdSet | ||
|- | |- | ||
| 0x5 || | | [-19.0.0] 0x4 [20.0.0+] 0x5 || CanFinalizeGameCardDriver || 0x8000000000000200 || FinalizeGameCardDriver | ||
|- | |- | ||
| 0x6 || | | [-19.0.0] 0x5 [20.0.0+] 0x6 || CanGetGameCardAsicInfo || 0x8000000000000200 || GetGameCardAsicInfo | ||
|- | |- | ||
| 0x7 || | | [-19.0.0] 0x6 [20.0.0+] 0x7 || CanGetGameCardAsicCertificate || 0x8000000000000200 || GetGameCardAsicCertificate | ||
|- | |- | ||
| 0x8 || | | [20.0.0+] 0x8 || || 0x8000100000000080 || | ||
|- | |- | ||
| 0x9 || | | [20.0.0+] 0x9 || || 0x8000100000000080 || | ||
|- | |- | ||
| 0xA || | | [20.0.0+] 0xA || || 0x8000080000000000 || | ||
|- | |- | ||
| 0xB || | | [20.0.0+] 0xB || || 0x8000000000000010 || | ||
|- | |- | ||
| 0xC || | | [20.0.0+] 0xC || || 0x8000100000000080 || | ||
|- | |- | ||
| 0xD || | | [-19.0.0] 0x7 [20.0.0+] 0xD || CanCreateSaveData || 0x8000000000002020 || [[#CreateSaveDataFileSystem]] | ||
|- | |- | ||
| 0xE || | | [-19.0.0] 0x8 [20.0.0+] 0xE || CanDeleteSaveData || 0x8000000000000060 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion | ||
|- | |- | ||
| 0xF || | | [-19.0.0] 0x9 [20.0.0+] 0xF || CanCreateSystemSaveData || 0x8000000000000028 || CreateSaveDataFileSystemBySystemSaveDataId | ||
|- | |- | ||
| 0x10 || | | [-19.0.0] 0xA [20.0.0+] 0x10 || CanCreateOthersSystemSaveData || 0x8000000000000020 || CreateSaveDataFileSystemBySystemSaveDataId | ||
|- | |- | ||
| 0x11 || | | [-19.0.0] 0xB [20.0.0+] 0x11 || CanDeleteSystemSaveData || 0x8000000000004028 || [[#DeleteSaveDataFileSystem]], RegisterSaveDataFileSystemAtomicDeletion | ||
|- | |- | ||
| 0x12 || | | [-19.0.0] 0xC [20.0.0+] 0x12 || CanOpenSaveDataInfoReader || 0x8000000000000060 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | ||
|- | |- | ||
| 0x13 || | | [-19.0.0] 0xD [20.0.0+] 0x13 || CanOpenSaveDataInfoReaderForSystem || 0x8000000000004020 || [[#OpenSaveDataInfoReaderBySaveDataSpaceId]], [[#OpenSaveDataInfoReader]] | ||
|- | |- | ||
| 0x14 || | | [-19.0.0] 0xE [20.0.0+] 0x14 || CanOpenSaveDataInfoReaderForInternal || 0x8000000000000040 || [[#OpenSaveDataInfoReaderWithFilter]] | ||
|- | |- | ||
| 0x15 || | | [-19.0.0] 0xF [20.0.0+] 0x15 || CanOpenSaveDataMetaFile || 0x8000000000020000 || OpenSaveDataMetaFile | ||
|- | |- | ||
| 0x16 || | | [-19.0.0] 0x10 [20.0.0+] 0x16 || CanSetCurrentPosixTime || 0x8000000000000400 || SetCurrentPosixTime, SetCurrentPosixTimeWithTimeDifference | ||
|- | |- | ||
| 0x17 || | | [-19.0.0] 0x11 [20.0.0+] 0x17 || CanReadSaveDataFileSystemExtraData || 0x8000000000004060 || [[#ReadSaveDataFileSystemExtraData]] | ||
|- | |- | ||
| 0x18 || | | [-19.0.0] 0x12 [20.0.0+] 0x18 || CanSetGlobalAccessLogMode || 0x8000000000080000 || [[#SetGlobalAccessLogMode]] | ||
|- | |- | ||
| 0x19 || | | [-19.0.0] 0x13 [20.0.0+] 0x19 || CanSetSpeedEmulationMode || 0x8000000000080000 || SetSpeedEmulationMode | ||
|- | |- | ||
| 0x1A || | | [20.0.0+] 0x1A || || 0x8000000400080000 || | ||
|- | |- | ||
| 0x1B || | | [20.0.0+] 0x1B || || 0x8000000400080000 || | ||
|- | |- | ||
| 0x1C || | | [-19.0.0] 0x14 [20.0.0+] 0x1C || CanDebug || 0xC000000000000000 || | ||
|- | |- | ||
| 0x1D || | | [-19.0.0] 0x15 [20.0.0+] 0x1D || CanFillBis || 0xC000000000800000 || CreatePaddingFile, DeleteAllPaddingFiles | ||
|- | |- | ||
| 0x1E || | | [2.0.0-19.0.0] 0x16 [20.0.0+] 0x1E || CanCorruptSaveData || 0xC000000001000000 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId | ||
|- | |- | ||
| 0x1F || | | [2.0.0-19.0.0] 0x17 [20.0.0+] 0x1F || CanCorruptSystemSaveData || 0x8000000001000060 || CorruptSaveDataFileSystem, CorruptSaveDataFileSystemBySaveDataSpaceId | ||
|- | |- | ||
| 0x20 || | | [2.0.0-19.0.0] 0x18 [20.0.0+] 0x20 || CanVerifySaveData || 0x8000000000000060 || [[#VerifySaveDataFileSystem]], VerifySaveDataFileSystemBySaveDataSpaceId | ||
|- | |- | ||
| 0x21 || | | [2.0.0-19.0.0] 0x19 [20.0.0+] 0x21 || CanDebugSaveData || 0xC000000002000000 || [[#CreateSaveDataFileSystem]], [[#OpenSaveDataFileSystem]], [[#SetSaveDataRootPath]] | ||
|- | |- | ||
| 0x22 || | | [2.0.0-19.0.0] 0x1A [20.0.0+] 0x22 || CanFormatSdCard || 0x8000000004000000 || FormatSdCardFileSystem | ||
|- | |- | ||
| 0x23 || | | [3.0.0-19.0.0] 0x1B [20.0.0+] 0x23 || CanGetRightsId || 0x8000000008000000 || GetRightsId, GetRightsIdAndKeyGenerationByPath, GetRightsIdByPath | ||
|- | |- | ||
| 0x24 || | | [3.0.0-19.0.0] 0x1C [20.0.0+] 0x24 || CanRegisterExternalKey || 0x8000000010000000 || RegisterExternalKey, UnregisterAllExternalKey | ||
|- | |- | ||
| 0x25 || | | [4.0.0-19.0.0] 0x1D [20.0.0+] 0x25 || CanSetEncryptionSeed || 0x8000000000000800 || [[#SetSdCardEncryptionSeed]] | ||
|- | |- | ||
| 0x26 || | | [4.0.0-19.0.0] 0x1E [20.0.0+] 0x26 || CanWriteSaveDataFileSystemExtraDataTimeStamp || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
|- | |- | ||
| [ | | [4.0.0-19.0.0] 0x1F [20.0.0+] 0x27 || CanWriteSaveDataFileSystemExtraDataFlags || 0x8000000000004020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
|- | |- | ||
| [ | | [4.0.0-19.0.0] 0x20 [20.0.0+] 0x28 || CanWriteSaveDataFileSystemExtraDataCommitId || 0x8000000000000020 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
|- | |- | ||
| [ | | [5.0.0-19.0.0] 0x21 [20.0.0+] 0x29 || CanWriteSaveDataFileSystemExtraDataAll || 0x8000000000000000 || WriteSaveDataFileSystemExtraData, WriteSaveDataFileSystemExtraDataWithMask | ||
|- | |- | ||
| [5.0.0+] 0x2A || | | [5.0.0-19.0.0] 0x22 [20.0.0+] 0x2A || CanExtendSaveData || 0x8000000000002020 || ExtendSaveDataFileSystem | ||
|- | |- | ||
| [ | | [5.0.0-19.0.0] 0x23 [20.0.0+] 0x2B || CanExtendSystemSaveData || 0x8000000000000028 || ExtendSaveDataFileSystem | ||
|- | |- | ||
| [ | | [5.0.0-19.0.0] 0x24 [20.0.0+] 0x2C || CanExtendOthersSystemSaveData || 0x8000000000000020 || ExtendSaveDataFileSystem | ||
|- | |- | ||
| [ | | [5.0.0-19.0.0] 0x25 [20.0.0+] 0x2D || CanRegisterUpdatePartition || 0x8000000020000000 || RegisterUpdatePartition | ||
|- | |- | ||
| [ | | [5.0.0-19.0.0] 0x26 [20.0.0+] 0x2E || CanOpenSaveDataTransferManager || 0x8000000040000000 || [[#OpenSaveDataTransferManager]] | ||
|- | |- | ||
| [ | | [5.0.0-19.0.0] 0x27 [20.0.0+] 0x2F || CanOpenSaveDataTransferManagerVersion2 || 0x8000000200000000 || [[#OpenSaveDataTransferManagerVersion2]] | ||
|- | |- | ||
| [5.0.0-19.0.0] 0x28 [20.0.0+] 0x30 || CanOpenSaveDataTransferManagerForSaveDataRepair || 0x8000000200000000 || OpenSaveDataTransferManagerForSaveDataRepair | |||
|- | |- | ||
| | | [5.0.0-19.0.0] 0x29 [20.0.0+] 0x31 || CanOpenSaveDataTransferManagerForSaveDataRepairTool || 0x8000000000000000 || OpenSaveDataTransferManagerForSaveDataRepair | ||
|- | |- | ||
| | | [5.0.0-19.0.0] 0x2A [20.0.0+] 0x32 || CanOpenOpenSaveDataTransferProhibiter || 0x8000000200002000 || [[#OpenSaveDataTransferProhibiter]] | ||
|- | |- | ||
| [20.0.0+] | | [5.0.0-19.0.0] 0x2B [20.0.0+] 0x33 || CanOpenSaveDataMover || 0x8000001000000000 || [[#OpenSaveDataMover]] | ||
|- | |- | ||
| [-19.0.0] | | [5.0.0-19.0.0] 0x2C [20.0.0+] 0x34 || CanOpenBisWiper || 0x8000000000000800 || [[#OpenBisWiper]] | ||
|- | |- | ||
| [-19.0.0] | | [5.0.0-19.0.0] 0x2D [20.0.0+] 0x35 || CanListAccessibleSaveDataOwnerId || 0x8000000240002000 || [[#ListAccessibleSaveDataOwnerId]] | ||
|- | |- | ||
| [-19.0.0] | | [5.0.0-19.0.0] 0x2E [20.0.0+] 0x36 || CanControlMmcPatrol || 0x8000000000000000 || SuspendMmcPatrol, ResumeMmcPatrol | ||
|- | |- | ||
| [-19.0.0] | | [5.0.0-19.0.0] 0x2F [20.0.0+] 0x37 || CanOverrideSaveDataTransferTokenSignVerificationKey || 0x8000000000000000 || OverrideSaveDataTransferTokenSignVerificationKey | ||
|- | |- | ||
| [-19.0.0] | | [5.1.0-19.0.0] 0x30 [20.0.0+] 0x38 || CanOpenSdCardDetectionEventNotifier || 0x8000000080200000 || [[#OpenSdCardDetectionEventNotifier]] | ||
|- | |- | ||
| [20.0.0+] | | [20.0.0+] 0x39 || || 0x8000000000200000 || | ||
|- | |- | ||
| [20.0.0+] | | [6.0.0-19.0.0] 0x31 [20.0.0+] 0x3A || CanOpenGameCardDetectionEventNotifier || 0x8000000080000110 || [[#OpenGameCardDetectionEventNotifier]] | ||
|- | |- | ||
| [20.0.0+] | | [20.0.0+] 0x3B || CanOpenGameCardAwakenReadyEventNotifier || 0x8000000080000110 || OpenGameCardAwakenReadyEventNotifier | ||
|- | |- | ||
| [20.0.0+] | | [6.0.0-19.0.0] 0x32 [20.0.0+] 0x3C || CanOpenSystemDataUpdateEventNotifier || 0x8000000000100008 || OpenSystemDataUpdateEventNotifier | ||
|- | |- | ||
| [20.0.0+] | | [6.0.0-19.0.0] 0x33 [20.0.0+] 0x3D || CanNotifySystemDataUpdateEvent || 0x8000000000010000 || NotifySystemDataUpdateEvent | ||
|- | |- | ||
| [-19.0.0] | | [6.0.0-19.0.0] 0x34 [20.0.0+] 0x3E || CanOpenAccessFailureDetectionEventNotifier || 0x8000000100000000 || [[#OpenAccessFailureDetectionEventNotifier]] | ||
|- | |- | ||
| [-19.0.0] | | [6.0.0-19.0.0] 0x35 [20.0.0+] 0x3F || CanGetAccessFailureDetectionEvent || 0x8000000100000000 || GetAccessFailureDetectionEvent | ||
|- | |- | ||
| [-19.0.0] | | [6.0.0-19.0.0] 0x36 [20.0.0+] 0x40 || CanIsAccessFailureDetected || 0x8000000100000000 || IsAccessFailureDetected | ||
|- | |- | ||
| [-19.0.0] | | [6.0.0-19.0.0] 0x37 [20.0.0+] 0x41 || CanResolveAccessFailure || 0x8000000100000000 || ResolveAccessFailure | ||
|- | |- | ||
| [-19.0.0] | | [6.0.0-19.0.0] 0x38 [20.0.0+] 0x42 || CanAbandonAccessFailure || 0x8000000100000000 || AbandonAccessFailure | ||
|- | |- | ||
| [-19.0.0] | | [8.0.0-19.0.0] 0x39 [20.0.0+] 0x43 || CanQuerySaveDataInternalStorageTotalSize || 0x8000000040000000 || QuerySaveDataInternalStorageTotalSize | ||
|- | |- | ||
| [-19.0.0] | | [9.0.0-19.0.0] 0x3A [20.0.0+] 0x44 || CanGetSaveDataCommitId || 0x8000000200000020 || [[#GetSaveDataCommitId]] | ||
|- | |- | ||
| | | [20.0.0+] 0x45 || || 0x8000000000200000 || | ||
|- | |- | ||
| [-19.0.0] | | [9.0.0-19.0.0] 0x3B [20.0.0+] 0x46 || CanSetSdCardAccessibility || 0x8000000000200000 || SetSdCardAccessibility | ||
|- | |- | ||
| [-19.0.0] | | [9.0.0-19.0.0] 0x3C [20.0.0+] 0x47 || CanSimulateDevice || 0x4000000000000000 || SimulateDeviceDetectionEvent, SetSimulationEvent, ClearSimulationEvent | ||
|- | |- | ||
| [-19.0.0] | | [9.0.0-19.0.0] 0x3D [20.0.0+] 0x48 || CanCreateSaveDataWithHashSalt || 0x8000000000000000 || [[#CreateSaveDataFileSystem]], [[#CreateSaveDataFileSystemWithHashSalt]] | ||
|- | |- | ||
| [-19.0.0] | | [9.0.0-19.0.0] 0x3E [20.0.0+] 0x49 || CanRegisterProgramIndexMapInfo || 0x8000000400000000 || RegisterProgramIndexMapInfo | ||
|- | |- | ||
| [-19.0.0] | | [9.0.0-19.0.0] 0x3F [20.0.0+] 0x4A || CanChallengeCardExistence || 0x8000000000000010 || ChallengeCardExistence | ||
|- | |- | ||
| [20.0.0+] | | [9.0.0-19.0.0] 0x40 [20.0.0+] 0x4B || CanCreateOwnSaveData || 0x8000000800000000 || [[#CreateSaveDataFileSystem]], CreateSaveDataFileSystemWithHashSalt | ||
|- | |- | ||
| [20.0.0+] | | [9.0.0-19.0.0] 0x41 [20.0.0+] 0x4C || CanDeleteOwnSaveData || 0x8000000800000000 || [[#DeleteSaveDataFileSystem]] | ||
|- | |- | ||
| [-19.0.0] | | [10.0.0-19.0.0] 0x42 [20.0.0+] 0x4D || CanReadOwnSaveDataFileSystemExtraData || 0x8000000800000000 || [[#ReadSaveDataFileSystemExtraData]] | ||
|- | |- | ||
| [-19.0.0] | | [10.0.0-19.0.0] 0x43 [20.0.0+] 0x4E || CanExtendOwnSaveData || 0x8000000800000000 || ExtendSaveDataFileSystem | ||
|- | |- | ||
| [2 | | [10.2.0-19.0.0] 0x44 [20.0.0+] 0x4F || CanOpenOwnSaveDataTransferProhibiter || 0x8000000800000000 || [[#OpenSaveDataTransferProhibiter]] | ||
|- | |- | ||
| [ | | [11.0.0-19.0.0] 0x45 [20.0.0+] 0x50 || CanFindOwnSaveDataWithFilter || 0x8000000800000000 || [[#FindSaveDataWithFilter]] | ||
|- | |- | ||
| [ | | [13.0.0-19.0.0] 0x46 [20.0.0+] 0x51 || CanOpenSaveDataTransferManagerForRepair || 0x8000000000000020 || [[#OpenSaveDataTransferManagerForRepair]] | ||
|- | |- | ||
| [ | | [13.0.0-19.0.0] 0x47 [20.0.0+] 0x52 || CanSetDebugConfiguration || 0x8000000000000000 || SetDebugOption, UnsetDebugOption | ||
|- | |- | ||
| [ | | [15.0.0-19.0.0] 0x48 [20.0.0+] 0x53 || CanOpenDataStorageByPath || 0x8000000000000000 || OpenDataStorageByPath | ||
|- | |- | ||
| [ | | [17.0.0-19.0.0] 0x49 [20.0.0+] 0x54|| CanNotifyErrorContextServiceReady || 0x8000004000000000 || NotifyErrorContextServiceReady | ||
|- | |- | ||
| [ | | [17.0.0-19.0.0] 0x4A || CanGetProgramId || 0x8000000008000000 || GetProgramId, Removed in 20.0.0 | ||
|- | |- | ||
| | | [20.0.0+] 0x55 || CanGetContentStorageInfo || 0x8000000000000800 || | ||
|- | |- | ||
| | | [20.0.0+] 0x56 || CanDetachSdCard || 0x8000000004000000 || | ||
|- | |- | ||
| | | [20.0.0+] 0x57 || CanSetSdCardActivationMode || 0x8000000004000000 || | ||
|- | |} | ||
== OpenFileSystem == | |||
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#FileSystemProxyType]]. Returns an [[#IFileSystem]]. | |||
[2.0.0+] This function was removed. | |||
== SetCurrentProcess == | |||
Takes an input u64 ProcessId. No output. | |||
== OpenFileSystemWithPatch == | |||
Takes an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | |||
The [[#FileSystemProxyType]] must be '''Manual'''. | |||
Note: web-applet strings refer to both this cmd and [[#OpenFileSystemWithId]] as "MountContent", but official nn_sf_sync symbols use "OpenXX" names. | |||
== OpenFileSystemWithIdObsolete == | |||
Takes a type-0x19 input buffer containing a [[#FspPath]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | |||
The [[#IFileSystem]] must be '''Meta''' if the NCA type is 0. | |||
The input buffer is the output string path from [[NS_Services#GetApplicationContentPath|GetApplicationContentPath]]. | |||
| | May return errors when attempting to access NCA-paths for an update-title with a gamecard, when the gamecard isn't inserted. May return error 0x7D402 in some cases with update-titles. Non-val2 in32 values with NCA-type1 are unusable, even for normal titles. | ||
The official "MountApplicationPackage" func uses this with in64=0 and [[#FileSystemProxyType]] '''Package'''. | |||
After the [[#FileSystemProxyType]] specific permissions are checked, it then gets the func retval for permissions-type 0x25 and func0. | |||
When [[#FileSystemProxyType]] is '''Meta''', it uses in64=0xffffffffffffffff internally, otherwise it checks if in64 is set to 0xffffffffffffffff then throws an error if so. When the in64 used internally is not 0xffffffffffffffff, it's compared with the NCA [[NCM_services#ProgramId|ProgramId]], then an error is thrown on mismatch. | |||
== OpenFileSystemWithId == | |||
Takes a type-0x19 input buffer containing a [[#FspPath]], an input [[#ContentAttributes]], an input [[#FileSystemProxyType]] and an input [[NCM_services#ProgramId|ProgramId]]. Returns an [[#IFileSystem]]. | |||
== OpenBisFileSystem == | |||
Takes a type-0x19 input buffer containing a [[#FspPath]] and an input [[#BisPartitionId]]. Returns an [[#IFileSystem]]. | |||
Official user-process code sets instr[0] = 0 normally. | |||
Only partitionIDs for FAT partitions are usable with this, otherwise error 0x2EE202 is returned. Seems to be about the same as [[#OpenBisStorage]] except this mounts the partition filesystem instead of allowing direct access to the partition sectors. | |||
== OpenBisStorage == | |||
Takes a u32 partition ID, returns 0x2EE202 for partitions which do not exist, 0x320002 for partitions which cannot be opened and a valid [[#IStorage]] handle otherwise. | |||
== InvalidateBisCache == | |||
Seems to invalidate the Bis cache for MBR/GPT after overwriting that data via the OpenBisStorage IStorage. Used by [[SystemInitializer]]. | |||
== DeleteSaveDataFileSystem == | |||
Takes an input u64. | |||
== CreateSaveDataFileSystem == | |||
Takes a 0x40-byte [[#SaveDataAttribute]], a 0x40-byte [[#SaveDataCreationInfo]], and a 0x10-byte input struct which governs creation of a saveMeta file. | |||
Only the first 0x5-bytes in the 0x10-byte struct are initialized: all-zero when automatically creating savedata during savecommon mount by official user-processes. In the dedicated save-creation code in official user-processes: +0 u32 = 0x40060 meta file size, +4 u8 = 1 meta index which dictates meta file name. | |||
Creates non-system savedata. | |||
== CreateSaveDataFileSystemBySystemSaveDataId == | |||
Takes a 0x40-byte [[#SaveDataAttribute]] and a 0x40-byte [[#SaveDataCreationInfo]]. | |||
Creates savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | |||
== OpenGameCardStorage == | |||
Takes two input u32s (gamecard handle, partition ID), and returns an [[#IStorage]] for the [[Gamecard_Format|partition]]. | |||
== OpenGameCardFileSystem == | |||
Takes two input u32s, with the second u32 located at +4 in rawdata after the first u32. Returns an [[#IFileSystem]]. | |||
Mounts a [[Gamecard_Partition|gamecard partition]]. | |||
| | |||
== | == CreateSaveDataFileSystemWithHashSalt == | ||
Takes a | Takes a total of 0xB0-bytes of input, no output. | ||
[ | == OpenSaveDataFileSystem == | ||
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Official user-process code is only known to use value 1 for the u8. | |||
Returns an [[#IFileSystem]]. | |||
Permissions aren't checked until the specified save is successfully found. | |||
Only one process (specifically only one [[#IFileSystem]] session) can mount a given savedata at any given time (this includes SystemSaveData). | |||
== OpenSaveDataFileSystemBySystemSaveDataId == | |||
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]]. Web-applet only uses value0 for the input u8. | |||
Returns an [[#IFileSystem]]. | |||
Mounts savedata in the SYSTEM [[Flash_Filesystem|NAND]] partition. | |||
== OpenReadOnlySaveDataFileSystem == | |||
Takes an input u8 [[#SaveDataSpaceId]] and a 0x40-byte [[#SaveDataAttribute]], and returns an [[#IFileSystem]]. | |||
Mounts SaveData as ReadOnly. | |||
== ReadSaveDataFileSystemExtraDataBySaveDataSpaceId == | |||
Takes an input u8 [[#SaveDataSpaceId]], an input u64 saveID, and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]]. | |||
== ReadSaveDataFileSystemExtraData == | |||
Takes an input u64 saveID and a type-0x6 output buffer containing the [[#SaveDataFileSystemExtraData]]. | |||
== OpenSaveDataInfoReader == | |||
No input, returns an output [[#ISaveDataInfoReader]]. | |||
== | == OpenSaveDataInfoReaderBySaveDataSpaceId == | ||
Takes | Takes an input u8 [[#SaveDataSpaceId]], returns an output [[#ISaveDataInfoReader]]. | ||
== | == FindSaveDataWithFilter == | ||
Takes a type- | 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 | 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 | 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 | Takes 4-bytes of input, returns an [[#IFileSystem]]. | ||
== | == OpenCustomStorageFileSystem == | ||
Takes | 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 | Takes a [[NCM_services#StorageId|StorageID]] and a [[NCM_services#DataId|DataId]]. | ||
Returns a [[IPC_Marshalling#Domain_message|domain object ID]] implementing the [[#IStorage]] interface for data archives. | |||
[[NCA|PublicData]] is exempt from the [[#Permissions|permissions]] check. | |||
== OpenDataFileSystemWithProgramIndex == | |||
Takes an input u8, returns an [[#IFileSystem]]. | |||
== OpenDataStorageWithProgramIndex == | |||
Takes an input u8, returns an [[#IStorage]]. | |||
== | == OpenDeviceOperator == | ||
This command returns a session to a port implementing the [[#IDeviceOperator]] interface. | |||
== OpenSdCardDetectionEventNotifier == | |||
This command returns a session to a port implementing the [[#IEventNotifier]] interface. | |||
== OpenGameCardDetectionEventNotifier == | |||
This command returns a session to a port implementing the [[#IEventNotifier]] interface. | |||
== | == SimulateDeviceDetectionEvent == | ||
Takes | 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_codes|error]] is returned(0xE02). | |||
== | == GetSaveDataCommitId == | ||
Takes an input u64 | 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 | 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 | 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 | Takes an input u32. | ||
== | == SetGlobalAccessLogMode == | ||
Takes an input u32. | |||
== | == GetGlobalAccessLogMode == | ||
Returns an output u32. | |||
GlobalAccessLogMode is normally 0. | |||
== | == OutputAccessLogToSdCard == | ||
Takes | 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 | This is "nn::fssrv::sf::IStorage". | ||
This is the interface for a raw device, usually a block device. | |||
This | |||
== | {| class="wikitable" border="1" | ||
|- | |||
! Cmd || Name | |||
|- | |||
| 0 || [[#Read]] | |||
|- | |||
| 1 || [[#Write]] | |||
|- | |||
| 2 || [[#Flush]] | |||
|- | |||
| 3 || [[#SetSize]] | |||
|- | |||
| 4 || [[#GetSize]] | |||
|- | |||
| 5 || [4.0.0+] OperateRange | |||
|} | |||
== | == Read == | ||
Takes | Takes a type-0x46 buffer, an offset and length. | ||
== Write == | |||
Takes a type-0x45 buffer, an offset and length. | |||
== | == Flush == | ||
No input. | |||
== | == SetSize == | ||
Takes | Takes a size. | ||
== GetSize == | |||
Returns a size. | |||
= | = IFileSystem = | ||
This is "nn::fssrv::sf::IFileSystem". | |||
There are two main implementations of this interface: | |||
* '''nn::fs::fsa::IFileSystem''': The main IFileSystem implementation. Filesystem classes implement this interface, and FS code usually operates on this interface. | |||
* '''nn::fssrv::sf::IFileSystem''': Used for sending an IFileSystem over IPC. Not used outside of IPC code. | |||
There are two adapter classes to convert between these interfaces: | |||
* '''nn::fssrv::detail::FileSystemInterfaceAdapter''': Allows access to an nn::fs::fsa::IFileSystem via the nn::fssrv::sf::IFileSystem interface. | |||
* '''nn::fs::detail::FileSystemServiceObjectAdapter''': Allows access to an nn::fssrv::sf::IFileSystem via the nn::fs::fsa::IFileSystem interface. | |||
When the FS process returns a filesystem, it will wrap the filesystem object in a FileSystemInterfaceAdapter to return it over IPC. | |||
Then when FS application code receives that filesystem, it will wrap the nn::fssrv::sf::IFileSystem object in a FileSystemServiceObjectAdapter before using it. | |||
{| class="wikitable" border="1" | |||
|- | |||
! Cmd || Name | |||
|- | |||
| 0 || CreateFile | |||
|- | |||
| 1 || DeleteFile | |||
|- | |||
| 2 || CreateDirectory | |||
|- | |||
| 3 || DeleteDirectory | |||
|- | |||
| 4 || DeleteDirectoryRecursively | |||
|- | |||
| 5 || RenameFile | |||
|- | |||
| 6 || RenameDirectory | |||
|- | |||
| 7 || [[#GetEntryType]] | |||
|- | |||
| 8 || [[#OpenFile]] | |||
|- | |||
| 9 || [[#OpenDirectory]] | |||
|- | |||
| 10 || [[#Commit]] | |||
|- | |||
| 11 || [[#GetFreeSpaceSize]] | |||
|- | |||
| 12 || [[#GetTotalSpaceSize]] | |||
|- | |||
| 13 || [3.0.0+] [[#CleanDirectoryRecursively]] | |||
|- | |||
| 14 || [3.0.0+] [[#GetFileTimeStampRaw]] | |||
|- | |||
| 15 || [4.0.0+] QueryEntry | |||
|- | |||
| 16 || [15.0.0+] GetFileSystemAttribute | |||
|} | |||
== | == GetEntryType == | ||
Takes an | 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- | Takes a type-0x9 input buffer for the path and an u64 '''filter_flags'''. '''filter_flags''' controls what type of entries are read by the [[#IDirectory]]: bitmask 0x1 = directories, bitmask 0x2 = files. | ||
== Commit == | |||
Like [https://3dbrew.org/wiki/FS:ControlArchive 3DS], this has to be used after writing to savedata for the changes to take affect. | |||
== GetFreeSpaceSize == | |||
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total free space with this FS. | |||
== GetTotalSpaceSize == | |||
Takes a type-0x9 input buffer for the path and returns an output byte-size u64 for the total space available with this FS(free+used). | |||
== CleanDirectoryRecursively == | |||
Takes a type-0x9 input buffer for the path and clears the contents of the directory specified in the path. | |||
== | == GetFileTimeStampRaw == | ||
Takes a type-0x19 input buffer for the path and returns a 0x20-byte struct. This contains 3 u64s and an u8. | |||
= | = IDirectory = | ||
This is "nn::fssrv::sf::IDirectory". | |||
== | {| class="wikitable" border="1" | ||
Takes | |- | ||
! 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. | |||
This is | = DirectoryEntry = | ||
This is "nn::fs::DirectoryEntry". | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! Offset || Size || Description | ||
|- | |- | ||
| | | 0x0 || 0x301 || Path | ||
|- | |- | ||
| | | 0x301 || 0x1 || File attributes (bit 0 = is directory; bit 1 = archive bit) | ||
|- | |- | ||
| | | 0x302 || 0x2 || Padding? | ||
|- | |- | ||
| | | 0x304 || 0x1 || [[#DirectoryEntryType]] | ||
|- | |- | ||
| | | 0x305 || 0x3 || Padding? | ||
|- | |- | ||
| | | 0x308 || 0x8 || Filesize, 0 for directories. | ||
|} | |} | ||
= | = DirectoryEntryType = | ||
This is "nn::fs::DirectoryEntryType". | |||
An s8 value indicating a directory entry type. The current values are: | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
! | ! Value || Description | ||
|- | |- | ||
| 0 || | | 0 || Directory | ||
|- | |- | ||
| 1 || | | 1 || File | ||
|} | |||
= IFile = | |||
This is "nn::fssrv::sf::IFile". | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
| | ! Cmd || Name | ||
|- | |- | ||
| | | 0 || Read | ||
|- | |- | ||
| | | 1 || Write | ||
|- | |- | ||
| | | 2 || Flush | ||
|- | |- | ||
| | | 3 || SetSize | ||
|- | |- | ||
| | | 4 || GetSize | ||
|- | |- | ||
| | | 5 || [4.0.0+] OperateRange | ||
|- | |- | ||
| | | 6 || [12.0.0+] OperateRangeWithBuffer | ||
|} | |||
= ISaveDataInfoReader = | |||
This is "nn::fssrv::sf::ISaveDataInfoReader". | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
| | ! Cmd || Name | ||
|- | |- | ||
| | | 0 || [[#ReadSaveDataInfo]] | ||
|- | |} | ||
== ReadSaveDataInfo == | |||
Takes a type-0x6 output buffer. Returns an output u64 for total output entries. This buffer contains an array of [[#SaveDataInfo]]. | |||
This is used to get [[#SaveDataInfo]] for all savedata on the system (or all savedata for the current [[#SaveDataSpaceId]]). When used multiple times, it will resume reading where it left off, until no more entries are available (in that case the out u64 is value 0). | |||
= IDeviceOperator = | |||
This is "nn::fssrv::sf::IDeviceOperator". | |||
{| class="wikitable" border="1" | |||
|- | |- | ||
| | ! Cmd || Name | ||
|- | |||
| 0 || [[#IsSdCardInserted]] | |||
|- | |||
| 1 || [[#GetSdCardSpeedMode]] | |||
|- | |||
| 2 || [2.0.0+] [[#GetSdCardCid]] | |||
|- | |||
| 3 || [2.0.0+] [[#GetSdCardUserAreaSize]] | |||
|- | |- | ||
| | | 4 || [2.0.0+] [[#GetSdCardProtectedAreaSize]] | ||
|- | |- | ||
| | | 5 || [2.0.0+] [[#GetAndClearSdCardErrorInfo]] | ||
|- | |||
| 6 || [17.0.0+] [[#GetSdCardHostControllerStatus]] | |||
|- | |||
| 7 || [20.0.0+] SetSdCardActivationMode | |||
|- | |||
| 8 || [20.0.0+] [S1] TryGetSdCardInfo | |||
|- | |||
| 100 || [[#GetMmcCid]] | |||
|- | |- | ||
| 101 || [[#GetMmcSpeedMode]] | |||
|- | |- | ||
| | | 110 || [[#EraseMmc]] | ||
|- | |- | ||
| | | 111 || [[#GetMmcPartitionSize]] | ||
| | |- | ||
| 112 || [2.0.0+] [[#GetMmcPatrolCount]] | |||
|- | |||
| 113 || [2.0.0+] [[#GetAndClearMmcErrorInfo]] | |||
|- | |||
| 114 || [2.0.0+] [[#GetMmcExtendedCsd]] | |||
|- | |- | ||
| 115 || [4.0.0+] [[#SuspendMmcPatrol]] | |||
|- | |- | ||
| | | 116 || [4.0.0+] [[#ResumeMmcPatrol]] | ||
|- | |- | ||
| | | 117 || [17.0.0+] [[#EraseMmcWithRange]] | ||
|- | |- | ||
| | | 118 || [20.0.0+] MarkBeforeEraseMmcPartitionUserData | ||
|- | |- | ||
| | | 119 || [20.0.0+] CheckAfterEraseMmcPartitionUserData | ||
|- | |- | ||
| | | 200 || [S1] [[#IsGameCardInserted]] | ||
|- | |- | ||
| | | 201 || [S1] [[#EraseGameCard]] | ||
|- | |- | ||
| 202 || [S1] [[#GetGameCardHandle]] | |||
|- | |- | ||
| | | 203 || [S1] [[#GetGameCardUpdatePartitionInfo]] | ||
|- | |- | ||
| | | 204 || [S1] [[#FinalizeGameCardDriver]] | ||
|- | |- | ||
| 205 || [S1] [[#GetGameCardAttribute]] | |||
|- | |- | ||
| | | 206 || [S1] [[#GetGameCardDeviceCertificate]] | ||
|- | |- | ||
| | | 207 || [S1] [[#GetGameCardAsicInfo]] | ||
|- | |- | ||
| | | 208 || [S1] [[#GetGameCardIdSet]] | ||
|- | |- | ||
| | | 209 || [S1] [[#WriteToGameCardDirectly]] | ||
|- | |- | ||
| | | 210 || [S1] [[#SetVerifyWriteEnalbleFlag]] | ||
|- | |- | ||
| | | 211 || [S1] [[#GetGameCardImageHash]] | ||
|- | |- | ||
| | | 212 || [S1] [2.0.0+] [[#GetGameCardDeviceIdForProdCard]] | ||
|- | |- | ||
| 213 || [S1] [2.0.0+] [[#EraseAndWriteParamDirectly]] | |||
|- | |- | ||
| | | 214 || [S1] [2.0.0+] [[#ReadParamDirectly]] | ||
|- | |- | ||
| 215 || [S1] [2.0.0+] [[#ForceEraseGameCard]] | |||
|- | |- | ||
| | | 216 || [S1] [2.0.0+] [[#GetGameCardErrorInfo]] | ||
|- | |- | ||
| | | 217 || [S1] [2.1.0+] [[#GetGameCardErrorReportInfo]] | ||
|- | |- | ||
| | | 218 || [S1] [3.0.0+] [[#GetGameCardDeviceId]] | ||
|- | |- | ||
| | | 219 || [S1] [8.0.0+] [[#ChallengeCardExistence]] | ||
|- | |- | ||
| | | 220 || [S1] [9.0.0+] [[#GetGameCardCompatibilityType]] | ||
|- | |- | ||
| | | 221 || [S1] [17.0.0+] [[#GetGameCardAsicCertificate]] | ||
|- | |- | ||
| | | 222 || [S1] [18.0.0+] [[#GetGameCardCardHeader]] | ||
|- | |- | ||
| | | 223 || [S1] [19.0.0+] [[#SetGameCardSessionCreationDelay]] | ||
|- | |- | ||
| | | 224 || [S1] [19.0.0+] [[#GetGameCardApplicationIdList]] | ||
|- | |- | ||
| | | 225 || [S1] [20.0.0+] RegisterGameCardConfigurationData | ||
|- | |- | ||
| | | 226 || [S1] [20.0.0+] GetGameCardDetailedErrorReportInfo | ||
|- | |- | ||
| | | 300 || [[#SetSpeedEmulationMode]] | ||
|- | |- | ||
| | | 301 || [[#GetSpeedEmulationMode]] | ||
|- | |- | ||
| | | 302 || [18.0.0+] [[#SetApplicationStorageSpeed]] | ||
|- | |- | ||
| | | 303 || [20.0.0+] SetGameCardClockRateForSpeedEmulation | ||
|- | |- | ||
| | | 304 || [20.0.0+] ClearGameCardClockRateForSpeedEmulation | ||
|- | |- | ||
| | | 400 || [5.0.0+] [[#SuspendSdmmcControl]] | ||
|- | |- | ||
| | | 401 || [5.0.0+] [[#ResumeSdmmcControl]] | ||
|- | |- | ||
| | | 402 || [6.0.0+] [[#GetSdmmcConnectionStatus]] | ||
|- | |- | ||
| | | 500 || [6.0.0+] [[#SetDeviceSimulationEvent]] | ||
|- | |- | ||
| | | 501 || [6.0.0+] [[#ClearDeviceSimulationEvent]] | ||
|- | |- | ||
| | | 800 || [S2] [[#OpenStorageDeviceManager]] | ||
|} | |||
== IsSdCardInserted == | |||
No input. Returns an output bool. | |||
== GetSdCardSpeedMode == | |||
No input. Returns an output [[#SdCardSpeedMode]]. | |||
|} | |||
== IsSdCardInserted == | |||
No input. Returns an output bool. | |||
== GetSdCardSpeedMode == | |||
No input. Returns an output [[#SdCardSpeedMode]]. | |||
== GetSdCardCid == | == GetSdCardCid == | ||
Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | Takes a type-0x6 output buffer and an input s64 '''BufferSize'''. No output. | ||
Line 1,447: | Line 1,369: | ||
== ClearDeviceSimulationEvent == | == ClearDeviceSimulationEvent == | ||
Takes a total of 4-bytes of input. No output. | Takes a total of 4-bytes of input. No output. | ||
== OpenStorageDeviceManager == | |||
Takes a byte. Returns an [[#IStorageDeviceManager]]. | |||
= IEventNotifier = | = IEventNotifier = | ||
Line 1,665: | Line 1,590: | ||
|- | |- | ||
| 16 || [[#SetKeySeedPackage]] | | 16 || [[#SetKeySeedPackage]] | ||
|- | |||
| 17 || [20.0.0+] SetLocalKeySeedPackage | |||
|- | |- | ||
| 32 || [[#OpenSaveDataExporter]] | | 32 || [[#OpenSaveDataExporter]] | ||
Line 1,758: | Line 1,685: | ||
|- | |- | ||
| 74 || [18.0.0+] [[#GetKeySeed]] | | 74 || [18.0.0+] [[#GetKeySeed]] | ||
|- | |||
| 75 || [20.0.0+] GetLocalKeySeedPackage | |||
|- | |- | ||
| 80 || [6.0.0+] [[#GetImportInitialDataAad]] | | 80 || [6.0.0+] [[#GetImportInitialDataAad]] | ||
Line 1,966: | Line 1,895: | ||
= IStorageDeviceManager = | = IStorageDeviceManager = | ||
This is "nn::fssrv::storage::sf::IStorageDeviceManager". | [S2] This is "nn::fssrv::storage::sf::IStorageDeviceManager". | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,972: | Line 1,901: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| | | 0 || IsInserted | ||
|- | |||
| 1 || IsHandleValid | |||
|- | |- | ||
| | | 2 || [[#OpenDetectionEvent]] | ||
|- | |- | ||
| | | 3 || Returns an [[#IEventNotifier]]. | ||
|- | |- | ||
| | | 10 || [[#OpenOperator]] | ||
|- | |- | ||
| | | 20 || [[#OpenDevice]] | ||
|- | |- | ||
| | | 21 || [[#OpenStorage]] | ||
|- | |- | ||
| | | 34 || Invalidate | ||
|} | |} | ||
== OpenDetectionEvent == | |||
Returns an [[#IEventNotifier]]. | |||
== OpenOperator == | |||
Returns an [[#IStorageDeviceOperator]]. | |||
== OpenDevice == | |||
Returns an [[#IStorageDevice]]. | |||
== OpenStorage == | |||
Returns an [[#IStorage]]. | |||
= IStorageDeviceOperator = | = IStorageDeviceOperator = | ||
This is "nn::fssrv::storage::sf::IStorageDeviceOperator". | [S2] This is "nn::fssrv::storage::sf::IStorageDeviceOperator". | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 1,994: | Line 1,936: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| | | 0 || Operate | ||
|- | |- | ||
| | | 1 || OperateIn | ||
|- | |- | ||
| | | 10 || OperateOut | ||
|- | |- | ||
| | | 11 || OperateOut2 | ||
|- | |- | ||
| | | 20 || OperateInOut | ||
|- | |- | ||
| | | 21 || OperateIn2Out | ||
|} | |} | ||
= IStorageDevice = | = IStorageDevice = | ||
This is "nn::fssrv::storage::sf::IStorageDevice". | [S2] This is "nn::fssrv::storage::sf::IStorageDevice". | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 2,014: | Line 1,956: | ||
! Cmd || Name | ! Cmd || Name | ||
|- | |- | ||
| | | 0 || GetHandle | ||
|- | |- | ||
| | | 1 || IsHandleValid | ||
|- | |- | ||
| | | 10 || OpenOperator | ||
|- | |- | ||
| | | 20 || Read | ||
|- | |- | ||
| | | 21 || Write | ||
|- | |- | ||
| | | 22 || Flush | ||
|- | |- | ||
| | | 23 || SetSize | ||
|- | |- | ||
| | | 24 || GetSize | ||
|- | |- | ||
| | | 25 || OperateRange | ||
|} | |} | ||
= FileSystemProxyType = | = FileSystemProxyType = | ||
This is "nn::fs::FileSystemProxyType". | This is "nn::fs::FileSystemProxyType". | ||
sdknso converts the input [[#ContentType|ContentType]] to a FileSystemProxyType, for use with the cmd input. | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 2,085: | Line 2,029: | ||
|- | |- | ||
| 0 || None | | 0 || None | ||
|- | |||
| 1 || [S2] | |||
|- | |- | ||
| 15 || All | | 15 || All | ||
Line 3,223: | Line 3,169: | ||
|- | |- | ||
| 0xA | | 0xA | ||
| 0x6 | | 0x6 | ||
| Padding? | | Padding? | ||
|- | |- | ||
| 0x10 | | 0x10 | ||
| 0x10 | | 0x10 | ||
| UserId | | UserId | ||
|- | |||
| 0x20 | |||
| 0x8 | |||
| SystemSaveDataId (0 for regular SaveData) | |||
|- | |||
| 0x28 | |||
| 0x8 | |||
| [[NCM_services#ApplicationId|ApplicationId]] (for regular SaveData) | |||
|- | |||
| 0x30 | |||
| 0x8 | |||
| Raw saveimage size | |||
|- | |||
| 0x38 | |||
| 0x2 | |||
| SaveDataIndex | |||
|- | |||
| 0x3A | |||
| 0x1 | |||
| [[#SaveDataRank]] | |||
|- | |||
| 0x3B | |||
| 0x25 | |||
| Unknown. Usually zeros? | |||
|} | |||
This is a 0x60-byte struct. | |||
= SaveDataFileSystemExtraData = | |||
This is a 0x200-byte struct. Appears to match [[Savegames#Extra_data]]. | |||
= InitialDataVersion2 = | |||
This is a 0x8210-byte struct used by [[#ISaveDataTransferManagerWithDivision]]. | |||
= FsAccessControlRestrictionMode = | |||
This is "nn::fs::FsAccessControlRestrictionMode". | |||
{| class="wikitable" border="1" | |||
|- | |||
! Value || Name | |||
|- | |- | ||
| | | 0 || | ||
| | |||
| | |||
|} | |} | ||
[[Category:Services]] | [[Category:Services]] |