Browse Source

Rewrite size for fixed size buffers (#1808)

gdkchan 5 năm trước cách đây
mục cha
commit
74aa7b20be

+ 3 - 1
Ryujinx.Cpu/MemoryHelper.cs

@@ -37,7 +37,7 @@ namespace Ryujinx.Cpu
             }
         }
 
-        public unsafe static void Write<T>(IVirtualMemoryManager memory, long position, T value) where T : struct
+        public unsafe static long Write<T>(IVirtualMemoryManager memory, long position, T value) where T : struct
         {
             long size = Marshal.SizeOf<T>();
 
@@ -49,6 +49,8 @@ namespace Ryujinx.Cpu
             }
 
             memory.Write((ulong)position, data);
+
+            return size;
         }
 
         public static string ReadAsciiString(IVirtualMemoryManager memory, long position, long maxSize = -1)

+ 5 - 0
Ryujinx.HLE/HOS/Ipc/IpcPtrBuffDesc.cs

@@ -30,6 +30,11 @@ namespace Ryujinx.HLE.HOS.Ipc
             Size = (ushort)(word0 >> 16);
         }
 
+        public IpcPtrBuffDesc WithSize(long size)
+        {
+            return new IpcPtrBuffDesc(Position, Index, size);
+        }
+
         public uint GetWord0()
         {
             uint word0;

+ 3 - 1
Ryujinx.HLE/HOS/Services/Account/Acc/IManagerForApplication.cs

@@ -41,7 +41,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
         // GetAccountId() -> nn::account::NetworkServiceAccountId
         public ResultCode GetAccountId(ServiceCtx context)
         {
-            // NOTE: This opens the file at "su/baas/USERID_IN_UUID_STRING.dat" (where USERID_IN_UUID_STRING is formatted 
+            // NOTE: This opens the file at "su/baas/USERID_IN_UUID_STRING.dat" (where USERID_IN_UUID_STRING is formatted
             //       as "%08x-%04x-%04x-%02x%02x-%08x%04x") in the account:/ savedata.
             //       Then it searches the NetworkServiceAccountId related to the UserId in this file and returns it.
 
@@ -122,6 +122,8 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
 
             context.ResponseData.Write(NetworkServiceAccountId);
 
+            context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(0L);
+
             // TODO: determine and fill the two output IPC buffers.
 
             return ResultCode.Success;

+ 2 - 0
Ryujinx.HLE/HOS/Services/Account/Acc/IProfile.cs

@@ -24,6 +24,8 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
         {
             Logger.Stub?.PrintStub(LogClass.ServiceAcc);
 
+            context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(0x80L);
+
             long position = context.Request.ReceiveBuff[0].Position;
 
             MemoryHelper.FillWithZeros(context.Memory, position, 0x80);

+ 5 - 8
Ryujinx.HLE/HOS/Services/Bcat/ServiceCreator/IDeliveryCacheProgressService.cs

@@ -1,5 +1,6 @@
 using Ryujinx.Common;
 using Ryujinx.Common.Logging;
+using Ryujinx.Cpu;
 using Ryujinx.HLE.HOS.Ipc;
 using Ryujinx.HLE.HOS.Kernel.Common;
 using Ryujinx.HLE.HOS.Kernel.Threading;
@@ -48,21 +49,17 @@ namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
                 Result = 0
             };
 
-            WriteDeliveryCacheProgressImpl(context, context.Request.RecvListBuff[0], deliveryCacheProgress);
+            long dcpSize = WriteDeliveryCacheProgressImpl(context, context.Request.RecvListBuff[0], deliveryCacheProgress);
+            context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(dcpSize);
 
             Logger.Stub?.PrintStub(LogClass.ServiceBcat);
 
             return ResultCode.Success;
         }
 
-        private void WriteDeliveryCacheProgressImpl(ServiceCtx context, IpcRecvListBuffDesc ipcDesc, DeliveryCacheProgressImpl deliveryCacheProgress)
+        private long WriteDeliveryCacheProgressImpl(ServiceCtx context, IpcRecvListBuffDesc ipcDesc, DeliveryCacheProgressImpl deliveryCacheProgress)
         {
-            using (MemoryStream memory = new MemoryStream((int)ipcDesc.Size))
-            using (BinaryWriter bufferWriter = new BinaryWriter(memory))
-            {
-                bufferWriter.WriteStruct(deliveryCacheProgress);
-                context.Memory.Write((ulong)ipcDesc.Position, memory.ToArray());
-            }
+            return MemoryHelper.Write(context.Memory, ipcDesc.Position, deliveryCacheProgress);
         }
     }
 }

+ 2 - 0
Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/IFriendService.cs

@@ -221,6 +221,8 @@ namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator
             bool   unknownBool = context.RequestData.ReadBoolean();
             UserId userId      = context.RequestData.ReadStruct<UserId>();
 
+            context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(0x40L);
+
             long bufferPosition  = context.Request.RecvListBuff[0].Position;
 
             if (userId.IsNull)

+ 6 - 11
Ryujinx.HLE/HOS/Services/Time/IStaticServiceForPsc.cs

@@ -1,4 +1,5 @@
 using Ryujinx.Common;
+using Ryujinx.Cpu;
 using Ryujinx.HLE.HOS.Ipc;
 using Ryujinx.HLE.HOS.Kernel.Common;
 using Ryujinx.HLE.HOS.Kernel.Threading;
@@ -245,6 +246,8 @@ namespace Ryujinx.HLE.HOS.Services.Time
         {
             byte type = context.RequestData.ReadByte();
 
+            context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(Marshal.SizeOf<ClockSnapshot>());
+
             ResultCode result = _timeManager.StandardUserSystemClock.GetClockContext(context.Thread, out SystemClockContext userContext);
 
             if (result == ResultCode.Success)
@@ -271,6 +274,8 @@ namespace Ryujinx.HLE.HOS.Services.Time
         {
             byte type = context.RequestData.ReadByte();
 
+            context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(Marshal.SizeOf<ClockSnapshot>());
+
             context.RequestData.BaseStream.Position += 7;
 
             SystemClockContext userContext    = context.RequestData.ReadStruct<SystemClockContext>();
@@ -413,17 +418,7 @@ namespace Ryujinx.HLE.HOS.Services.Time
 
         private void WriteClockSnapshotFromBuffer(ServiceCtx context, IpcRecvListBuffDesc ipcDesc, ClockSnapshot clockSnapshot)
         {
-            Debug.Assert(ipcDesc.Size == Marshal.SizeOf<ClockSnapshot>());
-
-            MemoryStream memory = new MemoryStream((int)ipcDesc.Size);
-
-            using (BinaryWriter bufferWriter = new BinaryWriter(memory))
-            {
-                bufferWriter.WriteStruct(clockSnapshot);
-            }
-
-            context.Memory.Write((ulong)ipcDesc.Position, memory.ToArray());
-            memory.Dispose();
+            MemoryHelper.Write(context.Memory, ipcDesc.Position, clockSnapshot);
         }
     }
 }