[XAM/INFO] - Stub XamQueryLiveHive & XamGetLiveHiveValue functions

- Stub XamQueryLiveHive & XamGetLiveHiveValue functions
- Stub XNetLogonGetMachineID
This commit is contained in:
The-Little-Wolf
2026-07-24 19:34:01 -07:00
committed by Radosław Gliński
parent 6d530a1ab9
commit a0e1ba8313
4 changed files with 105 additions and 7 deletions

View File

@@ -633,6 +633,8 @@ inline const std::unordered_map<uint32_t, std::string>
{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,

View File

@@ -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<XAM_OVERLAPPED> 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<XAM_OVERLAPPED> 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<XAM_OVERLAPPED> 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<XAM_OVERLAPPED> 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) {

View File

@@ -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) {

View File

@@ -125,6 +125,7 @@ typedef uint32_t X_HRESULT;
#define X_E_FALSE static_cast<X_HRESULT>(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<X_HRESULT>(0x80004001L)
#define X_E_FAIL static_cast<X_HRESULT>(0x80004005L)
#define X_E_NO_MORE_FILES X_HRESULT_FROM_WIN32(X_ERROR_NO_MORE_FILES)