1060 lines
44 KiB
C++
1060 lines
44 KiB
C++
/**
|
|
******************************************************************************
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
******************************************************************************
|
|
* Copyright 2026 Xenia Canary. All rights reserved. *
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef XENIA_KERNEL_XCONFIG_H_
|
|
#define XENIA_KERNEL_XCONFIG_H_
|
|
|
|
#include <array>
|
|
#include <concepts>
|
|
#include <cstdint>
|
|
#include <numeric>
|
|
|
|
#include "xenia/base/byte_order.h"
|
|
#include "xenia/base/mutex.h"
|
|
|
|
#include "third_party/fmt/include/fmt/format.h"
|
|
|
|
namespace xe {
|
|
namespace kernel {
|
|
|
|
enum X_CONFIG_CATEGORY : uint16_t {
|
|
XCONFIG_STATIC_CATEGORY = 0x00,
|
|
XCONFIG_STATISTIC_CATEGORY = 0x01,
|
|
XCONFIG_SECURED_CATEGORY = 0x02,
|
|
XCONFIG_USER_CATEGORY = 0x03,
|
|
XCONFIG_XNET_MACHINE_ACCOUNT_CATEGORY = 0x04,
|
|
XCONFIG_XNET_PARAMETERS_CATEGORY = 0x05,
|
|
XCONFIG_MEDIA_CENTER_CATEGORY = 0x06,
|
|
XCONFIG_CONSOLE_CATEGORY = 0x07,
|
|
XCONFIG_DVD_CATEGORY = 0x08,
|
|
XCONFIG_IPTV_CATEGORY = 0x09,
|
|
XCONFIG_SYSTEM_CATEGORY = 0x0A,
|
|
XCONFIG_DEVKIT_CATEGORY = 0x0B
|
|
};
|
|
|
|
enum XCONFIG_STATIC_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_STATIC_FIRST_POWER_ON_DATE = 0x01,
|
|
XCONFIG_STATIC_SMC_CONFIG = 0x02
|
|
};
|
|
|
|
enum XCONFIG_STATISTIC_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_STATISTICS_XUID_MAC_ADDRESS = 0x01,
|
|
XCONFIG_STATISTICS_XUID_COUNT = 0x02,
|
|
XCONFIG_STATISTICS_ODD_FAILURES = 0x03,
|
|
XCONFIG_STATISTICS_HDD_SMART_DATA = 0x04,
|
|
XCONFIG_STATISTICS_UEM_ERRORS = 0x05,
|
|
XCONFIG_STATISTICS_FPM_ERRORS = 0x06,
|
|
XCONFIG_STATISTICS_LAST_REPORT_TIME = 0x07,
|
|
XCONFIG_STATISTICS_BUG_CHECK_DATA = 0x08,
|
|
XCONFIG_STATISTICS_TEMPERATURE = 0x09,
|
|
XCONFIG_STATISTICS_XEKEYS_WRITE_FAILURE = 0x0A
|
|
};
|
|
|
|
enum XCONFIG_SECURED_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_SECURED_MAC_ADDRESS = 0x01,
|
|
XCONFIG_SECURED_AV_REGION = 0x02,
|
|
XCONFIG_SECURED_GAME_REGION = 0x03,
|
|
XCONFIG_SECURED_DVD_REGION = 0x04,
|
|
XCONFIG_SECURED_RESET_KEY = 0x05,
|
|
XCONFIG_SECURED_SYSTEM_FLAGS = 0x06,
|
|
XCONFIG_SECURED_POWER_MODE = 0x07,
|
|
XCONFIG_SECURED_ONLINE_NETWORK_ID = 0x08,
|
|
XCONFIG_SECURED_POWER_VCS_CONTROL = 0x09,
|
|
XCONFIG_SECURED_UNKNOWN = 0x10
|
|
};
|
|
|
|
enum XCONFIG_USER_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_USER_TIME_ZONE_BIAS = 0x01,
|
|
XCONFIG_USER_TIME_ZONE_STD_NAME = 0x02,
|
|
XCONFIG_USER_TIME_ZONE_DLT_NAME = 0x03,
|
|
XCONFIG_USER_TIME_ZONE_STD_DATE = 0x04,
|
|
XCONFIG_USER_TIME_ZONE_DLT_DATE = 0x05,
|
|
XCONFIG_USER_TIME_ZONE_STD_BIAS = 0x06,
|
|
XCONFIG_USER_TIME_ZONE_DLT_BIAS = 0x07,
|
|
XCONFIG_USER_DEFAULT_PROFILE = 0x08,
|
|
XCONFIG_USER_LANGUAGE = 0x09,
|
|
XCONFIG_USER_VIDEO_FLAGS = 0x0A,
|
|
XCONFIG_USER_AUDIO_FLAGS = 0x0B,
|
|
XCONFIG_USER_RETAIL_FLAGS = 0x0C,
|
|
XCONFIG_USER_DEVKIT_FLAGS = 0x0D,
|
|
XCONFIG_USER_COUNTRY = 0x0E,
|
|
XCONFIG_USER_PC_FLAGS = 0x0F,
|
|
XCONFIG_USER_SMB_CONFIG = 0x10,
|
|
XCONFIG_USER_LIVE_PUID = 0x11,
|
|
XCONFIG_USER_LIVE_CREDENTIALS = 0x12,
|
|
XCONFIG_USER_AV_COMPOSITE_SCREENSZ = 0x13, // Used for any other case
|
|
XCONFIG_USER_AV_COMPONENT_SCREENSZ =
|
|
0x14, // Used only if avpack is set to component (3)
|
|
XCONFIG_USER_AV_VGA_SCREENSZ = 0x15, // Used only if avpack is set to VGA (6)
|
|
XCONFIG_USER_PC_GAME = 0x16,
|
|
XCONFIG_USER_PC_PASSWORD = 0x17,
|
|
XCONFIG_USER_PC_MOVIE = 0x18,
|
|
XCONFIG_USER_PC_GAME_RATING = 0x19,
|
|
XCONFIG_USER_PC_MOVIE_RATING = 0x1A,
|
|
XCONFIG_USER_PC_HINT = 0x1B,
|
|
XCONFIG_USER_PC_HINT_ANSWER = 0x1C,
|
|
XCONFIG_USER_PC_OVERRIDE = 0x1D,
|
|
XCONFIG_USER_MUSIC_PLAYBACK_MODE = 0x1E,
|
|
XCONFIG_USER_MUSIC_VOLUME = 0x1F,
|
|
XCONFIG_USER_MUSIC_FLAGS = 0x20,
|
|
XCONFIG_USER_ARCADE_FLAGS = 0x21,
|
|
XCONFIG_USER_PC_VERSION = 0x22,
|
|
XCONFIG_USER_PC_TV = 0x23,
|
|
XCONFIG_USER_PC_TV_RATING = 0x24,
|
|
XCONFIG_USER_PC_EXPLICIT_VIDEO = 0x25,
|
|
XCONFIG_USER_PC_EXPLICIT_VIDEO_RATING = 0x26,
|
|
XCONFIG_USER_PC_UNRATED_VIDEO = 0x27,
|
|
XCONFIG_USER_PC_UNRATED_VIDEO_RATING = 0x28,
|
|
XCONFIG_USER_VIDEO_OUTPUT_BLACK_LEVELS = 0x29,
|
|
XCONFIG_USER_VIDEO_PLAYER_DISPLAY_MODE = 0x2A,
|
|
XCONFIG_USER_ALTERNATE_VIDEO_TIMING_ID = 0x2B,
|
|
XCONFIG_USER_VIDEO_DRIVER_OPTIONS = 0x2C,
|
|
XCONFIG_USER_MUSIC_UI_FLAGS = 0x2D,
|
|
XCONFIG_USER_VIDEO_MEDIA_SOURCE_TYPE = 0x2E,
|
|
XCONFIG_USER_MUSIC_MEDIA_SOURCE_TYPE = 0x2F,
|
|
XCONFIG_USER_PHOTO_MEDIA_SOURCE_TYPE = 0x30
|
|
};
|
|
|
|
enum XCONFIG_XNET_MACHINE_ACCOUNT_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_XNET_DATA = 0x01
|
|
};
|
|
|
|
enum XCONFIG_MEDIA_CENTER_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_MEDIA_CENTER_MEDIA_PLAYER = 0x01,
|
|
XCONFIG_MEDIA_CENTER_XESLED_VERSION = 0x02,
|
|
XCONFIG_MEDIA_CENTER_XESLED_TRUST_SECRET = 0x03,
|
|
XCONFIG_MEDIA_CENTER_XESLED_TRUST_CODE = 0x04,
|
|
XCONFIG_MEDIA_CENTER_XESLED_HOST_ID = 0x05,
|
|
XCONFIG_MEDIA_CENTER_XESLED_KEY = 0x06,
|
|
XCONFIG_MEDIA_CENTER_XESLED_HOST_MAC_ADDRESS = 0x07,
|
|
XCONFIG_MEDIA_CENTER_SERVER_UUID = 0x08,
|
|
XCONFIG_MEDIA_CENTER_SERVER_NAME = 0x09,
|
|
XCONFIG_MEDIA_CENTER_SERVER_FLAG = 0x0A
|
|
};
|
|
|
|
enum XCONFIG_CONSOLE_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_CONSOLE_SCREEN_SAVER = 0x01,
|
|
XCONFIG_CONSOLE_AUTO_SHUT_OFF = 0x02,
|
|
XCONFIG_CONSOLE_WIRELESS_SETTINGS = 0x03,
|
|
XCONFIG_CONSOLE_CAMERA_SETTINGS = 0x04,
|
|
XCONFIG_CONSOLE_PLAYTIMERDATA = 0x05,
|
|
XCONFIG_CONSOLE_MEDIA_DISABLEAUTOLAUNCH = 0x06,
|
|
XCONFIG_CONSOLE_KEYBOARD_LAYOUT = 0x07,
|
|
XCONFIG_CONSOLE_PC_TITLE_EXEMPTIONS = 0x08,
|
|
XCONFIG_CONSOLE_NUI = 0x09,
|
|
XCONFIG_CONSOLE_VOICE = 0x0A,
|
|
XCONFIG_CONSOLE_RETAIL_EX_FLAGS = 0x0B,
|
|
XCONFIG_CONSOLE_DASH_FIRST_USE_TUTORIAL_FLAGS = 0x0C,
|
|
XCONFIG_CONSOLE_TV_DIAGONAL_SIZE_IN_CM = 0x0D,
|
|
XCONFIG_CONSOLE_NETWORKSTORAGEDEVICE_SERIALNUMBER = 0x0E,
|
|
XCONFIG_CONSOLE_DISCOVERABLE = 0x0F,
|
|
XCONFIG_CONSOLE_LIVE_TV_PROVIDER = 0x10
|
|
};
|
|
|
|
enum XCONFIG_DVD_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_DVD_VOLUME_ID = 0x01,
|
|
XCONFIG_DVD_BOOKMARK = 0x02
|
|
};
|
|
|
|
enum XCONFIG_IPTV_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_IPTV_SERVICE_PROVIDER_NAME = 0x01,
|
|
XCONFIG_IPTV_PROVISIONING_SERVER_URL = 0x02,
|
|
XCONFIG_IPTV_SUPPORT_INFO = 0x03,
|
|
XCONFIG_IPTV_BOOTSTRAP_SERVER_URL = 0x04
|
|
};
|
|
|
|
enum XCONFIG_SYSTEM_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_SYSTEM_ALARM_TIME = 0x01,
|
|
XCONFIG_SYSTEM_PREVIOUS_FLASH_VERSION = 0x02
|
|
};
|
|
|
|
enum XCONFIG_DEVKIT_CATEGORY_ENTRIES : uint8_t {
|
|
XCONFIG_DEVKIT_USBD_ROOT_HUB_PORT_DISABLE_MASK = 0x01,
|
|
XCONFIG_DEVKIT_XAM_FEATURE_ENABLE_DISABLE_MASK = 0x02,
|
|
XCONFIG_DEVKIT_KIOSK_ID = 0x03
|
|
};
|
|
|
|
enum class X_AV_VIDEO_STANDARD : uint32_t {
|
|
NTSCM = 1,
|
|
NTSCJ = 2,
|
|
PAL = 3,
|
|
PAL_50 = 4,
|
|
};
|
|
|
|
// XCONFIG_SECURED_AV_REGION
|
|
enum X_AV_REGION : uint32_t {
|
|
NTSCM = 0x00400100,
|
|
NTSCJ = 0x00400200,
|
|
PAL = 0x00400400,
|
|
PAL_50 = 0x00800300,
|
|
};
|
|
|
|
// XCONFIG_USER_VIDEO_FLAGS
|
|
enum X_VIDEO_FLAGS : uint32_t {
|
|
RatioNormal = 0x00000000,
|
|
Widescreen = 0x00010000,
|
|
};
|
|
|
|
constexpr std::array<uint8_t, 4> kNoDate = {0x00, 0x00, 0x00, 0x00};
|
|
constexpr std::array<uint8_t, 4> kUS_StdDate = {0x0A, 0x05, 0x00, 0x02};
|
|
constexpr std::array<uint8_t, 4> kUS_DltDate = {0x04, 0x01, 0x00, 0x02};
|
|
constexpr std::array<uint8_t, 4> kEU_StdDate = {0x0A, 0x05, 0x00, 0x03};
|
|
constexpr std::array<uint8_t, 4> kEU_DltDate = {0x03, 0x05, 0x00, 0x02};
|
|
|
|
struct TimeZone {
|
|
xe::be<int32_t> timezone_bias;
|
|
std::array<char, 4> tz_std_name;
|
|
std::array<char, 4> tz_dlt_name;
|
|
std::array<uint8_t, 4> tz_std_date;
|
|
std::array<uint8_t, 4> tz_dlt_date;
|
|
xe::be<int32_t> tz_std_bias;
|
|
xe::be<int32_t> tz_dlt_bias;
|
|
|
|
std::string name;
|
|
|
|
TimeZone() = default;
|
|
|
|
TimeZone(xe::be<int32_t> timezone_bias, const std::array<char, 4> std_name,
|
|
const std::array<char, 4> dlt_name,
|
|
const std::array<uint8_t, 4> std_date,
|
|
const std::array<uint8_t, 4> dlt_date, xe::be<int32_t> tz_std_bias,
|
|
xe::be<int32_t> tz_dlt_bias, std::string name = "")
|
|
: name(name),
|
|
timezone_bias(timezone_bias),
|
|
tz_std_bias(tz_std_bias),
|
|
tz_dlt_bias(tz_dlt_bias) {
|
|
std::memcpy(tz_std_name.data(), std_name.data(), 4);
|
|
std::memcpy(tz_dlt_name.data(), dlt_name.data(), 4);
|
|
std::memcpy(tz_std_date.data(), std_date.data(), 4);
|
|
std::memcpy(tz_dlt_date.data(), dlt_date.data(), 4);
|
|
}
|
|
|
|
// Ctors used only to make entries in table below.
|
|
static TimeZone NoDST(int32_t bias, std::string_view std_name,
|
|
std::string name) {
|
|
std::array<char, 4> std_arr{};
|
|
std::memcpy(std_arr.data(), std_name.data(),
|
|
std::min(std_name.size(), std_arr.size()));
|
|
return {bias, std_arr, {'\0', '\0', '\0', '\0'}, kNoDate, kNoDate, 0,
|
|
0, name};
|
|
}
|
|
|
|
static TimeZone WithDST(int32_t bias, std::string_view std_name,
|
|
std::string_view dlt_name,
|
|
std::array<uint8_t, 4> std_date,
|
|
std::array<uint8_t, 4> dlt_date, int32_t dlt_bias,
|
|
std::string name) {
|
|
std::array<char, 4> std_arr{};
|
|
std::array<char, 4> dlt_arr{};
|
|
std::memcpy(std_arr.data(), std_name.data(),
|
|
std::min(std_name.size(), std_arr.size()));
|
|
std::memcpy(dlt_arr.data(), dlt_name.data(),
|
|
std::min(dlt_name.size(), dlt_arr.size()));
|
|
return {bias, std_arr, dlt_arr, std_date, dlt_date, 0, dlt_bias, name};
|
|
}
|
|
|
|
bool operator==(const TimeZone& other) const {
|
|
return timezone_bias == other.timezone_bias &&
|
|
std::memcmp(tz_std_name.data(), other.tz_std_name.data(), 4) == 0 &&
|
|
std::memcmp(tz_dlt_name.data(), other.tz_dlt_name.data(), 4) == 0 &&
|
|
std::memcmp(tz_std_date.data(), other.tz_std_date.data(), 4) == 0 &&
|
|
std::memcmp(tz_dlt_date.data(), other.tz_dlt_date.data(), 4) == 0 &&
|
|
tz_std_bias == other.tz_std_bias && tz_dlt_bias == other.tz_dlt_bias;
|
|
}
|
|
};
|
|
|
|
inline const std::array<TimeZone, 75> kTimezones = {
|
|
TimeZone::NoDST(720, "IDLW", "GMT-12 Tokelau"),
|
|
TimeZone::NoDST(660, "NT", "GMT-11 Samoa"),
|
|
TimeZone::NoDST(600, "HST", "GMT-10 Hawaii"),
|
|
TimeZone::WithDST(540, "YST", "YDT", kUS_StdDate, kUS_DltDate, -60,
|
|
"GMT-09 Alaska"),
|
|
TimeZone::WithDST(480, "PST", "PDT", kUS_StdDate, kUS_DltDate, -60,
|
|
"GMT-08 Pacific (U.S. & Canada)"),
|
|
TimeZone::NoDST(420, "AMST", "GMT-07 Arizona"),
|
|
TimeZone::WithDST(420, "MST", "MST", kUS_StdDate, kUS_DltDate, -60,
|
|
"GMT-07 Mountain (U.S. & Canada)"),
|
|
TimeZone::NoDST(360, "CAST", "GMT-06 Central America"),
|
|
TimeZone::WithDST(360, "CST", "CDT", kUS_StdDate, kUS_DltDate, -60,
|
|
"GMT-06 Central (U.S. & Canada)"),
|
|
TimeZone::WithDST(360, "MST", "MDT", kUS_StdDate, kUS_DltDate, -60,
|
|
"GMT-06 Mexico City"),
|
|
TimeZone::NoDST(360, "CCST", "GMT-06 Saskatchewan"),
|
|
TimeZone::WithDST(300, "EST", "EDT", kUS_StdDate, kUS_DltDate, -60,
|
|
"GMT-05 Eastern (U.S. & Canada)"),
|
|
TimeZone::NoDST(300, "EST", "GMT-05 Indiana"),
|
|
TimeZone::NoDST(300, "SPST", "GMT-05 Bogota"),
|
|
TimeZone::WithDST(240, "AST", "ADT", kUS_StdDate, kUS_DltDate, -60,
|
|
"GMT-04 Atlantic (U.S. & Canada)"),
|
|
TimeZone::NoDST(240, "SWST", "GMT-04 Caracas"),
|
|
TimeZone::WithDST(240, "PSST", "PSDT", {0x03, 0x02, 0x06, 0x00},
|
|
{0x0A, 0x02, 0x06, 0x00}, -60, "GMT-04 Santiago"),
|
|
TimeZone::WithDST(210, "NST", "NDT", kUS_StdDate, kUS_DltDate, -60,
|
|
"GMT-03:30 Newfoundland"),
|
|
TimeZone::WithDST(180, "ESST", "ESDT", {0x02, 0x02, 0x00, 0x02},
|
|
{0x0A, 0x03, 0x00, 0x02}, -60, "GMT-03 Brasilia"),
|
|
TimeZone::NoDST(180, "SEST", "GMT-03 Buenos Aires"),
|
|
TimeZone::WithDST(180, "GST", "GDT", kUS_StdDate, kUS_DltDate, -60,
|
|
"GMT-03 Greenland"),
|
|
TimeZone::WithDST(120, "MAST", "MADT", {0x09, 0x05, 0x00, 0x02},
|
|
{0x03, 0x05, 0x00, 0x02}, -60, "GMT-02 Mid-Atlantic"),
|
|
TimeZone::WithDST(60, "AST", "ADT", {0x0A, 0x05, 0x00, 0x03},
|
|
{0x03, 0x05, 0x00, 0x02}, -60, "GMT-01 Azores"),
|
|
TimeZone::NoDST(60, "WAT", "GMT-01 Cape Verde"),
|
|
TimeZone::NoDST(0, "GST", "GMT+00 Casablanca"),
|
|
TimeZone::WithDST(0, "GMT", "BST", {0x0A, 0x05, 0x00, 0x02},
|
|
{0x03, 0x05, 0x00, 0x01}, -60, "GMT+00 London"),
|
|
TimeZone::WithDST(-60, "WEST", "WEDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+01 Berlin"),
|
|
TimeZone::WithDST(-60, "CEST", "CEDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+01 Belgrade"),
|
|
TimeZone::WithDST(-60, "RST", "RDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+01 Paris, Madrid"),
|
|
TimeZone::WithDST(-60, "SCST", "SCDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+01 Sarajevo"),
|
|
TimeZone::NoDST(-60, "WAST", "GMT+01 W. Central Africa"),
|
|
TimeZone::WithDST(-120, "GTST", "GTDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+02 Athens"),
|
|
TimeZone::WithDST(-120, "EEST", "EEDT", {0x09, 0x05, 0x00, 0x01},
|
|
{0x03, 0x05, 0x00, 0x00}, -60, "GMT+02 Bucharest"),
|
|
TimeZone::WithDST(-120, "EST", "EDT", {0x09, 0x05, 0x03, 0x02},
|
|
{0x05, 0x01, 0x05, 0x02}, -60, "GMT+02 Cairo"),
|
|
TimeZone::NoDST(-120, "SAST", "GMT+02 Pretoria"),
|
|
TimeZone::WithDST(-120, "FLST", "FLDT", {0x0A, 0x05, 0x00, 0x04},
|
|
{0x03, 0x05, 0x00, 0x03}, -60, "GMT+02 Helsinki"),
|
|
TimeZone::NoDST(-120, "JST", "GMT+02 Jerusalem"),
|
|
TimeZone::WithDST(-180, "AST", "ADT", {0x0A, 0x01, 0x00, 0x04},
|
|
{0x04, 0x01, 0x00, 0x03}, -60, "GMT+03 Baghdad"),
|
|
TimeZone::NoDST(-180, "AST", "GMT+03 Kuwait"),
|
|
TimeZone::WithDST(-180, "RST", "RDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+03 Moscow"),
|
|
TimeZone::NoDST(-180, "EAST", "GMT+03 Nairobi"),
|
|
TimeZone::WithDST(-210, "IST", "IDT", {0x09, 0x04, 0x02, 0x02},
|
|
{0x03, 0x01, 0x00, 0x02}, -60, "GMT+03:30 Tehran"),
|
|
TimeZone::NoDST(-240, "AST", "GMT+04 Abu Dhabi"),
|
|
TimeZone::WithDST(-240, "CST", "CDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+04 Baku"),
|
|
TimeZone::NoDST(-270, "AST", "GMT+04:30 Kabul"),
|
|
TimeZone::WithDST(-300, "EST", "EDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+05 Ekaterinburg"),
|
|
TimeZone::NoDST(-300, "WAST", "GMT+05 Islamabad"),
|
|
TimeZone::NoDST(-330, "IST", "GMT+05:30 New Delhi"),
|
|
TimeZone::NoDST(-345, "NST", "GMT+05:45 Kathmandu"),
|
|
TimeZone::WithDST(-360, "NCST", "NCDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+06 Almaty"),
|
|
TimeZone::NoDST(-360, "CAST", "GMT+06 Dhaka"),
|
|
TimeZone::NoDST(-360, "SRST", "GMT+06 Sri Lanka"),
|
|
TimeZone::NoDST(-390, "MST", "GMT+06:30 Yangon"),
|
|
TimeZone::NoDST(-420, "SAST", "GMT+07 Bangkok"),
|
|
TimeZone::WithDST(-420, "NAST", "NADT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+07 Krasnoyarsk"),
|
|
TimeZone::NoDST(-480, "CST", "GMT+08 Beijing"),
|
|
TimeZone::WithDST(-480, "NEST", "NEDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+08 Irkutsk"),
|
|
TimeZone::NoDST(-480, "MPST", "GMT+08 Singapore"),
|
|
TimeZone::NoDST(-480, "AWST", "GMT+08 Perth"),
|
|
TimeZone::NoDST(-480, "TST", "GMT+08 Taipei"),
|
|
TimeZone::NoDST(-540, "TST", "GMT+09 Tokyo"),
|
|
TimeZone::NoDST(-540, "KST", "GMT+09 Seoul"),
|
|
TimeZone::WithDST(-540, "YST", "YDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+09 Yakutsk"),
|
|
TimeZone::WithDST(-570, "ACST", "ACDT", {0x03, 0x05, 0x00, 0x02},
|
|
{0x0A, 0x05, 0x00, 0x02}, -60, "GMT+09:30 Adelaide"),
|
|
TimeZone::NoDST(-570, "ACST", "GMT+09:30 Darwin"),
|
|
TimeZone::NoDST(-600, "AEST", "GMT+10 Brisbane"),
|
|
TimeZone::WithDST(-600, "AEST", "AEDT", {0x03, 0x05, 0x00, 0x02},
|
|
{0x0A, 0x05, 0x00, 0x02}, -60, "GMT+10 Sydney"),
|
|
TimeZone::NoDST(-600, "WPST", "GMT+10 Guam"),
|
|
TimeZone::WithDST(-600, "TST", "TDT", {0x03, 0x05, 0x00, 0x02},
|
|
{0x0A, 0x01, 0x00, 0x02}, -60, "GMT+10 Hobart"),
|
|
TimeZone::WithDST(-600, "VST", "VDT", kEU_StdDate, kEU_DltDate, -60,
|
|
"GMT+10 Vladivostok"),
|
|
TimeZone::NoDST(-660, "CPST", "GMT+11 Solomon Islands"),
|
|
TimeZone::WithDST(-720, "NZST", "NZDT", {0x03, 0x03, 0x00, 0x02},
|
|
{0x0A, 0x01, 0x00, 0x02}, -60, "GMT+12 Auckland"),
|
|
TimeZone::NoDST(-720, "FST", "GMT+12 Fiji Islands"),
|
|
TimeZone::NoDST(-780, "TST", "GMT+13 Nuku'alofa"),
|
|
TimeZone::NoDST(-840, "KST", "GMT+14 Kiribati"),
|
|
};
|
|
|
|
struct Resolution {
|
|
std::string name_;
|
|
xe::be<uint16_t> width_;
|
|
xe::be<uint16_t> height_;
|
|
|
|
Resolution(uint16_t width, uint16_t height) : width_(width), height_(height) {
|
|
name_ = fmt::format("{}x{}", width, height);
|
|
};
|
|
|
|
Resolution(uint32_t value) : width_(value >> 16), height_(value) {
|
|
name_ = fmt::format("{}x{}", width_.get(), height_.get());
|
|
};
|
|
|
|
uint32_t to_host() const {
|
|
return (static_cast<uint32_t>(width_.get()) << 16) |
|
|
static_cast<uint32_t>(height_.get());
|
|
}
|
|
|
|
std::pair<uint16_t, uint16_t> aspect_ratio() const {
|
|
const uint16_t divisor = std::gcd(width_.get(), height_.get());
|
|
return {width_.get() / divisor, height_.get() / divisor};
|
|
}
|
|
|
|
bool is_widescreen() const {
|
|
return aspect_ratio() != std::make_pair<uint16_t, uint16_t>(4, 3);
|
|
}
|
|
};
|
|
|
|
// Not sure why HDMI is assigned to composite, but ok.
|
|
// XCONFIG_USER_AV_COMPOSITE_SCREENSZ
|
|
inline const std::array<Resolution, 3> XHDTVResolution = {
|
|
Resolution(640, 480), // 0x028001E0
|
|
Resolution(1280, 720), // 0x050002D0, always widescreen
|
|
Resolution(1920,
|
|
1080) // 0x07800438, interlaced added in 1888, always widescreen
|
|
};
|
|
|
|
// XCONFIG_USER_AV_COMPONENT_SCREENSZ
|
|
inline const std::array<Resolution, 20> XVGAResolution = {
|
|
Resolution(640, 480), Resolution(640, 576), Resolution(720, 480),
|
|
Resolution(720, 576), Resolution(800, 600), Resolution(848, 480),
|
|
Resolution(1024, 768), Resolution(1152, 864), Resolution(1280, 720),
|
|
Resolution(1280, 768), Resolution(1280, 960), Resolution(1280, 1024),
|
|
Resolution(1360, 768), Resolution(1440, 768), Resolution(1440, 900),
|
|
Resolution(1600, 768), Resolution(1680, 720), Resolution(1680, 1050),
|
|
Resolution(1920, 540), Resolution(1920, 1080)};
|
|
|
|
// XCONFIG_USER_AUDIO_FLAGS
|
|
enum X_AUDIO_FLAGS : uint32_t {
|
|
// Audio Mode Analog
|
|
DolbyProLogic = 0x00000001,
|
|
AnalogMono = 0x00000002,
|
|
// Audio Mode Digital
|
|
DigitalStereo = 0x00000000,
|
|
DolbyDigital = 0x00010000,
|
|
DolbyDigitalWithWMAPRO = 0x00030000,
|
|
// Special Flags
|
|
StereoBypass = 0x00000003,
|
|
LowLatency = 0x80000000,
|
|
};
|
|
|
|
// XCONFIG_USER_RETAIL_FLAGS
|
|
enum X_RETAIL_FLAGS : uint32_t {
|
|
// Clock
|
|
DSTOff = 0x00000002,
|
|
TwentyFourHourClock = 0x00000008,
|
|
|
|
// Startup
|
|
DashboardStartup = 0x00000080,
|
|
IPTVStartup = 0x00000800,
|
|
DiscStartup = 0x00002000,
|
|
MCXDownloaderStartup = 0x00020000,
|
|
// IPTV
|
|
IPTVEnabled = 0x00001000,
|
|
IPTVDVREnabled = 0x00080000,
|
|
IPTVDisabled = 0x02000000,
|
|
// Kinect
|
|
KinectInitialized = 0x20000000,
|
|
KinectDisabled = 0x80000000,
|
|
|
|
// Other
|
|
DashboardInitialized = 0x00000040,
|
|
BackgroundDownloadOn = 0x00010000,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_FLAGS
|
|
enum X_PC_FLAGS : uint8_t {
|
|
XBLAllowed = 0x01,
|
|
XBLMembershipCreationAllowed = 0x02,
|
|
XboxOneGameAllowed = 0x04,
|
|
PCEnabled = 0x80,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_GAMES
|
|
enum X_PC_GAMES_FLAGS : uint32_t {
|
|
EarlyChildhoodMax = 0x00000000,
|
|
EveryoneMax = 0x00000002,
|
|
Everyone_10Max = 0x00000004,
|
|
TeenMax = 0x00000006,
|
|
MatureMax = 0x00000008,
|
|
NoGameRestrictions = 0x000000FF,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_PASSWORD
|
|
enum X_PC_PASSWORD_FLAGS : uint32_t {
|
|
XButton = 0x00000001,
|
|
YButton = 0x00000002,
|
|
LeftButton = 0x00000003,
|
|
RightButton = 0x00000004,
|
|
UPButton = 0x00000005,
|
|
DownButton = 0x00000006,
|
|
LTButton = 0x00000009,
|
|
RTButton = 0x0000000A,
|
|
LBButton = 0x0000000B,
|
|
RBButton = 0x0000000C,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_MOVIE
|
|
enum X_PC_MOVIE_FLAGS : uint32_t {
|
|
GeneralAudiences = 0x00000001,
|
|
ParentalGuidance = 0x00000003,
|
|
ParentalGuidance13 = 0x00000004,
|
|
Restricted = 0x00000006,
|
|
NoMovieRestrictions = 0x000000FF,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_GAME_RATING
|
|
enum X_PC_GAME_RATING_FLAGS : uint32_t {
|
|
DefaultGame = 0x00000000,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_MOVIE_RATING
|
|
enum X_PC_MOVIE_RATING_FLAGS : uint32_t {
|
|
DefaultMovie = 0x00000000,
|
|
};
|
|
|
|
// XCONFIG_USER_ARCADE_FLAGS
|
|
enum X_ARCADE_FLAGS : uint32_t {
|
|
AutoDownloadOff = 0x00000000,
|
|
AutoDownloadNewReleases = 0x00000001,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_VERSION
|
|
enum X_PC_VERSION : uint32_t {
|
|
VersionOne = 0x00000001,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_TV
|
|
enum X_PC_TV : uint32_t {
|
|
TVG = 0X00000006,
|
|
TVPG = 0X00000008,
|
|
TV14 = 0X0000000a,
|
|
TVMatureAudience = 0x0000000C,
|
|
NoTVRestrictions = 0X000000FF,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_TV_RATING
|
|
enum X_PC_TV_RATING : uint32_t {
|
|
DefaultTV = 0X00000000,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_EXPLICIT_VIDEO
|
|
enum X_PC_EXPLICIT_VIDEO : uint32_t {
|
|
ExplicitVideoAllowed = 0X000000FF,
|
|
ExplicitVideoBanned = 0X00000000,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_EXPLICIT_VIDEO_RATING
|
|
enum X_PC_EXPLICIT_VIDEO_RATING : uint32_t {
|
|
ExplicitAllowed = 0X00000000,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_UNRATED_VIDEO
|
|
enum X_PC_EXPLICIT_UNRATED : uint32_t {
|
|
ExplicitUnratedBanned = 0X00000000,
|
|
UnratedALL = 0X000000FF,
|
|
};
|
|
|
|
// XCONFIG_USER_PC_UNRATED_VIDEO_RATING
|
|
enum X_PC_EXPLICIT_UNRATED_RATING : uint32_t {
|
|
DefaultExplicitUnrated = 0X00000000,
|
|
};
|
|
|
|
// XCONFIG_USER_VIDEO_OUTPUT_BLACK_LEVELS
|
|
enum X_BLACK_LEVEL : uint32_t {
|
|
High = 0x00000100,
|
|
Intermediate = 0x00000200,
|
|
LevelNormal = 0x00000300,
|
|
};
|
|
|
|
// XCONFIG_CONSOLE_SCREENSAVER
|
|
enum X_SCREENSAVER : uint32_t {
|
|
ScreensaverOn = 0x000A,
|
|
ScreensaverOff = 0x1000,
|
|
};
|
|
|
|
// XCONFIG_CONSOLE_AUTO_SHUTDOWN
|
|
enum X_AUTO_SHUTDOWN : uint32_t {
|
|
AutoShutdownOff = 0x0000,
|
|
AutoShutdownOneHr = 0x003C,
|
|
AutoShutdownSixHr = 0x0168,
|
|
};
|
|
|
|
// XCONFIG_CONSOLE_CAMERA_SETTINGS
|
|
enum X_CAMERA_FLAGS : uint32_t {
|
|
// Room
|
|
RoomAuto = 0x00000000,
|
|
DarkWall = 0x00000001,
|
|
LightWall = 0x00000002,
|
|
// Lighting
|
|
LightingAuto = 0x00000000,
|
|
Incandescent = 0x00000004,
|
|
Flourescent = 0x00000008,
|
|
Daylight = 0x0000000C,
|
|
// Flourescent Anti-Flicker
|
|
AntiFlickerAuto = 0x00000000,
|
|
AntiFlickerOn = 0x00000001,
|
|
AntiFlickerOff = 0x00000002,
|
|
// Default
|
|
AutoAll = 0x00000001,
|
|
};
|
|
|
|
// XCONFIG_CONSOLE_KEYBOARD_LAYOUT
|
|
enum X_KEYBOARD_LAYOUT : uint16_t {
|
|
KeyboardDefault = 0x0000,
|
|
EnglishQWERTY = 0x0001,
|
|
};
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
struct XConfigData {
|
|
// -------------------------------------------------------------------------
|
|
// 0x0 XCONFIG_STATIC_SETTINGS
|
|
// -------------------------------------------------------------------------
|
|
struct Static {
|
|
xe::be<uint32_t> checksum; // 0x000
|
|
xe::be<uint32_t> version; // 0x004
|
|
std::array<uint8_t, 5> first_power_on; // 0x008 date; key 0x1
|
|
uint8_t _reserved0; // 0x00D
|
|
std::array<uint8_t, 256> smc_block; // 0x00E union_SMC_BLOCK
|
|
} static_settings;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0x1 XCONFIG_STATISTIC_SETTINGS
|
|
// -------------------------------------------------------------------------
|
|
struct Statistic {
|
|
xe::be<uint32_t> checksum; // 0x0000
|
|
xe::be<uint32_t> version; // 0x0004
|
|
std::array<uint8_t, 6> xuid_mac_address; // 0x0008
|
|
std::array<uint8_t, 2> _reserved0; // 0x000E
|
|
xe::be<uint32_t> xuid_count; // 0x0010
|
|
std::array<uint8_t, 32> odd_failures; // 0x0014
|
|
std::array<uint8_t, 101> bug_check_data; // 0x0034
|
|
std::array<uint8_t, 200> temperature_data; // 0x0099
|
|
std::array<uint8_t, 467> _unused; // 0x0161
|
|
std::array<uint8_t, 512> hdd_smart_data; // 0x0334
|
|
std::array<uint8_t, 100> uem_errors; // 0x0534
|
|
std::array<uint8_t, 56> fpm_errors; // 0x0598
|
|
xe::be<uint64_t> last_report_time; // 0x05D0 FILETIME?
|
|
} statistic;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0x2 XCONFIG_SECURED_SETTINGS
|
|
// -------------------------------------------------------------------------
|
|
struct Secured {
|
|
xe::be<uint32_t> checksum; // 0x00
|
|
xe::be<uint32_t> version; // 0x04
|
|
std::array<uint8_t, 4> online_network_id; // 0x08
|
|
std::array<uint8_t, 8> _reserved1; // 0x0C
|
|
std::array<uint8_t, 12> _reserved2; // 0x14
|
|
std::array<uint8_t, 6> mac_address; // 0x20
|
|
std::array<uint8_t, 2> _reserved3; // 0x26
|
|
xe::be<uint32_t> av_region; // 0x28
|
|
xe::be<uint16_t> game_region; // 0x2C
|
|
std::array<uint8_t, 6> _reserved4; // 0x2E
|
|
xe::be<uint32_t> dvd_region; // 0x34
|
|
xe::be<uint32_t> reset_key; // 0x38
|
|
xe::be<uint32_t> system_flags; // 0x3C
|
|
std::array<uint8_t, 2> power_mode; // 0x40
|
|
std::array<uint8_t, 2> power_vcs_control; // 0x42
|
|
std::array<uint8_t, 444> _reserved_region; // 0x44
|
|
} secured;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0x3 XCONFIG_USER_SETTINGS
|
|
// -------------------------------------------------------------------------
|
|
struct User {
|
|
xe::be<uint32_t> checksum; // 0x000
|
|
xe::be<uint32_t> version; // 0x004
|
|
xe::be<int32_t> time_zone_bias; // 0x008
|
|
std::array<char, 4> tz_std_name; // 0x00C
|
|
std::array<char, 4> tz_dlt_name; // 0x010
|
|
std::array<uint8_t, 4> tz_std_date; // 0x014 XCONFIG_TIMEZONE_DATE
|
|
std::array<uint8_t, 4> tz_dlt_date; // 0x018 XCONFIG_TIMEZONE_DATE
|
|
xe::be<int32_t> tz_std_bias; // 0x01C
|
|
xe::be<int32_t> tz_dlt_bias; // 0x020
|
|
xe::be<uint64_t> default_profile; // 0x024
|
|
xe::be<uint32_t> language; // 0x02C
|
|
xe::be<uint32_t> video_flags; // 0x030
|
|
xe::be<uint32_t> audio_flags; // 0x034
|
|
xe::be<uint32_t> retail_flags; // 0x038
|
|
xe::be<uint32_t> devkit_flags; // 0x03C
|
|
xe::be<uint8_t> country; // 0x040
|
|
xe::be<uint8_t> parental_control_flags; // 0x041
|
|
std::array<uint8_t, 2> _reserved_flag; // 0x042
|
|
std::array<uint8_t, 256> smb_config; // 0x044
|
|
xe::be<uint64_t> live_puid; // 0x144
|
|
std::array<uint8_t, 16> live_credentials; // 0x14C
|
|
xe::be<int32_t> av_pack_hdmi_sz; // 0x15C
|
|
xe::be<int32_t> av_pack_component_sz; // 0x160
|
|
xe::be<int32_t> av_pack_vga_sz; // 0x164
|
|
xe::be<uint32_t> parental_control_game; // 0x168
|
|
xe::be<uint32_t> parental_control_password; // 0x16C
|
|
xe::be<uint32_t> parental_control_movie; // 0x170
|
|
xe::be<uint32_t> parental_control_game_rating; // 0x174
|
|
xe::be<uint32_t> parental_control_movie_rating; // 0x178
|
|
uint8_t parental_control_hint; // 0x17C
|
|
std::array<uint8_t, 32> parental_control_hint_answer; // 0x17D
|
|
std::array<uint8_t, 32> parental_control_override; // 0x19D
|
|
xe::be<uint32_t> music_playback_mode; // 0x1BD
|
|
xe::be<float> music_volume; // 0x1C1
|
|
xe::be<uint32_t> music_flags; // 0x1C5
|
|
xe::be<uint32_t> arcade_flags; // 0x1C9
|
|
xe::be<uint32_t> parental_control_version; // 0x1CD
|
|
xe::be<uint32_t> parental_control_tv; // 0x1D1
|
|
xe::be<uint32_t> parental_control_tv_rating; // 0x1D5
|
|
xe::be<uint32_t> parental_control_explicit_video; // 0x1D9
|
|
xe::be<uint32_t> parental_control_explicit_video_rating; // 0x1DD
|
|
xe::be<uint32_t> parental_control_unrated_video; // 0x1E1
|
|
xe::be<uint32_t> parental_control_unrated_video_rating; // 0x1E5
|
|
xe::be<uint32_t> video_output_black_levels; // 0x1E9
|
|
uint8_t video_player_display_mode; // 0x1ED
|
|
xe::be<uint32_t> alternative_video_timing_ids; // 0x1EE
|
|
xe::be<uint32_t> video_driver_options; // 0x1F2
|
|
xe::be<uint32_t> music_ui_flags; // 0x1F6
|
|
uint8_t video_media_source_type; // 0x1FA
|
|
uint8_t music_media_source_type; // 0x1FB
|
|
uint8_t photo_media_source_type; // 0x1FC
|
|
} user;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0x4 XCONFIG_XNET_MACHINE_ACCOUNT
|
|
// -------------------------------------------------------------------------
|
|
struct XnetMachineAccount {
|
|
xe::be<uint32_t> version; // 0x000
|
|
std::array<uint8_t, 492> data; // 0x004
|
|
} xnet_machine_account;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0x5 XCONFIG_XNET_PARAMETERS
|
|
// -------------------------------------------------------------------------
|
|
struct XnetParameters {
|
|
uint8_t cfg_size_of_struct; // 0x00
|
|
uint8_t cfg_flags; // 0x01
|
|
uint8_t cfg_sock_max_dgram_sockets; // 0x02
|
|
uint8_t cfg_sock_max_stream_sockets; // 0x03
|
|
uint8_t cfg_sock_default_recv_bufsize_in_k; // 0x04
|
|
uint8_t cfg_sock_default_send_bufsize_in_k; // 0x05
|
|
uint8_t cfg_key_reg_max; // 0x06
|
|
uint8_t cfg_sec_reg_max; // 0x07
|
|
uint8_t cfg_qos_data_limit_div4; // 0x08
|
|
uint8_t cfg_qos_probe_timeout_in_seconds; // 0x09
|
|
uint8_t cfg_qos_probe_entries; // 0x0A
|
|
uint8_t cfg_qos_srv_max_simultaneous_responses; // 0x0B
|
|
uint8_t cfg_qos_pair_wait_time_in_seconds; // 0x0C
|
|
} xnet_parameters;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0x6 XCONFIG_MEDIA_CENTER_SETTINGS
|
|
// -------------------------------------------------------------------------
|
|
struct MediaCenter {
|
|
xe::be<uint32_t> checksum; // 0x0000
|
|
xe::be<uint32_t> version; // 0x0004
|
|
std::array<uint8_t, 20> media_player; // 0x0008
|
|
std::array<uint8_t, 10> xe_sled_version; // 0x001C
|
|
std::array<uint8_t, 20> xe_sled_trust_secret; // 0x0026
|
|
std::array<uint8_t, 8> xe_sled_trust_code; // 0x003A
|
|
std::array<uint8_t, 20> xe_sled_host_id; // 0x0042
|
|
std::array<uint8_t, 1628> xe_sled_key; // 0x0056
|
|
std::array<uint8_t, 6> xe_sled_host_mac_address; // 0x06B2
|
|
std::array<uint8_t, 16> server_uuid; // 0x06B8
|
|
std::array<uint8_t, 128> server_name; // 0x06C8
|
|
std::array<uint8_t, 4> server_flags; // 0x0748
|
|
} media_center;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0x7 XCONFIG_CONSOLE_SETTINGS
|
|
// -------------------------------------------------------------------------
|
|
struct Console {
|
|
xe::be<uint32_t> checksum; // 0x000
|
|
xe::be<uint32_t> version; // 0x004
|
|
xe::be<int16_t> screen_saver; // 0x008
|
|
xe::be<int16_t> auto_shut_off; // 0x00A
|
|
std::array<uint8_t, 256> wireless_settings; // 0x00C
|
|
xe::be<uint32_t> camera_settings; // 0x10C
|
|
std::array<uint8_t, 28> camera_settings_reserved; // 0x110
|
|
std::array<uint8_t, 20> play_timer_data; // 0x12C XCONFIG_PLAY_TIMER_DATA
|
|
xe::be<int16_t> media_disable_auto_launch; // 0x140
|
|
xe::be<int16_t> keyboard_layout; // 0x142
|
|
} console;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0x8 XCONFIG_DVD_SETTINGS
|
|
// -------------------------------------------------------------------------
|
|
struct Dvd {
|
|
xe::be<uint32_t> version; // 0x000
|
|
std::array<uint8_t, 20> volume_id; // 0x004
|
|
std::array<uint8_t, 640> data; // 0x018
|
|
} dvd;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0x9 XCONFIG_IPTV_SETTINGS
|
|
// -------------------------------------------------------------------------
|
|
struct Iptv {
|
|
xe::be<uint32_t> checksum; // 0x000
|
|
xe::be<uint32_t> version; // 0x004
|
|
std::array<char16_t, 60> service_provider_name; // 0x008 wchar
|
|
std::array<uint8_t, 128> provisioning_server_url; // 0x080 wchar
|
|
std::array<uint8_t, 128> support_info; // 0x100 wchar
|
|
std::array<uint8_t, 128> bootstrap_server_url; // 0x180 wchar
|
|
} iptv;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// 0xA XCONFIG_SYSTEM_SETTINGS
|
|
// -------------------------------------------------------------------------
|
|
struct System {
|
|
xe::be<uint32_t> version; // 0x00
|
|
xe::be<uint64_t> alarm_time; // 0x04 union_LARGE_INTEGER
|
|
xe::be<uint32_t> previous_flash_version; // 0x0C
|
|
} system;
|
|
};
|
|
|
|
static_assert(offsetof(XConfigData::Secured, mac_address) == 32);
|
|
static_assert(offsetof(XConfigData::Secured, av_region) == 40);
|
|
static_assert(offsetof(XConfigData::User, language) == 44);
|
|
static_assert(offsetof(XConfigData::User, audio_flags) == 52);
|
|
static_assert(offsetof(XConfigData::User, retail_flags) == 56);
|
|
static_assert(offsetof(XConfigData::User, country) == 64);
|
|
static_assert(offsetof(XConfigData::User, music_volume) == 449);
|
|
|
|
#pragma pack(pop)
|
|
|
|
template <typename T>
|
|
concept XConfigValidValueType =
|
|
std::same_as<T, uint8_t> || std::same_as<T, uint16_t> ||
|
|
std::same_as<T, uint32_t> || std::same_as<T, uint64_t> ||
|
|
std::same_as<T, float>;
|
|
|
|
class XConfig {
|
|
public:
|
|
XConfig() = delete;
|
|
XConfig(const std::filesystem::path& xconfig_path);
|
|
|
|
~XConfig() = default;
|
|
|
|
void WriteSetting(const X_CONFIG_CATEGORY category, const uint16_t setting_id,
|
|
const void* buffer);
|
|
|
|
void ReadSetting(const X_CONFIG_CATEGORY category, const uint16_t setting_id,
|
|
void* buffer);
|
|
template <XConfigValidValueType T>
|
|
T ReadSetting(const X_CONFIG_CATEGORY category, const uint16_t setting_id) {
|
|
const auto field = FindField(category, setting_id);
|
|
|
|
if (!field || sizeof(T) != field->size) {
|
|
return {};
|
|
}
|
|
|
|
T buffer;
|
|
ReadSetting(category, setting_id, &buffer);
|
|
|
|
buffer = xe::byte_swap<T>(buffer);
|
|
|
|
return buffer;
|
|
}
|
|
|
|
uint16_t GetSettingSize(const X_CONFIG_CATEGORY category,
|
|
const uint16_t setting_id);
|
|
|
|
const XConfigData* GetXConfig() const { return &xconfig_data_; }
|
|
void WriteXConfig(const XConfigData* data);
|
|
|
|
void SetDefaults();
|
|
|
|
private:
|
|
void FlushToFile();
|
|
|
|
struct FieldDescriptor {
|
|
X_CONFIG_CATEGORY category;
|
|
uint16_t setting;
|
|
uint16_t size;
|
|
size_t block_offset;
|
|
};
|
|
|
|
static const FieldDescriptor* FindField(X_CONFIG_CATEGORY category,
|
|
uint16_t setting);
|
|
uint8_t* CategoryBase(X_CONFIG_CATEGORY category);
|
|
const uint8_t* CategoryBase(X_CONFIG_CATEGORY category) const;
|
|
|
|
#define XCONFIG_FIELD(category, setting, block, member) \
|
|
{(category), (setting), \
|
|
static_cast<uint16_t>(sizeof(XConfigData::block::member)), \
|
|
offsetof(XConfigData::block, member)}
|
|
|
|
static inline constexpr XConfig::FieldDescriptor kFields[] = {
|
|
// -- XCONFIG_STATIC (0x0) ---------------------------------------------
|
|
XCONFIG_FIELD(XCONFIG_STATIC_CATEGORY, XCONFIG_STATIC_FIRST_POWER_ON_DATE,
|
|
Static, first_power_on),
|
|
|
|
// -- XCONFIG_SECURED (0x2) --------------------------------------------
|
|
XCONFIG_FIELD(XCONFIG_SECURED_CATEGORY, XCONFIG_SECURED_MAC_ADDRESS,
|
|
Secured, mac_address),
|
|
XCONFIG_FIELD(XCONFIG_SECURED_CATEGORY, XCONFIG_SECURED_AV_REGION,
|
|
Secured, av_region),
|
|
XCONFIG_FIELD(XCONFIG_SECURED_CATEGORY, XCONFIG_SECURED_GAME_REGION,
|
|
Secured, game_region),
|
|
XCONFIG_FIELD(XCONFIG_SECURED_CATEGORY, XCONFIG_SECURED_DVD_REGION,
|
|
Secured, dvd_region),
|
|
XCONFIG_FIELD(XCONFIG_SECURED_CATEGORY, XCONFIG_SECURED_RESET_KEY,
|
|
Secured, reset_key),
|
|
XCONFIG_FIELD(XCONFIG_SECURED_CATEGORY, XCONFIG_SECURED_SYSTEM_FLAGS,
|
|
Secured, system_flags),
|
|
XCONFIG_FIELD(XCONFIG_SECURED_CATEGORY, XCONFIG_SECURED_POWER_MODE,
|
|
Secured, power_mode),
|
|
XCONFIG_FIELD(XCONFIG_SECURED_CATEGORY, XCONFIG_SECURED_ONLINE_NETWORK_ID,
|
|
Secured, online_network_id),
|
|
XCONFIG_FIELD(XCONFIG_SECURED_CATEGORY, XCONFIG_SECURED_POWER_VCS_CONTROL,
|
|
Secured, power_vcs_control),
|
|
|
|
// -- XCONFIG_USER (0x3) -----------------------------------------------
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_TIME_ZONE_BIAS, User,
|
|
time_zone_bias),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_TIME_ZONE_STD_NAME,
|
|
User, tz_std_name),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_TIME_ZONE_DLT_NAME,
|
|
User, tz_dlt_name),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_TIME_ZONE_STD_DATE,
|
|
User, tz_std_date),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_TIME_ZONE_DLT_DATE,
|
|
User, tz_dlt_date),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_TIME_ZONE_STD_BIAS,
|
|
User, tz_std_bias),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_TIME_ZONE_DLT_BIAS,
|
|
User, tz_dlt_bias),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_DEFAULT_PROFILE, User,
|
|
default_profile),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_LANGUAGE, User,
|
|
language),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_VIDEO_FLAGS, User,
|
|
video_flags),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_AUDIO_FLAGS, User,
|
|
audio_flags),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_RETAIL_FLAGS, User,
|
|
retail_flags),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_DEVKIT_FLAGS, User,
|
|
devkit_flags),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_COUNTRY, User, country),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_FLAGS, User,
|
|
parental_control_flags),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_SMB_CONFIG, User,
|
|
smb_config),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_LIVE_PUID, User,
|
|
live_puid),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_LIVE_CREDENTIALS, User,
|
|
live_credentials),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_AV_COMPOSITE_SCREENSZ,
|
|
User, av_pack_hdmi_sz),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_AV_COMPONENT_SCREENSZ,
|
|
User, av_pack_component_sz),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_AV_VGA_SCREENSZ, User,
|
|
av_pack_vga_sz),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_GAME, User,
|
|
parental_control_game),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_PASSWORD, User,
|
|
parental_control_password),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_MOVIE, User,
|
|
parental_control_movie),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_GAME_RATING, User,
|
|
parental_control_game_rating),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_MOVIE_RATING, User,
|
|
parental_control_movie_rating),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_HINT, User,
|
|
parental_control_hint),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_HINT_ANSWER, User,
|
|
parental_control_hint_answer),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_OVERRIDE, User,
|
|
parental_control_override),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_MUSIC_PLAYBACK_MODE,
|
|
User, music_playback_mode),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_MUSIC_VOLUME, User,
|
|
music_volume),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_MUSIC_FLAGS, User,
|
|
music_flags),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_ARCADE_FLAGS, User,
|
|
arcade_flags),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_VERSION, User,
|
|
parental_control_version),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_TV, User,
|
|
parental_control_tv),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_TV_RATING, User,
|
|
parental_control_tv_rating),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_EXPLICIT_VIDEO, User,
|
|
parental_control_explicit_video),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY,
|
|
XCONFIG_USER_PC_EXPLICIT_VIDEO_RATING, User,
|
|
parental_control_explicit_video_rating),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_UNRATED_VIDEO, User,
|
|
parental_control_unrated_video),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PC_UNRATED_VIDEO_RATING,
|
|
User, parental_control_unrated_video_rating),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY,
|
|
XCONFIG_USER_VIDEO_OUTPUT_BLACK_LEVELS, User,
|
|
video_output_black_levels),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY,
|
|
XCONFIG_USER_VIDEO_PLAYER_DISPLAY_MODE, User,
|
|
video_player_display_mode),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY,
|
|
XCONFIG_USER_ALTERNATE_VIDEO_TIMING_ID, User,
|
|
alternative_video_timing_ids),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_VIDEO_DRIVER_OPTIONS,
|
|
User, video_driver_options),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_MUSIC_UI_FLAGS, User,
|
|
music_ui_flags),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_VIDEO_MEDIA_SOURCE_TYPE,
|
|
User, video_media_source_type),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_MUSIC_MEDIA_SOURCE_TYPE,
|
|
User, music_media_source_type),
|
|
XCONFIG_FIELD(XCONFIG_USER_CATEGORY, XCONFIG_USER_PHOTO_MEDIA_SOURCE_TYPE,
|
|
User, photo_media_source_type),
|
|
|
|
// -- XCONFIG_CONSOLE (0x7) --------------------------------------------
|
|
XCONFIG_FIELD(XCONFIG_CONSOLE_CATEGORY, XCONFIG_CONSOLE_SCREEN_SAVER,
|
|
Console, screen_saver),
|
|
XCONFIG_FIELD(XCONFIG_CONSOLE_CATEGORY, XCONFIG_CONSOLE_AUTO_SHUT_OFF,
|
|
Console, auto_shut_off),
|
|
XCONFIG_FIELD(XCONFIG_CONSOLE_CATEGORY, XCONFIG_CONSOLE_WIRELESS_SETTINGS,
|
|
Console, wireless_settings),
|
|
XCONFIG_FIELD(XCONFIG_CONSOLE_CATEGORY, XCONFIG_CONSOLE_CAMERA_SETTINGS,
|
|
Console, camera_settings),
|
|
XCONFIG_FIELD(XCONFIG_CONSOLE_CATEGORY, XCONFIG_CONSOLE_PLAYTIMERDATA,
|
|
Console, play_timer_data),
|
|
XCONFIG_FIELD(XCONFIG_CONSOLE_CATEGORY,
|
|
XCONFIG_CONSOLE_MEDIA_DISABLEAUTOLAUNCH, Console,
|
|
media_disable_auto_launch),
|
|
XCONFIG_FIELD(XCONFIG_CONSOLE_CATEGORY, XCONFIG_CONSOLE_KEYBOARD_LAYOUT,
|
|
Console, keyboard_layout),
|
|
// XCONFIG_FIELD(XCONFIG_CONSOLE_CATEGORY,
|
|
// XCONFIG_CONSOLE_PC_TITLE_EXEMPTIONS,
|
|
// Console, keyboard_layout),
|
|
|
|
// -- XCONFIG_IPTV (0x7) --------------------------------------------
|
|
XCONFIG_FIELD(XCONFIG_IPTV_CATEGORY, XCONFIG_IPTV_SERVICE_PROVIDER_NAME,
|
|
Iptv, service_provider_name),
|
|
|
|
// -- XCONFIG_SYSTEM (0xA) ---------------------------------------------
|
|
XCONFIG_FIELD(XCONFIG_SYSTEM_CATEGORY, XCONFIG_SYSTEM_ALARM_TIME, System,
|
|
alarm_time),
|
|
XCONFIG_FIELD(XCONFIG_SYSTEM_CATEGORY,
|
|
XCONFIG_SYSTEM_PREVIOUS_FLASH_VERSION, System,
|
|
previous_flash_version)};
|
|
|
|
#undef XCONFIG_FIELD
|
|
|
|
xe_mutex lock_{};
|
|
|
|
std::filesystem::path storage_path_;
|
|
std::filesystem::path file_path_;
|
|
XConfigData xconfig_data_{};
|
|
};
|
|
|
|
} // namespace kernel
|
|
} // namespace xe
|
|
|
|
#endif // XENIA_KERNEL_XCONFIG_H_
|