[Kernel] ObReferenceObjectByHandle Cleanup

This commit is contained in:
Adrian
2025-11-10 19:04:04 +00:00
committed by Radosław Gliński
parent e7d08b8e8e
commit 481ab595ce

View File

@@ -254,25 +254,31 @@ dword_result_t ObReferenceObjectByHandle_entry(dword_t handle,
} }
uint32_t native_ptr = object->guest_object(); uint32_t native_ptr = object->guest_object();
auto& object_types =
kernel_state()->host_object_type_enum_to_guest_object_type_ptr_; if (object_type_ptr) {
auto object_type = object_types.find(object->type()); auto& object_types =
if (object_type != object_types.end()) { kernel_state()->host_object_type_enum_to_guest_object_type_ptr_;
if (object_type_ptr && object_type_ptr != object_type->second) {
return X_STATUS_OBJECT_TYPE_MISMATCH; if (object_types.contains(object->type())) {
if (object_type_ptr != object_types[object->type()]) {
return X_STATUS_OBJECT_TYPE_MISMATCH;
}
} else {
assert_unhandled_case(object->type());
native_ptr = 0xDEADF00D;
} }
} else {
assert_unhandled_case(object->type());
native_ptr = 0xDEADF00D;
} }
// Caller takes the reference. // Caller takes the reference.
// It's released in ObDereferenceObject. // It's released in ObDereferenceObject.
object->RetainHandle(); object->RetainHandle();
xenia_assert(native_ptr != 0); assert_not_zero(native_ptr);
if (out_object_ptr.guest_address()) { if (out_object_ptr.guest_address()) {
*out_object_ptr = native_ptr; *out_object_ptr = native_ptr;
} }
return X_STATUS_SUCCESS; return X_STATUS_SUCCESS;
} }
DECLARE_XBOXKRNL_EXPORT1(ObReferenceObjectByHandle, kNone, kImplemented); DECLARE_XBOXKRNL_EXPORT1(ObReferenceObjectByHandle, kNone, kImplemented);