From 7e894d10a765cf17bacaecd6f33efb9668448842 Mon Sep 17 00:00:00 2001 From: Joel Linn Date: Thu, 24 Feb 2022 22:43:47 +0100 Subject: [PATCH] [kernel] Correct status for looked up objects - The guest will check for 0x40000000 and replace it with 0xb7 (ERROR_ALREADY_EXISTS), which is the correct return value. For example, see: https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-createmutexa --- src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc index 5b3c97fc0..9da95a84d 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc @@ -455,7 +455,7 @@ dword_result_t NtCreateEvent_entry( existing_object->RetainHandle(); *handle_ptr = existing_object->handle(); } - return X_STATUS_SUCCESS; + return X_STATUS_OBJECT_NAME_EXISTS; } else { return X_STATUS_INVALID_HANDLE; } @@ -576,7 +576,7 @@ DECLARE_XBOXKRNL_EXPORT1(KeReleaseSemaphore, kThreading, kImplemented); dword_result_t NtCreateSemaphore_entry(lpdword_t handle_ptr, lpvoid_t obj_attributes_ptr, dword_t count, dword_t limit) { - // Check for an existing timer with the same name. + // Check for an existing semaphore with the same name. auto existing_object = LookupNamedObject(kernel_state(), obj_attributes_ptr); if (existing_object) { @@ -585,7 +585,7 @@ dword_result_t NtCreateSemaphore_entry(lpdword_t handle_ptr, existing_object->RetainHandle(); *handle_ptr = existing_object->handle(); } - return X_STATUS_SUCCESS; + return X_STATUS_OBJECT_NAME_EXISTS; } else { return X_STATUS_INVALID_HANDLE; } @@ -647,7 +647,7 @@ dword_result_t NtCreateMutant_entry( existing_object->RetainHandle(); *handle_out = existing_object->handle(); } - return X_STATUS_SUCCESS; + return X_STATUS_OBJECT_NAME_EXISTS; } else { return X_STATUS_INVALID_HANDLE; } @@ -709,7 +709,7 @@ dword_result_t NtCreateTimer_entry(lpdword_t handle_ptr, existing_object->RetainHandle(); *handle_ptr = existing_object->handle(); } - return X_STATUS_SUCCESS; + return X_STATUS_OBJECT_NAME_EXISTS; } else { return X_STATUS_INVALID_HANDLE; }