Config Savegame

From 3dbrew
Revision as of 20:18, 5 May 2016 by Yellows8 (talk | contribs)
Jump to: navigation, search

This page describes the format of the Cfg NAND savegame. These blocks can be accessed with the Cfg service commands.

Structure of save-file "/config"

Offset Size Description
0x0 0x2 Total entries
0x2 0x2 Data entries offset
0x4 0x4558 Block entries
0x455C Data for the entries

The filesize for this /config file is 0x8000-bytes.

Configuration block entry

Offset Size Description
0x0 0x4 BlkID
0x4 0x4 Offset to the data for this block when size is >4, otherwise this word is the data for this block
0x8 0x2 Size
0xA 0x2 Flags

Configuration blocks

BlkID Size Flags Description
0x00000000 0x2 ? Config savegame version?
0x00030001 0x8 0xE ? (zeroed)
0x00040000 0x10 0x8 ? (read by HID)
0x00040001 0x1C 0x8 ? (read by HID)
0x00040002 0x12 0x8 ? (read by HID)
0x00040003 0xC 0x8 ? (read by HID)
0x00050001 0x2 0x8 ? (read by GSP)
0x00050002 0x38 0x8 ? (read by GSP)
0x00050003 0x20 0x8 ? (read by GSP)
0x00050005 0x20 ? Stereo camera settings?
0x00050006 0x2 0x8 ?
0x00070001 0x1 ? Sound output mode?
0x00080000 0xC00 0x2? WiFi configuration slot 0
0x00080001 0xC00 0x2? WiFi configuration slot 1
0x00080002 0xC00 0x2? WiFi configuration slot 2
0x00090000 0x8 0x2? This contains a u64 ID, used by processes using NWMUDS:InitializeWithVersion. The first word is the same as LocalFriendCodeSeed, while the latter is a separate word.
0x00090001 0x8 0xE This console-unique u64 used by GenHashConsoleUnique is generated with the LocalFriendCodeSeed and with random data
0x000A0000 0x1C 0xE Username
0x000A0001 0x2 0xE Birthday (u8 month, u8 day)
0x000A0002 0x1 0xA Language
0x000B0000 0x4 0x8 CountryInfo
0x000B0001 0x800 0x2? Country name in UTF-16, every 0x80-bytes is an entry for each language, in the order of the Language table below (not all entries are set)
0x000B0002 0x800 0x2? State name in UTF-16, every 0x80-bytes is an entry for each language
0x000B0003 0x4 0xE Pair of 16-bit values, meaning unknown but related to address (ZIP code?)
0x000C0000 0xC0 0x8 Restricted photo exchange data, and other info
0x000C0001 0x14 ? Same as above?
0x000D0000 0x4 0x2 u16 at offset 0x0: EULA Version which was agreed to.
0x000F0000 0x10 0x8? Unknown, used by NS on dev-units for svcKernelSetState, where Type is 6. During NS startup on debug-units, NS compares the u32 from +8 in this config-block with the APPMEMTYPE. When those don't match NS starts a FIRM-launch (with the same FIRM titleID as the currently running one) to boot into a FIRM with the APPMEMTYPE value from this config-block
0x000F0004 0x4 0x8? The first u8 is the System-Model value, the last 3-bytes are unknown
0x00110000 0x4 ? The low u16 indicates whether the system setup is required, such as when the system is booted for the first time or after doing a System Format: 0 = setup required, non-zero = no setup required
0x00110001 0x8 0xA? TitleID of the menu to launch, used by NS on dev units (this block can be edited on dev units with Config)
0x00120000 0x8 0x8 ? (read by HID)
0x00130000 0x4 ? If response is 0x100 then debug mode is enabled.
0x00160000 0x4 0x8? Unknown, first byte is used by config service-cmd 0x00070040. (Unknown whether the last 3-bytes are used)
0x00190000 0x1 0x8? Unknown. NFC-module checks for value1/non-value1.

The developer unit TID block only exists on developer units.

Languages

ID Description
0 JP
1 EN
2 FR
3 DE
4 IT
5 ES
6 ZH
7 KO
8 NL
9 PT
10 RU
11 TW

CountryInfo

Byte Description
0 ?
1 ?
2 ?
3 Country code, same as DSi/Wii country codes. Value 0xFF is invalid.

0x000A0000 Block

Byte Description
0x0-0x13 UTF-16 username, with no NULL-terminator.
0x14-17 Usually zero?
0x18-0x1B u32 NGWord version the username was last checked with. If this value is less than the u32 stored in the NGWord CFA "romfs:/version.dat", the system then checks the username string with the bad-word list CFA again, then updates this field with the value from the CFA


LCD display config

There seems to be some sort of LCD display configuration stored in this cfg. When using the cfg-save from an Old3DS on a New3DS without formatting the cfg first, the bottom-screen display is somewhat off(which is fixed by formatting the cfg-save).