From a0e1ba83135f810114162025cf4b729d6c420ba3 Mon Sep 17 00:00:00 2001 From: The-Little-Wolf <116989599+The-Little-Wolf@users.noreply.github.com> Date: Fri, 24 Jul 2026 19:34:01 -0700 Subject: [PATCH] [XAM/INFO] - Stub XamQueryLiveHive & XamGetLiveHiveValue functions - Stub XamQueryLiveHive & XamGetLiveHiveValue functions - Stub XNetLogonGetMachineID --- src/xenia/kernel/util/xex2_info.h | 2 + src/xenia/kernel/xam/xam_info.cc | 102 ++++++++++++++++++++++++++++-- src/xenia/kernel/xam/xam_net.cc | 7 ++ src/xenia/xbox.h | 1 + 4 files changed, 105 insertions(+), 7 deletions(-) diff --git a/src/xenia/kernel/util/xex2_info.h b/src/xenia/kernel/util/xex2_info.h index 82641fc97..a7ec034dc 100644 --- a/src/xenia/kernel/util/xex2_info.h +++ b/src/xenia/kernel/util/xex2_info.h @@ -633,6 +633,8 @@ inline const std::unordered_map {XEX_SYSTEM_CAMERA_ANGLE_CONTROL, "XEX_SYSTEM_CAMERA_ANGLE_CONTROL"}, {XEX_SYSTEM_SKELETAL_TRACKING_REQUIRED, "XEX_SYSTEM_SKELETAL_TRACKING_REQUIRED"}, + {XEX_SYSTEM_SKELETAL_TRACKING_SUPPORTED, + "XEX_SYSTEM_SKELETAL_TRACKING_SUPPORTED"}, {XEX_SYSTEM_USE_LARGE_HDS_FILE_CACHE, "XEX_SYSTEM_USE_LARGE_HDS_FILE_CACHE"}, {XEX_SYSTEM_TITLE_SUPPORTS_DEEP_LINK, diff --git a/src/xenia/kernel/xam/xam_info.cc b/src/xenia/kernel/xam/xam_info.cc index d2cfed2d9..8cfba3075 100644 --- a/src/xenia/kernel/xam/xam_info.cc +++ b/src/xenia/kernel/xam/xam_info.cc @@ -94,6 +94,101 @@ dword_result_t XamGetOnlineSchema_entry() { } DECLARE_XAM_EXPORT1(XamGetOnlineSchema, kNone, kImplemented); +dword_result_t XamQueryLiveHiveA_entry( + lpstring_t feature_name, lpstring_t value_ptr, dword_t value_buffer_size, + pointer_t overlapped_ptr) { + // See Netplay, create shared function for both XamQueryLiveHiveA and + // XamGetLiveHiveValueA + X_RESULT extended_error = 0x80151802; // X_ONLINE_E_LOGON_NOT_LOGGED_ON + if (!feature_name || !value_ptr || !value_buffer_size) { + extended_error = X_E_INVALIDARG; + } + + if (overlapped_ptr) { + kernel_state()->CompleteOverlappedImmediateEx( + overlapped_ptr, X_STATUS_SUCCESS, extended_error, 0); + return X_E_PENDING; + } else { + return extended_error; + } +} +DECLARE_XAM_EXPORT1(XamQueryLiveHiveA, kMisc, kStub); + +dword_result_t XamGetLiveHiveValueA_entry( + lpstring_t feature_name, lpstring_t value_ptr, dword_t value_buffer_size, + int_t unk, pointer_t overlapped_ptr) { + // See Netplay + X_RESULT result = 0x80151802; // X_ONLINE_E_LOGON_NOT_LOGGED_ON + if (!feature_name || !value_ptr || !value_buffer_size) { + result = X_E_INVALIDARG; + } + + auto thread = kernel::XThread::GetCurrentThread(); + auto ctx = thread->thread_state()->context(); + auto type = xboxkrnl::xeKeGetCurrentProcessType(ctx); + if (unk == -1 && kernel_state()->emulator()->title_id() == kDashboardID && + type == 2) { + return XamQueryLiveHiveA_entry(feature_name, value_ptr, value_buffer_size, + overlapped_ptr); + } + + if (overlapped_ptr) { + kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result); + return X_ERROR_IO_PENDING; + } else { + return result; + } +} +DECLARE_XAM_EXPORT1(XamGetLiveHiveValueA, kMisc, kStub); + +dword_result_t XamQueryLiveHiveW_entry( + lpu16string_t feature_name, lpu16string_t value_ptr, + dword_t value_buffer_size, pointer_t overlapped_ptr) { + // See Netplay, create shared function for both XamQueryLiveHiveW and + // XamGetLiveHiveValueW + X_RESULT extended_error = 0x80151802; // X_ONLINE_E_LOGON_NOT_LOGGED_ON + if (!feature_name || !value_ptr || !value_buffer_size) { + extended_error = X_E_INVALIDARG; + } + + if (overlapped_ptr) { + kernel_state()->CompleteOverlappedImmediateEx( + overlapped_ptr, X_STATUS_SUCCESS, extended_error, 0); + return X_E_PENDING; + } else { + return extended_error; + } +} +DECLARE_XAM_EXPORT1(XamQueryLiveHiveW, kMisc, kStub); + +dword_result_t XamGetLiveHiveValueW_entry( + lpu16string_t feature_name, lpu16string_t value_ptr, + dword_t value_buffer_size, int_t unk, + pointer_t overlapped_ptr) { + // See Netplay + X_RESULT result = 0x80151802; // X_ONLINE_E_LOGON_NOT_LOGGED_ON + if (!feature_name || !value_ptr || !value_buffer_size) { + result = X_E_INVALIDARG; + } + + auto thread = kernel::XThread::GetCurrentThread(); + auto ctx = thread->thread_state()->context(); + auto type = xboxkrnl::xeKeGetCurrentProcessType(ctx); + if (unk == -1 && kernel_state()->emulator()->title_id() == kDashboardID && + type == 2) { + return XamQueryLiveHiveW_entry(feature_name, value_ptr, value_buffer_size, + overlapped_ptr); + } + + if (overlapped_ptr) { + kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result); + return X_ERROR_IO_PENDING; + } else { + return result; + } +} +DECLARE_XAM_EXPORT1(XamGetLiveHiveValueW, kMisc, kStub); + dword_result_t keXamBuildResourceLocator(uint64_t module, const std::u16string& container, const std::u16string& resource, @@ -439,13 +534,6 @@ dword_result_t XamFree_entry(lpdword_t ptr) { } DECLARE_XAM_EXPORT1(XamFree, kMemory, kImplemented); -dword_result_t XamQueryLiveHiveW_entry(lpu16string_t name, lpvoid_t out_buf, - dword_t out_size, - dword_t type /* guess */) { - return X_STATUS_INVALID_PARAMETER_1; -} -DECLARE_XAM_EXPORT1(XamQueryLiveHiveW, kNone, kStub); - // http://www.noxa.org/blog/2011/02/28/building-an-xbox-360-emulator-part-3-feasibilityos/ // http://www.noxa.org/blog/2011/08/13/building-an-xbox-360-emulator-part-5-xex-files/ dword_result_t RtlSleep_entry(dword_t dwMilliseconds, dword_t bAlertable) { diff --git a/src/xenia/kernel/xam/xam_net.cc b/src/xenia/kernel/xam/xam_net.cc index 4bbe9d144..8174383b3 100644 --- a/src/xenia/kernel/xam/xam_net.cc +++ b/src/xenia/kernel/xam/xam_net.cc @@ -224,6 +224,13 @@ dword_result_t NetDll_XNetCleanup_entry(dword_t caller, lpvoid_t params) { } DECLARE_XAM_EXPORT1(NetDll_XNetCleanup, kNetworking, kImplemented); +dword_result_t XNetLogonGetMachineID_entry(lpqword_t machine_id_ptr) { + // See Netplay + *machine_id_ptr = 0; + return 0x80151802; // X_ERROR_LOGON_NOT_LOGGED_ON; +} +DECLARE_XAM_EXPORT1(XNetLogonGetMachineID, kNetworking, kStub); + dword_result_t NetDll_XNetGetOpt_entry(dword_t one, dword_t option_id, lpvoid_t buffer_ptr, lpdword_t buffer_size) { diff --git a/src/xenia/xbox.h b/src/xenia/xbox.h index 9240f5e6f..291fe175b 100644 --- a/src/xenia/xbox.h +++ b/src/xenia/xbox.h @@ -125,6 +125,7 @@ typedef uint32_t X_HRESULT; #define X_E_FALSE static_cast(0x80000000L) #define X_E_SUCCESS X_HRESULT_FROM_WIN32(X_ERROR_SUCCESS) #define X_E_ACCESS_DENIED X_HRESULT_FROM_WIN32(X_ERROR_ACCESS_DENIED) +#define X_E_PENDING X_HRESULT_FROM_WIN32(0x8000000AL) #define X_E_NOT_IMPLEMENTED static_cast(0x80004001L) #define X_E_FAIL static_cast(0x80004005L) #define X_E_NO_MORE_FILES X_HRESULT_FROM_WIN32(X_ERROR_NO_MORE_FILES)