aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-06-04 02:09:41 -0300
committergdkchan <gab.dark.100@gmail.com>2018-06-04 02:09:41 -0300
commit741ec27b1d11d765039607a26d88ad5124767a2a (patch)
tree614e12c3c12b05d29c02bce851725463ac3fa487
parente7efee7909650e9b747e0f26efebbfc1b32a078e (diff)
Fix ILibraryAppletCreator CreateStorage, implement Write on IStorageAccessor
-rw-r--r--Ryujinx.Core/OsHle/Ipc/IpcRecvListBuffDesc.cs6
-rw-r--r--Ryujinx.Core/OsHle/Services/Am/ILibraryAppletCreator.cs4
-rw-r--r--Ryujinx.Core/OsHle/Services/Am/IStorageAccessor.cs48
-rw-r--r--Ryujinx.Core/OsHle/Services/Aud/IAudioDevice.cs6
-rw-r--r--Ryujinx.Core/OsHle/Services/Set/ISettingsServer.cs6
5 files changed, 42 insertions, 28 deletions
diff --git a/Ryujinx.Core/OsHle/Ipc/IpcRecvListBuffDesc.cs b/Ryujinx.Core/OsHle/Ipc/IpcRecvListBuffDesc.cs
index c647208f..78ba142e 100644
--- a/Ryujinx.Core/OsHle/Ipc/IpcRecvListBuffDesc.cs
+++ b/Ryujinx.Core/OsHle/Ipc/IpcRecvListBuffDesc.cs
@@ -4,8 +4,8 @@ namespace Ryujinx.Core.OsHle.Ipc
{
struct IpcRecvListBuffDesc
{
- public long Position { get; private set; }
- public short Size { get; private set; }
+ public long Position { get; private set; }
+ public long Size { get; private set; }
public IpcRecvListBuffDesc(BinaryReader Reader)
{
@@ -13,7 +13,7 @@ namespace Ryujinx.Core.OsHle.Ipc
Position = Value & 0xffffffffffff;
- Size = (short)(Value >> 48);
+ Size = (ushort)(Value >> 48);
}
}
} \ No newline at end of file
diff --git a/Ryujinx.Core/OsHle/Services/Am/ILibraryAppletCreator.cs b/Ryujinx.Core/OsHle/Services/Am/ILibraryAppletCreator.cs
index 52cd490e..9d0d5957 100644
--- a/Ryujinx.Core/OsHle/Services/Am/ILibraryAppletCreator.cs
+++ b/Ryujinx.Core/OsHle/Services/Am/ILibraryAppletCreator.cs
@@ -27,7 +27,9 @@ namespace Ryujinx.Core.OsHle.Services.Am
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;
}
diff --git a/Ryujinx.Core/OsHle/Services/Am/IStorageAccessor.cs b/Ryujinx.Core/OsHle/Services/Am/IStorageAccessor.cs
index 5efc4993..0e928f67 100644
--- a/Ryujinx.Core/OsHle/Services/Am/IStorageAccessor.cs
+++ b/Ryujinx.Core/OsHle/Services/Am/IStorageAccessor.cs
@@ -35,36 +35,50 @@ namespace Ryujinx.Core.OsHle.Services.Am
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;
}
public long Read(ServiceCtx Context)
{
+ //TODO: Error conditions.
long ReadPosition = Context.RequestData.ReadInt64();
- if (Context.Request.RecvListBuff.Count > 0)
- {
- long Position = Context.Request.RecvListBuff[0].Position;
- short Size = Context.Request.RecvListBuff[0].Size;
+ (long Position, long Size) = Context.Request.GetBufferType0x22();
- byte[] Data;
+ byte[] Data;
- if (Storage.Data.Length > Size)
- {
- Data = new byte[Size];
-
- Buffer.BlockCopy(Storage.Data, 0, Data, 0, Size);
- }
- else
- {
- Data = Storage.Data;
- }
+ if (Storage.Data.Length > Size)
+ {
+ Data = new byte[Size];
- AMemoryHelper.WriteBytes(Context.Memory, Position, Data);
+ Buffer.BlockCopy(Storage.Data, 0, Data, 0, (int)Size);
+ }
+ else
+ {
+ Data = Storage.Data;
}
+ AMemoryHelper.WriteBytes(Context.Memory, Position, Data);
+
return 0;
}
}
diff --git a/Ryujinx.Core/OsHle/Services/Aud/IAudioDevice.cs b/Ryujinx.Core/OsHle/Services/Aud/IAudioDevice.cs
index 424bf6a9..b5de85a1 100644
--- a/Ryujinx.Core/OsHle/Services/Aud/IAudioDevice.cs
+++ b/Ryujinx.Core/OsHle/Services/Aud/IAudioDevice.cs
@@ -158,8 +158,7 @@ namespace Ryujinx.Core.OsHle.Services.Aud
{
float Volume = Context.RequestData.ReadSingle();
- long Position = Context.Request.SendBuff[0].Position;
- long Size = Context.Request.SendBuff[0].Size;
+ (long Position, long Size) = Context.Request.GetBufferType0x21();
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;
- long Position = Context.Request.RecvListBuff[0].Position;
- long Size = Context.Request.RecvListBuff[0].Size;
+ (long Position, long Size) = Context.Request.GetBufferType0x22();
byte[] DeviceNameBuffer = Encoding.UTF8.GetBytes(Name + '\0');
diff --git a/Ryujinx.Core/OsHle/Services/Set/ISettingsServer.cs b/Ryujinx.Core/OsHle/Services/Set/ISettingsServer.cs
index c80de80c..fb3648da 100644
--- a/Ryujinx.Core/OsHle/Services/Set/ISettingsServer.cs
+++ b/Ryujinx.Core/OsHle/Services/Set/ISettingsServer.cs
@@ -28,10 +28,10 @@ namespace Ryujinx.Core.OsHle.Services.Set
public static long GetAvailableLanguageCodes(ServiceCtx Context)
{
- long Position = Context.Request.RecvListBuff[0].Position;
- short Size = Context.Request.RecvListBuff[0].Size;
+ long Position = Context.Request.RecvListBuff[0].Position;
+ long Size = Context.Request.RecvListBuff[0].Size;
- int Count = (int)((uint)Size / 8);
+ int Count = (int)(Size / 8);
if (Count > SystemStateMgr.LanguageCodes.Length)
{