Filesystem services

From 3dbrew
Revision as of 03:37, 2 June 2015 by Subv (talk | contribs)
Jump to navigation Jump to search

Filesystem service "fs:USER"

You can at most have 32 FS archive handles.

Command Header Available since system version Description Required exheader access info bitmask
0x000100C6 ? Dummy1 None
0x040100C4 ? Control None
0x08010002 ? Initialize None
0x080201C2 ? OpenFile None
0x08030204 ? OpenFileDirectly None
0x08040142 ? DeleteFile None
0x08050244 ? RenameFile None
0x08060142 ? DeleteDirectory None
0x08070142 ? DeleteDirectoryRecursively None
0x08080202 ? CreateFile None
0x08090182 ? CreateDirectory None
0x080A0244 ? RenameDirectory None
0x080B0102 ? OpenDirectory None
0x080C00C2 ? OpenArchive Each archive ID code has separate access info bitmasks, if it has any
0x080D0144 ? ControlArchive None
0x080E0080 ? CloseArchive None
0x080F0180 ? FormatThisUserSaveData None
0x08100200 ? CreateSystemSaveData 0x4, for when the input saveID doesn't match the exheader saveID
0x08110040 ? DeleteSystemSaveData 0x1004, for when the input saveID doesn't match the exheader saveID
0x08120080 ? GetFreeBytes None
0x08130000 ? GetCardType 0x1017
0x08140000 ? GetSdmcArchiveResource None
0x08150000 ? GetNandArchiveResource 0x1007
0x08160000 ? GetSdmcFatfsError 0x2
0x08170000 ? IsSdmcDetected None
0x08180000 ? IsSdmcWritable None
0x08190042 ? GetSdmcCid 0x2
0x081A0042 ? GetNandCid 0x2
0x081B0000 ? GetSdmcSpeedInfo 0x2
0x081C0000 ? GetNandSpeedInfo 0x2
0x081D0042 ? GetSdmcLog 0x2
0x081E0042 ? GetNandLog 0x2
0x081F0000 ? ClearSdmcLog 0x2
0x08200000 ? ClearNandLog 0x2
0x08210000 ? CardSlotIsInserted 0x1017
0x08220000 ? CardSlotPowerOn 0x2
0x08230000 ? CardSlotPowerOff 0x2
0x08240000 ? CardSlotGetCardIFPowerStatus 0x2
0x08250040 ? CardNorDirectCommand 0x2
0x08260080 ? CardNorDirectCommandWithAddress 0x2
0x08270082 ? CardNorDirectRead 0x2
0x082800C2 ? CardNorDirectReadWithAddress 0x2
0x08290082 ? CardNorDirectWrite 0x2
0x082A00C2 ? CardNorDirectWriteWithAddress 0x2
0x082B00C2 ? CardNorDirectRead_4xIO 0x2
0x082C0082 ? CardNorDirectCpuWriteWithoutVerify 0x2
0x082D0040 ? CardNorDirectSectorEraseWithoutVerify 0x2
0x082E0040 ? GetProductInfo 0x1005
0x082F0040 ? GetProgramLaunchInfo 0x1005
0x08300182 ? CreateExtSaveData 0xC, for when the input extdataID doesn't match the exheader extdataID
0x08310180 ? CreateSharedExtSaveData 0x1005
0x08320102 ? ReadExtSaveDataIcon 0x100D, for when the input extdataID doesn't match the exheader extdataID
0x08330082 ? EnumerateExtSaveData 0x1005
0x08340082 ? EnumerateSharedExtSaveData 0x1005
0x08350080 ? DeleteExtSaveData 0x100D, for when the input extdataID doesn't match the exheader extdataID
0x08360080 ? DeleteSharedExtSaveData 0x1005
0x08370040 ? SetCardSpiBaudRate 0x2
0x08380040 ? SetCardSpiBusMode 0x2
0x08390000 ? SendInitializeInfoTo9 None
0x083A0100 ? GetSpecialContentIndex 0x1005
0x083B00C2 ? GetLegacyRomHeader 0x1015
0x083C00C2 ? GetLegacyBannerData 0x1015
0x083D0100 ? CheckAuthorityToAccessExtSaveData 0x44
0x083E00C2 ? QueryTotalQuotaSize None
0x083F00C0 ? GetExtDataBlockSize None
0x08400040 ? AbnegateAccessRight ?
0x08410000 ? DeleteSdmcRoot 0x1005
0x08420040 ? DeleteAllExtSaveDataOnNand 0x1005
0x08430000 ? InitializeCtrFileSystem None
0x08440000 ? CreateSeed 0x2
0x084500C2 ? GetFormatInfo ?
0x08460102 ? GetLegacyRomHeader2 0x1015
0x08470180 ? FormatCtrCardUserSaveData 0x6
0x08480042 ? GetSdmcCtrRootPath 0x100D
0x08490040 ? GetArchiveResource ?
0x084A0002 ? ExportIntegrityVerificationSeed 0x4000
0x084B0002 ? ImportIntegrityVerificationSeed 0x4000
0x084C0242 ? FormatSaveData 0x6, in some cases this write isn't needed however
0x084D0102 ? GetLegacySubBannerData 0x1015
0x084E0342 ? UpdateSha256Context 0x5
0x084F0102 ? ReadSpecialFile None
0x08500040 ? GetSpecialFileSize None
0x08510242 3.0.0-5 CreateExtSaveData Shared extdata: 0x101005. Regular extdata in certain cases: 0xC
0x08520100 3.0.0-5 DeleteExtSaveData (u32 flags, u64 extdataID) Shared extdata: 0x101005. Regular extdata in certain cases: 0x10100D
0x08530142 3.0.0-5 ReadExtSaveDataIcon 0x10100D (this doesn't apply in certain cases, however)
0x085400C0 3.0.0-5 GetExtDataBlockSize? 0x10100D (this doesn't apply in certain cases, however)
0x08550102 3.0.0-5 EnumerateExtSaveData 0x101005
0x08560200 3.0.0-5 FsCreateSystemSaveData? 0x4 (this doesn't apply in certain cases, however)
0x08570080 3.0.0-5 DeleteSystemSaveData 0x1004 (this doesn't apply in certain cases, however)
0x08580000 3.0.0-5 GetMovableSedHashedKeyYRandomData 0x2004
0x08590200 3.0.0-5 SetMovableSedHashedKeyYRandomData? 0x2004
0x085A00C0 3.0.0-5 SetArchivePriority(u64 ID,u32 priority) None
0x085B0080 3.0.0-5 GetArchivePriority(u64 ID,u32 *priority) None
0x085C00C0 3.0.0-5 SetCtrCardLatencyParameter 0xE
0x085D0180 3.0.0-5 ? 0x100001
0x085E0040 3.0.0-5 ResetCardCompatibilityParameter 0xE
0x085F0040 3.0.0-5 SwitchCleanupInvalidSaveData 0x12004
0x08600042 3.0.0-5 EnumerateSystemSaveData 0x2004
0x08610042 3.0.0-5 InitializeWithSdkVersion None
0x08620040 3.0.0-5 SetPriority None
0x08630000 3.0.0-5 GetPriority None
0x08640000 3.0.0-5 Obsoleted_4_0_GetNandInfo Stubbed, this returns an error
0x08650140 4.0.0-7 SetSaveDataSecureValue, this is used with Anti Savegame Restore. 0x121004 (in certain cases this doesn't apply, however)
0x086600C0 4.0.0-7 GetSaveDataSecureValue, this is used with Anti Savegame Restore. 0x121004 (in certain cases this doesn't apply, however)
0x086700C4 4.0.0-7 ControlSecureSave 0x121004
0x08680000 4.0.0-7 GetMediaType, This loads the u8 mediatype for the current application from already initialized state, this u8 was originally loaded from the same data used by GetProgramLaunchInfo. This then writes the u8 to response-word[2]. This is used with Anti Savegame Restore None
0x08690000 4.0.0-7 Obsoleted_4_0_GetNandEraseCount Stubbed, this returns an error. None
0x086A0082 4.0.0-7 ReadNandReport This is a wrapper for FSPXI command 0x00550082. None
0x086B00C2 ? ? 00121004
0x086C00C2 ? ? 00121004
0x086D0040 ? ? 00020004
0x086E00C0 ? ? None?
0x086F0040 ? ? 0xE
0x087000C2 ? ? None?
0x08710100 ? ? 0xC
0x087201C0 ? ? 00080004
0x087300C0 ? ? 00080004
0x08740000 ? ? 00080004
0x08750140 ? ? None?
0x087600C0 ? ? None?
0x08770100 ? ? ?
0x087800C0 ? ? ?
0x087900C2 ? Same as GetLegacyBannerData, except for the last parameter this passes u8 value 0x1 instead of 0x0, for the FSPXI command. 0x00101015
0x087A.... 9.6.0-X ? 0x00200000
0x087B.... 9.6.0-X Wrapper for the code internally used for command <0x087A....>. 0x00200000
0x087C.... 9.6.0-X Eventually calls same code as command <0x087A....>. 0x00200000
0x087D0000 9.6.0-X Writes an u32 from state to cmdreply[2]. Probably the total number of titles in the SEEDDB? 0x00200000
0x087E0042 9.6.0-X Eventually calls same code as command <0x087A....>. Writes a list of titleIDs to the outbuf, this is for titles with content-lock-seed(s) stored in SEEDDB. (u32 total_titleids_probably, ((Size<<4) | 12), outbufptr) 0x00200000
0x087F.... 9.6.0-X ? 0x00200000
0x0880.... 9.6.0-X Eventually calls same code as command <0x087A....>. 0x00200000
0x0881.... 9.6.0-X Eventually calls same code as command <0x087A....>. 0x00200000
0x0882.... 9.6.0-X Eventually calls same code as command <0x087A....>. 0x00200000
0x08830000 9.6.0-X Writes an output value to cmdreply[2]. 0x00200000
0x0884.... 9.6.0-X Eventually calls same code as command <0x087A....>. 0x00200000
0x0885.... 9.6.0-X ? 0x00200000

Note: The question marks from Dummy1 to GetSpecialFileSize on the "available since system version" field are mainly there because I think that most of these are necessary for the main system to function, so theoretically that would mean that since the creation of the 3DS these were available, or since launch if that makes more sense. But because of the peculiar nature of some of the functions, they will remain question marks until they can be confirmed 100%.

When access rights are required for a command, at least one of the bits in the process access info specified in the above table for the command must be set. Error 0xD9004676 is returned when a process attempts to use a command which it doesn't have access rights for the command. The exheader access info field is all zero's for most applications. Note that the permissions listed in the above table is for system-version v2.x, therefore permission bit(s) added with newer FIRM may be missing from this.

Each session for fs:USER has separate permissions, initially these are set to all zero's for new fs:USER sessions. The permissions/etc for fs:USER sessions are initialized via FS:Initialize(loaded from the user process exheader).

File service

Command Header Description
0x000100C6 Dummy1
0x040100C4 Control
0x08010100 OpenSubFile
0x080200C2 Read
0x08030102 Write
0x08040000 GetSize
0x08050080 SetSize
0x08060000 GetAttributes
0x08070040 SetAttributes
0x08080000 Close
0x08090000 Flush
0x080A0040 SetPriority
0x080B0000 GetPriority
0x080C0000 OpenLinkFile
0x0C010100 ?

Directory service

Command Header Available since system version Description
0x000100C6 1.0.0-0 Dummy1
0x040100C4 1.0.0-0 Control
0x08010042 1.0.0-0 Read
0x08020000 1.0.0-0 Close
0x08030040 ? SetPriority
0x08040000 ? GetPriority

Filesystem service "fs:LDR"

This service is identical to fs:USER, except FS:OpenArchive archive 0x2345678E can only be accessed with fs:LDR.

ProgramRegistry service "fs:REG"

Command Header Description
0x000100C6 Dummy1
0x040103C0 Register
0x04020040 Unregister
0x040300C0 GetProgramInfo
0x04040100 LoadProgram
0x04050080 UnloadProgram
0x04060080 CheckHostLoadId

Only one session can be opened for this service at a time, hence no other processes can use this due to pm-module using this.


With 9.6.0-X new System_SaveData with saveID 0001000F was added, this seems to be handled by FS-module itself, probably via the new service-cmds added to fsuser. Home Menu and NIM module have access to those commands.

The SEEDDB savedata contains the title-unique seed-data used for the new NCCH keyY generation added with FIRM 9.6.0-X.


See Filesystem_services_PXI.