From dc7eb5c672969a6b82cb84f1e9692cb3f2f708a8 Mon Sep 17 00:00:00 2001 From: The-Little-Wolf <116989599+The-Little-Wolf@users.noreply.github.com> Date: Mon, 26 May 2025 16:03:01 -0700 Subject: [PATCH] [XBOXKRNL/XCONFIG] - Partially Implement Time Zones - Partially Implement Time Zones --- src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc | 127 ++++++++++++++++-- src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.h | 4 + 2 files changed, 118 insertions(+), 13 deletions(-) diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc index 34bc37c11..1f64f0893 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc @@ -53,6 +53,9 @@ DEFINE_uint32( " optional. Ex) 0x00010001\n", "XConfig"); +DEFINE_bool(twenty_four_hour_clock, false, + "Have the clock set to 24 hour format or 12\n", "XConfig"); + DECLARE_bool(widescreen); DECLARE_bool(use_50Hz_mode); DECLARE_int32(video_standard); @@ -74,6 +77,9 @@ X_STATUS xeExGetXConfigSetting(X_CONFIG_CATEGORY category, uint16_t setting, switch (category) { case XCONFIG_SECURED_CATEGORY: switch (setting) { + case XCONFIG_SECURED_MAC_ADDRESS: + setting_size = 6; + break; case XCONFIG_SECURED_AV_REGION: setting_size = 4; switch (cvars::video_standard) { @@ -103,17 +109,92 @@ X_STATUS xeExGetXConfigSetting(X_CONFIG_CATEGORY category, uint16_t setting, break; case XCONFIG_USER_CATEGORY: switch (setting) { - case XCONFIG_USER_TIME_ZONE_BIAS: - case XCONFIG_USER_TIME_ZONE_STD_NAME: - case XCONFIG_USER_TIME_ZONE_DLT_NAME: - case XCONFIG_USER_TIME_ZONE_STD_DATE: - case XCONFIG_USER_TIME_ZONE_DLT_DATE: - case XCONFIG_USER_TIME_ZONE_STD_BIAS: - case XCONFIG_USER_TIME_ZONE_DLT_BIAS: +#ifdef XE_PLATFORM_WIN32 + case XCONFIG_USER_TIME_ZONE_BIAS: { + setting_size = 4; + TIME_ZONE_INFORMATION tzi; + auto id = GetTimeZoneInformation(&tzi); + xe::store_and_swap( + value, id != TIME_ZONE_ID_INVALID ? tzi.Bias : 0); + break; + } + case XCONFIG_USER_TIME_ZONE_STD_NAME: + setting_size = 4; + xe::store_and_swap(value, "BST"); + break; + case XCONFIG_USER_TIME_ZONE_DLT_NAME: + setting_size = 4; + xe::store_and_swap(value, "BDT"); + break; + case XCONFIG_USER_TIME_ZONE_STD_DATE: { + setting_size = 4; + TIME_ZONE_INFORMATION tzi; + auto id = GetTimeZoneInformation(&tzi); + value[0] = static_cast(tzi.StandardDate.wMonth); + value[1] = static_cast(tzi.StandardDate.wDay); + value[2] = static_cast(tzi.StandardDate.wDayOfWeek); + value[3] = static_cast(tzi.StandardDate.wHour); + break; + } + case XCONFIG_USER_TIME_ZONE_DLT_DATE: { + setting_size = 4; + TIME_ZONE_INFORMATION tzi; + auto id = GetTimeZoneInformation(&tzi); + value[0] = static_cast(tzi.DaylightDate.wMonth); + value[1] = static_cast(tzi.DaylightDate.wDay); + value[2] = static_cast(tzi.DaylightDate.wDayOfWeek); + value[3] = static_cast(tzi.DaylightDate.wHour); + break; + } + case XCONFIG_USER_TIME_ZONE_STD_BIAS: { + TIME_ZONE_INFORMATION tzi; + auto id = GetTimeZoneInformation(&tzi); + setting_size = 4; + xe::store_and_swap( + value, id != TIME_ZONE_ID_INVALID ? tzi.StandardBias : 0); + break; + } + case XCONFIG_USER_TIME_ZONE_DLT_BIAS: { // XCONFIG_USER_TIME_ZONE_DLT_BIAS + TIME_ZONE_INFORMATION tzi; + auto id = GetTimeZoneInformation(&tzi); + setting_size = 4; + xe::store_and_swap( + value, id != TIME_ZONE_ID_INVALID ? tzi.DaylightBias : 0); + break; + } +#else + case XCONFIG_USER_TIME_ZONE_BIAS: setting_size = 4; - // TODO(benvanik): get this value. xe::store_and_swap(value, 0); break; + case XCONFIG_USER_TIME_ZONE_STD_NAME: + setting_size = 4; + xe::store_and_swap(value, "GMT"); + break; + case XCONFIG_USER_TIME_ZONE_DLT_NAME: + setting_size = 4; + xe::store_and_swap(value, "\0\0\0\0"); + break; + case XCONFIG_USER_TIME_ZONE_STD_DATE: + setting_size = 4; + xe::store_and_swap(value, 0x00000000); + break; + case XCONFIG_USER_TIME_ZONE_DLT_DATE: + setting_size = 4; + xe::store_and_swap(value, 0x00000000); + break; + case XCONFIG_USER_TIME_ZONE_STD_BIAS: + setting_size = 4; + xe::store_and_swap(value, 0x00000000); + break; + case XCONFIG_USER_TIME_ZONE_DLT_BIAS: + setting_size = 4; + xe::store_and_swap(value, 0x00000000); + break; +#endif + case XCONFIG_USER_DEFAULT_PROFILE: + setting_size = 8; + xe::store_and_swap(value, 0); case XCONFIG_USER_LANGUAGE: setting_size = 4; xe::store_and_swap(value, cvars::user_language); @@ -128,11 +209,24 @@ X_STATUS xeExGetXConfigSetting(X_CONFIG_CATEGORY category, uint16_t setting, setting_size = 4; xe::store_and_swap(value, cvars::audio_flag); break; - case XCONFIG_USER_RETAIL_FLAGS: + case XCONFIG_USER_RETAIL_FLAGS: { setting_size = 4; - // TODO(benvanik): get this value. - xe::store_and_swap(value, 0x40); + uint32_t retail_flags = 0; + retail_flags |= X_RETAIL_FLAGS::DashboardInitialized; + retail_flags |= cvars::twenty_four_hour_clock + ? X_RETAIL_FLAGS::TwentyFourHourClock + : 0; +#ifdef XE_PLATFORM_WIN32 + TIME_ZONE_INFORMATION tzi; + auto id = GetTimeZoneInformation(&tzi); + retail_flags |= + id != TIME_ZONE_ID_INVALID ? 0 : X_RETAIL_FLAGS::DSTOff; +#else + retail_flags |= X_RETAIL_FLAGS::DSTOff; +#endif + xe::store_and_swap(value, retail_flags); break; + } case XCONFIG_USER_COUNTRY: setting_size = 1; value[0] = static_cast(cvars::user_country); @@ -169,6 +263,10 @@ X_STATUS xeExGetXConfigSetting(X_CONFIG_CATEGORY category, uint16_t setting, setting_size = 1; value[0] = static_cast(0); break; + case XCONFIG_USER_PC_VERSION: + setting_size = 4; + xe::store_and_swap(value, 0x00000001); + break; case XCONFIG_USER_VIDEO_OUTPUT_BLACK_LEVELS: setting_size = 4; xe::store_and_swap(value, X_BLACK_LEVEL::LevelNormal); @@ -190,6 +288,9 @@ X_STATUS xeExGetXConfigSetting(X_CONFIG_CATEGORY category, uint16_t setting, setting_size = 2; xe::store_and_swap(value, X_AUTO_SHUTDOWN::AutoShutdownOff); break; + case XCONFIG_CONSOLE_MEDIA_DISABLEAUTOLAUNCH: + setting_size = 2; + xe::store_and_swap(value, 0); case XCONFIG_CONSOLE_CAMERA_SETTINGS: // Camera Flags are added together and last byte is always 0x1 setting_size = 4; @@ -257,7 +358,7 @@ dword_result_t ExSetXConfigSetting_entry(word_t category, word_t setting, Handles settings the only have a single flag/value like XCONFIG_USER_VIDEO_FLAGS to swap */ - XELOGI("ExSetXConfigSetting: category: 0X{:04x}, setting: 0X{:04x}", + XELOGI("ExSetXConfigSetting: category: 0x{:04x}, setting: 0x{:04x}", static_cast(category), static_cast(setting)); return X_STATUS_SUCCESS; } @@ -273,7 +374,7 @@ dword_result_t ExReadModifyWriteXConfigSettingUlong_entry(word_t category, */ XELOGI( "ExReadModifyWriteXConfigSettingUlong: category: 0x{:04x}, setting: " - "{:04x}, changed bits: 0X{:08x}, setting flag 0X{:08x}", + "{:04x}, changed bits: 0x{:08x}, setting flag 0x{:08x}", static_cast(category), static_cast(setting), static_cast(bit_affected), static_cast(flag)); return X_STATUS_SUCCESS; diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.h b/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.h index 7d99144cd..57557124a 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.h +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.h @@ -13,6 +13,10 @@ #include #include +#if XE_PLATFORM_WIN32 +#include "xenia/base/platform_win.h" +#endif + namespace xe { namespace kernel { namespace xboxkrnl {