From b7f83f41542a219d6e5851639dc9d8db8a512b98 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Sun, 5 Jan 2014 00:48:00 -0800 Subject: [PATCH] XamUserGetSigninInfo, NtCreateSemaphore, busted error codes. --- src/xenia/kernel/xam_user.cc | 15 ++++++++++++++ src/xenia/kernel/xboxkrnl_threading.cc | 28 ++++++++++++++++++++++++++ src/xenia/xbox.h | 21 ++++++++++--------- 3 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/xenia/kernel/xam_user.cc b/src/xenia/kernel/xam_user.cc index 49cc87658..87b79d24e 100644 --- a/src/xenia/kernel/xam_user.cc +++ b/src/xenia/kernel/xam_user.cc @@ -53,6 +53,20 @@ SHIM_CALL XamUserGetSigninState_shim( } +SHIM_CALL XamUserGetSigninInfo_shim( + PPCContext* ppc_state, KernelState* state) { + uint32_t user_index = SHIM_GET_ARG_32(0); + uint32_t flags = SHIM_GET_ARG_32(1); + uint32_t info_ptr = SHIM_GET_ARG_32(2); + + XELOGD( + "XamUserGetSigninInfo(%d, %.8X, %.8X)", + user_index, flags, info_ptr); + + SHIM_SET_RETURN(X_ERROR_NO_SUCH_USER); +} + + // http://freestyledash.googlecode.com/svn/trunk/Freestyle/Tools/Generic/xboxtools.cpp SHIM_CALL XamUserReadProfileSettings_shim( PPCContext* ppc_state, KernelState* state) { @@ -125,5 +139,6 @@ void xe::kernel::xam::RegisterUserExports( ExportResolver* export_resolver, KernelState* state) { SHIM_SET_MAPPING("xam.xex", XamUserGetXUID, state); SHIM_SET_MAPPING("xam.xex", XamUserGetSigninState, state); + SHIM_SET_MAPPING("xam.xex", XamUserGetSigninInfo, state); SHIM_SET_MAPPING("xam.xex", XamUserReadProfileSettings, state); } diff --git a/src/xenia/kernel/xboxkrnl_threading.cc b/src/xenia/kernel/xboxkrnl_threading.cc index f8ef3e72a..6f0863236 100644 --- a/src/xenia/kernel/xboxkrnl_threading.cc +++ b/src/xenia/kernel/xboxkrnl_threading.cc @@ -656,6 +656,33 @@ SHIM_CALL NtClearEvent_shim( } +SHIM_CALL NtCreateSemaphore_shim( + PPCContext* ppc_state, KernelState* state) { + uint32_t handle_ptr = SHIM_GET_ARG_32(0); + uint32_t obj_attributes_ptr = SHIM_GET_ARG_32(1); + int32_t count = SHIM_GET_ARG_32(2); + int32_t limit = SHIM_GET_ARG_32(3); + + XELOGD( + "NtCreateSemaphore(%.8X, %.8X, %d, %d)", + handle_ptr, obj_attributes_ptr, count, limit); + + XSemaphore* sem = new XSemaphore(state); + sem->Initialize(count, limit); + + // obj_attributes may have a name inside of it, if != NULL. + if (obj_attributes_ptr) { + //sem->SetName(...); + } + + if (handle_ptr) { + SHIM_SET_MEM_32(handle_ptr, sem->handle()); + } + + SHIM_SET_RETURN(X_STATUS_SUCCESS); +} + + void xeKeInitializeSemaphore( void* semaphore_ptr, int32_t count, int32_t limit) { KernelState* state = shared_kernel_state_; @@ -896,6 +923,7 @@ void xe::kernel::xboxkrnl::RegisterThreadingExports( SHIM_SET_MAPPING("xboxkrnl.exe", KeResetEvent, state); SHIM_SET_MAPPING("xboxkrnl.exe", NtClearEvent, state); + SHIM_SET_MAPPING("xboxkrnl.exe", NtCreateSemaphore, state); SHIM_SET_MAPPING("xboxkrnl.exe", KeInitializeSemaphore, state); SHIM_SET_MAPPING("xboxkrnl.exe", KeReleaseSemaphore, state); diff --git a/src/xenia/xbox.h b/src/xenia/xbox.h index 6f1d23d50..01620d04e 100644 --- a/src/xenia/xbox.h +++ b/src/xenia/xbox.h @@ -53,15 +53,18 @@ typedef uint32_t X_STATUS; // HRESULT (ERROR_*) // Adding as needed. typedef uint32_t X_RESULT; -#define X_ERROR_SUCCESS ((uint32_t)0x00000000L) -#define X_ERROR_ACCESS_DENIED ((uint32_t)0x00000005L) -#define X_ERROR_INSUFFICIENT_BUFFER ((uint32_t)0x0000007AL) -#define X_ERROR_BAD_ARGUMENTS ((uint32_t)0x000000A0L) -#define X_ERROR_BUSY ((uint32_t)0x000000AAL) -#define X_ERROR_DEVICE_NOT_CONNECTED ((uint32_t)0x0000048FL) -#define X_ERROR_NOT_FOUND ((uint32_t)0x00000490L) -#define X_ERROR_CANCELLED ((uint32_t)0x000004C7L) -#define X_ERROR_EMPTY ((uint32_t)0x000010D2L) +#define X_FACILITY_WIN32 7 +#define X_HRESULT_FROM_WIN32(x) ((X_RESULT)(x) <= 0 ? ((X_RESULT)(x)) : ((X_RESULT) (((x) & 0x0000FFFF) | (X_FACILITY_WIN32 << 16) | 0x80000000))) +#define X_ERROR_SUCCESS X_HRESULT_FROM_WIN32(0x00000000L) +#define X_ERROR_ACCESS_DENIED X_HRESULT_FROM_WIN32(0x00000005L) +#define X_ERROR_INSUFFICIENT_BUFFER X_HRESULT_FROM_WIN32(0x0000007AL) +#define X_ERROR_BAD_ARGUMENTS X_HRESULT_FROM_WIN32(0x000000A0L) +#define X_ERROR_BUSY X_HRESULT_FROM_WIN32(0x000000AAL) +#define X_ERROR_DEVICE_NOT_CONNECTED X_HRESULT_FROM_WIN32(0x0000048FL) +#define X_ERROR_NOT_FOUND X_HRESULT_FROM_WIN32(0x00000490L) +#define X_ERROR_CANCELLED X_HRESULT_FROM_WIN32(0x000004C7L) +#define X_ERROR_NO_SUCH_USER X_HRESULT_FROM_WIN32(0x00000525L) +#define X_ERROR_EMPTY X_HRESULT_FROM_WIN32(0x000010D2L) // MEM_*, used by NtAllocateVirtualMemory #define X_MEM_COMMIT 0x00001000