From 658bd5db702ab127a8302ba3285e193b235451a7 Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:07:53 +0900 Subject: [PATCH] [Xboxkrnl] Return error code from KeSetAffinityThread on null thread If the guest-supplied thread pointer doesn't resolve to an XThread, we previously returned STATUS_SUCCESS without setting the affinity or writing previous_affinity_ptr, leaving callers believing the call succeeded. Real NT kernel would crash on a bad pointer, but that's not easy for us to replicate so return STATUS_INVALID_HANDLE instead and log the pointer value so the condition is visible rather than silent. --- src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc index 64dbe7b1a..ced21a600 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc @@ -331,12 +331,17 @@ dword_result_t KeSetAffinityThread_entry(lpvoid_t thread_ptr, dword_t affinity, return X_STATUS_INVALID_PARAMETER; } auto thread = XObject::GetNativeObject(kernel_state(), thread_ptr); - if (thread) { - if (previous_affinity_ptr) { - *previous_affinity_ptr = uint32_t(1) << thread->active_cpu(); - } - thread->SetAffinity(affinity); + if (!thread) { + XELOGW( + "KeSetAffinityThread: guest thread pointer {:08X} did not resolve to " + "an XThread; returning STATUS_INVALID_HANDLE", + thread_ptr.guest_address()); + return X_STATUS_INVALID_HANDLE; } + if (previous_affinity_ptr) { + *previous_affinity_ptr = uint32_t(1) << thread->active_cpu(); + } + thread->SetAffinity(affinity); return X_STATUS_SUCCESS; } DECLARE_XBOXKRNL_EXPORT1(KeSetAffinityThread, kThreading, kImplemented);