Fix ILibraryAppletCreator CreateStorage, implement Write on IStorageAccessor
This commit is contained in:
parent
e7efee7909
commit
741ec27b1d
5 changed files with 43 additions and 29 deletions
|
@ -4,8 +4,8 @@ namespace Ryujinx.Core.OsHle.Ipc
|
||||||
{
|
{
|
||||||
struct IpcRecvListBuffDesc
|
struct IpcRecvListBuffDesc
|
||||||
{
|
{
|
||||||
public long Position { get; private set; }
|
public long Position { get; private set; }
|
||||||
public short Size { get; private set; }
|
public long Size { get; private set; }
|
||||||
|
|
||||||
public IpcRecvListBuffDesc(BinaryReader Reader)
|
public IpcRecvListBuffDesc(BinaryReader Reader)
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,7 @@ namespace Ryujinx.Core.OsHle.Ipc
|
||||||
|
|
||||||
Position = Value & 0xffffffffffff;
|
Position = Value & 0xffffffffffff;
|
||||||
|
|
||||||
Size = (short)(Value >> 48);
|
Size = (ushort)(Value >> 48);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -27,7 +27,9 @@ namespace Ryujinx.Core.OsHle.Services.Am
|
||||||
|
|
||||||
public long CreateStorage(ServiceCtx Context)
|
public long CreateStorage(ServiceCtx Context)
|
||||||
{
|
{
|
||||||
MakeObject(Context, new IStorage(StorageHelper.MakeLaunchParams()));
|
long Size = Context.RequestData.ReadInt64();
|
||||||
|
|
||||||
|
MakeObject(Context, new IStorage(new byte[Size]));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,35 +35,49 @@ namespace Ryujinx.Core.OsHle.Services.Am
|
||||||
|
|
||||||
public long Write(ServiceCtx Context)
|
public long Write(ServiceCtx Context)
|
||||||
{
|
{
|
||||||
Context.Ns.Log.PrintStub(LogClass.ServiceAm, "Stubbed.");
|
//TODO: Error conditions.
|
||||||
|
long WritePosition = Context.RequestData.ReadInt64();
|
||||||
|
|
||||||
|
(long Position, long Size) = Context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
|
if (Size > 0)
|
||||||
|
{
|
||||||
|
long MaxSize = Storage.Data.Length - WritePosition;
|
||||||
|
|
||||||
|
if (Size > MaxSize)
|
||||||
|
{
|
||||||
|
Size = MaxSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] Data = AMemoryHelper.ReadBytes(Context.Memory, Position, Size);
|
||||||
|
|
||||||
|
Buffer.BlockCopy(Data, 0, Storage.Data, (int)WritePosition, (int)Size);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long Read(ServiceCtx Context)
|
public long Read(ServiceCtx Context)
|
||||||
{
|
{
|
||||||
|
//TODO: Error conditions.
|
||||||
long ReadPosition = Context.RequestData.ReadInt64();
|
long ReadPosition = Context.RequestData.ReadInt64();
|
||||||
|
|
||||||
if (Context.Request.RecvListBuff.Count > 0)
|
(long Position, long Size) = Context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
|
byte[] Data;
|
||||||
|
|
||||||
|
if (Storage.Data.Length > Size)
|
||||||
{
|
{
|
||||||
long Position = Context.Request.RecvListBuff[0].Position;
|
Data = new byte[Size];
|
||||||
short Size = Context.Request.RecvListBuff[0].Size;
|
|
||||||
|
|
||||||
byte[] Data;
|
Buffer.BlockCopy(Storage.Data, 0, Data, 0, (int)Size);
|
||||||
|
|
||||||
if (Storage.Data.Length > Size)
|
|
||||||
{
|
|
||||||
Data = new byte[Size];
|
|
||||||
|
|
||||||
Buffer.BlockCopy(Storage.Data, 0, Data, 0, Size);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Data = Storage.Data;
|
|
||||||
}
|
|
||||||
|
|
||||||
AMemoryHelper.WriteBytes(Context.Memory, Position, Data);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Data = Storage.Data;
|
||||||
|
}
|
||||||
|
|
||||||
|
AMemoryHelper.WriteBytes(Context.Memory, Position, Data);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,8 +158,7 @@ namespace Ryujinx.Core.OsHle.Services.Aud
|
||||||
{
|
{
|
||||||
float Volume = Context.RequestData.ReadSingle();
|
float Volume = Context.RequestData.ReadSingle();
|
||||||
|
|
||||||
long Position = Context.Request.SendBuff[0].Position;
|
(long Position, long Size) = Context.Request.GetBufferType0x21();
|
||||||
long Size = Context.Request.SendBuff[0].Size;
|
|
||||||
|
|
||||||
byte[] DeviceNameBuffer = AMemoryHelper.ReadBytes(Context.Memory, Position, Size);
|
byte[] DeviceNameBuffer = AMemoryHelper.ReadBytes(Context.Memory, Position, Size);
|
||||||
|
|
||||||
|
@ -183,8 +182,7 @@ namespace Ryujinx.Core.OsHle.Services.Aud
|
||||||
{
|
{
|
||||||
string Name = Context.Ns.Os.SystemState.ActiveAudioOutput;
|
string Name = Context.Ns.Os.SystemState.ActiveAudioOutput;
|
||||||
|
|
||||||
long Position = Context.Request.RecvListBuff[0].Position;
|
(long Position, long Size) = Context.Request.GetBufferType0x22();
|
||||||
long Size = Context.Request.RecvListBuff[0].Size;
|
|
||||||
|
|
||||||
byte[] DeviceNameBuffer = Encoding.UTF8.GetBytes(Name + '\0');
|
byte[] DeviceNameBuffer = Encoding.UTF8.GetBytes(Name + '\0');
|
||||||
|
|
||||||
|
|
|
@ -28,10 +28,10 @@ namespace Ryujinx.Core.OsHle.Services.Set
|
||||||
|
|
||||||
public static long GetAvailableLanguageCodes(ServiceCtx Context)
|
public static long GetAvailableLanguageCodes(ServiceCtx Context)
|
||||||
{
|
{
|
||||||
long Position = Context.Request.RecvListBuff[0].Position;
|
long Position = Context.Request.RecvListBuff[0].Position;
|
||||||
short Size = Context.Request.RecvListBuff[0].Size;
|
long Size = Context.Request.RecvListBuff[0].Size;
|
||||||
|
|
||||||
int Count = (int)((uint)Size / 8);
|
int Count = (int)(Size / 8);
|
||||||
|
|
||||||
if (Count > SystemStateMgr.LanguageCodes.Length)
|
if (Count > SystemStateMgr.LanguageCodes.Length)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue