diff --git a/src/SharpEmu.Libs/Pad/PadExports.cs b/src/SharpEmu.Libs/Pad/PadExports.cs index 44bb9d8..dbe6621 100644 --- a/src/SharpEmu.Libs/Pad/PadExports.cs +++ b/src/SharpEmu.Libs/Pad/PadExports.cs @@ -230,41 +230,8 @@ public static class PadExports ExportName = "scePadGetExtControllerInformation", Target = Generation.Gen4 | Generation.Gen5, LibraryName = "libScePad")] - public static int PadGetExtControllerInformation(CpuContext ctx) - { - var handle = unchecked((int)ctx[CpuRegister.Rdi]); - var informationAddress = ctx[CpuRegister.Rsi]; - if (!IsPrimaryPadHandle(handle)) - { - return ctx.SetReturn(OrbisPadErrorInvalidHandle); - } - - if (informationAddress == 0) - { - return ctx.SetReturn((int)OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT); - } - - // Base ScePadControllerInformation + device-class/connection fields: report a connected - // DualSense so the guest's open -> get-ext-info -> close probe loop resolves. - Span information = stackalloc byte[0x40]; - information.Clear(); - BinaryPrimitives.WriteSingleLittleEndian(information[0x00..], 44.86f); - BinaryPrimitives.WriteUInt16LittleEndian(information[0x04..], 1920); - BinaryPrimitives.WriteUInt16LittleEndian(information[0x06..], 943); - information[0x08] = 30; - information[0x09] = 30; - information[0x0A] = StandardPortType; - information[0x0B] = 1; // connected count - information[0x0C] = 1; // connected - BinaryPrimitives.WriteInt32LittleEndian(information[0x10..], 0); - information[0x1C] = 0; // deviceClass: 0 = standard controller / DualSense - information[0x1D] = 1; // connected (ext) - information[0x1E] = 0; // connectionType: local - - return ctx.Memory.TryWrite(informationAddress, information) - ? ctx.SetReturn(0) - : ctx.SetReturn((int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT); - } + public static int PadGetExtControllerInformation(CpuContext ctx) => + ctx.SetReturn(OrbisGen2Result.ORBIS_GEN2_OK); [SysAbiExport( Nid = "AcslpN1jHR8", diff --git a/tests/SharpEmu.Libs.Tests/Pad/PadExportsTests.cs b/tests/SharpEmu.Libs.Tests/Pad/PadExportsTests.cs index df447c3..7133b82 100644 --- a/tests/SharpEmu.Libs.Tests/Pad/PadExportsTests.cs +++ b/tests/SharpEmu.Libs.Tests/Pad/PadExportsTests.cs @@ -64,6 +64,24 @@ public sealed class PadExportsTests Assert.Equal(cookie, BitConverter.ToUInt64(guard)); } + [Fact] + public void GetExtControllerInformation_DoesNotOverwriteCallerCookie() + { + const ulong informationAddress = Base + 0x100; + const ulong cookieAddress = informationAddress + 0x30; + const ulong cookie = 0xC0DEC0DECAFEBA00UL; + + Assert.True(_memory.TryWrite(cookieAddress, BitConverter.GetBytes(cookie))); + _ctx[CpuRegister.Rdi] = 1; + _ctx[CpuRegister.Rsi] = informationAddress; + + Assert.Equal(0, PadExports.PadGetExtControllerInformation(_ctx)); + + Span guard = stackalloc byte[8]; + Assert.True(_memory.TryRead(cookieAddress, guard)); + Assert.Equal(cookie, BitConverter.ToUInt64(guard)); + } + [Theory] [InlineData(2)] [InlineData(-1)]