Rewrite size for fixed size buffers (#1808)

This commit is contained in:
gdkchan 2020-12-12 00:06:20 -03:00 committed by GitHub
parent 06057a99a6
commit 74aa7b20be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 26 additions and 21 deletions

View file

@ -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>(); long size = Marshal.SizeOf<T>();
@ -49,6 +49,8 @@ namespace Ryujinx.Cpu
} }
memory.Write((ulong)position, data); memory.Write((ulong)position, data);
return size;
} }
public static string ReadAsciiString(IVirtualMemoryManager memory, long position, long maxSize = -1) public static string ReadAsciiString(IVirtualMemoryManager memory, long position, long maxSize = -1)

View file

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

View file

@ -41,7 +41,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
// GetAccountId() -> nn::account::NetworkServiceAccountId // GetAccountId() -> nn::account::NetworkServiceAccountId
public ResultCode GetAccountId(ServiceCtx context) 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. // 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. // 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.ResponseData.Write(NetworkServiceAccountId);
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(0L);
// TODO: determine and fill the two output IPC buffers. // TODO: determine and fill the two output IPC buffers.
return ResultCode.Success; return ResultCode.Success;

View file

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

View file

@ -1,5 +1,6 @@
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Cpu;
using Ryujinx.HLE.HOS.Ipc; using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Common;
using Ryujinx.HLE.HOS.Kernel.Threading; using Ryujinx.HLE.HOS.Kernel.Threading;
@ -48,21 +49,17 @@ namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
Result = 0 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); Logger.Stub?.PrintStub(LogClass.ServiceBcat);
return ResultCode.Success; 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)) return MemoryHelper.Write(context.Memory, ipcDesc.Position, deliveryCacheProgress);
using (BinaryWriter bufferWriter = new BinaryWriter(memory))
{
bufferWriter.WriteStruct(deliveryCacheProgress);
context.Memory.Write((ulong)ipcDesc.Position, memory.ToArray());
}
} }
} }
} }

View file

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

View file

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