HLE: Fix integer sign inconcistency accross the codebase (#2222)
* Make all title id instances unsigned * Replace address and size with ulong instead of signed types Long overdue change. Also change some logics here and there to optimize with the new memory manager. * Address Ac_K's comments * Remove uneeded cast all around * Fixes some others misalignment
This commit is contained in:
parent
c46f6879ff
commit
305f06eb71
73 changed files with 707 additions and 716 deletions
|
@ -8,28 +8,28 @@ namespace Ryujinx.Cpu
|
||||||
{
|
{
|
||||||
public static class MemoryHelper
|
public static class MemoryHelper
|
||||||
{
|
{
|
||||||
public static void FillWithZeros(IVirtualMemoryManager memory, long position, int size)
|
public static void FillWithZeros(IVirtualMemoryManager memory, ulong position, int size)
|
||||||
{
|
{
|
||||||
int size8 = size & ~(8 - 1);
|
int size8 = size & ~(8 - 1);
|
||||||
|
|
||||||
for (int offs = 0; offs < size8; offs += 8)
|
for (int offs = 0; offs < size8; offs += 8)
|
||||||
{
|
{
|
||||||
memory.Write<long>((ulong)(position + offs), 0);
|
memory.Write<long>(position + (ulong)offs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int offs = size8; offs < (size - size8); offs++)
|
for (int offs = size8; offs < (size - size8); offs++)
|
||||||
{
|
{
|
||||||
memory.Write<byte>((ulong)(position + offs), 0);
|
memory.Write<byte>(position + (ulong)offs, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public unsafe static T Read<T>(IVirtualMemoryManager memory, long position) where T : struct
|
public unsafe static T Read<T>(IVirtualMemoryManager memory, ulong position) where T : struct
|
||||||
{
|
{
|
||||||
long size = Marshal.SizeOf<T>();
|
long size = Marshal.SizeOf<T>();
|
||||||
|
|
||||||
byte[] data = new byte[size];
|
byte[] data = new byte[size];
|
||||||
|
|
||||||
memory.Read((ulong)position, data);
|
memory.Read(position, data);
|
||||||
|
|
||||||
fixed (byte* ptr = data)
|
fixed (byte* ptr = data)
|
||||||
{
|
{
|
||||||
|
@ -37,7 +37,7 @@ namespace Ryujinx.Cpu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public unsafe static long Write<T>(IVirtualMemoryManager memory, long position, T value) where T : struct
|
public unsafe static ulong Write<T>(IVirtualMemoryManager memory, ulong position, T value) where T : struct
|
||||||
{
|
{
|
||||||
long size = Marshal.SizeOf<T>();
|
long size = Marshal.SizeOf<T>();
|
||||||
|
|
||||||
|
@ -48,18 +48,18 @@ namespace Ryujinx.Cpu
|
||||||
Marshal.StructureToPtr<T>(value, (IntPtr)ptr, false);
|
Marshal.StructureToPtr<T>(value, (IntPtr)ptr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
memory.Write((ulong)position, data);
|
memory.Write(position, data);
|
||||||
|
|
||||||
return size;
|
return (ulong)size;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string ReadAsciiString(IVirtualMemoryManager memory, long position, long maxSize = -1)
|
public static string ReadAsciiString(IVirtualMemoryManager memory, ulong position, long maxSize = -1)
|
||||||
{
|
{
|
||||||
using (MemoryStream ms = new MemoryStream())
|
using (MemoryStream ms = new MemoryStream())
|
||||||
{
|
{
|
||||||
for (long offs = 0; offs < maxSize || maxSize == -1; offs++)
|
for (long offs = 0; offs < maxSize || maxSize == -1; offs++)
|
||||||
{
|
{
|
||||||
byte value = memory.Read<byte>((ulong)(position + offs));
|
byte value = memory.Read<byte>(position + (ulong)offs);
|
||||||
|
|
||||||
if (value == 0)
|
if (value == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,8 +24,8 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
|
|
||||||
private Dictionary<StorageId, LinkedList<LocationEntry>> _locationEntries;
|
private Dictionary<StorageId, LinkedList<LocationEntry>> _locationEntries;
|
||||||
|
|
||||||
private Dictionary<string, long> _sharedFontTitleDictionary;
|
private Dictionary<string, ulong> _sharedFontTitleDictionary;
|
||||||
private Dictionary<long, string> _systemTitlesNameDictionary;
|
private Dictionary<ulong, string> _systemTitlesNameDictionary;
|
||||||
private Dictionary<string, string> _sharedFontFilenameDictionary;
|
private Dictionary<string, string> _sharedFontFilenameDictionary;
|
||||||
|
|
||||||
private SortedDictionary<(ulong titleId, NcaContentType type), string> _contentDictionary;
|
private SortedDictionary<(ulong titleId, NcaContentType type), string> _contentDictionary;
|
||||||
|
@ -55,7 +55,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
_contentDictionary = new SortedDictionary<(ulong, NcaContentType), string>();
|
_contentDictionary = new SortedDictionary<(ulong, NcaContentType), string>();
|
||||||
_locationEntries = new Dictionary<StorageId, LinkedList<LocationEntry>>();
|
_locationEntries = new Dictionary<StorageId, LinkedList<LocationEntry>>();
|
||||||
|
|
||||||
_sharedFontTitleDictionary = new Dictionary<string, long>
|
_sharedFontTitleDictionary = new Dictionary<string, ulong>
|
||||||
{
|
{
|
||||||
{ "FontStandard", 0x0100000000000811 },
|
{ "FontStandard", 0x0100000000000811 },
|
||||||
{ "FontChineseSimplified", 0x0100000000000814 },
|
{ "FontChineseSimplified", 0x0100000000000814 },
|
||||||
|
@ -65,7 +65,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
{ "FontNintendoExtended", 0x0100000000000810 }
|
{ "FontNintendoExtended", 0x0100000000000810 }
|
||||||
};
|
};
|
||||||
|
|
||||||
_systemTitlesNameDictionary = new Dictionary<long, string>()
|
_systemTitlesNameDictionary = new Dictionary<ulong, string>()
|
||||||
{
|
{
|
||||||
{ 0x010000000000080E, "TimeZoneBinary" },
|
{ 0x010000000000080E, "TimeZoneBinary" },
|
||||||
{ 0x0100000000000810, "FontNintendoExtension" },
|
{ 0x0100000000000810, "FontNintendoExtension" },
|
||||||
|
@ -140,7 +140,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
|
|
||||||
LocationEntry entry = new LocationEntry(switchPath,
|
LocationEntry entry = new LocationEntry(switchPath,
|
||||||
0,
|
0,
|
||||||
(long)nca.Header.TitleId,
|
nca.Header.TitleId,
|
||||||
nca.Header.ContentType);
|
nca.Header.ContentType);
|
||||||
|
|
||||||
AddEntry(entry);
|
AddEntry(entry);
|
||||||
|
@ -167,7 +167,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
|
|
||||||
LocationEntry entry = new LocationEntry(switchPath,
|
LocationEntry entry = new LocationEntry(switchPath,
|
||||||
0,
|
0,
|
||||||
(long)nca.Header.TitleId,
|
nca.Header.TitleId,
|
||||||
nca.Header.ContentType);
|
nca.Header.ContentType);
|
||||||
|
|
||||||
AddEntry(entry);
|
AddEntry(entry);
|
||||||
|
@ -297,7 +297,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearEntry(long titleId, NcaContentType contentType, StorageId storageId)
|
public void ClearEntry(ulong titleId, NcaContentType contentType, StorageId storageId)
|
||||||
{
|
{
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
|
@ -333,7 +333,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
if (_contentDictionary.ContainsValue(ncaId))
|
if (_contentDictionary.ContainsValue(ncaId))
|
||||||
{
|
{
|
||||||
var content = _contentDictionary.FirstOrDefault(x => x.Value == ncaId);
|
var content = _contentDictionary.FirstOrDefault(x => x.Value == ncaId);
|
||||||
long titleId = (long)content.Key.Item1;
|
ulong titleId = content.Key.Item1;
|
||||||
|
|
||||||
NcaContentType contentType = content.Key.type;
|
NcaContentType contentType = content.Key.type;
|
||||||
StorageId storage = GetInstalledStorage(titleId, contentType, storageId);
|
StorageId storage = GetInstalledStorage(titleId, contentType, storageId);
|
||||||
|
@ -345,20 +345,20 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public UInt128 GetInstalledNcaId(long titleId, NcaContentType contentType)
|
public UInt128 GetInstalledNcaId(ulong titleId, NcaContentType contentType)
|
||||||
{
|
{
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
if (_contentDictionary.ContainsKey(((ulong)titleId, contentType)))
|
if (_contentDictionary.ContainsKey((titleId, contentType)))
|
||||||
{
|
{
|
||||||
return new UInt128(_contentDictionary[((ulong)titleId, contentType)]);
|
return new UInt128(_contentDictionary[(titleId, contentType)]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new UInt128();
|
return new UInt128();
|
||||||
}
|
}
|
||||||
|
|
||||||
public StorageId GetInstalledStorage(long titleId, NcaContentType contentType, StorageId storageId)
|
public StorageId GetInstalledStorage(ulong titleId, NcaContentType contentType, StorageId storageId)
|
||||||
{
|
{
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
|
@ -369,7 +369,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetInstalledContentPath(long titleId, StorageId storageId, NcaContentType contentType)
|
public string GetInstalledContentPath(ulong titleId, StorageId storageId, NcaContentType contentType)
|
||||||
{
|
{
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
|
@ -445,7 +445,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RemoveLocationEntry(long titleId, NcaContentType contentType, StorageId storageId)
|
private void RemoveLocationEntry(ulong titleId, NcaContentType contentType, StorageId storageId)
|
||||||
{
|
{
|
||||||
LinkedList<LocationEntry> locationList = null;
|
LinkedList<LocationEntry> locationList = null;
|
||||||
|
|
||||||
|
@ -466,7 +466,7 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryGetFontTitle(string fontName, out long titleId)
|
public bool TryGetFontTitle(string fontName, out ulong titleId)
|
||||||
{
|
{
|
||||||
return _sharedFontTitleDictionary.TryGetValue(fontName, out titleId);
|
return _sharedFontTitleDictionary.TryGetValue(fontName, out titleId);
|
||||||
}
|
}
|
||||||
|
@ -476,12 +476,12 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
return _sharedFontFilenameDictionary.TryGetValue(fontName, out filename);
|
return _sharedFontFilenameDictionary.TryGetValue(fontName, out filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryGetSystemTitlesName(long titleId, out string name)
|
public bool TryGetSystemTitlesName(ulong titleId, out string name)
|
||||||
{
|
{
|
||||||
return _systemTitlesNameDictionary.TryGetValue(titleId, out name);
|
return _systemTitlesNameDictionary.TryGetValue(titleId, out name);
|
||||||
}
|
}
|
||||||
|
|
||||||
private LocationEntry GetLocation(long titleId, NcaContentType contentType, StorageId storageId)
|
private LocationEntry GetLocation(ulong titleId, NcaContentType contentType, StorageId storageId)
|
||||||
{
|
{
|
||||||
LinkedList<LocationEntry> locationList = _locationEntries[storageId];
|
LinkedList<LocationEntry> locationList = _locationEntries[storageId];
|
||||||
|
|
||||||
|
|
|
@ -6,10 +6,10 @@ namespace Ryujinx.HLE.FileSystem.Content
|
||||||
{
|
{
|
||||||
public string ContentPath { get; private set; }
|
public string ContentPath { get; private set; }
|
||||||
public int Flag { get; private set; }
|
public int Flag { get; private set; }
|
||||||
public long TitleId { get; private set; }
|
public ulong TitleId { get; private set; }
|
||||||
public NcaContentType ContentType { get; private set; }
|
public NcaContentType ContentType { get; private set; }
|
||||||
|
|
||||||
public LocationEntry(string contentPath, int flag, long titleId, NcaContentType contentType)
|
public LocationEntry(string contentPath, int flag, ulong titleId, NcaContentType contentType)
|
||||||
{
|
{
|
||||||
ContentPath = contentPath;
|
ContentPath = contentPath;
|
||||||
Flag = flag;
|
Flag = flag;
|
||||||
|
|
|
@ -58,7 +58,7 @@ namespace Ryujinx.HLE.HOS.Font
|
||||||
|
|
||||||
FontInfo CreateFont(string name)
|
FontInfo CreateFont(string name)
|
||||||
{
|
{
|
||||||
if (contentManager.TryGetFontTitle(name, out long fontTitle) &&
|
if (contentManager.TryGetFontTitle(name, out ulong fontTitle) &&
|
||||||
contentManager.TryGetFontFilename(name, out string fontFilename))
|
contentManager.TryGetFontFilename(name, out string fontFilename))
|
||||||
{
|
{
|
||||||
string contentPath = contentManager.GetInstalledContentPath(fontTitle, StorageId.NandSystem, NcaContentType.Data);
|
string contentPath = contentManager.GetInstalledContentPath(fontTitle, StorageId.NandSystem, NcaContentType.Data);
|
||||||
|
|
|
@ -4,15 +4,15 @@ namespace Ryujinx.HLE.HOS.Ipc
|
||||||
{
|
{
|
||||||
struct IpcBuffDesc
|
struct IpcBuffDesc
|
||||||
{
|
{
|
||||||
public long Position { get; private set; }
|
public ulong Position { get; private set; }
|
||||||
public long Size { get; private set; }
|
public ulong Size { get; private set; }
|
||||||
public int Flags { get; private set; }
|
public byte Flags { get; private set; }
|
||||||
|
|
||||||
public IpcBuffDesc(BinaryReader reader)
|
public IpcBuffDesc(BinaryReader reader)
|
||||||
{
|
{
|
||||||
long word0 = reader.ReadUInt32();
|
ulong word0 = reader.ReadUInt32();
|
||||||
long word1 = reader.ReadUInt32();
|
ulong word1 = reader.ReadUInt32();
|
||||||
long word2 = reader.ReadUInt32();
|
ulong word2 = reader.ReadUInt32();
|
||||||
|
|
||||||
Position = word1;
|
Position = word1;
|
||||||
Position |= (word2 << 4) & 0x0f00000000;
|
Position |= (word2 << 4) & 0x0f00000000;
|
||||||
|
@ -21,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Ipc
|
||||||
Size = word0;
|
Size = word0;
|
||||||
Size |= (word2 << 8) & 0xf00000000;
|
Size |= (word2 << 8) & 0xf00000000;
|
||||||
|
|
||||||
Flags = (int)word2 & 3;
|
Flags = (byte)(word2 & 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -196,7 +196,7 @@ namespace Ryujinx.HLE.HOS.Ipc
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReSharper disable once InconsistentNaming
|
// ReSharper disable once InconsistentNaming
|
||||||
public (long Position, long Size) GetBufferType0x21(int index = 0)
|
public (ulong Position, ulong Size) GetBufferType0x21(int index = 0)
|
||||||
{
|
{
|
||||||
if (PtrBuff.Count > index &&
|
if (PtrBuff.Count > index &&
|
||||||
PtrBuff[index].Position != 0 &&
|
PtrBuff[index].Position != 0 &&
|
||||||
|
@ -216,7 +216,7 @@ namespace Ryujinx.HLE.HOS.Ipc
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReSharper disable once InconsistentNaming
|
// ReSharper disable once InconsistentNaming
|
||||||
public (long Position, long Size) GetBufferType0x22(int index = 0)
|
public (ulong Position, ulong Size) GetBufferType0x22(int index = 0)
|
||||||
{
|
{
|
||||||
if (RecvListBuff.Count > index &&
|
if (RecvListBuff.Count > index &&
|
||||||
RecvListBuff[index].Position != 0 &&
|
RecvListBuff[index].Position != 0 &&
|
||||||
|
|
|
@ -4,11 +4,11 @@ namespace Ryujinx.HLE.HOS.Ipc
|
||||||
{
|
{
|
||||||
struct IpcPtrBuffDesc
|
struct IpcPtrBuffDesc
|
||||||
{
|
{
|
||||||
public long Position { get; private set; }
|
public ulong Position { get; private set; }
|
||||||
public int Index { get; private set; }
|
public uint Index { get; private set; }
|
||||||
public long Size { get; private set; }
|
public ulong Size { get; private set; }
|
||||||
|
|
||||||
public IpcPtrBuffDesc(long position, int index, long size)
|
public IpcPtrBuffDesc(ulong position, uint index, ulong size)
|
||||||
{
|
{
|
||||||
Position = position;
|
Position = position;
|
||||||
Index = index;
|
Index = index;
|
||||||
|
@ -17,20 +17,20 @@ namespace Ryujinx.HLE.HOS.Ipc
|
||||||
|
|
||||||
public IpcPtrBuffDesc(BinaryReader reader)
|
public IpcPtrBuffDesc(BinaryReader reader)
|
||||||
{
|
{
|
||||||
long word0 = reader.ReadUInt32();
|
ulong word0 = reader.ReadUInt32();
|
||||||
long word1 = reader.ReadUInt32();
|
ulong word1 = reader.ReadUInt32();
|
||||||
|
|
||||||
Position = word1;
|
Position = word1;
|
||||||
Position |= (word0 << 20) & 0x0f00000000;
|
Position |= (word0 << 20) & 0x0f00000000;
|
||||||
Position |= (word0 << 30) & 0x7000000000;
|
Position |= (word0 << 30) & 0x7000000000;
|
||||||
|
|
||||||
Index = ((int)word0 >> 0) & 0x03f;
|
Index = ((uint)word0 >> 0) & 0x03f;
|
||||||
Index |= ((int)word0 >> 3) & 0x1c0;
|
Index |= ((uint)word0 >> 3) & 0x1c0;
|
||||||
|
|
||||||
Size = (ushort)(word0 >> 16);
|
Size = (ushort)(word0 >> 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IpcPtrBuffDesc WithSize(long size)
|
public IpcPtrBuffDesc WithSize(ulong size)
|
||||||
{
|
{
|
||||||
return new IpcPtrBuffDesc(Position, Index, size);
|
return new IpcPtrBuffDesc(Position, Index, size);
|
||||||
}
|
}
|
||||||
|
@ -42,8 +42,8 @@ namespace Ryujinx.HLE.HOS.Ipc
|
||||||
word0 = (uint)((Position & 0x0f00000000) >> 20);
|
word0 = (uint)((Position & 0x0f00000000) >> 20);
|
||||||
word0 |= (uint)((Position & 0x7000000000) >> 30);
|
word0 |= (uint)((Position & 0x7000000000) >> 30);
|
||||||
|
|
||||||
word0 |= (uint)(Index & 0x03f) << 0;
|
word0 |= (Index & 0x03f) << 0;
|
||||||
word0 |= (uint)(Index & 0x1c0) << 3;
|
word0 |= (Index & 0x1c0) << 3;
|
||||||
|
|
||||||
word0 |= (uint)Size << 16;
|
word0 |= (uint)Size << 16;
|
||||||
|
|
||||||
|
|
|
@ -4,10 +4,10 @@ namespace Ryujinx.HLE.HOS.Ipc
|
||||||
{
|
{
|
||||||
struct IpcRecvListBuffDesc
|
struct IpcRecvListBuffDesc
|
||||||
{
|
{
|
||||||
public long Position { get; private set; }
|
public ulong Position { get; private set; }
|
||||||
public long Size { get; private set; }
|
public ulong Size { get; private set; }
|
||||||
|
|
||||||
public IpcRecvListBuffDesc(long position, long size)
|
public IpcRecvListBuffDesc(ulong position, ulong size)
|
||||||
{
|
{
|
||||||
Position = position;
|
Position = position;
|
||||||
Size = size;
|
Size = size;
|
||||||
|
@ -15,7 +15,7 @@ namespace Ryujinx.HLE.HOS.Ipc
|
||||||
|
|
||||||
public IpcRecvListBuffDesc(BinaryReader reader)
|
public IpcRecvListBuffDesc(BinaryReader reader)
|
||||||
{
|
{
|
||||||
long value = reader.ReadInt64();
|
ulong value = reader.ReadUInt64();
|
||||||
|
|
||||||
Position = value & 0xffffffffffff;
|
Position = value & 0xffffffffffff;
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Common
|
||||||
if (currentProcess.CpuMemory.IsMapped(address) &&
|
if (currentProcess.CpuMemory.IsMapped(address) &&
|
||||||
currentProcess.CpuMemory.IsMapped(address + (ulong)size - 1))
|
currentProcess.CpuMemory.IsMapped(address + (ulong)size - 1))
|
||||||
{
|
{
|
||||||
value = MemoryHelper.ReadAsciiString(currentProcess.CpuMemory, (long)address, size);
|
value = MemoryHelper.ReadAsciiString(currentProcess.CpuMemory, address, size);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -340,7 +340,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
|
|
||||||
UserExceptionContextAddress = userExceptionContextAddress;
|
UserExceptionContextAddress = userExceptionContextAddress;
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(CpuMemory, (long)userExceptionContextAddress, KTlsPageInfo.TlsEntrySize);
|
MemoryHelper.FillWithZeros(CpuMemory, userExceptionContextAddress, KTlsPageInfo.TlsEntrySize);
|
||||||
|
|
||||||
Name = creationInfo.Name;
|
Name = creationInfo.Name;
|
||||||
|
|
||||||
|
@ -461,7 +461,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
{
|
{
|
||||||
pageInfo = new KTlsPageInfo(tlsPageVa);
|
pageInfo = new KTlsPageInfo(tlsPageVa);
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(CpuMemory, (long)tlsPageVa, KMemoryManager.PageSize);
|
MemoryHelper.FillWithZeros(CpuMemory, tlsPageVa, KMemoryManager.PageSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -1431,7 +1431,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
||||||
{
|
{
|
||||||
KProcess process = KernelStatic.GetCurrentProcess();
|
KProcess process = KernelStatic.GetCurrentProcess();
|
||||||
|
|
||||||
string str = MemoryHelper.ReadAsciiString(process.CpuMemory, (long)strPtr, (long)size);
|
string str = MemoryHelper.ReadAsciiString(process.CpuMemory, strPtr, (long)size);
|
||||||
|
|
||||||
Logger.Warning?.Print(LogClass.KernelSvc, str);
|
Logger.Warning?.Print(LogClass.KernelSvc, str);
|
||||||
}
|
}
|
||||||
|
|
|
@ -161,7 +161,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading
|
||||||
|
|
||||||
TlsDramAddress = owner.MemoryManager.GetDramAddressFromVa(_tlsAddress);
|
TlsDramAddress = owner.MemoryManager.GetDramAddressFromVa(_tlsAddress);
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(owner.CpuMemory, (long)_tlsAddress, KTlsPageInfo.TlsEntrySize);
|
MemoryHelper.FillWithZeros(owner.CpuMemory, _tlsAddress, KTlsPageInfo.TlsEntrySize);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is64Bits;
|
bool is64Bits;
|
||||||
|
|
|
@ -73,8 +73,8 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
||||||
|
|
||||||
public ResultCode LoadIdTokenCache(ServiceCtx context)
|
public ResultCode LoadIdTokenCache(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
// NOTE: This opens the file at "su/cache/USERID_IN_UUID_STRING.dat" (where USERID_IN_UUID_STRING is formatted as "%08x-%04x-%04x-%02x%02x-%08x%04x")
|
// NOTE: This opens the file at "su/cache/USERID_IN_UUID_STRING.dat" (where USERID_IN_UUID_STRING is formatted as "%08x-%04x-%04x-%02x%02x-%08x%04x")
|
||||||
// in the "account:/" savedata and writes some data in the buffer.
|
// in the "account:/" savedata and writes some data in the buffer.
|
||||||
|
|
|
@ -16,16 +16,16 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
||||||
|
|
||||||
public ResultCode Get(ServiceCtx context)
|
public ResultCode Get(ServiceCtx context)
|
||||||
{
|
{
|
||||||
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(0x80L);
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(0x80UL);
|
||||||
|
|
||||||
long bufferPosition = context.Request.RecvListBuff[0].Position;
|
ulong bufferPosition = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, bufferPosition, 0x80);
|
MemoryHelper.FillWithZeros(context.Memory, bufferPosition, 0x80);
|
||||||
|
|
||||||
// TODO: Determine the struct.
|
// TODO: Determine the struct.
|
||||||
context.Memory.Write((ulong)bufferPosition, 0); // Unknown
|
context.Memory.Write(bufferPosition, 0); // Unknown
|
||||||
context.Memory.Write((ulong)bufferPosition + 4, 1); // Icon ID. 0 = Mii, the rest are character icon IDs.
|
context.Memory.Write(bufferPosition + 4, 1); // Icon ID. 0 = Mii, the rest are character icon IDs.
|
||||||
context.Memory.Write((ulong)bufferPosition + 8, (byte)1); // Profile icon background color ID
|
context.Memory.Write(bufferPosition + 8, (byte)1); // Profile icon background color ID
|
||||||
// 0x07 bytes - Unknown
|
// 0x07 bytes - Unknown
|
||||||
// 0x10 bytes - Some ID related to the Mii? All zeros when a character icon is used.
|
// 0x10 bytes - Some ID related to the Mii? All zeros when a character icon is used.
|
||||||
// 0x60 bytes - Usually zeros?
|
// 0x60 bytes - Usually zeros?
|
||||||
|
@ -57,15 +57,15 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
||||||
|
|
||||||
public ResultCode LoadImage(ServiceCtx context)
|
public ResultCode LoadImage(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferLen = context.Request.ReceiveBuff[0].Size;
|
ulong bufferLen = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
if (_profile.Image.Length > bufferLen)
|
if ((ulong)_profile.Image.Length > bufferLen)
|
||||||
{
|
{
|
||||||
return ResultCode.InvalidBufferSize;
|
return ResultCode.InvalidBufferSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)bufferPosition, _profile.Image);
|
context.Memory.Write(bufferPosition, _profile.Image);
|
||||||
|
|
||||||
context.ResponseData.Write(_profile.Image.Length);
|
context.ResponseData.Write(_profile.Image.Length);
|
||||||
|
|
||||||
|
@ -74,12 +74,12 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
||||||
|
|
||||||
public ResultCode Store(ServiceCtx context)
|
public ResultCode Store(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long userDataPosition = context.Request.PtrBuff[0].Position;
|
ulong userDataPosition = context.Request.PtrBuff[0].Position;
|
||||||
long userDataSize = context.Request.PtrBuff[0].Size;
|
ulong userDataSize = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
byte[] userData = new byte[userDataSize];
|
byte[] userData = new byte[userDataSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)userDataPosition, userData);
|
context.Memory.Read(userDataPosition, userData);
|
||||||
|
|
||||||
// TODO: Read the nn::account::profile::ProfileBase and store everything in the savedata.
|
// TODO: Read the nn::account::profile::ProfileBase and store everything in the savedata.
|
||||||
|
|
||||||
|
@ -90,19 +90,19 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc.AccountService
|
||||||
|
|
||||||
public ResultCode StoreWithImage(ServiceCtx context)
|
public ResultCode StoreWithImage(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long userDataPosition = context.Request.PtrBuff[0].Position;
|
ulong userDataPosition = context.Request.PtrBuff[0].Position;
|
||||||
long userDataSize = context.Request.PtrBuff[0].Size;
|
ulong userDataSize = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
byte[] userData = new byte[userDataSize];
|
byte[] userData = new byte[userDataSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)userDataPosition, userData);
|
context.Memory.Read(userDataPosition, userData);
|
||||||
|
|
||||||
long profileImagePosition = context.Request.SendBuff[0].Position;
|
ulong profileImagePosition = context.Request.SendBuff[0].Position;
|
||||||
long profileImageSize = context.Request.SendBuff[0].Size;
|
ulong profileImageSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
byte[] profileImageData = new byte[profileImageSize];
|
byte[] profileImageData = new byte[profileImageSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)profileImagePosition, profileImageData);
|
context.Memory.Read(profileImagePosition, profileImageData);
|
||||||
|
|
||||||
// TODO: Read the nn::account::profile::ProfileBase and store everything in the savedata.
|
// TODO: Read the nn::account::profile::ProfileBase and store everything in the savedata.
|
||||||
|
|
||||||
|
|
|
@ -53,8 +53,8 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
return ResultCode.InvalidBuffer;
|
return ResultCode.InvalidBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
long outputPosition = context.Request.RecvListBuff[0].Position;
|
ulong outputPosition = context.Request.RecvListBuff[0].Position;
|
||||||
long outputSize = context.Request.RecvListBuff[0].Size;
|
ulong outputSize = context.Request.RecvListBuff[0].Size;
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
||||||
|
|
||||||
|
@ -67,8 +67,8 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition + offset, userProfile.UserId.High);
|
context.Memory.Write(outputPosition + offset, userProfile.UserId.High);
|
||||||
context.Memory.Write((ulong)outputPosition + offset + 8, userProfile.UserId.Low);
|
context.Memory.Write(outputPosition + offset + 8, userProfile.UserId.Low);
|
||||||
|
|
||||||
offset += 0x10;
|
offset += 0x10;
|
||||||
}
|
}
|
||||||
|
@ -156,8 +156,8 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
return ResultCode.InvalidBuffer;
|
return ResultCode.InvalidBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
long inputPosition = context.Request.SendBuff[0].Position;
|
ulong inputPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputSize = context.Request.SendBuff[0].Size;
|
ulong inputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
if (inputSize != 0x24000)
|
if (inputSize != 0x24000)
|
||||||
{
|
{
|
||||||
|
@ -166,7 +166,7 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
|
|
||||||
byte[] thumbnailBuffer = new byte[inputSize];
|
byte[] thumbnailBuffer = new byte[inputSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputPosition, thumbnailBuffer);
|
context.Memory.Read(inputPosition, thumbnailBuffer);
|
||||||
|
|
||||||
// NOTE: Account service call nn::fs::WriteSaveDataThumbnailFile().
|
// NOTE: Account service call nn::fs::WriteSaveDataThumbnailFile().
|
||||||
// TODO: Store thumbnailBuffer somewhere, in save data 0x8000000000000010 ?
|
// TODO: Store thumbnailBuffer somewhere, in save data 0x8000000000000010 ?
|
||||||
|
|
|
@ -142,8 +142,8 @@ namespace Ryujinx.HLE.HOS.Services.Account.Acc
|
||||||
// ListOpenContextStoredUsers() -> array<nn::account::Uid, 0xa>
|
// ListOpenContextStoredUsers() -> array<nn::account::Uid, 0xa>
|
||||||
public ResultCode ListOpenContextStoredUsers(ServiceCtx context)
|
public ResultCode ListOpenContextStoredUsers(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long outputPosition = context.Request.RecvListBuff[0].Position;
|
ulong outputPosition = context.Request.RecvListBuff[0].Position;
|
||||||
long outputSize = context.Request.RecvListBuff[0].Size;
|
ulong outputSize = context.Request.RecvListBuff[0].Size;
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
||||||
|
|
||||||
|
|
|
@ -29,20 +29,20 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
||||||
return ResultCode.ObjectInvalid;
|
return ResultCode.ObjectInvalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
long writePosition = context.RequestData.ReadInt64();
|
ulong writePosition = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (writePosition > _storage.Data.Length)
|
if (writePosition > (ulong)_storage.Data.Length)
|
||||||
{
|
{
|
||||||
return ResultCode.OutOfBounds;
|
return ResultCode.OutOfBounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
(long position, long size) = context.Request.GetBufferType0x21();
|
(ulong position, ulong size) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
size = Math.Min(size, _storage.Data.Length - writePosition);
|
size = Math.Min(size, (ulong)_storage.Data.Length - writePosition);
|
||||||
|
|
||||||
if (size > 0)
|
if (size > 0)
|
||||||
{
|
{
|
||||||
long maxSize = _storage.Data.Length - writePosition;
|
ulong maxSize = (ulong)_storage.Data.Length - writePosition;
|
||||||
|
|
||||||
if (size > maxSize)
|
if (size > maxSize)
|
||||||
{
|
{
|
||||||
|
@ -51,7 +51,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
||||||
|
|
||||||
byte[] data = new byte[size];
|
byte[] data = new byte[size];
|
||||||
|
|
||||||
context.Memory.Read((ulong)position, data);
|
context.Memory.Read(position, data);
|
||||||
|
|
||||||
Buffer.BlockCopy(data, 0, _storage.Data, (int)writePosition, (int)size);
|
Buffer.BlockCopy(data, 0, _storage.Data, (int)writePosition, (int)size);
|
||||||
}
|
}
|
||||||
|
@ -63,22 +63,22 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
||||||
// Read(u64) -> buffer<bytes, 0x22>
|
// Read(u64) -> buffer<bytes, 0x22>
|
||||||
public ResultCode Read(ServiceCtx context)
|
public ResultCode Read(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long readPosition = context.RequestData.ReadInt64();
|
ulong readPosition = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (readPosition > _storage.Data.Length)
|
if (readPosition > (ulong)_storage.Data.Length)
|
||||||
{
|
{
|
||||||
return ResultCode.OutOfBounds;
|
return ResultCode.OutOfBounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
(long position, long size) = context.Request.GetBufferType0x22();
|
(ulong position, ulong size) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
size = Math.Min(size, _storage.Data.Length - readPosition);
|
size = Math.Min(size, (ulong)_storage.Data.Length - readPosition);
|
||||||
|
|
||||||
byte[] data = new byte[size];
|
byte[] data = new byte[size];
|
||||||
|
|
||||||
Buffer.BlockCopy(_storage.Data, (int)readPosition, data, 0, (int)size);
|
Buffer.BlockCopy(_storage.Data, (int)readPosition, data, 0, (int)size);
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, data);
|
context.Memory.Write(position, data);
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
|
@ -359,13 +359,13 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati
|
||||||
// SetApplicationCopyrightImage(buffer<bytes, 0x45> frame_buffer, s32 x, s32 y, s32 width, s32 height, s32 window_origin_mode)
|
// SetApplicationCopyrightImage(buffer<bytes, 0x45> frame_buffer, s32 x, s32 y, s32 width, s32 height, s32 window_origin_mode)
|
||||||
public ResultCode SetApplicationCopyrightImage(ServiceCtx context)
|
public ResultCode SetApplicationCopyrightImage(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long frameBufferPos = context.Request.SendBuff[0].Position;
|
ulong frameBufferPos = context.Request.SendBuff[0].Position;
|
||||||
long frameBufferSize = context.Request.SendBuff[0].Size;
|
ulong frameBufferSize = context.Request.SendBuff[0].Size;
|
||||||
int x = context.RequestData.ReadInt32();
|
int x = context.RequestData.ReadInt32();
|
||||||
int y = context.RequestData.ReadInt32();
|
int y = context.RequestData.ReadInt32();
|
||||||
int width = context.RequestData.ReadInt32();
|
int width = context.RequestData.ReadInt32();
|
||||||
int height = context.RequestData.ReadInt32();
|
int height = context.RequestData.ReadInt32();
|
||||||
uint windowOriginMode = context.RequestData.ReadUInt32();
|
uint windowOriginMode = context.RequestData.ReadUInt32();
|
||||||
|
|
||||||
ResultCode resultCode = ResultCode.InvalidParameters;
|
ResultCode resultCode = ResultCode.InvalidParameters;
|
||||||
|
|
||||||
|
@ -388,7 +388,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati
|
||||||
return resultCode;
|
return resultCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResultCode SetApplicationCopyrightImageImpl(int x, int y, int width, int height, long frameBufferPos, long frameBufferSize, uint windowOriginMode)
|
private ResultCode SetApplicationCopyrightImageImpl(int x, int y, int width, int height, ulong frameBufferPos, ulong frameBufferSize, uint windowOriginMode)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
if (_copyrightBuffer == null)
|
if (_copyrightBuffer == null)
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioIn
|
||||||
// AppendAudioInBuffer(u64 tag, buffer<nn::audio::AudioInBuffer, 5>)
|
// AppendAudioInBuffer(u64 tag, buffer<nn::audio::AudioInBuffer, 5>)
|
||||||
public ResultCode AppendAudioInBuffer(ServiceCtx context)
|
public ResultCode AppendAudioInBuffer(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.SendBuff[0].Position;
|
ulong position = context.Request.SendBuff[0].Position;
|
||||||
|
|
||||||
ulong bufferTag = context.RequestData.ReadUInt64();
|
ulong bufferTag = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
|
@ -74,8 +74,8 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioIn
|
||||||
// GetReleasedAudioInBuffers() -> (u32 count, buffer<u64, 6> tags)
|
// GetReleasedAudioInBuffers() -> (u32 count, buffer<u64, 6> tags)
|
||||||
public ResultCode GetReleasedAudioInBuffers(ServiceCtx context)
|
public ResultCode GetReleasedAudioInBuffers(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
long size = context.Request.ReceiveBuff[0].Size;
|
ulong size = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
using (WritableRegion outputRegion = context.Memory.GetWritableRegion((ulong)position, (int)size))
|
using (WritableRegion outputRegion = context.Memory.GetWritableRegion((ulong)position, (int)size))
|
||||||
{
|
{
|
||||||
|
@ -102,7 +102,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioIn
|
||||||
// AppendUacInBuffer(u64 tag, handle<copy, unknown>, buffer<nn::audio::AudioInBuffer, 5>)
|
// AppendUacInBuffer(u64 tag, handle<copy, unknown>, buffer<nn::audio::AudioInBuffer, 5>)
|
||||||
public ResultCode AppendUacInBuffer(ServiceCtx context)
|
public ResultCode AppendUacInBuffer(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.SendBuff[0].Position;
|
ulong position = context.Request.SendBuff[0].Position;
|
||||||
|
|
||||||
ulong bufferTag = context.RequestData.ReadUInt64();
|
ulong bufferTag = context.RequestData.ReadUInt64();
|
||||||
uint handle = (uint)context.Request.HandleDesc.ToCopy[0];
|
uint handle = (uint)context.Request.HandleDesc.ToCopy[0];
|
||||||
|
@ -116,7 +116,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioIn
|
||||||
// AppendAudioInBufferAuto(u64 tag, buffer<nn::audio::AudioInBuffer, 0x21>)
|
// AppendAudioInBufferAuto(u64 tag, buffer<nn::audio::AudioInBuffer, 0x21>)
|
||||||
public ResultCode AppendAudioInBufferAuto(ServiceCtx context)
|
public ResultCode AppendAudioInBufferAuto(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long position, _) = context.Request.GetBufferType0x21();
|
(ulong position, _) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
ulong bufferTag = context.RequestData.ReadUInt64();
|
ulong bufferTag = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
|
@ -129,9 +129,9 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioIn
|
||||||
// GetReleasedAudioInBuffersAuto() -> (u32 count, buffer<u64, 0x22> tags)
|
// GetReleasedAudioInBuffersAuto() -> (u32 count, buffer<u64, 0x22> tags)
|
||||||
public ResultCode GetReleasedAudioInBuffersAuto(ServiceCtx context)
|
public ResultCode GetReleasedAudioInBuffersAuto(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long position, long size) = context.Request.GetBufferType0x22();
|
(ulong position, ulong size) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
using (WritableRegion outputRegion = context.Memory.GetWritableRegion((ulong)position, (int)size))
|
using (WritableRegion outputRegion = context.Memory.GetWritableRegion(position, (int)size))
|
||||||
{
|
{
|
||||||
ResultCode result = _impl.GetReleasedBuffers(MemoryMarshal.Cast<byte, ulong>(outputRegion.Memory.Span), out uint releasedCount);
|
ResultCode result = _impl.GetReleasedBuffers(MemoryMarshal.Cast<byte, ulong>(outputRegion.Memory.Span), out uint releasedCount);
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioIn
|
||||||
// AppendUacInBufferAuto(u64 tag, handle<copy, event>, buffer<nn::audio::AudioInBuffer, 0x21>)
|
// AppendUacInBufferAuto(u64 tag, handle<copy, event>, buffer<nn::audio::AudioInBuffer, 0x21>)
|
||||||
public ResultCode AppendUacInBufferAuto(ServiceCtx context)
|
public ResultCode AppendUacInBufferAuto(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long position, _) = context.Request.GetBufferType0x21();
|
(ulong position, _) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
ulong bufferTag = context.RequestData.ReadUInt64();
|
ulong bufferTag = context.RequestData.ReadUInt64();
|
||||||
uint handle = (uint)context.Request.HandleDesc.ToCopy[0];
|
uint handle = (uint)context.Request.HandleDesc.ToCopy[0];
|
||||||
|
|
|
@ -27,10 +27,10 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
string[] deviceNames = _impl.ListAudioIns(false);
|
string[] deviceNames = _impl.ListAudioIns(false);
|
||||||
|
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
long size = context.Request.ReceiveBuff[0].Size;
|
ulong size = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
long basePosition = position;
|
ulong basePosition = position;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
@ -38,15 +38,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
||||||
|
|
||||||
if ((position - basePosition) + buffer.Length > size)
|
if ((position - basePosition) + (ulong)buffer.Length > size)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, buffer);
|
context.Memory.Write(position, buffer);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, position + buffer.Length, AudioInNameSize - buffer.Length);
|
MemoryHelper.FillWithZeros(context.Memory, position + (ulong)buffer.Length, AudioInNameSize - buffer.Length);
|
||||||
|
|
||||||
position += AudioInNameSize;
|
position += AudioInNameSize;
|
||||||
count++;
|
count++;
|
||||||
|
@ -65,15 +65,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
||||||
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long deviceNameInputPosition = context.Request.SendBuff[0].Position;
|
ulong deviceNameInputPosition = context.Request.SendBuff[0].Position;
|
||||||
long deviceNameInputSize = context.Request.SendBuff[0].Size;
|
ulong deviceNameInputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long deviceNameOutputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong deviceNameOutputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long deviceNameOutputSize = context.Request.ReceiveBuff[0].Size;
|
ulong deviceNameOutputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
||||||
|
|
||||||
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, deviceNameInputSize);
|
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, (long)deviceNameInputSize);
|
||||||
|
|
||||||
ResultCode resultCode = _impl.OpenAudioIn(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioIn obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
ResultCode resultCode = _impl.OpenAudioIn(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioIn obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
||||||
|
|
||||||
|
@ -83,8 +83,8 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
|
|
||||||
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
||||||
|
|
||||||
context.Memory.Write((ulong)deviceNameOutputPosition, outputDeviceNameRaw);
|
context.Memory.Write(deviceNameOutputPosition, outputDeviceNameRaw);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + outputDeviceNameRaw.Length, AudioInNameSize - outputDeviceNameRaw.Length);
|
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + (ulong)outputDeviceNameRaw.Length, AudioInNameSize - outputDeviceNameRaw.Length);
|
||||||
|
|
||||||
MakeObject(context, new AudioInServer(obj));
|
MakeObject(context, new AudioInServer(obj));
|
||||||
}
|
}
|
||||||
|
@ -98,9 +98,9 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
string[] deviceNames = _impl.ListAudioIns(false);
|
string[] deviceNames = _impl.ListAudioIns(false);
|
||||||
|
|
||||||
(long position, long size) = context.Request.GetBufferType0x22();
|
(ulong position, ulong size) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
long basePosition = position;
|
ulong basePosition = position;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
@ -108,15 +108,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
||||||
|
|
||||||
if ((position - basePosition) + buffer.Length > size)
|
if ((position - basePosition) + (ulong)buffer.Length > size)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, buffer);
|
context.Memory.Write(position, buffer);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, position + buffer.Length, AudioInNameSize - buffer.Length);
|
MemoryHelper.FillWithZeros(context.Memory, position + (ulong)buffer.Length, AudioInNameSize - buffer.Length);
|
||||||
|
|
||||||
position += AudioInNameSize;
|
position += AudioInNameSize;
|
||||||
count++;
|
count++;
|
||||||
|
@ -135,12 +135,12 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
||||||
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
(long deviceNameInputPosition, long deviceNameInputSize) = context.Request.GetBufferType0x21();
|
(ulong deviceNameInputPosition, ulong deviceNameInputSize) = context.Request.GetBufferType0x21();
|
||||||
(long deviceNameOutputPosition, long deviceNameOutputSize) = context.Request.GetBufferType0x22();
|
(ulong deviceNameOutputPosition, ulong deviceNameOutputSize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
||||||
|
|
||||||
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, deviceNameInputSize);
|
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, (long)deviceNameInputSize);
|
||||||
|
|
||||||
ResultCode resultCode = _impl.OpenAudioIn(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioIn obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
ResultCode resultCode = _impl.OpenAudioIn(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioIn obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
||||||
|
|
||||||
|
@ -150,8 +150,8 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
|
|
||||||
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
||||||
|
|
||||||
context.Memory.Write((ulong)deviceNameOutputPosition, outputDeviceNameRaw);
|
context.Memory.Write(deviceNameOutputPosition, outputDeviceNameRaw);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + outputDeviceNameRaw.Length, AudioInNameSize - outputDeviceNameRaw.Length);
|
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + (ulong)outputDeviceNameRaw.Length, AudioInNameSize - outputDeviceNameRaw.Length);
|
||||||
|
|
||||||
MakeObject(context, new AudioInServer(obj));
|
MakeObject(context, new AudioInServer(obj));
|
||||||
}
|
}
|
||||||
|
@ -165,9 +165,9 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
string[] deviceNames = _impl.ListAudioIns(true);
|
string[] deviceNames = _impl.ListAudioIns(true);
|
||||||
|
|
||||||
(long position, long size) = context.Request.GetBufferType0x22();
|
(ulong position, ulong size) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
long basePosition = position;
|
ulong basePosition = position;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
@ -175,15 +175,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
||||||
|
|
||||||
if ((position - basePosition) + buffer.Length > size)
|
if ((position - basePosition) + (ulong)buffer.Length > size)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, buffer);
|
context.Memory.Write(position, buffer);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, position + buffer.Length, AudioInNameSize - buffer.Length);
|
MemoryHelper.FillWithZeros(context.Memory, position + (ulong)buffer.Length, AudioInNameSize - buffer.Length);
|
||||||
|
|
||||||
position += AudioInNameSize;
|
position += AudioInNameSize;
|
||||||
count++;
|
count++;
|
||||||
|
@ -205,15 +205,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
||||||
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long deviceNameInputPosition = context.Request.SendBuff[0].Position;
|
ulong deviceNameInputPosition = context.Request.SendBuff[0].Position;
|
||||||
long deviceNameInputSize = context.Request.SendBuff[0].Size;
|
ulong deviceNameInputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long deviceNameOutputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong deviceNameOutputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long deviceNameOutputSize = context.Request.ReceiveBuff[0].Size;
|
ulong deviceNameOutputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
||||||
|
|
||||||
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, deviceNameInputSize);
|
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, (long)deviceNameInputSize);
|
||||||
|
|
||||||
ResultCode resultCode = _impl.OpenAudioIn(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioIn obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
ResultCode resultCode = _impl.OpenAudioIn(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioIn obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
||||||
|
|
||||||
|
@ -223,8 +223,8 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
|
|
||||||
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
||||||
|
|
||||||
context.Memory.Write((ulong)deviceNameOutputPosition, outputDeviceNameRaw);
|
context.Memory.Write(deviceNameOutputPosition, outputDeviceNameRaw);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + outputDeviceNameRaw.Length, AudioInNameSize - outputDeviceNameRaw.Length);
|
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + (ulong)outputDeviceNameRaw.Length, AudioInNameSize - outputDeviceNameRaw.Length);
|
||||||
|
|
||||||
MakeObject(context, new AudioInServer(obj));
|
MakeObject(context, new AudioInServer(obj));
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioOut
|
||||||
// AppendAudioOutBuffer(u64 bufferTag, buffer<nn::audio::AudioOutBuffer, 5> buffer)
|
// AppendAudioOutBuffer(u64 bufferTag, buffer<nn::audio::AudioOutBuffer, 5> buffer)
|
||||||
public ResultCode AppendAudioOutBuffer(ServiceCtx context)
|
public ResultCode AppendAudioOutBuffer(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.SendBuff[0].Position;
|
ulong position = context.Request.SendBuff[0].Position;
|
||||||
|
|
||||||
ulong bufferTag = context.RequestData.ReadUInt64();
|
ulong bufferTag = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
|
@ -74,10 +74,10 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioOut
|
||||||
// GetReleasedAudioOutBuffers() -> (u32 count, buffer<u64, 6> tags)
|
// GetReleasedAudioOutBuffers() -> (u32 count, buffer<u64, 6> tags)
|
||||||
public ResultCode GetReleasedAudioOutBuffers(ServiceCtx context)
|
public ResultCode GetReleasedAudioOutBuffers(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
long size = context.Request.ReceiveBuff[0].Size;
|
ulong size = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
using (WritableRegion outputRegion = context.Memory.GetWritableRegion((ulong)position, (int)size))
|
using (WritableRegion outputRegion = context.Memory.GetWritableRegion(position, (int)size))
|
||||||
{
|
{
|
||||||
ResultCode result = _impl.GetReleasedBuffers(MemoryMarshal.Cast<byte, ulong>(outputRegion.Memory.Span), out uint releasedCount);
|
ResultCode result = _impl.GetReleasedBuffers(MemoryMarshal.Cast<byte, ulong>(outputRegion.Memory.Span), out uint releasedCount);
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioOut
|
||||||
// AppendAudioOutBufferAuto(u64 tag, buffer<nn::audio::AudioOutBuffer, 0x21>)
|
// AppendAudioOutBufferAuto(u64 tag, buffer<nn::audio::AudioOutBuffer, 0x21>)
|
||||||
public ResultCode AppendAudioOutBufferAuto(ServiceCtx context)
|
public ResultCode AppendAudioOutBufferAuto(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long position, _) = context.Request.GetBufferType0x21();
|
(ulong position, _) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
ulong bufferTag = context.RequestData.ReadUInt64();
|
ulong bufferTag = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
|
@ -115,9 +115,9 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioOut
|
||||||
// GetReleasedAudioOutBuffersAuto() -> (u32 count, buffer<u64, 0x22> tags)
|
// GetReleasedAudioOutBuffersAuto() -> (u32 count, buffer<u64, 0x22> tags)
|
||||||
public ResultCode GetReleasedAudioOutBuffersAuto(ServiceCtx context)
|
public ResultCode GetReleasedAudioOutBuffersAuto(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long position, long size) = context.Request.GetBufferType0x22();
|
(ulong position, ulong size) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
using (WritableRegion outputRegion = context.Memory.GetWritableRegion((ulong)position, (int)size))
|
using (WritableRegion outputRegion = context.Memory.GetWritableRegion(position, (int)size))
|
||||||
{
|
{
|
||||||
ResultCode result = _impl.GetReleasedBuffers(MemoryMarshal.Cast<byte, ulong>(outputRegion.Memory.Span), out uint releasedCount);
|
ResultCode result = _impl.GetReleasedBuffers(MemoryMarshal.Cast<byte, ulong>(outputRegion.Memory.Span), out uint releasedCount);
|
||||||
|
|
||||||
|
|
|
@ -27,10 +27,10 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
string[] deviceNames = _impl.ListAudioOuts();
|
string[] deviceNames = _impl.ListAudioOuts();
|
||||||
|
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
long size = context.Request.ReceiveBuff[0].Size;
|
ulong size = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
long basePosition = position;
|
ulong basePosition = position;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
@ -38,15 +38,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
||||||
|
|
||||||
if ((position - basePosition) + buffer.Length > size)
|
if ((position - basePosition) + (ulong)buffer.Length > size)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, buffer);
|
context.Memory.Write(position, buffer);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, position + buffer.Length, AudioOutNameSize - buffer.Length);
|
MemoryHelper.FillWithZeros(context.Memory, position + (ulong)buffer.Length, AudioOutNameSize - buffer.Length);
|
||||||
|
|
||||||
position += AudioOutNameSize;
|
position += AudioOutNameSize;
|
||||||
count++;
|
count++;
|
||||||
|
@ -65,15 +65,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
||||||
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long deviceNameInputPosition = context.Request.SendBuff[0].Position;
|
ulong deviceNameInputPosition = context.Request.SendBuff[0].Position;
|
||||||
long deviceNameInputSize = context.Request.SendBuff[0].Size;
|
ulong deviceNameInputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long deviceNameOutputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong deviceNameOutputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long deviceNameOutputSize = context.Request.ReceiveBuff[0].Size;
|
ulong deviceNameOutputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
||||||
|
|
||||||
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, deviceNameInputSize);
|
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, (long)deviceNameInputSize);
|
||||||
|
|
||||||
ResultCode resultCode = _impl.OpenAudioOut(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioOut obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
ResultCode resultCode = _impl.OpenAudioOut(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioOut obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
||||||
|
|
||||||
|
@ -83,8 +83,8 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
|
|
||||||
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
||||||
|
|
||||||
context.Memory.Write((ulong)deviceNameOutputPosition, outputDeviceNameRaw);
|
context.Memory.Write(deviceNameOutputPosition, outputDeviceNameRaw);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + outputDeviceNameRaw.Length, AudioOutNameSize - outputDeviceNameRaw.Length);
|
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + (ulong)outputDeviceNameRaw.Length, AudioOutNameSize - outputDeviceNameRaw.Length);
|
||||||
|
|
||||||
MakeObject(context, new AudioOutServer(obj));
|
MakeObject(context, new AudioOutServer(obj));
|
||||||
}
|
}
|
||||||
|
@ -98,9 +98,9 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
string[] deviceNames = _impl.ListAudioOuts();
|
string[] deviceNames = _impl.ListAudioOuts();
|
||||||
|
|
||||||
(long position, long size) = context.Request.GetBufferType0x22();
|
(ulong position, ulong size) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
long basePosition = position;
|
ulong basePosition = position;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
@ -108,15 +108,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
{
|
{
|
||||||
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
||||||
|
|
||||||
if ((position - basePosition) + buffer.Length > size)
|
if ((position - basePosition) + (ulong)buffer.Length > size)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, buffer);
|
context.Memory.Write(position, buffer);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, position + buffer.Length, AudioOutNameSize - buffer.Length);
|
MemoryHelper.FillWithZeros(context.Memory, position + (ulong)buffer.Length, AudioOutNameSize - buffer.Length);
|
||||||
|
|
||||||
position += AudioOutNameSize;
|
position += AudioOutNameSize;
|
||||||
count++;
|
count++;
|
||||||
|
@ -135,12 +135,12 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
AudioInputConfiguration inputConfiguration = context.RequestData.ReadStruct<AudioInputConfiguration>();
|
||||||
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
(long deviceNameInputPosition, long deviceNameInputSize) = context.Request.GetBufferType0x21();
|
(ulong deviceNameInputPosition, ulong deviceNameInputSize) = context.Request.GetBufferType0x21();
|
||||||
(long deviceNameOutputPosition, long deviceNameOutputSize) = context.Request.GetBufferType0x22();
|
(ulong deviceNameOutputPosition, ulong deviceNameOutputSize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
uint processHandle = (uint)context.Request.HandleDesc.ToCopy[0];
|
||||||
|
|
||||||
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, deviceNameInputSize);
|
string inputDeviceName = MemoryHelper.ReadAsciiString(context.Memory, deviceNameInputPosition, (long)deviceNameInputSize);
|
||||||
|
|
||||||
ResultCode resultCode = _impl.OpenAudioOut(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioOut obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
ResultCode resultCode = _impl.OpenAudioOut(context, out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out IAudioOut obj, inputDeviceName, ref inputConfiguration, appletResourceUserId, processHandle);
|
||||||
|
|
||||||
|
@ -150,8 +150,8 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
||||||
|
|
||||||
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
byte[] outputDeviceNameRaw = Encoding.ASCII.GetBytes(outputDeviceName);
|
||||||
|
|
||||||
context.Memory.Write((ulong)deviceNameOutputPosition, outputDeviceNameRaw);
|
context.Memory.Write(deviceNameOutputPosition, outputDeviceNameRaw);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + outputDeviceNameRaw.Length, AudioOutNameSize - outputDeviceNameRaw.Length);
|
MemoryHelper.FillWithZeros(context.Memory, deviceNameOutputPosition + (ulong)outputDeviceNameRaw.Length, AudioOutNameSize - outputDeviceNameRaw.Length);
|
||||||
|
|
||||||
MakeObject(context, new AudioOutServer(obj));
|
MakeObject(context, new AudioOutServer(obj));
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,10 +25,10 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
{
|
{
|
||||||
string[] deviceNames = _impl.ListAudioDeviceName();
|
string[] deviceNames = _impl.ListAudioDeviceName();
|
||||||
|
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
long size = context.Request.ReceiveBuff[0].Size;
|
ulong size = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
long basePosition = position;
|
ulong basePosition = position;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
@ -36,15 +36,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
{
|
{
|
||||||
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
||||||
|
|
||||||
if ((position - basePosition) + buffer.Length > size)
|
if ((position - basePosition) + (ulong)buffer.Length > size)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, buffer);
|
context.Memory.Write(position, buffer);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, position + buffer.Length, AudioDeviceNameSize - buffer.Length);
|
MemoryHelper.FillWithZeros(context.Memory, position + (ulong)buffer.Length, AudioDeviceNameSize - buffer.Length);
|
||||||
|
|
||||||
position += AudioDeviceNameSize;
|
position += AudioDeviceNameSize;
|
||||||
count++;
|
count++;
|
||||||
|
@ -61,10 +61,10 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
{
|
{
|
||||||
float volume = context.RequestData.ReadSingle();
|
float volume = context.RequestData.ReadSingle();
|
||||||
|
|
||||||
long position = context.Request.SendBuff[0].Position;
|
ulong position = context.Request.SendBuff[0].Position;
|
||||||
long size = context.Request.SendBuff[0].Size;
|
ulong size = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, size);
|
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, (long)size);
|
||||||
|
|
||||||
return _impl.SetAudioDeviceOutputVolume(deviceName, volume);
|
return _impl.SetAudioDeviceOutputVolume(deviceName, volume);
|
||||||
}
|
}
|
||||||
|
@ -73,10 +73,10 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
// GetAudioDeviceOutputVolume(buffer<bytes, 5> name) -> f32 volume
|
// GetAudioDeviceOutputVolume(buffer<bytes, 5> name) -> f32 volume
|
||||||
public ResultCode GetAudioDeviceOutputVolume(ServiceCtx context)
|
public ResultCode GetAudioDeviceOutputVolume(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.SendBuff[0].Position;
|
ulong position = context.Request.SendBuff[0].Position;
|
||||||
long size = context.Request.SendBuff[0].Size;
|
ulong size = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, size);
|
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, (long)size);
|
||||||
|
|
||||||
ResultCode result = _impl.GetAudioDeviceOutputVolume(deviceName, out float volume);
|
ResultCode result = _impl.GetAudioDeviceOutputVolume(deviceName, out float volume);
|
||||||
|
|
||||||
|
@ -94,14 +94,14 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
{
|
{
|
||||||
string name = _impl.GetActiveAudioDeviceName();
|
string name = _impl.GetActiveAudioDeviceName();
|
||||||
|
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
long size = context.Request.ReceiveBuff[0].Size;
|
ulong size = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] deviceNameBuffer = Encoding.ASCII.GetBytes(name + "\0");
|
byte[] deviceNameBuffer = Encoding.ASCII.GetBytes(name + "\0");
|
||||||
|
|
||||||
if ((ulong)deviceNameBuffer.Length <= (ulong)size)
|
if ((ulong)deviceNameBuffer.Length <= size)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)position, deviceNameBuffer);
|
context.Memory.Write(position, deviceNameBuffer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -146,9 +146,9 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
{
|
{
|
||||||
string[] deviceNames = _impl.ListAudioDeviceName();
|
string[] deviceNames = _impl.ListAudioDeviceName();
|
||||||
|
|
||||||
(long position, long size) = context.Request.GetBufferType0x22();
|
(ulong position, ulong size) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
long basePosition = position;
|
ulong basePosition = position;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
@ -156,15 +156,15 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
{
|
{
|
||||||
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
byte[] buffer = Encoding.ASCII.GetBytes(name);
|
||||||
|
|
||||||
if ((position - basePosition) + buffer.Length > size)
|
if ((position - basePosition) + (ulong)buffer.Length > size)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
Logger.Error?.Print(LogClass.ServiceAudio, $"Output buffer size {size} too small!");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, buffer);
|
context.Memory.Write(position, buffer);
|
||||||
MemoryHelper.FillWithZeros(context.Memory, position + buffer.Length, AudioDeviceNameSize - buffer.Length);
|
MemoryHelper.FillWithZeros(context.Memory, position + (ulong)buffer.Length, AudioDeviceNameSize - buffer.Length);
|
||||||
|
|
||||||
position += AudioDeviceNameSize;
|
position += AudioDeviceNameSize;
|
||||||
count++;
|
count++;
|
||||||
|
@ -181,9 +181,9 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
{
|
{
|
||||||
float volume = context.RequestData.ReadSingle();
|
float volume = context.RequestData.ReadSingle();
|
||||||
|
|
||||||
(long position, long size) = context.Request.GetBufferType0x21();
|
(ulong position, ulong size) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, size);
|
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, (long)size);
|
||||||
|
|
||||||
return _impl.SetAudioDeviceOutputVolume(deviceName, volume);
|
return _impl.SetAudioDeviceOutputVolume(deviceName, volume);
|
||||||
}
|
}
|
||||||
|
@ -192,9 +192,9 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
// GetAudioDeviceOutputVolumeAuto(buffer<bytes, 0x21> name) -> f32
|
// GetAudioDeviceOutputVolumeAuto(buffer<bytes, 0x21> name) -> f32
|
||||||
public ResultCode GetAudioDeviceOutputVolumeAuto(ServiceCtx context)
|
public ResultCode GetAudioDeviceOutputVolumeAuto(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long position, long size) = context.Request.GetBufferType0x21();
|
(ulong position, ulong size) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, size);
|
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, (long)size);
|
||||||
|
|
||||||
ResultCode result = _impl.GetAudioDeviceOutputVolume(deviceName, out float volume);
|
ResultCode result = _impl.GetAudioDeviceOutputVolume(deviceName, out float volume);
|
||||||
|
|
||||||
|
@ -212,13 +212,13 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
{
|
{
|
||||||
string name = _impl.GetActiveAudioDeviceName();
|
string name = _impl.GetActiveAudioDeviceName();
|
||||||
|
|
||||||
(long position, long size) = context.Request.GetBufferType0x22();
|
(ulong position, ulong size) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
byte[] deviceNameBuffer = Encoding.UTF8.GetBytes(name + '\0');
|
byte[] deviceNameBuffer = Encoding.UTF8.GetBytes(name + '\0');
|
||||||
|
|
||||||
if ((ulong)deviceNameBuffer.Length <= (ulong)size)
|
if ((ulong)deviceNameBuffer.Length <= size)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)position, deviceNameBuffer);
|
context.Memory.Write(position, deviceNameBuffer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -268,10 +268,10 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
// GetAudioSystemMasterVolumeSetting(buffer<bytes, 5> name) -> f32
|
// GetAudioSystemMasterVolumeSetting(buffer<bytes, 5> name) -> f32
|
||||||
public ResultCode GetAudioSystemMasterVolumeSetting(ServiceCtx context)
|
public ResultCode GetAudioSystemMasterVolumeSetting(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.SendBuff[0].Position;
|
ulong position = context.Request.SendBuff[0].Position;
|
||||||
long size = context.Request.SendBuff[0].Size;
|
ulong size = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, size);
|
string deviceName = MemoryHelper.ReadAsciiString(context.Memory, position, (long)size);
|
||||||
|
|
||||||
ResultCode result = _impl.GetAudioSystemMasterVolumeSetting(deviceName, out float systemMasterVolume);
|
ResultCode result = _impl.GetAudioSystemMasterVolumeSetting(deviceName, out float systemMasterVolume);
|
||||||
|
|
||||||
|
|
|
@ -57,16 +57,16 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
// -> (buffer<nn::audio::detail::AudioRendererUpdateDataHeader, 6> output, buffer<nn::audio::detail::AudioRendererUpdateDataHeader, 6> performanceOutput)
|
// -> (buffer<nn::audio::detail::AudioRendererUpdateDataHeader, 6> output, buffer<nn::audio::detail::AudioRendererUpdateDataHeader, 6> performanceOutput)
|
||||||
public ResultCode RequestUpdate(ServiceCtx context)
|
public ResultCode RequestUpdate(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long inputPosition = context.Request.SendBuff[0].Position;
|
ulong inputPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputSize = context.Request.SendBuff[0].Size;
|
ulong inputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long outputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
long performanceOutputPosition = context.Request.ReceiveBuff[1].Position;
|
ulong performanceOutputPosition = context.Request.ReceiveBuff[1].Position;
|
||||||
long performanceOutputSize = context.Request.ReceiveBuff[1].Size;
|
ulong performanceOutputSize = context.Request.ReceiveBuff[1].Size;
|
||||||
|
|
||||||
ReadOnlyMemory<byte> input = context.Memory.GetSpan((ulong)inputPosition, (int)inputSize).ToArray();
|
ReadOnlyMemory<byte> input = context.Memory.GetSpan(inputPosition, (int)inputSize).ToArray();
|
||||||
|
|
||||||
Memory<byte> output = new byte[outputSize];
|
Memory<byte> output = new byte[outputSize];
|
||||||
Memory<byte> performanceOutput = new byte[performanceOutputSize];
|
Memory<byte> performanceOutput = new byte[performanceOutputSize];
|
||||||
|
@ -78,8 +78,8 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)outputPosition, output.Span);
|
context.Memory.Write(outputPosition, output.Span);
|
||||||
context.Memory.Write((ulong)performanceOutputPosition, performanceOutput.Span);
|
context.Memory.Write(performanceOutputPosition, performanceOutput.Span);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -149,11 +149,11 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
// -> (buffer<nn::audio::detail::AudioRendererUpdateDataHeader, 0x22> output, buffer<nn::audio::detail::AudioRendererUpdateDataHeader, 0x22> performanceOutput)
|
// -> (buffer<nn::audio::detail::AudioRendererUpdateDataHeader, 0x22> output, buffer<nn::audio::detail::AudioRendererUpdateDataHeader, 0x22> performanceOutput)
|
||||||
public ResultCode RequestUpdateAuto(ServiceCtx context)
|
public ResultCode RequestUpdateAuto(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long inputPosition, long inputSize) = context.Request.GetBufferType0x21();
|
(ulong inputPosition, ulong inputSize) = context.Request.GetBufferType0x21();
|
||||||
(long outputPosition, long outputSize) = context.Request.GetBufferType0x22(0);
|
(ulong outputPosition, ulong outputSize) = context.Request.GetBufferType0x22(0);
|
||||||
(long performanceOutputPosition, long performanceOutputSize) = context.Request.GetBufferType0x22(1);
|
(ulong performanceOutputPosition, ulong performanceOutputSize) = context.Request.GetBufferType0x22(1);
|
||||||
|
|
||||||
ReadOnlyMemory<byte> input = context.Memory.GetSpan((ulong)inputPosition, (int)inputSize).ToArray();
|
ReadOnlyMemory<byte> input = context.Memory.GetSpan(inputPosition, (int)inputSize).ToArray();
|
||||||
|
|
||||||
Memory<byte> output = new byte[outputSize];
|
Memory<byte> output = new byte[outputSize];
|
||||||
Memory<byte> performanceOutput = new byte[performanceOutputSize];
|
Memory<byte> performanceOutput = new byte[performanceOutputSize];
|
||||||
|
@ -165,8 +165,8 @@ namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)outputPosition, output.Span);
|
context.Memory.Write(outputPosition, output.Span);
|
||||||
context.Memory.Write((ulong)performanceOutputPosition, performanceOutput.Span);
|
context.Memory.Write(performanceOutputPosition, performanceOutput.Span);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -106,24 +106,24 @@ namespace Ryujinx.HLE.HOS.Services.Audio.HardwareOpusDecoderManager
|
||||||
{
|
{
|
||||||
ResultCode result;
|
ResultCode result;
|
||||||
|
|
||||||
long inPosition = context.Request.SendBuff[0].Position;
|
ulong inPosition = context.Request.SendBuff[0].Position;
|
||||||
long inSize = context.Request.SendBuff[0].Size;
|
ulong inSize = context.Request.SendBuff[0].Size;
|
||||||
long outputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] buffer = new byte[inSize];
|
byte[] buffer = new byte[inSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inPosition, buffer);
|
context.Memory.Read(inPosition, buffer);
|
||||||
|
|
||||||
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(buffer)))
|
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(buffer)))
|
||||||
{
|
{
|
||||||
result = DecodeInterleavedInternal(inputStream, out short[] outPcmData, outputSize, out uint outConsumed, out int outSamples);
|
result = DecodeInterleavedInternal(inputStream, out short[] outPcmData, (long)outputSize, out uint outConsumed, out int outSamples);
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
byte[] pcmDataBytes = new byte[outPcmData.Length * sizeof(short)];
|
byte[] pcmDataBytes = new byte[outPcmData.Length * sizeof(short)];
|
||||||
Buffer.BlockCopy(outPcmData, 0, pcmDataBytes, 0, pcmDataBytes.Length);
|
Buffer.BlockCopy(outPcmData, 0, pcmDataBytes, 0, pcmDataBytes.Length);
|
||||||
context.Memory.Write((ulong)outputPosition, pcmDataBytes);
|
context.Memory.Write(outputPosition, pcmDataBytes);
|
||||||
|
|
||||||
context.ResponseData.Write(outConsumed);
|
context.ResponseData.Write(outConsumed);
|
||||||
context.ResponseData.Write(outSamples);
|
context.ResponseData.Write(outSamples);
|
||||||
|
@ -139,24 +139,24 @@ namespace Ryujinx.HLE.HOS.Services.Audio.HardwareOpusDecoderManager
|
||||||
{
|
{
|
||||||
ResultCode result;
|
ResultCode result;
|
||||||
|
|
||||||
long inPosition = context.Request.SendBuff[0].Position;
|
ulong inPosition = context.Request.SendBuff[0].Position;
|
||||||
long inSize = context.Request.SendBuff[0].Size;
|
ulong inSize = context.Request.SendBuff[0].Size;
|
||||||
long outputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] buffer = new byte[inSize];
|
byte[] buffer = new byte[inSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inPosition, buffer);
|
context.Memory.Read(inPosition, buffer);
|
||||||
|
|
||||||
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(buffer)))
|
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(buffer)))
|
||||||
{
|
{
|
||||||
result = DecodeInterleavedInternal(inputStream, out short[] outPcmData, outputSize, out uint outConsumed, out int outSamples);
|
result = DecodeInterleavedInternal(inputStream, out short[] outPcmData, (long)outputSize, out uint outConsumed, out int outSamples);
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
byte[] pcmDataBytes = new byte[outPcmData.Length * sizeof(short)];
|
byte[] pcmDataBytes = new byte[outPcmData.Length * sizeof(short)];
|
||||||
Buffer.BlockCopy(outPcmData, 0, pcmDataBytes, 0, pcmDataBytes.Length);
|
Buffer.BlockCopy(outPcmData, 0, pcmDataBytes, 0, pcmDataBytes.Length);
|
||||||
context.Memory.Write((ulong)outputPosition, pcmDataBytes);
|
context.Memory.Write(outputPosition, pcmDataBytes);
|
||||||
|
|
||||||
context.ResponseData.Write(outConsumed);
|
context.ResponseData.Write(outConsumed);
|
||||||
context.ResponseData.Write(outSamples);
|
context.ResponseData.Write(outSamples);
|
||||||
|
@ -177,24 +177,24 @@ namespace Ryujinx.HLE.HOS.Services.Audio.HardwareOpusDecoderManager
|
||||||
|
|
||||||
_reset = context.RequestData.ReadBoolean();
|
_reset = context.RequestData.ReadBoolean();
|
||||||
|
|
||||||
long inPosition = context.Request.SendBuff[0].Position;
|
ulong inPosition = context.Request.SendBuff[0].Position;
|
||||||
long inSize = context.Request.SendBuff[0].Size;
|
ulong inSize = context.Request.SendBuff[0].Size;
|
||||||
long outputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] buffer = new byte[inSize];
|
byte[] buffer = new byte[inSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inPosition, buffer);
|
context.Memory.Read(inPosition, buffer);
|
||||||
|
|
||||||
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(buffer)))
|
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(buffer)))
|
||||||
{
|
{
|
||||||
result = DecodeInterleavedInternal(inputStream, out short[] outPcmData, outputSize, out uint outConsumed, out int outSamples);
|
result = DecodeInterleavedInternal(inputStream, out short[] outPcmData, (long)outputSize, out uint outConsumed, out int outSamples);
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
byte[] pcmDataBytes = new byte[outPcmData.Length * sizeof(short)];
|
byte[] pcmDataBytes = new byte[outPcmData.Length * sizeof(short)];
|
||||||
Buffer.BlockCopy(outPcmData, 0, pcmDataBytes, 0, pcmDataBytes.Length);
|
Buffer.BlockCopy(outPcmData, 0, pcmDataBytes, 0, pcmDataBytes.Length);
|
||||||
context.Memory.Write((ulong)outputPosition, pcmDataBytes);
|
context.Memory.Write(outputPosition, pcmDataBytes);
|
||||||
|
|
||||||
context.ResponseData.Write(outConsumed);
|
context.ResponseData.Write(outConsumed);
|
||||||
context.ResponseData.Write(outSamples);
|
context.ResponseData.Write(outSamples);
|
||||||
|
@ -215,24 +215,24 @@ namespace Ryujinx.HLE.HOS.Services.Audio.HardwareOpusDecoderManager
|
||||||
|
|
||||||
_reset = context.RequestData.ReadBoolean();
|
_reset = context.RequestData.ReadBoolean();
|
||||||
|
|
||||||
long inPosition = context.Request.SendBuff[0].Position;
|
ulong inPosition = context.Request.SendBuff[0].Position;
|
||||||
long inSize = context.Request.SendBuff[0].Size;
|
ulong inSize = context.Request.SendBuff[0].Size;
|
||||||
long outputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] buffer = new byte[inSize];
|
byte[] buffer = new byte[inSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inPosition, buffer);
|
context.Memory.Read(inPosition, buffer);
|
||||||
|
|
||||||
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(buffer)))
|
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(buffer)))
|
||||||
{
|
{
|
||||||
result = DecodeInterleavedInternal(inputStream, out short[] outPcmData, outputSize, out uint outConsumed, out int outSamples);
|
result = DecodeInterleavedInternal(inputStream, out short[] outPcmData, (long)outputSize, out uint outConsumed, out int outSamples);
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
byte[] pcmDataBytes = new byte[outPcmData.Length * sizeof(short)];
|
byte[] pcmDataBytes = new byte[outPcmData.Length * sizeof(short)];
|
||||||
Buffer.BlockCopy(outPcmData, 0, pcmDataBytes, 0, pcmDataBytes.Length);
|
Buffer.BlockCopy(outPcmData, 0, pcmDataBytes, 0, pcmDataBytes.Length);
|
||||||
context.Memory.Write((ulong)outputPosition, pcmDataBytes);
|
context.Memory.Write(outputPosition, pcmDataBytes);
|
||||||
|
|
||||||
context.ResponseData.Write(outConsumed);
|
context.ResponseData.Write(outConsumed);
|
||||||
context.ResponseData.Write(outSamples);
|
context.ResponseData.Write(outSamples);
|
||||||
|
|
|
@ -30,14 +30,14 @@ namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
|
||||||
// Read() -> (u32, buffer<nn::bcat::DeliveryCacheDirectoryEntry, 6>)
|
// Read() -> (u32, buffer<nn::bcat::DeliveryCacheDirectoryEntry, 6>)
|
||||||
public ResultCode Read(ServiceCtx context)
|
public ResultCode Read(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
long size = context.Request.ReceiveBuff[0].Size;
|
ulong size = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] data = new byte[size];
|
byte[] data = new byte[size];
|
||||||
|
|
||||||
Result result = _base.Read(out int entriesRead, MemoryMarshal.Cast<byte, DeliveryCacheDirectoryEntry>(data));
|
Result result = _base.Read(out int entriesRead, MemoryMarshal.Cast<byte, DeliveryCacheDirectoryEntry>(data));
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, data);
|
context.Memory.Write(position, data);
|
||||||
|
|
||||||
context.ResponseData.Write(entriesRead);
|
context.ResponseData.Write(entriesRead);
|
||||||
|
|
||||||
|
|
|
@ -30,8 +30,8 @@ namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
|
||||||
// Read(u64) -> (u64, buffer<bytes, 6>)
|
// Read(u64) -> (u64, buffer<bytes, 6>)
|
||||||
public ResultCode Read(ServiceCtx context)
|
public ResultCode Read(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
long size = context.Request.ReceiveBuff[0].Size;
|
ulong size = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
long offset = context.RequestData.ReadInt64();
|
long offset = context.RequestData.ReadInt64();
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
|
||||||
|
|
||||||
Result result = _base.Read(out long bytesRead, offset, data);
|
Result result = _base.Read(out long bytesRead, offset, data);
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, data);
|
context.Memory.Write(position, data);
|
||||||
|
|
||||||
context.ResponseData.Write(bytesRead);
|
context.ResponseData.Write(bytesRead);
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
|
||||||
Result = 0
|
Result = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
long dcpSize = WriteDeliveryCacheProgressImpl(context, context.Request.RecvListBuff[0], deliveryCacheProgress);
|
ulong dcpSize = WriteDeliveryCacheProgressImpl(context, context.Request.RecvListBuff[0], deliveryCacheProgress);
|
||||||
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(dcpSize);
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(dcpSize);
|
||||||
|
|
||||||
Logger.Stub?.PrintStub(LogClass.ServiceBcat);
|
Logger.Stub?.PrintStub(LogClass.ServiceBcat);
|
||||||
|
@ -57,7 +57,7 @@ namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
private long WriteDeliveryCacheProgressImpl(ServiceCtx context, IpcRecvListBuffDesc ipcDesc, DeliveryCacheProgressImpl deliveryCacheProgress)
|
private ulong WriteDeliveryCacheProgressImpl(ServiceCtx context, IpcRecvListBuffDesc ipcDesc, DeliveryCacheProgressImpl deliveryCacheProgress)
|
||||||
{
|
{
|
||||||
return MemoryHelper.Write(context.Memory, ipcDesc.Position, deliveryCacheProgress);
|
return MemoryHelper.Write(context.Memory, ipcDesc.Position, deliveryCacheProgress);
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,14 +46,14 @@ namespace Ryujinx.HLE.HOS.Services.Bcat.ServiceCreator
|
||||||
// EnumerateDeliveryCacheDirectory() -> (u32, buffer<nn::bcat::DirectoryName, 6>)
|
// EnumerateDeliveryCacheDirectory() -> (u32, buffer<nn::bcat::DirectoryName, 6>)
|
||||||
public ResultCode EnumerateDeliveryCacheDirectory(ServiceCtx context)
|
public ResultCode EnumerateDeliveryCacheDirectory(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
long size = context.Request.ReceiveBuff[0].Size;
|
ulong size = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] data = new byte[size];
|
byte[] data = new byte[size];
|
||||||
|
|
||||||
Result result = _base.EnumerateDeliveryCacheDirectory(out int count, MemoryMarshal.Cast<byte, DirectoryName>(data));
|
Result result = _base.EnumerateDeliveryCacheDirectory(out int count, MemoryMarshal.Cast<byte, DirectoryName>(data));
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, data);
|
context.Memory.Write(position, data);
|
||||||
|
|
||||||
context.ResponseData.Write(count);
|
context.ResponseData.Write(count);
|
||||||
|
|
||||||
|
|
|
@ -26,10 +26,10 @@ namespace Ryujinx.HLE.HOS.Services.Caps
|
||||||
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
||||||
ulong pidPlaceholder = context.RequestData.ReadUInt64();
|
ulong pidPlaceholder = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long screenshotDataPosition = context.Request.SendBuff[0].Position;
|
ulong screenshotDataPosition = context.Request.SendBuff[0].Position;
|
||||||
long screenshotDataSize = context.Request.SendBuff[0].Size;
|
ulong screenshotDataSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
byte[] screenshotData = context.Memory.GetSpan((ulong)screenshotDataPosition, (int)screenshotDataSize, true).ToArray();
|
byte[] screenshotData = context.Memory.GetSpan(screenshotDataPosition, (int)screenshotDataSize, true).ToArray();
|
||||||
|
|
||||||
ResultCode resultCode = context.Device.System.CaptureManager.SaveScreenShot(screenshotData, appletResourceUserId, context.Device.Application.TitleId, out ApplicationAlbumEntry applicationAlbumEntry);
|
ResultCode resultCode = context.Device.System.CaptureManager.SaveScreenShot(screenshotData, appletResourceUserId, context.Device.Application.TitleId, out ApplicationAlbumEntry applicationAlbumEntry);
|
||||||
|
|
||||||
|
@ -49,16 +49,16 @@ namespace Ryujinx.HLE.HOS.Services.Caps
|
||||||
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
||||||
ulong pidPlaceholder = context.RequestData.ReadUInt64();
|
ulong pidPlaceholder = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long applicationDataPosition = context.Request.SendBuff[0].Position;
|
ulong applicationDataPosition = context.Request.SendBuff[0].Position;
|
||||||
long applicationDataSize = context.Request.SendBuff[0].Size;
|
ulong applicationDataSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long screenshotDataPosition = context.Request.SendBuff[1].Position;
|
ulong screenshotDataPosition = context.Request.SendBuff[1].Position;
|
||||||
long screenshotDataSize = context.Request.SendBuff[1].Size;
|
ulong screenshotDataSize = context.Request.SendBuff[1].Size;
|
||||||
|
|
||||||
// TODO: Parse the application data: At 0x00 it's UserData (Size of 0x400), at 0x404 it's a uint UserDataSize (Always empty for now).
|
// TODO: Parse the application data: At 0x00 it's UserData (Size of 0x400), at 0x404 it's a uint UserDataSize (Always empty for now).
|
||||||
byte[] applicationData = context.Memory.GetSpan((ulong)applicationDataPosition, (int)applicationDataSize).ToArray();
|
byte[] applicationData = context.Memory.GetSpan(applicationDataPosition, (int)applicationDataSize).ToArray();
|
||||||
|
|
||||||
byte[] screenshotData = context.Memory.GetSpan((ulong)screenshotDataPosition, (int)screenshotDataSize, true).ToArray();
|
byte[] screenshotData = context.Memory.GetSpan(screenshotDataPosition, (int)screenshotDataSize, true).ToArray();
|
||||||
|
|
||||||
ResultCode resultCode = context.Device.System.CaptureManager.SaveScreenShot(screenshotData, appletResourceUserId, context.Device.Application.TitleId, out ApplicationAlbumEntry applicationAlbumEntry);
|
ResultCode resultCode = context.Device.System.CaptureManager.SaveScreenShot(screenshotData, appletResourceUserId, context.Device.Application.TitleId, out ApplicationAlbumEntry applicationAlbumEntry);
|
||||||
|
|
||||||
|
@ -77,16 +77,16 @@ namespace Ryujinx.HLE.HOS.Services.Caps
|
||||||
uint unknown = context.RequestData.ReadUInt32();
|
uint unknown = context.RequestData.ReadUInt32();
|
||||||
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
ulong appletResourceUserId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long userIdListPosition = context.Request.SendBuff[0].Position;
|
ulong userIdListPosition = context.Request.SendBuff[0].Position;
|
||||||
long userIdListSize = context.Request.SendBuff[0].Size;
|
ulong userIdListSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long screenshotDataPosition = context.Request.SendBuff[1].Position;
|
ulong screenshotDataPosition = context.Request.SendBuff[1].Position;
|
||||||
long screenshotDataSize = context.Request.SendBuff[1].Size;
|
ulong screenshotDataSize = context.Request.SendBuff[1].Size;
|
||||||
|
|
||||||
// TODO: Parse the UserIdList.
|
// TODO: Parse the UserIdList.
|
||||||
byte[] userIdList = context.Memory.GetSpan((ulong)userIdListPosition, (int)userIdListSize).ToArray();
|
byte[] userIdList = context.Memory.GetSpan(userIdListPosition, (int)userIdListSize).ToArray();
|
||||||
|
|
||||||
byte[] screenshotData = context.Memory.GetSpan((ulong)screenshotDataPosition, (int)screenshotDataSize, true).ToArray();
|
byte[] screenshotData = context.Memory.GetSpan(screenshotDataPosition, (int)screenshotDataSize, true).ToArray();
|
||||||
|
|
||||||
ResultCode resultCode = context.Device.System.CaptureManager.SaveScreenShot(screenshotData, appletResourceUserId, context.Device.Application.TitleId, out ApplicationAlbumEntry applicationAlbumEntry);
|
ResultCode resultCode = context.Device.System.CaptureManager.SaveScreenShot(screenshotData, appletResourceUserId, context.Device.Application.TitleId, out ApplicationAlbumEntry applicationAlbumEntry);
|
||||||
|
|
||||||
|
|
|
@ -184,12 +184,12 @@ namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator
|
||||||
// Pid placeholder
|
// Pid placeholder
|
||||||
context.RequestData.ReadInt64();
|
context.RequestData.ReadInt64();
|
||||||
|
|
||||||
long position = context.Request.PtrBuff[0].Position;
|
ulong position = context.Request.PtrBuff[0].Position;
|
||||||
long size = context.Request.PtrBuff[0].Size;
|
ulong size = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
byte[] bufferContent = new byte[size];
|
byte[] bufferContent = new byte[size];
|
||||||
|
|
||||||
context.Memory.Read((ulong)position, bufferContent);
|
context.Memory.Read(position, bufferContent);
|
||||||
|
|
||||||
if (uuid.IsNull)
|
if (uuid.IsNull)
|
||||||
{
|
{
|
||||||
|
@ -215,9 +215,9 @@ 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);
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(0x40UL);
|
||||||
|
|
||||||
long bufferPosition = context.Request.RecvListBuff[0].Position;
|
ulong bufferPosition = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
if (userId.IsNull)
|
if (userId.IsNull)
|
||||||
{
|
{
|
||||||
|
@ -265,8 +265,8 @@ namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
context.Memory.Write((ulong)bufferPosition, playHistoryRegistrationKeyBuffer);
|
context.Memory.Write(bufferPosition, playHistoryRegistrationKeyBuffer);
|
||||||
context.Memory.Write((ulong)bufferPosition + 0x20, new byte[0x20]); // HmacHash
|
context.Memory.Write(bufferPosition + 0x20, new byte[0x20]); // HmacHash
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -281,14 +281,14 @@ namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator
|
||||||
context.RequestData.ReadInt64();
|
context.RequestData.ReadInt64();
|
||||||
long pid = context.Process.Pid;
|
long pid = context.Process.Pid;
|
||||||
|
|
||||||
long playHistoryRegistrationKeyPosition = context.Request.PtrBuff[0].Position;
|
ulong playHistoryRegistrationKeyPosition = context.Request.PtrBuff[0].Position;
|
||||||
long PlayHistoryRegistrationKeySize = context.Request.PtrBuff[0].Size;
|
ulong PlayHistoryRegistrationKeySize = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
long inAppScreenName1Position = context.Request.PtrBuff[1].Position;
|
ulong inAppScreenName1Position = context.Request.PtrBuff[1].Position;
|
||||||
long inAppScreenName1Size = context.Request.PtrBuff[1].Size;
|
ulong inAppScreenName1Size = context.Request.PtrBuff[1].Size;
|
||||||
|
|
||||||
long inAppScreenName2Position = context.Request.PtrBuff[2].Position;
|
ulong inAppScreenName2Position = context.Request.PtrBuff[2].Position;
|
||||||
long inAppScreenName2Size = context.Request.PtrBuff[2].Size;
|
ulong inAppScreenName2Size = context.Request.PtrBuff[2].Size;
|
||||||
|
|
||||||
if (userId.IsNull || inAppScreenName1Size > 0x48 || inAppScreenName2Size > 0x48)
|
if (userId.IsNull || inAppScreenName1Size > 0x48 || inAppScreenName2Size > 0x48)
|
||||||
{
|
{
|
||||||
|
|
|
@ -116,12 +116,12 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
|
|
||||||
public static Result ReadFsPath(out FsPath path, ServiceCtx context, int index = 0)
|
public static Result ReadFsPath(out FsPath path, ServiceCtx context, int index = 0)
|
||||||
{
|
{
|
||||||
long position = context.Request.PtrBuff[index].Position;
|
ulong position = context.Request.PtrBuff[index].Position;
|
||||||
long size = context.Request.PtrBuff[index].Size;
|
ulong size = context.Request.PtrBuff[index].Size;
|
||||||
|
|
||||||
byte[] pathBytes = new byte[size];
|
byte[] pathBytes = new byte[size];
|
||||||
|
|
||||||
context.Memory.Read((ulong)position, pathBytes);
|
context.Memory.Read(position, pathBytes);
|
||||||
|
|
||||||
return FsPath.FromSpan(out path, pathBytes);
|
return FsPath.FromSpan(out path, pathBytes);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,15 +18,15 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
// Read() -> (u64 count, buffer<nn::fssrv::sf::IDirectoryEntry, 6, 0> entries)
|
// Read() -> (u64 count, buffer<nn::fssrv::sf::IDirectoryEntry, 6, 0> entries)
|
||||||
public ResultCode Read(ServiceCtx context)
|
public ResultCode Read(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferLen = context.Request.ReceiveBuff[0].Size;
|
ulong bufferLen = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] entriesBytes = new byte[bufferLen];
|
byte[] entriesBytes = new byte[bufferLen];
|
||||||
Span<DirectoryEntry> entries = MemoryMarshal.Cast<byte, DirectoryEntry>(entriesBytes);
|
Span<DirectoryEntry> entries = MemoryMarshal.Cast<byte, DirectoryEntry>(entriesBytes);
|
||||||
|
|
||||||
Result result = _baseDirectory.Read(out long entriesRead, entries);
|
Result result = _baseDirectory.Read(out long entriesRead, entries);
|
||||||
|
|
||||||
context.Memory.Write((ulong)bufferPosition, entriesBytes);
|
context.Memory.Write(bufferPosition, entriesBytes);
|
||||||
context.ResponseData.Write(entriesRead);
|
context.ResponseData.Write(entriesRead);
|
||||||
|
|
||||||
return (ResultCode)result.Value;
|
return (ResultCode)result.Value;
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
// Read(u32 readOption, u64 offset, u64 size) -> (u64 out_size, buffer<u8, 0x46, 0> out_buf)
|
// Read(u32 readOption, u64 offset, u64 size) -> (u64 out_size, buffer<u8, 0x46, 0> out_buf)
|
||||||
public ResultCode Read(ServiceCtx context)
|
public ResultCode Read(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
|
|
||||||
ReadOption readOption = new ReadOption(context.RequestData.ReadInt32());
|
ReadOption readOption = new ReadOption(context.RequestData.ReadInt32());
|
||||||
context.RequestData.BaseStream.Position += 4;
|
context.RequestData.BaseStream.Position += 4;
|
||||||
|
@ -29,7 +29,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
|
|
||||||
Result result = _baseFile.Read(out long bytesRead, offset, data, readOption);
|
Result result = _baseFile.Read(out long bytesRead, offset, data, readOption);
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, data);
|
context.Memory.Write(position, data);
|
||||||
|
|
||||||
context.ResponseData.Write(bytesRead);
|
context.ResponseData.Write(bytesRead);
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
// Write(u32 writeOption, u64 offset, u64 size, buffer<u8, 0x45, 0>)
|
// Write(u32 writeOption, u64 offset, u64 size, buffer<u8, 0x45, 0>)
|
||||||
public ResultCode Write(ServiceCtx context)
|
public ResultCode Write(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.SendBuff[0].Position;
|
ulong position = context.Request.SendBuff[0].Position;
|
||||||
|
|
||||||
WriteOption writeOption = new WriteOption(context.RequestData.ReadInt32());
|
WriteOption writeOption = new WriteOption(context.RequestData.ReadInt32());
|
||||||
context.RequestData.BaseStream.Position += 4;
|
context.RequestData.BaseStream.Position += 4;
|
||||||
|
@ -50,7 +50,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
|
|
||||||
byte[] data = new byte[size];
|
byte[] data = new byte[size];
|
||||||
|
|
||||||
context.Memory.Read((ulong)position, data);
|
context.Memory.Read(position, data);
|
||||||
|
|
||||||
return (ResultCode)_baseFile.Write(offset, data, writeOption).Value;
|
return (ResultCode)_baseFile.Write(offset, data, writeOption).Value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,8 +17,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
// Read(u64 offset, u64 length) -> buffer<u8, 0x46, 0> buffer
|
// Read(u64 offset, u64 length) -> buffer<u8, 0x46, 0> buffer
|
||||||
public ResultCode Read(ServiceCtx context)
|
public ResultCode Read(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long offset = context.RequestData.ReadInt64();
|
ulong offset = context.RequestData.ReadUInt64();
|
||||||
long size = context.RequestData.ReadInt64();
|
ulong size = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (context.Request.ReceiveBuff.Count > 0)
|
if (context.Request.ReceiveBuff.Count > 0)
|
||||||
{
|
{
|
||||||
|
@ -32,9 +32,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
|
||||||
|
|
||||||
byte[] data = new byte[size];
|
byte[] data = new byte[size];
|
||||||
|
|
||||||
Result result = _baseStorage.Read(offset, data);
|
Result result = _baseStorage.Read((long)offset, data);
|
||||||
|
|
||||||
context.Memory.Write((ulong)buffDesc.Position, data);
|
context.Memory.Write(buffDesc.Position, data);
|
||||||
|
|
||||||
return (ResultCode)result.Value;
|
return (ResultCode)result.Value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs
|
||||||
public ResultCode OpenFileSystemWithId(ServiceCtx context)
|
public ResultCode OpenFileSystemWithId(ServiceCtx context)
|
||||||
{
|
{
|
||||||
FileSystemType fileSystemType = (FileSystemType)context.RequestData.ReadInt32();
|
FileSystemType fileSystemType = (FileSystemType)context.RequestData.ReadInt32();
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
string switchPath = ReadUtf8String(context);
|
string switchPath = ReadUtf8String(context);
|
||||||
string fullPath = context.Device.FileSystem.SwitchPathToSystemPath(switchPath);
|
string fullPath = context.Device.FileSystem.SwitchPathToSystemPath(switchPath);
|
||||||
|
|
||||||
|
@ -337,14 +337,14 @@ namespace Ryujinx.HLE.HOS.Services.Fs
|
||||||
SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64();
|
SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64();
|
||||||
SaveDataFilter filter = context.RequestData.ReadStruct<SaveDataFilter>();
|
SaveDataFilter filter = context.RequestData.ReadStruct<SaveDataFilter>();
|
||||||
|
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferLen = context.Request.ReceiveBuff[0].Size;
|
ulong bufferLen = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] infoBuffer = new byte[bufferLen];
|
byte[] infoBuffer = new byte[bufferLen];
|
||||||
|
|
||||||
Result result = _baseFileSystemProxy.FindSaveDataWithFilter(out long count, infoBuffer, spaceId, ref filter);
|
Result result = _baseFileSystemProxy.FindSaveDataWithFilter(out long count, infoBuffer, spaceId, ref filter);
|
||||||
|
|
||||||
context.Memory.Write((ulong)bufferPosition, infoBuffer);
|
context.Memory.Write(bufferPosition, infoBuffer);
|
||||||
context.ResponseData.Write(count);
|
context.ResponseData.Write(count);
|
||||||
|
|
||||||
return (ResultCode)result.Value;
|
return (ResultCode)result.Value;
|
||||||
|
@ -392,7 +392,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs
|
||||||
{
|
{
|
||||||
StorageId storageId = (StorageId)context.RequestData.ReadByte();
|
StorageId storageId = (StorageId)context.RequestData.ReadByte();
|
||||||
byte[] padding = context.RequestData.ReadBytes(7);
|
byte[] padding = context.RequestData.ReadBytes(7);
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
// We do a mitm here to find if the request is for an AOC.
|
// We do a mitm here to find if the request is for an AOC.
|
||||||
// This is because AOC can be distributed over multiple containers in the emulator.
|
// This is because AOC can be distributed over multiple containers in the emulator.
|
||||||
|
|
|
@ -16,14 +16,14 @@ namespace Ryujinx.HLE.HOS.Services.Fs
|
||||||
// ReadSaveDataInfo() -> (u64, buffer<unknown, 6>)
|
// ReadSaveDataInfo() -> (u64, buffer<unknown, 6>)
|
||||||
public ResultCode ReadSaveDataInfo(ServiceCtx context)
|
public ResultCode ReadSaveDataInfo(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferLen = context.Request.ReceiveBuff[0].Size;
|
ulong bufferLen = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] infoBuffer = new byte[bufferLen];
|
byte[] infoBuffer = new byte[bufferLen];
|
||||||
|
|
||||||
Result result = _baseReader.Target.Read(out long readCount, infoBuffer);
|
Result result = _baseReader.Target.Read(out long readCount, infoBuffer);
|
||||||
|
|
||||||
context.Memory.Write((ulong)bufferPosition, infoBuffer);
|
context.Memory.Write(bufferPosition, infoBuffer);
|
||||||
context.ResponseData.Write(readCount);
|
context.ResponseData.Write(readCount);
|
||||||
|
|
||||||
return (ResultCode)result.Value;
|
return (ResultCode)result.Value;
|
||||||
|
|
|
@ -4,6 +4,7 @@ using Ryujinx.HLE.HOS.Kernel.Common;
|
||||||
using Ryujinx.HLE.HOS.Kernel.Threading;
|
using Ryujinx.HLE.HOS.Kernel.Threading;
|
||||||
using Ryujinx.HLE.HOS.Services.Hid.HidServer;
|
using Ryujinx.HLE.HOS.Services.Hid.HidServer;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Hid
|
namespace Ryujinx.HLE.HOS.Services.Hid
|
||||||
{
|
{
|
||||||
|
@ -590,25 +591,22 @@ namespace Ryujinx.HLE.HOS.Services.Hid
|
||||||
public ResultCode SetSupportedNpadIdType(ServiceCtx context)
|
public ResultCode SetSupportedNpadIdType(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long appletResourceUserId = context.RequestData.ReadInt64();
|
long appletResourceUserId = context.RequestData.ReadInt64();
|
||||||
long arraySize = context.Request.PtrBuff[0].Size / 4;
|
ulong arrayPosition = context.Request.PtrBuff[0].Position;
|
||||||
|
ulong arraySize = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
NpadIdType[] supportedPlayerIds = new NpadIdType[arraySize];
|
ReadOnlySpan<NpadIdType> supportedPlayerIds = MemoryMarshal.Cast<byte, NpadIdType>(context.Memory.GetSpan(arrayPosition, (int)arraySize));
|
||||||
|
|
||||||
context.Device.Hid.Npads.ClearSupportedPlayers();
|
context.Device.Hid.Npads.ClearSupportedPlayers();
|
||||||
|
|
||||||
for (int i = 0; i < arraySize; ++i)
|
for (int i = 0; i < supportedPlayerIds.Length; ++i)
|
||||||
{
|
{
|
||||||
NpadIdType id = context.Memory.Read<NpadIdType>((ulong)(context.Request.PtrBuff[0].Position + i * 4));
|
if (supportedPlayerIds[i] >= 0)
|
||||||
|
|
||||||
if (id >= 0)
|
|
||||||
{
|
{
|
||||||
context.Device.Hid.Npads.SetSupportedPlayer(HidUtils.GetIndexFromNpadIdType(id));
|
context.Device.Hid.Npads.SetSupportedPlayer(HidUtils.GetIndexFromNpadIdType(supportedPlayerIds[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
supportedPlayerIds[i] = id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.Stub?.PrintStub(LogClass.ServiceHid, $"{arraySize} " + string.Join(",", supportedPlayerIds));
|
Logger.Stub?.PrintStub(LogClass.ServiceHid, $"{supportedPlayerIds.Length} " + string.Join(",", supportedPlayerIds.ToArray()));
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -1007,11 +1005,11 @@ namespace Ryujinx.HLE.HOS.Services.Hid
|
||||||
|
|
||||||
byte[] vibrationDeviceHandleBuffer = new byte[context.Request.PtrBuff[0].Size];
|
byte[] vibrationDeviceHandleBuffer = new byte[context.Request.PtrBuff[0].Size];
|
||||||
|
|
||||||
context.Memory.Read((ulong)context.Request.PtrBuff[0].Position, vibrationDeviceHandleBuffer);
|
context.Memory.Read(context.Request.PtrBuff[0].Position, vibrationDeviceHandleBuffer);
|
||||||
|
|
||||||
byte[] vibrationValueBuffer = new byte[context.Request.PtrBuff[1].Size];
|
byte[] vibrationValueBuffer = new byte[context.Request.PtrBuff[1].Size];
|
||||||
|
|
||||||
context.Memory.Read((ulong)context.Request.PtrBuff[1].Position, vibrationValueBuffer);
|
context.Memory.Read(context.Request.PtrBuff[1].Position, vibrationValueBuffer);
|
||||||
|
|
||||||
// TODO: Read all handles and values from buffer.
|
// TODO: Read all handles and values from buffer.
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
namespace Ryujinx.HLE.HOS.Services.Hid
|
namespace Ryujinx.HLE.HOS.Services.Hid
|
||||||
{
|
{
|
||||||
public enum NpadIdType
|
public enum NpadIdType : uint
|
||||||
{
|
{
|
||||||
Player1 = 0,
|
Player1 = 0,
|
||||||
Player2 = 1,
|
Player2 = 1,
|
||||||
|
|
|
@ -19,11 +19,11 @@ namespace Ryujinx.HLE.HOS.Services.Lm.LogService
|
||||||
|
|
||||||
private string LogImpl(ServiceCtx context)
|
private string LogImpl(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long bufPos, long bufSize) = context.Request.GetBufferType0x21();
|
(ulong bufPos, ulong bufSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
byte[] logBuffer = new byte[bufSize];
|
byte[] logBuffer = new byte[bufSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)bufPos, logBuffer);
|
context.Memory.Read(bufPos, logBuffer);
|
||||||
|
|
||||||
using MemoryStream ms = new MemoryStream(logBuffer);
|
using MemoryStream ms = new MemoryStream(logBuffer);
|
||||||
|
|
||||||
|
|
|
@ -261,7 +261,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii.StaticService
|
||||||
|
|
||||||
ResultCode result = Export(data);
|
ResultCode result = Export(data);
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputBuffer.Position, data.ToArray());
|
context.Memory.Write(outputBuffer.Position, data.ToArray());
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -352,7 +352,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii.StaticService
|
||||||
{
|
{
|
||||||
rawData = new byte[ipcBuff.Size];
|
rawData = new byte[ipcBuff.Size];
|
||||||
|
|
||||||
context.Memory.Read((ulong)ipcBuff.Position, rawData);
|
context.Memory.Read(ipcBuff.Position, rawData);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Span<byte>(rawData);
|
return new Span<byte>(rawData);
|
||||||
|
@ -367,7 +367,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii.StaticService
|
||||||
{
|
{
|
||||||
Span<byte> rawData = MemoryMarshal.Cast<T, byte>(span);
|
Span<byte> rawData = MemoryMarshal.Cast<T, byte>(span);
|
||||||
|
|
||||||
context.Memory.Write((ulong)ipcBuff.Position, rawData);
|
context.Memory.Write(ipcBuff.Position, rawData);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract bool IsUpdated(SourceFlag flag);
|
protected abstract bool IsUpdated(SourceFlag flag);
|
||||||
|
|
|
@ -17,10 +17,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(0)]
|
[CommandHipc(0)]
|
||||||
// ResolveProgramPath()
|
// ResolveProgramPath(u64 titleId)
|
||||||
public ResultCode ResolveProgramPath(ServiceCtx context)
|
public ResultCode ResolveProgramPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (ResolvePath(context, titleId, NcaContentType.Program))
|
if (ResolvePath(context, titleId, NcaContentType.Program))
|
||||||
{
|
{
|
||||||
|
@ -33,10 +33,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(1)]
|
[CommandHipc(1)]
|
||||||
// RedirectProgramPath()
|
// RedirectProgramPath(u64 titleId)
|
||||||
public ResultCode RedirectProgramPath(ServiceCtx context)
|
public ResultCode RedirectProgramPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
RedirectPath(context, titleId, 0, NcaContentType.Program);
|
RedirectPath(context, titleId, 0, NcaContentType.Program);
|
||||||
|
|
||||||
|
@ -44,10 +44,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(2)]
|
[CommandHipc(2)]
|
||||||
// ResolveApplicationControlPath()
|
// ResolveApplicationControlPath(u64 titleId)
|
||||||
public ResultCode ResolveApplicationControlPath(ServiceCtx context)
|
public ResultCode ResolveApplicationControlPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (ResolvePath(context, titleId, NcaContentType.Control))
|
if (ResolvePath(context, titleId, NcaContentType.Control))
|
||||||
{
|
{
|
||||||
|
@ -60,10 +60,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(3)]
|
[CommandHipc(3)]
|
||||||
// ResolveApplicationHtmlDocumentPath()
|
// ResolveApplicationHtmlDocumentPath(u64 titleId)
|
||||||
public ResultCode ResolveApplicationHtmlDocumentPath(ServiceCtx context)
|
public ResultCode ResolveApplicationHtmlDocumentPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (ResolvePath(context, titleId, NcaContentType.Manual))
|
if (ResolvePath(context, titleId, NcaContentType.Manual))
|
||||||
{
|
{
|
||||||
|
@ -76,10 +76,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(4)]
|
[CommandHipc(4)]
|
||||||
// ResolveDataPath()
|
// ResolveDataPath(u64 titleId)
|
||||||
public ResultCode ResolveDataPath(ServiceCtx context)
|
public ResultCode ResolveDataPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (ResolvePath(context, titleId, NcaContentType.Data) || ResolvePath(context, titleId, NcaContentType.PublicData))
|
if (ResolvePath(context, titleId, NcaContentType.Data) || ResolvePath(context, titleId, NcaContentType.PublicData))
|
||||||
{
|
{
|
||||||
|
@ -92,10 +92,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(5)]
|
[CommandHipc(5)]
|
||||||
// RedirectApplicationControlPath()
|
// RedirectApplicationControlPath(u64 titleId)
|
||||||
public ResultCode RedirectApplicationControlPath(ServiceCtx context)
|
public ResultCode RedirectApplicationControlPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
RedirectPath(context, titleId, 1, NcaContentType.Control);
|
RedirectPath(context, titleId, 1, NcaContentType.Control);
|
||||||
|
|
||||||
|
@ -103,10 +103,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(6)]
|
[CommandHipc(6)]
|
||||||
// RedirectApplicationHtmlDocumentPath()
|
// RedirectApplicationHtmlDocumentPath(u64 titleId)
|
||||||
public ResultCode RedirectApplicationHtmlDocumentPath(ServiceCtx context)
|
public ResultCode RedirectApplicationHtmlDocumentPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
RedirectPath(context, titleId, 1, NcaContentType.Manual);
|
RedirectPath(context, titleId, 1, NcaContentType.Manual);
|
||||||
|
|
||||||
|
@ -114,10 +114,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(7)]
|
[CommandHipc(7)]
|
||||||
// ResolveApplicationLegalInformationPath()
|
// ResolveApplicationLegalInformationPath(u64 titleId)
|
||||||
public ResultCode ResolveApplicationLegalInformationPath(ServiceCtx context)
|
public ResultCode ResolveApplicationLegalInformationPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (ResolvePath(context, titleId, NcaContentType.Manual))
|
if (ResolvePath(context, titleId, NcaContentType.Manual))
|
||||||
{
|
{
|
||||||
|
@ -130,10 +130,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(8)]
|
[CommandHipc(8)]
|
||||||
// RedirectApplicationLegalInformationPath()
|
// RedirectApplicationLegalInformationPath(u64 titleId)
|
||||||
public ResultCode RedirectApplicationLegalInformationPath(ServiceCtx context)
|
public ResultCode RedirectApplicationLegalInformationPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
RedirectPath(context, titleId, 1, NcaContentType.Manual);
|
RedirectPath(context, titleId, 1, NcaContentType.Manual);
|
||||||
|
|
||||||
|
@ -150,10 +150,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(10)]
|
[CommandHipc(10)]
|
||||||
// SetProgramNcaPath2()
|
// SetProgramNcaPath2(u64 titleId)
|
||||||
public ResultCode SetProgramNcaPath2(ServiceCtx context)
|
public ResultCode SetProgramNcaPath2(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
RedirectPath(context, titleId, 1, NcaContentType.Program);
|
RedirectPath(context, titleId, 1, NcaContentType.Program);
|
||||||
|
|
||||||
|
@ -170,10 +170,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(12)]
|
[CommandHipc(12)]
|
||||||
// DeleteProgramNcaPath()
|
// DeleteProgramNcaPath(u64 titleId)
|
||||||
public ResultCode DeleteProgramNcaPath(ServiceCtx context)
|
public ResultCode DeleteProgramNcaPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
DeleteContentPath(context, titleId, NcaContentType.Program);
|
DeleteContentPath(context, titleId, NcaContentType.Program);
|
||||||
|
|
||||||
|
@ -181,10 +181,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(13)]
|
[CommandHipc(13)]
|
||||||
// DeleteControlNcaPath()
|
// DeleteControlNcaPath(u64 titleId)
|
||||||
public ResultCode DeleteControlNcaPath(ServiceCtx context)
|
public ResultCode DeleteControlNcaPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
DeleteContentPath(context, titleId, NcaContentType.Control);
|
DeleteContentPath(context, titleId, NcaContentType.Control);
|
||||||
|
|
||||||
|
@ -192,10 +192,10 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(14)]
|
[CommandHipc(14)]
|
||||||
// DeleteDocHtmlNcaPath()
|
// DeleteDocHtmlNcaPath(u64 titleId)
|
||||||
public ResultCode DeleteDocHtmlNcaPath(ServiceCtx context)
|
public ResultCode DeleteDocHtmlNcaPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
DeleteContentPath(context, titleId, NcaContentType.Manual);
|
DeleteContentPath(context, titleId, NcaContentType.Manual);
|
||||||
|
|
||||||
|
@ -203,17 +203,17 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandHipc(15)]
|
[CommandHipc(15)]
|
||||||
// DeleteInfoHtmlNcaPath()
|
// DeleteInfoHtmlNcaPath(u64 titleId)
|
||||||
public ResultCode DeleteInfoHtmlNcaPath(ServiceCtx context)
|
public ResultCode DeleteInfoHtmlNcaPath(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long titleId = context.RequestData.ReadInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
DeleteContentPath(context, titleId, NcaContentType.Manual);
|
DeleteContentPath(context, titleId, NcaContentType.Manual);
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RedirectPath(ServiceCtx context, long titleId, int flag, NcaContentType contentType)
|
private void RedirectPath(ServiceCtx context, ulong titleId, int flag, NcaContentType contentType)
|
||||||
{
|
{
|
||||||
string contentPath = ReadUtf8String(context);
|
string contentPath = ReadUtf8String(context);
|
||||||
LocationEntry newLocation = new LocationEntry(contentPath, flag, titleId, contentType);
|
LocationEntry newLocation = new LocationEntry(contentPath, flag, titleId, contentType);
|
||||||
|
@ -221,19 +221,19 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
context.Device.System.ContentManager.RedirectLocation(newLocation, _storageId);
|
context.Device.System.ContentManager.RedirectLocation(newLocation, _storageId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool ResolvePath(ServiceCtx context, long titleId, NcaContentType contentType)
|
private bool ResolvePath(ServiceCtx context, ulong titleId, NcaContentType contentType)
|
||||||
{
|
{
|
||||||
ContentManager contentManager = context.Device.System.ContentManager;
|
ContentManager contentManager = context.Device.System.ContentManager;
|
||||||
string contentPath = contentManager.GetInstalledContentPath(titleId, _storageId, NcaContentType.Program);
|
string contentPath = contentManager.GetInstalledContentPath(titleId, _storageId, NcaContentType.Program);
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(contentPath))
|
if (!string.IsNullOrWhiteSpace(contentPath))
|
||||||
{
|
{
|
||||||
long position = context.Request.RecvListBuff[0].Position;
|
ulong position = context.Request.RecvListBuff[0].Position;
|
||||||
long size = context.Request.RecvListBuff[0].Size;
|
ulong size = context.Request.RecvListBuff[0].Size;
|
||||||
|
|
||||||
byte[] contentPathBuffer = Encoding.UTF8.GetBytes(contentPath);
|
byte[] contentPathBuffer = Encoding.UTF8.GetBytes(contentPath);
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, contentPathBuffer);
|
context.Memory.Write(position, contentPathBuffer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -243,7 +243,7 @@ namespace Ryujinx.HLE.HOS.Services.Ncm.Lr.LocationResolverManager
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeleteContentPath(ServiceCtx context, long titleId, NcaContentType contentType)
|
private void DeleteContentPath(ServiceCtx context, ulong titleId, NcaContentType contentType)
|
||||||
{
|
{
|
||||||
ContentManager contentManager = context.Device.System.ContentManager;
|
ContentManager contentManager = context.Device.System.ContentManager;
|
||||||
string contentPath = contentManager.GetInstalledContentPath(titleId, _storageId, NcaContentType.Manual);
|
string contentPath = contentManager.GetInstalledContentPath(titleId, _storageId, NcaContentType.Manual);
|
||||||
|
|
|
@ -37,12 +37,12 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
_appletResourceUserId = context.RequestData.ReadUInt64();
|
_appletResourceUserId = context.RequestData.ReadUInt64();
|
||||||
_mcuVersionData = context.RequestData.ReadUInt64();
|
_mcuVersionData = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long inputPosition = context.Request.SendBuff[0].Position;
|
ulong inputPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputSize = context.Request.SendBuff[0].Size;
|
ulong inputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
_mcuData = new byte[inputSize];
|
_mcuData = new byte[inputSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputPosition, _mcuData);
|
context.Memory.Read(inputPosition, _mcuData);
|
||||||
|
|
||||||
// TODO: The mcuData buffer seems to contains entries with a size of 0x40 bytes each. Usage of the data needs to be determined.
|
// TODO: The mcuData buffer seems to contains entries with a size of 0x40 bytes each. Usage of the data needs to be determined.
|
||||||
|
|
||||||
|
@ -93,8 +93,8 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
return ResultCode.WrongArgument;
|
return ResultCode.WrongArgument;
|
||||||
}
|
}
|
||||||
|
|
||||||
long outputPosition = context.Request.RecvListBuff[0].Position;
|
ulong outputPosition = context.Request.RecvListBuff[0].Position;
|
||||||
long outputSize = context.Request.RecvListBuff[0].Size;
|
ulong outputSize = context.Request.RecvListBuff[0].Size;
|
||||||
|
|
||||||
if (context.Device.System.NfpDevices.Count == 0)
|
if (context.Device.System.NfpDevices.Count == 0)
|
||||||
{
|
{
|
||||||
|
@ -107,7 +107,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
{
|
{
|
||||||
for (int i = 0; i < context.Device.System.NfpDevices.Count; i++)
|
for (int i = 0; i < context.Device.System.NfpDevices.Count; i++)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)(outputPosition + (i * sizeof(long))), (uint)context.Device.System.NfpDevices[i].Handle);
|
context.Memory.Write(outputPosition + ((uint)i * sizeof(long)), (uint)context.Device.System.NfpDevices[i].Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
context.ResponseData.Write(context.Device.System.NfpDevices.Count);
|
context.ResponseData.Write(context.Device.System.NfpDevices.Count);
|
||||||
|
@ -376,8 +376,8 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
return ResultCode.DeviceNotFound;
|
return ResultCode.DeviceNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
long outputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
||||||
|
|
||||||
|
@ -397,7 +397,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
{
|
{
|
||||||
byte[] applicationArea = VirtualAmiibo.GetApplicationArea(context.Device.System.NfpDevices[i].AmiiboId);
|
byte[] applicationArea = VirtualAmiibo.GetApplicationArea(context.Device.System.NfpDevices[i].AmiiboId);
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition, applicationArea);
|
context.Memory.Write(outputPosition, applicationArea);
|
||||||
|
|
||||||
size = (uint)applicationArea.Length;
|
size = (uint)applicationArea.Length;
|
||||||
|
|
||||||
|
@ -444,12 +444,12 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
return ResultCode.DeviceNotFound;
|
return ResultCode.DeviceNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
long inputPosition = context.Request.SendBuff[0].Position;
|
ulong inputPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputSize = context.Request.SendBuff[0].Size;
|
ulong inputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
byte[] applicationArea = new byte[inputSize];
|
byte[] applicationArea = new byte[inputSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputPosition, applicationArea);
|
context.Memory.Read(inputPosition, applicationArea);
|
||||||
|
|
||||||
for (int i = 0; i < context.Device.System.NfpDevices.Count; i++)
|
for (int i = 0; i < context.Device.System.NfpDevices.Count; i++)
|
||||||
{
|
{
|
||||||
|
@ -523,12 +523,12 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
|
|
||||||
uint applicationAreaId = context.RequestData.ReadUInt32();
|
uint applicationAreaId = context.RequestData.ReadUInt32();
|
||||||
|
|
||||||
long inputPosition = context.Request.SendBuff[0].Position;
|
ulong inputPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputSize = context.Request.SendBuff[0].Size;
|
ulong inputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
byte[] applicationArea = new byte[inputSize];
|
byte[] applicationArea = new byte[inputSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputPosition, applicationArea);
|
context.Memory.Read(inputPosition, applicationArea);
|
||||||
|
|
||||||
bool isCreated = false;
|
bool isCreated = false;
|
||||||
|
|
||||||
|
@ -582,9 +582,9 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
return ResultCode.WrongArgument;
|
return ResultCode.WrongArgument;
|
||||||
}
|
}
|
||||||
|
|
||||||
long outputPosition = context.Request.RecvListBuff[0].Position;
|
ulong outputPosition = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(Marshal.SizeOf(typeof(TagInfo)));
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize((uint)Marshal.SizeOf(typeof(TagInfo)));
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, outputPosition, Marshal.SizeOf(typeof(TagInfo)));
|
MemoryHelper.FillWithZeros(context.Memory, outputPosition, Marshal.SizeOf(typeof(TagInfo)));
|
||||||
|
|
||||||
|
@ -625,7 +625,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
|
|
||||||
Uuid.CopyTo(tagInfo.Uuid.ToSpan());
|
Uuid.CopyTo(tagInfo.Uuid.ToSpan());
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition, tagInfo);
|
context.Memory.Write(outputPosition, tagInfo);
|
||||||
|
|
||||||
resultCode = ResultCode.Success;
|
resultCode = ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -658,9 +658,9 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
return ResultCode.WrongArgument;
|
return ResultCode.WrongArgument;
|
||||||
}
|
}
|
||||||
|
|
||||||
long outputPosition = context.Request.RecvListBuff[0].Position;
|
ulong outputPosition = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(Marshal.SizeOf(typeof(RegisterInfo)));
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize((uint)Marshal.SizeOf(typeof(RegisterInfo)));
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, outputPosition, Marshal.SizeOf(typeof(RegisterInfo)));
|
MemoryHelper.FillWithZeros(context.Memory, outputPosition, Marshal.SizeOf(typeof(RegisterInfo)));
|
||||||
|
|
||||||
|
@ -685,7 +685,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
{
|
{
|
||||||
RegisterInfo registerInfo = VirtualAmiibo.GetRegisterInfo(context.Device.System.NfpDevices[i].AmiiboId);
|
RegisterInfo registerInfo = VirtualAmiibo.GetRegisterInfo(context.Device.System.NfpDevices[i].AmiiboId);
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition, registerInfo);
|
context.Memory.Write(outputPosition, registerInfo);
|
||||||
|
|
||||||
resultCode = ResultCode.Success;
|
resultCode = ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -718,9 +718,9 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
return ResultCode.WrongArgument;
|
return ResultCode.WrongArgument;
|
||||||
}
|
}
|
||||||
|
|
||||||
long outputPosition = context.Request.RecvListBuff[0].Position;
|
ulong outputPosition = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(Marshal.SizeOf(typeof(CommonInfo)));
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize((uint)Marshal.SizeOf(typeof(CommonInfo)));
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, outputPosition, Marshal.SizeOf(typeof(CommonInfo)));
|
MemoryHelper.FillWithZeros(context.Memory, outputPosition, Marshal.SizeOf(typeof(CommonInfo)));
|
||||||
|
|
||||||
|
@ -745,7 +745,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
{
|
{
|
||||||
CommonInfo commonInfo = VirtualAmiibo.GetCommonInfo(context.Device.System.NfpDevices[i].AmiiboId);
|
CommonInfo commonInfo = VirtualAmiibo.GetCommonInfo(context.Device.System.NfpDevices[i].AmiiboId);
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition, commonInfo);
|
context.Memory.Write(outputPosition, commonInfo);
|
||||||
|
|
||||||
resultCode = ResultCode.Success;
|
resultCode = ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -778,9 +778,9 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
return ResultCode.WrongArgument;
|
return ResultCode.WrongArgument;
|
||||||
}
|
}
|
||||||
|
|
||||||
long outputPosition = context.Request.RecvListBuff[0].Position;
|
ulong outputPosition = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(Marshal.SizeOf(typeof(ModelInfo)));
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize((uint)Marshal.SizeOf(typeof(ModelInfo)));
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, outputPosition, Marshal.SizeOf(typeof(ModelInfo)));
|
MemoryHelper.FillWithZeros(context.Memory, outputPosition, Marshal.SizeOf(typeof(ModelInfo)));
|
||||||
|
|
||||||
|
@ -814,7 +814,7 @@ namespace Ryujinx.HLE.HOS.Services.Nfc.Nfp
|
||||||
modelInfo.ModelNumber = ushort.Parse(context.Device.System.NfpDevices[i].AmiiboId.Substring(8, 4), NumberStyles.HexNumber);
|
modelInfo.ModelNumber = ushort.Parse(context.Device.System.NfpDevices[i].AmiiboId.Substring(8, 4), NumberStyles.HexNumber);
|
||||||
modelInfo.Type = byte.Parse(context.Device.System.NfpDevices[i].AmiiboId.Substring(6, 2), NumberStyles.HexNumber);
|
modelInfo.Type = byte.Parse(context.Device.System.NfpDevices[i].AmiiboId.Substring(6, 2), NumberStyles.HexNumber);
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition, modelInfo);
|
context.Memory.Write(outputPosition, modelInfo);
|
||||||
|
|
||||||
resultCode = ResultCode.Success;
|
resultCode = ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,8 @@ namespace Ryujinx.HLE.HOS.Services.Ngct
|
||||||
// Then it checks if ngc.t!functionality_override_enabled is enabled and if sys:set GetT is == 2.
|
// Then it checks if ngc.t!functionality_override_enabled is enabled and if sys:set GetT is == 2.
|
||||||
// If both conditions are true, it does this following code. Since we currently stub it, it's fine to don't check settings service values.
|
// If both conditions are true, it does this following code. Since we currently stub it, it's fine to don't check settings service values.
|
||||||
|
|
||||||
long bufferPosition = context.Request.PtrBuff[0].Position;
|
ulong bufferPosition = context.Request.PtrBuff[0].Position;
|
||||||
long bufferSize = context.Request.PtrBuff[0].Size;
|
ulong bufferSize = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
bool isMatch = false;
|
bool isMatch = false;
|
||||||
string text = "";
|
string text = "";
|
||||||
|
@ -27,7 +27,7 @@ namespace Ryujinx.HLE.HOS.Services.Ngct
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[bufferSize];
|
byte[] buffer = new byte[bufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)bufferPosition, buffer);
|
context.Memory.Read(bufferPosition, buffer);
|
||||||
|
|
||||||
text = Encoding.ASCII.GetString(buffer);
|
text = Encoding.ASCII.GetString(buffer);
|
||||||
|
|
||||||
|
@ -52,10 +52,10 @@ namespace Ryujinx.HLE.HOS.Services.Ngct
|
||||||
// Then it checks if ngc.t!functionality_override_enabled is enabled and if sys:set GetT is == 2.
|
// Then it checks if ngc.t!functionality_override_enabled is enabled and if sys:set GetT is == 2.
|
||||||
// If both conditions are true, it does this following code. Since we currently stub it, it's fine to don't check settings service values.
|
// If both conditions are true, it does this following code. Since we currently stub it, it's fine to don't check settings service values.
|
||||||
|
|
||||||
long bufferPosition = context.Request.PtrBuff[0].Position;
|
ulong bufferPosition = context.Request.PtrBuff[0].Position;
|
||||||
long bufferSize = context.Request.PtrBuff[0].Size;
|
ulong bufferSize = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
long bufferFilteredPosition = context.Request.RecvListBuff[0].Position;
|
ulong bufferFilteredPosition = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
string text = "";
|
string text = "";
|
||||||
string textFiltered = "";
|
string textFiltered = "";
|
||||||
|
@ -66,13 +66,13 @@ namespace Ryujinx.HLE.HOS.Services.Ngct
|
||||||
{
|
{
|
||||||
textFiltered = new string('*', text.Length);
|
textFiltered = new string('*', text.Length);
|
||||||
|
|
||||||
context.Memory.Write((ulong)bufferFilteredPosition, Encoding.ASCII.GetBytes(textFiltered));
|
context.Memory.Write(bufferFilteredPosition, Encoding.ASCII.GetBytes(textFiltered));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[bufferSize];
|
byte[] buffer = new byte[bufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)bufferPosition, buffer);
|
context.Memory.Read(bufferPosition, buffer);
|
||||||
|
|
||||||
// NOTE: Ngct use the archive 0100000000001034 which contains a words table. This is pushed on Chinese Switchs using Bcat service.
|
// NOTE: Ngct use the archive 0100000000001034 which contains a words table. This is pushed on Chinese Switchs using Bcat service.
|
||||||
// This call check if the string contains words which are in the table then returns the same string with each matched words replaced by '*'.
|
// This call check if the string contains words which are in the table then returns the same string with each matched words replaced by '*'.
|
||||||
|
@ -80,7 +80,7 @@ namespace Ryujinx.HLE.HOS.Services.Ngct
|
||||||
|
|
||||||
textFiltered = text = Encoding.ASCII.GetString(buffer);
|
textFiltered = text = Encoding.ASCII.GetString(buffer);
|
||||||
|
|
||||||
context.Memory.Write((ulong)bufferFilteredPosition, buffer);
|
context.Memory.Write(bufferFilteredPosition, buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,11 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
||||||
// GetClientId() -> buffer<nn::nifm::ClientId, 0x1a, 4>
|
// GetClientId() -> buffer<nn::nifm::ClientId, 0x1a, 4>
|
||||||
public ResultCode GetClientId(ServiceCtx context)
|
public ResultCode GetClientId(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.RecvListBuff[0].Position;
|
ulong position = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(4);
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(sizeof(int));
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, _generalServiceDetail.ClientId);
|
context.Memory.Write(position, _generalServiceDetail.ClientId);
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
||||||
// GetCurrentNetworkProfile() -> buffer<nn::nifm::detail::sf::NetworkProfileData, 0x1a, 0x17c>
|
// GetCurrentNetworkProfile() -> buffer<nn::nifm::detail::sf::NetworkProfileData, 0x1a, 0x17c>
|
||||||
public ResultCode GetCurrentNetworkProfile(ServiceCtx context)
|
public ResultCode GetCurrentNetworkProfile(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long networkProfileDataPosition = context.Request.RecvListBuff[0].Position;
|
ulong networkProfileDataPosition = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
(IPInterfaceProperties interfaceProperties, UnicastIPAddressInformation unicastAddress) = GetLocalInterface();
|
(IPInterfaceProperties interfaceProperties, UnicastIPAddressInformation unicastAddress) = GetLocalInterface();
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
||||||
|
|
||||||
Logger.Info?.Print(LogClass.ServiceNifm, $"Console's local IP is \"{unicastAddress.Address}\".");
|
Logger.Info?.Print(LogClass.ServiceNifm, $"Console's local IP is \"{unicastAddress.Address}\".");
|
||||||
|
|
||||||
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(Unsafe.SizeOf<NetworkProfileData>());
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize((uint)Unsafe.SizeOf<NetworkProfileData>());
|
||||||
|
|
||||||
NetworkProfileData networkProfile = new NetworkProfileData
|
NetworkProfileData networkProfile = new NetworkProfileData
|
||||||
{
|
{
|
||||||
|
@ -81,7 +81,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
||||||
|
|
||||||
Encoding.ASCII.GetBytes("RyujinxNetwork").CopyTo(networkProfile.Name.ToSpan());
|
Encoding.ASCII.GetBytes("RyujinxNetwork").CopyTo(networkProfile.Name.ToSpan());
|
||||||
|
|
||||||
context.Memory.Write((ulong)networkProfileDataPosition, networkProfile);
|
context.Memory.Write(networkProfileDataPosition, networkProfile);
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -148,10 +148,10 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
||||||
// IsAnyInternetRequestAccepted(buffer<nn::nifm::ClientId, 0x19, 4>) -> bool
|
// IsAnyInternetRequestAccepted(buffer<nn::nifm::ClientId, 0x19, 4>) -> bool
|
||||||
public ResultCode IsAnyInternetRequestAccepted(ServiceCtx context)
|
public ResultCode IsAnyInternetRequestAccepted(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long position = context.Request.PtrBuff[0].Position;
|
ulong position = context.Request.PtrBuff[0].Position;
|
||||||
long size = context.Request.PtrBuff[0].Size;
|
ulong size = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
int clientId = context.Memory.Read<int>((ulong)position);
|
int clientId = context.Memory.Read<int>(position);
|
||||||
|
|
||||||
context.ResponseData.Write(GeneralServiceManager.Get(clientId).IsAnyInternetRequestAccepted);
|
context.ResponseData.Write(GeneralServiceManager.Get(clientId).IsAnyInternetRequestAccepted);
|
||||||
|
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
byte source = (byte)context.RequestData.ReadInt64();
|
byte source = (byte)context.RequestData.ReadInt64();
|
||||||
ulong titleId = context.RequestData.ReadUInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
|
|
||||||
byte[] nacpData = context.Device.Application.ControlData.ByteSpan.ToArray();
|
byte[] nacpData = context.Device.Application.ControlData.ByteSpan.ToArray();
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, nacpData);
|
context.Memory.Write(position, nacpData);
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,11 +20,11 @@ namespace Ryujinx.HLE.HOS.Services.Ns
|
||||||
// SetDefaultDeliveryTarget(pid, buffer<bytes, 5> unknown)
|
// SetDefaultDeliveryTarget(pid, buffer<bytes, 5> unknown)
|
||||||
public ResultCode SetDefaultDeliveryTarget(ServiceCtx context)
|
public ResultCode SetDefaultDeliveryTarget(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long inBufferPosition = context.Request.SendBuff[0].Position;
|
ulong inBufferPosition = context.Request.SendBuff[0].Position;
|
||||||
long inBufferSize = context.Request.SendBuff[0].Size;
|
ulong inBufferSize = context.Request.SendBuff[0].Size;
|
||||||
byte[] buffer = new byte[inBufferSize];
|
byte[] buffer = new byte[inBufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inBufferPosition, buffer);
|
context.Memory.Read(inBufferPosition, buffer);
|
||||||
|
|
||||||
// NOTE: Service use the pid to call arp:r GetApplicationLaunchProperty and store it in internal field.
|
// NOTE: Service use the pid to call arp:r GetApplicationLaunchProperty and store it in internal field.
|
||||||
// Then it seems to use the buffer content and compare it with a stored linked instrusive list.
|
// Then it seems to use the buffer content and compare it with a stored linked instrusive list.
|
||||||
|
|
|
@ -11,11 +11,11 @@
|
||||||
byte source = (byte)context.RequestData.ReadInt64();
|
byte source = (byte)context.RequestData.ReadInt64();
|
||||||
ulong titleId = context.RequestData.ReadUInt64();
|
ulong titleId = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long position = context.Request.ReceiveBuff[0].Position;
|
ulong position = context.Request.ReceiveBuff[0].Position;
|
||||||
|
|
||||||
byte[] nacpData = context.Device.Application.ControlData.ByteSpan.ToArray();
|
byte[] nacpData = context.Device.Application.ControlData.ByteSpan.ToArray();
|
||||||
|
|
||||||
context.Memory.Write((ulong)position, nacpData);
|
context.Memory.Write(position, nacpData);
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,8 +73,8 @@ namespace Ryujinx.HLE.HOS.Services.Nv
|
||||||
|
|
||||||
private NvResult GetIoctlArgument(ServiceCtx context, NvIoctl ioctlCommand, out Span<byte> arguments)
|
private NvResult GetIoctlArgument(ServiceCtx context, NvIoctl ioctlCommand, out Span<byte> arguments)
|
||||||
{
|
{
|
||||||
(long inputDataPosition, long inputDataSize) = context.Request.GetBufferType0x21(0);
|
(ulong inputDataPosition, ulong inputDataSize) = context.Request.GetBufferType0x21(0);
|
||||||
(long outputDataPosition, long outputDataSize) = context.Request.GetBufferType0x22(0);
|
(ulong outputDataPosition, ulong outputDataSize) = context.Request.GetBufferType0x22(0);
|
||||||
|
|
||||||
NvIoctl.Direction ioctlDirection = ioctlCommand.DirectionValue;
|
NvIoctl.Direction ioctlDirection = ioctlCommand.DirectionValue;
|
||||||
uint ioctlSize = ioctlCommand.Size;
|
uint ioctlSize = ioctlCommand.Size;
|
||||||
|
@ -106,7 +106,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv
|
||||||
|
|
||||||
byte[] temp = new byte[inputDataSize];
|
byte[] temp = new byte[inputDataSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputDataPosition, temp);
|
context.Memory.Read(inputDataPosition, temp);
|
||||||
|
|
||||||
Buffer.BlockCopy(temp, 0, outputData, 0, temp.Length);
|
Buffer.BlockCopy(temp, 0, outputData, 0, temp.Length);
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv
|
||||||
{
|
{
|
||||||
byte[] temp = new byte[inputDataSize];
|
byte[] temp = new byte[inputDataSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputDataPosition, temp);
|
context.Memory.Read(inputDataPosition, temp);
|
||||||
|
|
||||||
arguments = new Span<byte>(temp);
|
arguments = new Span<byte>(temp);
|
||||||
}
|
}
|
||||||
|
@ -226,10 +226,10 @@ namespace Ryujinx.HLE.HOS.Services.Nv
|
||||||
|
|
||||||
if (errorCode == NvResult.Success)
|
if (errorCode == NvResult.Success)
|
||||||
{
|
{
|
||||||
long pathPtr = context.Request.SendBuff[0].Position;
|
ulong pathPtr = context.Request.SendBuff[0].Position;
|
||||||
long pathSize = context.Request.SendBuff[0].Size;
|
ulong pathSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
string path = MemoryHelper.ReadAsciiString(context.Memory, pathPtr, pathSize);
|
string path = MemoryHelper.ReadAsciiString(context.Memory, pathPtr, (long)pathSize);
|
||||||
|
|
||||||
fd = Open(context, path);
|
fd = Open(context, path);
|
||||||
|
|
||||||
|
@ -275,7 +275,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv
|
||||||
|
|
||||||
if ((ioctlCommand.DirectionValue & NvIoctl.Direction.Write) != 0)
|
if ((ioctlCommand.DirectionValue & NvIoctl.Direction.Write) != 0)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)context.Request.GetBufferType0x22(0).Position, arguments.ToArray());
|
context.Memory.Write(context.Request.GetBufferType0x22(0).Position, arguments.ToArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -470,13 +470,13 @@ namespace Ryujinx.HLE.HOS.Services.Nv
|
||||||
int fd = context.RequestData.ReadInt32();
|
int fd = context.RequestData.ReadInt32();
|
||||||
NvIoctl ioctlCommand = context.RequestData.ReadStruct<NvIoctl>();
|
NvIoctl ioctlCommand = context.RequestData.ReadStruct<NvIoctl>();
|
||||||
|
|
||||||
(long inlineInBufferPosition, long inlineInBufferSize) = context.Request.GetBufferType0x21(1);
|
(ulong inlineInBufferPosition, ulong inlineInBufferSize) = context.Request.GetBufferType0x21(1);
|
||||||
|
|
||||||
errorCode = GetIoctlArgument(context, ioctlCommand, out Span<byte> arguments);
|
errorCode = GetIoctlArgument(context, ioctlCommand, out Span<byte> arguments);
|
||||||
|
|
||||||
byte[] temp = new byte[inlineInBufferSize];
|
byte[] temp = new byte[inlineInBufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inlineInBufferPosition, temp);
|
context.Memory.Read(inlineInBufferPosition, temp);
|
||||||
|
|
||||||
Span<byte> inlineInBuffer = new Span<byte>(temp);
|
Span<byte> inlineInBuffer = new Span<byte>(temp);
|
||||||
|
|
||||||
|
@ -497,7 +497,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv
|
||||||
|
|
||||||
if ((ioctlCommand.DirectionValue & NvIoctl.Direction.Write) != 0)
|
if ((ioctlCommand.DirectionValue & NvIoctl.Direction.Write) != 0)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)context.Request.GetBufferType0x22(0).Position, arguments.ToArray());
|
context.Memory.Write(context.Request.GetBufferType0x22(0).Position, arguments.ToArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -519,13 +519,13 @@ namespace Ryujinx.HLE.HOS.Services.Nv
|
||||||
int fd = context.RequestData.ReadInt32();
|
int fd = context.RequestData.ReadInt32();
|
||||||
NvIoctl ioctlCommand = context.RequestData.ReadStruct<NvIoctl>();
|
NvIoctl ioctlCommand = context.RequestData.ReadStruct<NvIoctl>();
|
||||||
|
|
||||||
(long inlineOutBufferPosition, long inlineOutBufferSize) = context.Request.GetBufferType0x22(1);
|
(ulong inlineOutBufferPosition, ulong inlineOutBufferSize) = context.Request.GetBufferType0x22(1);
|
||||||
|
|
||||||
errorCode = GetIoctlArgument(context, ioctlCommand, out Span<byte> arguments);
|
errorCode = GetIoctlArgument(context, ioctlCommand, out Span<byte> arguments);
|
||||||
|
|
||||||
byte[] temp = new byte[inlineOutBufferSize];
|
byte[] temp = new byte[inlineOutBufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inlineOutBufferPosition, temp);
|
context.Memory.Read(inlineOutBufferPosition, temp);
|
||||||
|
|
||||||
Span<byte> inlineOutBuffer = new Span<byte>(temp);
|
Span<byte> inlineOutBuffer = new Span<byte>(temp);
|
||||||
|
|
||||||
|
@ -546,8 +546,8 @@ namespace Ryujinx.HLE.HOS.Services.Nv
|
||||||
|
|
||||||
if ((ioctlCommand.DirectionValue & NvIoctl.Direction.Write) != 0)
|
if ((ioctlCommand.DirectionValue & NvIoctl.Direction.Write) != 0)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)context.Request.GetBufferType0x22(0).Position, arguments.ToArray());
|
context.Memory.Write(context.Request.GetBufferType0x22(0).Position, arguments.ToArray());
|
||||||
context.Memory.Write((ulong)inlineOutBufferPosition, inlineOutBuffer.ToArray());
|
context.Memory.Write(inlineOutBufferPosition, inlineOutBuffer.ToArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,8 +117,8 @@ namespace Ryujinx.HLE.HOS.Services.Prepo
|
||||||
return ResultCode.InvalidState;
|
return ResultCode.InvalidState;
|
||||||
}
|
}
|
||||||
|
|
||||||
long inputPosition = context.Request.SendBuff[0].Position;
|
ulong inputPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputSize = context.Request.SendBuff[0].Size;
|
ulong inputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
if (inputSize == 0)
|
if (inputSize == 0)
|
||||||
{
|
{
|
||||||
|
@ -127,7 +127,7 @@ namespace Ryujinx.HLE.HOS.Services.Prepo
|
||||||
|
|
||||||
byte[] inputBuffer = new byte[inputSize];
|
byte[] inputBuffer = new byte[inputSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputPosition, inputBuffer);
|
context.Memory.Read(inputPosition, inputBuffer);
|
||||||
|
|
||||||
Logger.Info?.Print(LogClass.ServicePrepo, ReadReportBuffer(inputBuffer, gameRoom, userId));
|
Logger.Info?.Print(LogClass.ServicePrepo, ReadReportBuffer(inputBuffer, gameRoom, userId));
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro
|
||||||
_owner = null;
|
_owner = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResultCode ParseNrr(out NrrInfo nrrInfo, ServiceCtx context, long nrrAddress, long nrrSize)
|
private ResultCode ParseNrr(out NrrInfo nrrInfo, ServiceCtx context, ulong nrrAddress, ulong nrrSize)
|
||||||
{
|
{
|
||||||
nrrInfo = null;
|
nrrInfo = null;
|
||||||
|
|
||||||
|
@ -71,12 +71,12 @@ namespace Ryujinx.HLE.HOS.Services.Ro
|
||||||
{
|
{
|
||||||
byte[] temp = new byte[0x20];
|
byte[] temp = new byte[0x20];
|
||||||
|
|
||||||
_owner.CpuMemory.Read((ulong)(nrrAddress + header.HashOffset + (i * 0x20)), temp);
|
_owner.CpuMemory.Read(nrrAddress + header.HashOffset + (uint)(i * 0x20), temp);
|
||||||
|
|
||||||
hashes.Add(temp);
|
hashes.Add(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
nrrInfo = new NrrInfo(nrrAddress, header, hashes);
|
nrrInfo = new NrrInfo((ulong)nrrAddress, header, hashes);
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -333,7 +333,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro
|
||||||
process.CpuMemory.Write(roStart, relocatableObject.Ro);
|
process.CpuMemory.Write(roStart, relocatableObject.Ro);
|
||||||
process.CpuMemory.Write(dataStart, relocatableObject.Data);
|
process.CpuMemory.Write(dataStart, relocatableObject.Data);
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(process.CpuMemory, (long)bssStart, (int)(bssEnd - bssStart));
|
MemoryHelper.FillWithZeros(process.CpuMemory, bssStart, (int)(bssEnd - bssStart));
|
||||||
|
|
||||||
KernelResult result;
|
KernelResult result;
|
||||||
|
|
||||||
|
@ -354,7 +354,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro
|
||||||
return process.MemoryManager.SetProcessMemoryPermission(dataStart, bssEnd - dataStart, KMemoryPermission.ReadAndWrite);
|
return process.MemoryManager.SetProcessMemoryPermission(dataStart, bssEnd - dataStart, KMemoryPermission.ReadAndWrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResultCode RemoveNrrInfo(long nrrAddress)
|
private ResultCode RemoveNrrInfo(ulong nrrAddress)
|
||||||
{
|
{
|
||||||
foreach (NrrInfo info in _nrrInfos)
|
foreach (NrrInfo info in _nrrInfos)
|
||||||
{
|
{
|
||||||
|
@ -508,8 +508,8 @@ namespace Ryujinx.HLE.HOS.Services.Ro
|
||||||
// pid placeholder, zero
|
// pid placeholder, zero
|
||||||
context.RequestData.ReadUInt64();
|
context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long nrrAddress = context.RequestData.ReadInt64();
|
ulong nrrAddress = context.RequestData.ReadUInt64();
|
||||||
long nrrSize = context.RequestData.ReadInt64();
|
ulong nrrSize = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
|
@ -541,7 +541,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro
|
||||||
// pid placeholder, zero
|
// pid placeholder, zero
|
||||||
context.RequestData.ReadUInt64();
|
context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
long nrrHeapAddress = context.RequestData.ReadInt64();
|
ulong nrrHeapAddress = context.RequestData.ReadUInt64();
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,9 +6,9 @@ namespace Ryujinx.HLE.HOS.Services.Ro
|
||||||
{
|
{
|
||||||
public NrrHeader Header { get; private set; }
|
public NrrHeader Header { get; private set; }
|
||||||
public List<byte[]> Hashes { get; private set; }
|
public List<byte[]> Hashes { get; private set; }
|
||||||
public long NrrAddress { get; private set; }
|
public ulong NrrAddress { get; private set; }
|
||||||
|
|
||||||
public NrrInfo(long nrrAddress, NrrHeader header, List<byte[]> hashes)
|
public NrrInfo(ulong nrrAddress, NrrHeader header, List<byte[]> hashes)
|
||||||
{
|
{
|
||||||
NrrAddress = nrrAddress;
|
NrrAddress = nrrAddress;
|
||||||
Header = header;
|
Header = header;
|
||||||
|
|
|
@ -15,11 +15,11 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService
|
||||||
|
|
||||||
internal static ResultCode GetPlayStatistics(ServiceCtx context, bool byUserId = false)
|
internal static ResultCode GetPlayStatistics(ServiceCtx context, bool byUserId = false)
|
||||||
{
|
{
|
||||||
long inputPosition = context.Request.SendBuff[0].Position;
|
ulong inputPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputSize = context.Request.SendBuff[0].Size;
|
ulong inputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long outputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
UserId userId = byUserId ? context.RequestData.ReadStruct<UserId>() : new UserId();
|
UserId userId = byUserId ? context.RequestData.ReadStruct<UserId>() : new UserId();
|
||||||
|
|
||||||
|
@ -35,9 +35,9 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService
|
||||||
|
|
||||||
List<ulong> titleIds = new List<ulong>();
|
List<ulong> titleIds = new List<ulong>();
|
||||||
|
|
||||||
for (int i = 0; i < inputSize / sizeof(ulong); i++)
|
for (ulong i = 0; i < inputSize / sizeof(ulong); i++)
|
||||||
{
|
{
|
||||||
titleIds.Add(context.Memory.Read<ulong>((ulong)inputPosition));
|
titleIds.Add(context.Memory.Read<ulong>(inputPosition));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (queryCapability == PlayLogQueryCapability.WhiteList)
|
if (queryCapability == PlayLogQueryCapability.WhiteList)
|
||||||
|
@ -73,7 +73,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pdm.QueryService
|
||||||
|
|
||||||
for (int i = 0; i < filteredApplicationPlayStatistics.Count(); i++)
|
for (int i = 0; i < filteredApplicationPlayStatistics.Count(); i++)
|
||||||
{
|
{
|
||||||
MemoryHelper.Write(context.Memory, outputPosition + (i * Marshal.SizeOf<ApplicationPlayStatistics>()), filteredApplicationPlayStatistics.ElementAt(i).Value);
|
MemoryHelper.Write(context.Memory, outputPosition + (ulong)(i * Marshal.SizeOf<ApplicationPlayStatistics>()), filteredApplicationPlayStatistics.ElementAt(i).Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
context.ResponseData.Write(filteredApplicationPlayStatistics.Count());
|
context.ResponseData.Write(filteredApplicationPlayStatistics.Count());
|
||||||
|
|
|
@ -87,7 +87,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
|
||||||
|
|
||||||
for (SharedFontType type = 0; type < SharedFontType.Count; type++)
|
for (SharedFontType type = 0; type < SharedFontType.Count; type++)
|
||||||
{
|
{
|
||||||
int offset = (int)type * 4;
|
uint offset = (uint)type * 4;
|
||||||
|
|
||||||
if (!AddFontToOrderOfPriorityList(context, type, offset))
|
if (!AddFontToOrderOfPriorityList(context, type, offset))
|
||||||
{
|
{
|
||||||
|
@ -103,27 +103,27 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool AddFontToOrderOfPriorityList(ServiceCtx context, SharedFontType fontType, int offset)
|
private bool AddFontToOrderOfPriorityList(ServiceCtx context, SharedFontType fontType, uint offset)
|
||||||
{
|
{
|
||||||
long typesPosition = context.Request.ReceiveBuff[0].Position;
|
ulong typesPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long typesSize = context.Request.ReceiveBuff[0].Size;
|
ulong typesSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
long offsetsPosition = context.Request.ReceiveBuff[1].Position;
|
ulong offsetsPosition = context.Request.ReceiveBuff[1].Position;
|
||||||
long offsetsSize = context.Request.ReceiveBuff[1].Size;
|
ulong offsetsSize = context.Request.ReceiveBuff[1].Size;
|
||||||
|
|
||||||
long fontSizeBufferPosition = context.Request.ReceiveBuff[2].Position;
|
ulong fontSizeBufferPosition = context.Request.ReceiveBuff[2].Position;
|
||||||
long fontSizeBufferSize = context.Request.ReceiveBuff[2].Size;
|
ulong fontSizeBufferSize = context.Request.ReceiveBuff[2].Size;
|
||||||
|
|
||||||
if ((uint)offset + 4 > (uint)typesSize ||
|
if (offset + 4 > (uint)typesSize ||
|
||||||
(uint)offset + 4 > (uint)offsetsSize ||
|
offset + 4 > (uint)offsetsSize ||
|
||||||
(uint)offset + 4 > (uint)fontSizeBufferSize)
|
offset + 4 > (uint)fontSizeBufferSize)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)(typesPosition + offset), (int)fontType);
|
context.Memory.Write(typesPosition + offset, (int)fontType);
|
||||||
context.Memory.Write((ulong)(offsetsPosition + offset), context.Device.System.Font.GetSharedMemoryAddressOffset(fontType));
|
context.Memory.Write(offsetsPosition + offset, context.Device.System.Font.GetSharedMemoryAddressOffset(fontType));
|
||||||
context.Memory.Write((ulong)(fontSizeBufferPosition + offset), context.Device.System.Font.GetFontSize(fontType));
|
context.Memory.Write(fontSizeBufferPosition + offset, context.Device.System.Font.GetFontSize(fontType));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,13 +180,13 @@ namespace Ryujinx.HLE.HOS.Services
|
||||||
{
|
{
|
||||||
for (int i = 0; i < request.RecvListBuff.Count; i++)
|
for (int i = 0; i < request.RecvListBuff.Count; i++)
|
||||||
{
|
{
|
||||||
int size = BinaryPrimitives.ReadInt16LittleEndian(request.RawData.AsSpan().Slice(sizesOffset + i * 2, 2));
|
ulong size = (ulong)BinaryPrimitives.ReadInt16LittleEndian(request.RawData.AsSpan().Slice(sizesOffset + i * 2, 2));
|
||||||
|
|
||||||
response.PtrBuff.Add(new IpcPtrBuffDesc((long)tempAddr, i, size));
|
response.PtrBuff.Add(new IpcPtrBuffDesc(tempAddr, (uint)i, size));
|
||||||
|
|
||||||
request.RecvListBuff[i] = new IpcRecvListBuffDesc((long)tempAddr, size);
|
request.RecvListBuff[i] = new IpcRecvListBuffDesc(tempAddr, size);
|
||||||
|
|
||||||
tempAddr += (ulong)size;
|
tempAddr += size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -190,17 +190,17 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)context.Request.ReceiveBuff[0].Position, keyCodeMap);
|
context.Memory.Write(context.Request.ReceiveBuff[0].Position, keyCodeMap);
|
||||||
|
|
||||||
if (version == 1 && context.Device.System.State.DesiredKeyboardLayout == (long)KeyboardLayout.Default)
|
if (version == 1 && context.Device.System.State.DesiredKeyboardLayout == (long)KeyboardLayout.Default)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)context.Request.ReceiveBuff[0].Position, (byte)0x01);
|
context.Memory.Write(context.Request.ReceiveBuff[0].Position, (byte)0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultCode GetAvailableLanguagesCodesImpl(ServiceCtx context, long position, long size, int maxSize)
|
public ResultCode GetAvailableLanguagesCodesImpl(ServiceCtx context, ulong position, ulong size, int maxSize)
|
||||||
{
|
{
|
||||||
int count = (int)(size / 8);
|
int count = (int)(size / 8);
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
|
|
||||||
for (int index = 0; index < count; index++)
|
for (int index = 0; index < count; index++)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)position, SystemStateMgr.GetLanguageCode(index));
|
context.Memory.Write(position, SystemStateMgr.GetLanguageCode(index));
|
||||||
|
|
||||||
position += 8;
|
position += 8;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
// GetFirmwareVersion2() -> buffer<nn::settings::system::FirmwareVersion, 0x1a, 0x100>
|
// GetFirmwareVersion2() -> buffer<nn::settings::system::FirmwareVersion, 0x1a, 0x100>
|
||||||
public ResultCode GetFirmwareVersion2(ServiceCtx context)
|
public ResultCode GetFirmwareVersion2(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long replyPos = context.Request.RecvListBuff[0].Position;
|
ulong replyPos = context.Request.RecvListBuff[0].Position;
|
||||||
|
|
||||||
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(0x100L);
|
context.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize(0x100L);
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
|
|
||||||
if (firmwareData != null)
|
if (firmwareData != null)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)replyPos, firmwareData);
|
context.Memory.Write(replyPos, firmwareData);
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
|
|
||||||
writer.Write(Encoding.ASCII.GetBytes(build));
|
writer.Write(Encoding.ASCII.GetBytes(build));
|
||||||
|
|
||||||
context.Memory.Write((ulong)replyPos, ms.ToArray());
|
context.Memory.Write(replyPos, ms.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
|
@ -110,19 +110,19 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
// GetSettingsItemValueSize(buffer<nn::settings::SettingsName, 0x19>, buffer<nn::settings::SettingsItemKey, 0x19>) -> u64
|
// GetSettingsItemValueSize(buffer<nn::settings::SettingsName, 0x19>, buffer<nn::settings::SettingsItemKey, 0x19>) -> u64
|
||||||
public ResultCode GetSettingsItemValueSize(ServiceCtx context)
|
public ResultCode GetSettingsItemValueSize(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long classPos = context.Request.PtrBuff[0].Position;
|
ulong classPos = context.Request.PtrBuff[0].Position;
|
||||||
long classSize = context.Request.PtrBuff[0].Size;
|
ulong classSize = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
long namePos = context.Request.PtrBuff[1].Position;
|
ulong namePos = context.Request.PtrBuff[1].Position;
|
||||||
long nameSize = context.Request.PtrBuff[1].Size;
|
ulong nameSize = context.Request.PtrBuff[1].Size;
|
||||||
|
|
||||||
byte[] classBuffer = new byte[classSize];
|
byte[] classBuffer = new byte[classSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)classPos, classBuffer);
|
context.Memory.Read(classPos, classBuffer);
|
||||||
|
|
||||||
byte[] nameBuffer = new byte[nameSize];
|
byte[] nameBuffer = new byte[nameSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)namePos, nameBuffer);
|
context.Memory.Read(namePos, nameBuffer);
|
||||||
|
|
||||||
string askedSetting = Encoding.ASCII.GetString(classBuffer).Trim('\0') + "!" + Encoding.ASCII.GetString(nameBuffer).Trim('\0');
|
string askedSetting = Encoding.ASCII.GetString(classBuffer).Trim('\0') + "!" + Encoding.ASCII.GetString(nameBuffer).Trim('\0');
|
||||||
|
|
||||||
|
@ -159,22 +159,22 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
// GetSettingsItemValue(buffer<nn::settings::SettingsName, 0x19, 0x48>, buffer<nn::settings::SettingsItemKey, 0x19, 0x48>) -> (u64, buffer<unknown, 6, 0>)
|
// GetSettingsItemValue(buffer<nn::settings::SettingsName, 0x19, 0x48>, buffer<nn::settings::SettingsItemKey, 0x19, 0x48>) -> (u64, buffer<unknown, 6, 0>)
|
||||||
public ResultCode GetSettingsItemValue(ServiceCtx context)
|
public ResultCode GetSettingsItemValue(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long classPos = context.Request.PtrBuff[0].Position;
|
ulong classPos = context.Request.PtrBuff[0].Position;
|
||||||
long classSize = context.Request.PtrBuff[0].Size;
|
ulong classSize = context.Request.PtrBuff[0].Size;
|
||||||
|
|
||||||
long namePos = context.Request.PtrBuff[1].Position;
|
ulong namePos = context.Request.PtrBuff[1].Position;
|
||||||
long nameSize = context.Request.PtrBuff[1].Size;
|
ulong nameSize = context.Request.PtrBuff[1].Size;
|
||||||
|
|
||||||
long replyPos = context.Request.ReceiveBuff[0].Position;
|
ulong replyPos = context.Request.ReceiveBuff[0].Position;
|
||||||
long replySize = context.Request.ReceiveBuff[0].Size;
|
ulong replySize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
byte[] classBuffer = new byte[classSize];
|
byte[] classBuffer = new byte[classSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)classPos, classBuffer);
|
context.Memory.Read(classPos, classBuffer);
|
||||||
|
|
||||||
byte[] nameBuffer = new byte[nameSize];
|
byte[] nameBuffer = new byte[nameSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)namePos, nameBuffer);
|
context.Memory.Read(namePos, nameBuffer);
|
||||||
|
|
||||||
string askedSetting = Encoding.ASCII.GetString(classBuffer).Trim('\0') + "!" + Encoding.ASCII.GetString(nameBuffer).Trim('\0');
|
string askedSetting = Encoding.ASCII.GetString(classBuffer).Trim('\0') + "!" + Encoding.ASCII.GetString(nameBuffer).Trim('\0');
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
|
|
||||||
if (nxSetting is string stringValue)
|
if (nxSetting is string stringValue)
|
||||||
{
|
{
|
||||||
if (stringValue.Length + 1 > replySize)
|
if ((ulong)(stringValue.Length + 1) > replySize)
|
||||||
{
|
{
|
||||||
Logger.Error?.Print(LogClass.ServiceSet, $"{askedSetting} String value size is too big!");
|
Logger.Error?.Print(LogClass.ServiceSet, $"{askedSetting} String value size is too big!");
|
||||||
}
|
}
|
||||||
|
@ -209,7 +209,7 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
throw new NotImplementedException(nxSetting.GetType().Name);
|
throw new NotImplementedException(nxSetting.GetType().Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)replyPos, settingBuffer);
|
context.Memory.Write(replyPos, settingBuffer);
|
||||||
|
|
||||||
Logger.Debug?.Print(LogClass.ServiceSet, $"{askedSetting} set value: {nxSetting} as {nxSetting.GetType()}");
|
Logger.Debug?.Print(LogClass.ServiceSet, $"{askedSetting} set value: {nxSetting} as {nxSetting.GetType()}");
|
||||||
}
|
}
|
||||||
|
@ -235,8 +235,9 @@ namespace Ryujinx.HLE.HOS.Services.Settings
|
||||||
|
|
||||||
public byte[] GetFirmwareData(Switch device)
|
public byte[] GetFirmwareData(Switch device)
|
||||||
{
|
{
|
||||||
long titleId = 0x0100000000000809;
|
const ulong SystemVersionTitleId = 0x0100000000000809;
|
||||||
string contentPath = device.System.ContentManager.GetInstalledContentPath(titleId, StorageId.NandSystem, NcaContentType.Data);
|
|
||||||
|
string contentPath = device.System.ContentManager.GetInstalledContentPath(SystemVersionTitleId, StorageId.NandSystem, NcaContentType.Data);
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(contentPath))
|
if (string.IsNullOrWhiteSpace(contentPath))
|
||||||
{
|
{
|
||||||
|
|
|
@ -197,28 +197,28 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
return WriteBsdResult(context, _sockets.Count - 1);
|
return WriteBsdResult(context, _sockets.Count - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IPEndPoint ParseSockAddr(ServiceCtx context, long bufferPosition, long bufferSize)
|
private IPEndPoint ParseSockAddr(ServiceCtx context, ulong bufferPosition, ulong bufferSize)
|
||||||
{
|
{
|
||||||
int size = context.Memory.Read<byte>((ulong)bufferPosition);
|
int size = context.Memory.Read<byte>(bufferPosition);
|
||||||
int family = context.Memory.Read<byte>((ulong)bufferPosition + 1);
|
int family = context.Memory.Read<byte>(bufferPosition + 1);
|
||||||
int port = BinaryPrimitives.ReverseEndianness(context.Memory.Read<ushort>((ulong)bufferPosition + 2));
|
int port = BinaryPrimitives.ReverseEndianness(context.Memory.Read<ushort>(bufferPosition + 2));
|
||||||
|
|
||||||
byte[] rawIp = new byte[4];
|
byte[] rawIp = new byte[4];
|
||||||
|
|
||||||
context.Memory.Read((ulong)bufferPosition + 4, rawIp);
|
context.Memory.Read(bufferPosition + 4, rawIp);
|
||||||
|
|
||||||
return new IPEndPoint(new IPAddress(rawIp), port);
|
return new IPEndPoint(new IPAddress(rawIp), port);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WriteSockAddr(ServiceCtx context, long bufferPosition, IPEndPoint endPoint)
|
private void WriteSockAddr(ServiceCtx context, ulong bufferPosition, IPEndPoint endPoint)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)bufferPosition, (byte)0);
|
context.Memory.Write(bufferPosition, (byte)0);
|
||||||
context.Memory.Write((ulong)bufferPosition + 1, (byte)endPoint.AddressFamily);
|
context.Memory.Write(bufferPosition + 1, (byte)endPoint.AddressFamily);
|
||||||
context.Memory.Write((ulong)bufferPosition + 2, BinaryPrimitives.ReverseEndianness((ushort)endPoint.Port));
|
context.Memory.Write(bufferPosition + 2, BinaryPrimitives.ReverseEndianness((ushort)endPoint.Port));
|
||||||
context.Memory.Write((ulong)bufferPosition + 4, endPoint.Address.GetAddressBytes());
|
context.Memory.Write(bufferPosition + 4, endPoint.Address.GetAddressBytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WriteSockAddr(ServiceCtx context, long bufferPosition, BsdSocket socket, bool isRemote)
|
private void WriteSockAddr(ServiceCtx context, ulong bufferPosition, BsdSocket socket, bool isRemote)
|
||||||
{
|
{
|
||||||
IPEndPoint endPoint = (isRemote ? socket.Handle.RemoteEndPoint : socket.Handle.LocalEndPoint) as IPEndPoint;
|
IPEndPoint endPoint = (isRemote ? socket.Handle.RemoteEndPoint : socket.Handle.LocalEndPoint) as IPEndPoint;
|
||||||
|
|
||||||
|
@ -282,13 +282,13 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
// Open(u32 flags, array<unknown, 0x21> path) -> (i32 ret, u32 bsd_errno)
|
// Open(u32 flags, array<unknown, 0x21> path) -> (i32 ret, u32 bsd_errno)
|
||||||
public ResultCode Open(ServiceCtx context)
|
public ResultCode Open(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long bufferPosition, long bufferSize) = context.Request.GetBufferType0x21();
|
(ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
int flags = context.RequestData.ReadInt32();
|
int flags = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
byte[] rawPath = new byte[bufferSize];
|
byte[] rawPath = new byte[bufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)bufferPosition, rawPath);
|
context.Memory.Read(bufferPosition, rawPath);
|
||||||
|
|
||||||
string path = Encoding.ASCII.GetString(rawPath);
|
string path = Encoding.ASCII.GetString(rawPath);
|
||||||
|
|
||||||
|
@ -317,10 +317,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
int fdsCount = context.RequestData.ReadInt32();
|
int fdsCount = context.RequestData.ReadInt32();
|
||||||
int timeout = context.RequestData.ReadInt32();
|
int timeout = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long bufferPosition, long bufferSize) = context.Request.GetBufferType0x21();
|
(ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
|
|
||||||
if (timeout < -1 || fdsCount < 0 || (fdsCount * 8) > bufferSize)
|
if (timeout < -1 || fdsCount < 0 || (ulong)(fdsCount * 8) > bufferSize)
|
||||||
{
|
{
|
||||||
return WriteBsdResult(context, -1, LinuxError.EINVAL);
|
return WriteBsdResult(context, -1, LinuxError.EINVAL);
|
||||||
}
|
}
|
||||||
|
@ -329,7 +329,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
|
|
||||||
for (int i = 0; i < fdsCount; i++)
|
for (int i = 0; i < fdsCount; i++)
|
||||||
{
|
{
|
||||||
int socketFd = context.Memory.Read<int>((ulong)(bufferPosition + i * 8));
|
int socketFd = context.Memory.Read<int>(bufferPosition + (ulong)i * 8);
|
||||||
|
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
|
||||||
|
@ -337,8 +337,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
return WriteBsdResult(context, -1, LinuxError.EBADF);}
|
return WriteBsdResult(context, -1, LinuxError.EBADF);}
|
||||||
|
|
||||||
PollEvent.EventTypeMask inputEvents = (PollEvent.EventTypeMask)context.Memory.Read<short>((ulong)(bufferPosition + i * 8 + 4));
|
PollEvent.EventTypeMask inputEvents = (PollEvent.EventTypeMask)context.Memory.Read<short>(bufferPosition + (ulong)i * 8 + 4);
|
||||||
PollEvent.EventTypeMask outputEvents = (PollEvent.EventTypeMask)context.Memory.Read<short>((ulong)(bufferPosition + i * 8 + 6));
|
PollEvent.EventTypeMask outputEvents = (PollEvent.EventTypeMask)context.Memory.Read<short>(bufferPosition + (ulong)i * 8 + 6);
|
||||||
|
|
||||||
events[i] = new PollEvent(socketFd, socket, inputEvents, outputEvents);
|
events[i] = new PollEvent(socketFd, socket, inputEvents, outputEvents);
|
||||||
}
|
}
|
||||||
|
@ -413,8 +413,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
for (int i = 0; i < fdsCount; i++)
|
for (int i = 0; i < fdsCount; i++)
|
||||||
{
|
{
|
||||||
PollEvent Event = events[i];
|
PollEvent Event = events[i];
|
||||||
context.Memory.Write((ulong)(bufferPosition + i * 8), Event.SocketFd);
|
context.Memory.Write(bufferPosition + (ulong)i * 8, Event.SocketFd);
|
||||||
context.Memory.Write((ulong)(bufferPosition + i * 8 + 4), (short)Event.InputEvents);
|
context.Memory.Write(bufferPosition + (ulong)i * 8 + 4, (short)Event.InputEvents);
|
||||||
|
|
||||||
PollEvent.EventTypeMask outputEvents = 0;
|
PollEvent.EventTypeMask outputEvents = 0;
|
||||||
|
|
||||||
|
@ -443,7 +443,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
outputEvents |= PollEvent.EventTypeMask.Output;
|
outputEvents |= PollEvent.EventTypeMask.Output;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)(bufferPosition + i * 8 + 6), (short)outputEvents);
|
context.Memory.Write(bufferPosition + (ulong)i * 8 + 6, (short)outputEvents);
|
||||||
}
|
}
|
||||||
|
|
||||||
return WriteBsdResult(context, readEvents.Count + writeEvents.Count + errorEvents.Count, LinuxError.SUCCESS);
|
return WriteBsdResult(context, readEvents.Count + writeEvents.Count + errorEvents.Count, LinuxError.SUCCESS);
|
||||||
|
@ -467,7 +467,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
SocketFlags socketFlags = (SocketFlags)context.RequestData.ReadInt32();
|
SocketFlags socketFlags = (SocketFlags)context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long receivePosition, long receiveLength) = context.Request.GetBufferType0x22();
|
(ulong receivePosition, ulong receiveLength) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -489,7 +489,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
result = socket.Handle.Receive(receivedBuffer, socketFlags);
|
result = socket.Handle.Receive(receivedBuffer, socketFlags);
|
||||||
errno = SetResultErrno(socket.Handle, result);
|
errno = SetResultErrno(socket.Handle, result);
|
||||||
|
|
||||||
context.Memory.Write((ulong)receivePosition, receivedBuffer);
|
context.Memory.Write(receivePosition, receivedBuffer);
|
||||||
}
|
}
|
||||||
catch (SocketException exception)
|
catch (SocketException exception)
|
||||||
{
|
{
|
||||||
|
@ -507,8 +507,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
SocketFlags socketFlags = (SocketFlags)context.RequestData.ReadInt32();
|
SocketFlags socketFlags = (SocketFlags)context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long receivePosition, long receiveLength) = context.Request.GetBufferType0x22();
|
(ulong receivePosition, ulong receiveLength) = context.Request.GetBufferType0x22();
|
||||||
(long sockAddrOutPosition, long sockAddrOutSize) = context.Request.GetBufferType0x22(1);
|
(ulong sockAddrOutPosition, ulong sockAddrOutSize) = context.Request.GetBufferType0x22(1);
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -532,7 +532,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
result = socket.Handle.ReceiveFrom(receivedBuffer, receivedBuffer.Length, socketFlags, ref endPoint);
|
result = socket.Handle.ReceiveFrom(receivedBuffer, receivedBuffer.Length, socketFlags, ref endPoint);
|
||||||
errno = SetResultErrno(socket.Handle, result);
|
errno = SetResultErrno(socket.Handle, result);
|
||||||
|
|
||||||
context.Memory.Write((ulong)receivePosition, receivedBuffer);
|
context.Memory.Write(receivePosition, receivedBuffer);
|
||||||
WriteSockAddr(context, sockAddrOutPosition, (IPEndPoint)endPoint);
|
WriteSockAddr(context, sockAddrOutPosition, (IPEndPoint)endPoint);
|
||||||
}
|
}
|
||||||
catch (SocketException exception)
|
catch (SocketException exception)
|
||||||
|
@ -551,7 +551,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
SocketFlags socketFlags = (SocketFlags)context.RequestData.ReadInt32();
|
SocketFlags socketFlags = (SocketFlags)context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long sendPosition, long sendSize) = context.Request.GetBufferType0x21();
|
(ulong sendPosition, ulong sendSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -569,7 +569,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
|
|
||||||
byte[] sendBuffer = new byte[sendSize];
|
byte[] sendBuffer = new byte[sendSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)sendPosition, sendBuffer);
|
context.Memory.Read(sendPosition, sendBuffer);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -593,8 +593,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
SocketFlags socketFlags = (SocketFlags)context.RequestData.ReadInt32();
|
SocketFlags socketFlags = (SocketFlags)context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long sendPosition, long sendSize) = context.Request.GetBufferType0x21();
|
(ulong sendPosition, ulong sendSize) = context.Request.GetBufferType0x21();
|
||||||
(long bufferPosition, long bufferSize) = context.Request.GetBufferType0x21(1);
|
(ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x21(1);
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -612,7 +612,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
|
|
||||||
byte[] sendBuffer = new byte[sendSize];
|
byte[] sendBuffer = new byte[sendSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)sendPosition, sendBuffer);
|
context.Memory.Read(sendPosition, sendBuffer);
|
||||||
|
|
||||||
EndPoint endPoint = ParseSockAddr(context, bufferPosition, bufferSize);
|
EndPoint endPoint = ParseSockAddr(context, bufferPosition, bufferSize);
|
||||||
|
|
||||||
|
@ -637,7 +637,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long bufferPos, long bufferSize) = context.Request.GetBufferType0x22();
|
(ulong bufferPos, ulong bufferSize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -692,7 +692,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long bufferPos, long bufferSize) = context.Request.GetBufferType0x21();
|
(ulong bufferPos, ulong bufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -722,7 +722,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long bufferPos, long bufferSize) = context.Request.GetBufferType0x21();
|
(ulong bufferPos, ulong bufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -751,7 +751,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long bufferPos, long bufferSize) = context.Request.GetBufferType0x22();
|
(ulong bufferPos, ulong bufferSize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -774,7 +774,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long bufferPos, long bufferSize) = context.Request.GetBufferType0x22();
|
(ulong bufferPos, ulong bufferSize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -799,7 +799,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
int level = context.RequestData.ReadInt32();
|
int level = context.RequestData.ReadInt32();
|
||||||
int optionName = context.RequestData.ReadInt32();
|
int optionName = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long bufferPosition, long bufferSize) = context.Request.GetBufferType0x22();
|
(ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -866,10 +866,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
case BsdIoctl.AtMark:
|
case BsdIoctl.AtMark:
|
||||||
errno = LinuxError.SUCCESS;
|
errno = LinuxError.SUCCESS;
|
||||||
|
|
||||||
(long bufferPosition, long bufferSize) = context.Request.GetBufferType0x22();
|
(ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
// FIXME: OOB not implemented.
|
// FIXME: OOB not implemented.
|
||||||
context.Memory.Write((ulong)bufferPosition, 0);
|
context.Memory.Write(bufferPosition, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -917,7 +917,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
return WriteBsdResult(context, result, errno);
|
return WriteBsdResult(context, result, errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
private LinuxError HandleGetSocketOption(ServiceCtx context, BsdSocket socket, SocketOptionName optionName, long optionValuePosition, long optionValueSize)
|
private LinuxError HandleGetSocketOption(ServiceCtx context, BsdSocket socket, SocketOptionName optionName, ulong optionValuePosition, ulong optionValueSize)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -938,13 +938,13 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
case SocketOptionName.Type:
|
case SocketOptionName.Type:
|
||||||
case SocketOptionName.Linger:
|
case SocketOptionName.Linger:
|
||||||
socket.Handle.GetSocketOption(SocketOptionLevel.Socket, optionName, optionValue);
|
socket.Handle.GetSocketOption(SocketOptionLevel.Socket, optionName, optionValue);
|
||||||
context.Memory.Write((ulong)optionValuePosition, optionValue);
|
context.Memory.Write(optionValuePosition, optionValue);
|
||||||
|
|
||||||
return LinuxError.SUCCESS;
|
return LinuxError.SUCCESS;
|
||||||
|
|
||||||
case (SocketOptionName)0x200:
|
case (SocketOptionName)0x200:
|
||||||
socket.Handle.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, optionValue);
|
socket.Handle.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, optionValue);
|
||||||
context.Memory.Write((ulong)optionValuePosition, optionValue);
|
context.Memory.Write(optionValuePosition, optionValue);
|
||||||
|
|
||||||
return LinuxError.SUCCESS;
|
return LinuxError.SUCCESS;
|
||||||
|
|
||||||
|
@ -960,7 +960,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private LinuxError HandleSetSocketOption(ServiceCtx context, BsdSocket socket, SocketOptionName optionName, long optionValuePosition, long optionValueSize)
|
private LinuxError HandleSetSocketOption(ServiceCtx context, BsdSocket socket, SocketOptionName optionName, ulong optionValuePosition, ulong optionValueSize)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -1013,7 +1013,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
int level = context.RequestData.ReadInt32();
|
int level = context.RequestData.ReadInt32();
|
||||||
int optionName = context.RequestData.ReadInt32();
|
int optionName = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long bufferPos, long bufferSize) = context.Request.GetBufferType0x21();
|
(ulong bufferPos, ulong bufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -1105,7 +1105,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long sendPosition, long sendSize) = context.Request.GetBufferType0x21();
|
(ulong sendPosition, ulong sendSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -1115,7 +1115,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
byte[] sendBuffer = new byte[sendSize];
|
byte[] sendBuffer = new byte[sendSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)sendPosition, sendBuffer);
|
context.Memory.Read(sendPosition, sendBuffer);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -1137,7 +1137,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
int socketFd = context.RequestData.ReadInt32();
|
int socketFd = context.RequestData.ReadInt32();
|
||||||
|
|
||||||
(long receivePosition, long receiveLength) = context.Request.GetBufferType0x22();
|
(ulong receivePosition, ulong receiveLength) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
LinuxError errno = LinuxError.EBADF;
|
LinuxError errno = LinuxError.EBADF;
|
||||||
BsdSocket socket = RetrieveSocket(socketFd);
|
BsdSocket socket = RetrieveSocket(socketFd);
|
||||||
|
@ -1151,7 +1151,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
|
||||||
{
|
{
|
||||||
result = socket.Handle.Receive(receivedBuffer);
|
result = socket.Handle.Receive(receivedBuffer);
|
||||||
errno = SetResultErrno(socket.Handle, result);
|
errno = SetResultErrno(socket.Handle, result);
|
||||||
context.Memory.Write((ulong)receivePosition, receivedBuffer);
|
context.Memory.Write(receivePosition, receivedBuffer);
|
||||||
}
|
}
|
||||||
catch (SocketException exception)
|
catch (SocketException exception)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
|
||||||
// GetSettingName() -> buffer<unknown<0x100>, 0x16>
|
// GetSettingName() -> buffer<unknown<0x100>, 0x16>
|
||||||
public ResultCode GetSettingName(ServiceCtx context)
|
public ResultCode GetSettingName(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long outputPosition, long outputSize) = context.Request.GetBufferType0x22();
|
(ulong outputPosition, ulong outputSize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
ResultCode result = _fqdnResolver.GetSettingName(context, out string settingName);
|
ResultCode result = _fqdnResolver.GetSettingName(context, out string settingName);
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
|
||||||
{
|
{
|
||||||
byte[] settingNameBuffer = Encoding.UTF8.GetBytes(settingName + '\0');
|
byte[] settingNameBuffer = Encoding.UTF8.GetBytes(settingName + '\0');
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition, settingNameBuffer);
|
context.Memory.Write(outputPosition, settingNameBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -55,7 +55,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
|
||||||
// GetEnvironmentIdentifier() -> buffer<unknown<8>, 0x16>
|
// GetEnvironmentIdentifier() -> buffer<unknown<8>, 0x16>
|
||||||
public ResultCode GetEnvironmentIdentifier(ServiceCtx context)
|
public ResultCode GetEnvironmentIdentifier(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long outputPosition, long outputSize) = context.Request.GetBufferType0x22();
|
(ulong outputPosition, ulong outputSize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
ResultCode result = _fqdnResolver.GetEnvironmentIdentifier(context, out string identifier);
|
ResultCode result = _fqdnResolver.GetEnvironmentIdentifier(context, out string identifier);
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
|
||||||
{
|
{
|
||||||
byte[] identifierBuffer = Encoding.UTF8.GetBytes(identifier + '\0');
|
byte[] identifierBuffer = Encoding.UTF8.GetBytes(identifier + '\0');
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition, identifierBuffer);
|
context.Memory.Write(outputPosition, identifierBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -133,12 +133,12 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
|
||||||
// Resolve(buffer<unknown<0x100>, 0x15>) -> buffer<unknown<0x100>, 0x16>
|
// Resolve(buffer<unknown<0x100>, 0x15>) -> buffer<unknown<0x100>, 0x16>
|
||||||
public ResultCode Resolve(ServiceCtx context)
|
public ResultCode Resolve(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long outputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
ResultCode result = _fqdnResolver.ResolveEx(context, out _, out string resolvedAddress);
|
ResultCode result = _fqdnResolver.ResolveEx(context, out _, out string resolvedAddress);
|
||||||
|
|
||||||
if (resolvedAddress.Length > outputSize)
|
if ((ulong)resolvedAddress.Length > outputSize)
|
||||||
{
|
{
|
||||||
return ResultCode.InvalidArgument;
|
return ResultCode.InvalidArgument;
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition, resolvedAddressBuffer);
|
context.Memory.Write(outputPosition, resolvedAddressBuffer);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -156,12 +156,12 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
|
||||||
// ResolveEx(buffer<unknown<0x100>, 0x15>) -> (u32, buffer<unknown<0x100>, 0x16>)
|
// ResolveEx(buffer<unknown<0x100>, 0x15>) -> (u32, buffer<unknown<0x100>, 0x16>)
|
||||||
public ResultCode ResolveEx(ServiceCtx context)
|
public ResultCode ResolveEx(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long outputPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
ResultCode result = _fqdnResolver.ResolveEx(context, out ResultCode errorCode, out string resolvedAddress);
|
ResultCode result = _fqdnResolver.ResolveEx(context, out ResultCode errorCode, out string resolvedAddress);
|
||||||
|
|
||||||
if (resolvedAddress.Length > outputSize)
|
if ((ulong)resolvedAddress.Length > outputSize)
|
||||||
{
|
{
|
||||||
return ResultCode.InvalidArgument;
|
return ResultCode.InvalidArgument;
|
||||||
}
|
}
|
||||||
|
@ -170,7 +170,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
MemoryHelper.FillWithZeros(context.Memory, outputPosition, (int)outputSize);
|
||||||
|
|
||||||
context.Memory.Write((ulong)outputPosition, resolvedAddressBuffer);
|
context.Memory.Write(outputPosition, resolvedAddressBuffer);
|
||||||
|
|
||||||
context.ResponseData.Write((int)errorCode);
|
context.ResponseData.Write((int)errorCode);
|
||||||
|
|
||||||
|
|
|
@ -97,12 +97,12 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd.Manager
|
||||||
|
|
||||||
public ResultCode ResolveEx(ServiceCtx context, out ResultCode resultCode, out string resolvedAddress)
|
public ResultCode ResolveEx(ServiceCtx context, out ResultCode resultCode, out string resolvedAddress)
|
||||||
{
|
{
|
||||||
long inputPosition = context.Request.SendBuff[0].Position;
|
ulong inputPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputSize = context.Request.SendBuff[0].Size;
|
ulong inputSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
byte[] addressBuffer = new byte[inputSize];
|
byte[] addressBuffer = new byte[inputSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputPosition, addressBuffer);
|
context.Memory.Read(inputPosition, addressBuffer);
|
||||||
|
|
||||||
string address = Encoding.UTF8.GetString(addressBuffer).TrimEnd('\0');
|
string address = Encoding.UTF8.GetString(addressBuffer).TrimEnd('\0');
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
public ResultCode SetDnsAddressesPrivateRequest(ServiceCtx context)
|
public ResultCode SetDnsAddressesPrivateRequest(ServiceCtx context)
|
||||||
{
|
{
|
||||||
uint cancelHandleRequest = context.RequestData.ReadUInt32();
|
uint cancelHandleRequest = context.RequestData.ReadUInt32();
|
||||||
long bufferPosition = context.Request.SendBuff[0].Position;
|
ulong bufferPosition = context.Request.SendBuff[0].Position;
|
||||||
long bufferSize = context.Request.SendBuff[0].Size;
|
ulong bufferSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
// TODO: This is stubbed in 2.0.0+, reverse 1.0.0 version for the sake of completeness.
|
// TODO: This is stubbed in 2.0.0+, reverse 1.0.0 version for the sake of completeness.
|
||||||
Logger.Stub?.PrintStub(LogClass.ServiceSfdnsres, new { cancelHandleRequest });
|
Logger.Stub?.PrintStub(LogClass.ServiceSfdnsres, new { cancelHandleRequest });
|
||||||
|
@ -38,8 +38,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
public ResultCode GetDnsAddressPrivateRequest(ServiceCtx context)
|
public ResultCode GetDnsAddressPrivateRequest(ServiceCtx context)
|
||||||
{
|
{
|
||||||
uint cancelHandleRequest = context.RequestData.ReadUInt32();
|
uint cancelHandleRequest = context.RequestData.ReadUInt32();
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
// TODO: This is stubbed in 2.0.0+, reverse 1.0.0 version for the sake of completeness.
|
// TODO: This is stubbed in 2.0.0+, reverse 1.0.0 version for the sake of completeness.
|
||||||
Logger.Stub?.PrintStub(LogClass.ServiceSfdnsres, new { cancelHandleRequest });
|
Logger.Stub?.PrintStub(LogClass.ServiceSfdnsres, new { cancelHandleRequest });
|
||||||
|
@ -51,11 +51,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
// GetHostByNameRequest(u8, u32, u64, pid, buffer<unknown, 5, 0>) -> (u32, u32, u32, buffer<unknown, 6, 0>)
|
// GetHostByNameRequest(u8, u32, u64, pid, buffer<unknown, 5, 0>) -> (u32, u32, u32, buffer<unknown, 6, 0>)
|
||||||
public ResultCode GetHostByNameRequest(ServiceCtx context)
|
public ResultCode GetHostByNameRequest(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long inputBufferPosition = context.Request.SendBuff[0].Position;
|
ulong inputBufferPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputBufferSize = context.Request.SendBuff[0].Size;
|
ulong inputBufferSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long outputBufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputBufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
return GetHostByNameRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, 0, 0);
|
return GetHostByNameRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, 0, 0);
|
||||||
}
|
}
|
||||||
|
@ -64,11 +64,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
// GetHostByAddrRequest(u32, u32, u32, u64, pid, buffer<unknown, 5, 0>) -> (u32, u32, u32, buffer<unknown, 6, 0>)
|
// GetHostByAddrRequest(u32, u32, u32, u64, pid, buffer<unknown, 5, 0>) -> (u32, u32, u32, buffer<unknown, 6, 0>)
|
||||||
public ResultCode GetHostByAddrRequest(ServiceCtx context)
|
public ResultCode GetHostByAddrRequest(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long inputBufferPosition = context.Request.SendBuff[0].Position;
|
ulong inputBufferPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputBufferSize = context.Request.SendBuff[0].Size;
|
ulong inputBufferSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long outputBufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong outputBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long outputBufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong outputBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
return GetHostByAddrRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, 0, 0);
|
return GetHostByAddrRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, 0, 0);
|
||||||
}
|
}
|
||||||
|
@ -90,12 +90,12 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
_ => (errorCode <= NetDbError.Internal) ? "Resolver internal error" : "Unknown resolver error"
|
_ => (errorCode <= NetDbError.Internal) ? "Resolver internal error" : "Unknown resolver error"
|
||||||
};
|
};
|
||||||
|
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
if (errorString.Length + 1 <= bufferSize)
|
if ((ulong)(errorString.Length + 1) <= bufferSize)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)bufferPosition, Encoding.ASCII.GetBytes(errorString + '\0'));
|
context.Memory.Write(bufferPosition, Encoding.ASCII.GetBytes(errorString + '\0'));
|
||||||
|
|
||||||
resultCode = ResultCode.Success;
|
resultCode = ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -135,12 +135,12 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
_ => "Success"
|
_ => "Success"
|
||||||
};
|
};
|
||||||
|
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
if (errorString.Length + 1 <= bufferSize)
|
if ((ulong)(errorString.Length + 1) <= bufferSize)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)bufferPosition, Encoding.ASCII.GetBytes(errorString + '\0'));
|
context.Memory.Write(bufferPosition, Encoding.ASCII.GetBytes(errorString + '\0'));
|
||||||
|
|
||||||
resultCode = ResultCode.Success;
|
resultCode = ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
@ -152,8 +152,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
// GetAddrInfoRequest(bool enable_nsd_resolve, u32, u64 pid_placeholder, pid, buffer<i8, 5, 0> host, buffer<i8, 5, 0> service, buffer<packed_addrinfo, 5, 0> hints) -> (i32 ret, u32 bsd_errno, u32 packed_addrinfo_size, buffer<packed_addrinfo, 6, 0> response)
|
// GetAddrInfoRequest(bool enable_nsd_resolve, u32, u64 pid_placeholder, pid, buffer<i8, 5, 0> host, buffer<i8, 5, 0> service, buffer<packed_addrinfo, 5, 0> hints) -> (i32 ret, u32 bsd_errno, u32 packed_addrinfo_size, buffer<packed_addrinfo, 6, 0> response)
|
||||||
public ResultCode GetAddrInfoRequest(ServiceCtx context)
|
public ResultCode GetAddrInfoRequest(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long responseBufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong responseBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long responseBufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong responseBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
return GetAddrInfoRequestImpl(context, responseBufferPosition, responseBufferSize, 0, 0);
|
return GetAddrInfoRequestImpl(context, responseBufferPosition, responseBufferSize, 0, 0);
|
||||||
}
|
}
|
||||||
|
@ -188,9 +188,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
// GetHostByNameRequestWithOptions(u8, u32, u64, pid, buffer<unknown, 21, 0>, buffer<unknown, 21, 0>) -> (u32, u32, u32, buffer<unknown, 22, 0>)
|
// GetHostByNameRequestWithOptions(u8, u32, u64, pid, buffer<unknown, 21, 0>, buffer<unknown, 21, 0>) -> (u32, u32, u32, buffer<unknown, 22, 0>)
|
||||||
public ResultCode GetHostByNameRequestWithOptions(ServiceCtx context)
|
public ResultCode GetHostByNameRequestWithOptions(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long inputBufferPosition, long inputBufferSize) = context.Request.GetBufferType0x21();
|
(ulong inputBufferPosition, ulong inputBufferSize) = context.Request.GetBufferType0x21();
|
||||||
(long outputBufferPosition, long outputBufferSize) = context.Request.GetBufferType0x22();
|
(ulong outputBufferPosition, ulong outputBufferSize) = context.Request.GetBufferType0x22();
|
||||||
(long optionsBufferPosition, long optionsBufferSize) = context.Request.GetBufferType0x21();
|
(ulong optionsBufferPosition, ulong optionsBufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
return GetHostByNameRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, optionsBufferPosition, optionsBufferSize);
|
return GetHostByNameRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, optionsBufferPosition, optionsBufferSize);
|
||||||
}
|
}
|
||||||
|
@ -199,9 +199,9 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
// GetHostByAddrRequestWithOptions(u32, u32, u32, u64, pid, buffer<unknown, 21, 0>, buffer<unknown, 21, 0>) -> (u32, u32, u32, buffer<unknown, 22, 0>)
|
// GetHostByAddrRequestWithOptions(u32, u32, u32, u64, pid, buffer<unknown, 21, 0>, buffer<unknown, 21, 0>) -> (u32, u32, u32, buffer<unknown, 22, 0>)
|
||||||
public ResultCode GetHostByAddrRequestWithOptions(ServiceCtx context)
|
public ResultCode GetHostByAddrRequestWithOptions(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long inputBufferPosition, long inputBufferSize) = context.Request.GetBufferType0x21();
|
(ulong inputBufferPosition, ulong inputBufferSize) = context.Request.GetBufferType0x21();
|
||||||
(long outputBufferPosition, long outputBufferSize) = context.Request.GetBufferType0x22();
|
(ulong outputBufferPosition, ulong outputBufferSize) = context.Request.GetBufferType0x22();
|
||||||
(long optionsBufferPosition, long optionsBufferSize) = context.Request.GetBufferType0x21();
|
(ulong optionsBufferPosition, ulong optionsBufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
return GetHostByAddrRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, optionsBufferPosition, optionsBufferSize);
|
return GetHostByAddrRequestImpl(context, inputBufferPosition, inputBufferSize, outputBufferPosition, outputBufferSize, optionsBufferPosition, optionsBufferSize);
|
||||||
}
|
}
|
||||||
|
@ -210,17 +210,17 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
// GetAddrInfoRequestWithOptions(bool enable_nsd_resolve, u32, u64 pid_placeholder, pid, buffer<i8, 5, 0> host, buffer<i8, 5, 0> service, buffer<packed_addrinfo, 5, 0> hints, buffer<unknown, 21, 0>) -> (i32 ret, u32 bsd_errno, u32 unknown, u32 packed_addrinfo_size, buffer<packed_addrinfo, 22, 0> response)
|
// GetAddrInfoRequestWithOptions(bool enable_nsd_resolve, u32, u64 pid_placeholder, pid, buffer<i8, 5, 0> host, buffer<i8, 5, 0> service, buffer<packed_addrinfo, 5, 0> hints, buffer<unknown, 21, 0>) -> (i32 ret, u32 bsd_errno, u32 unknown, u32 packed_addrinfo_size, buffer<packed_addrinfo, 22, 0> response)
|
||||||
public ResultCode GetAddrInfoRequestWithOptions(ServiceCtx context)
|
public ResultCode GetAddrInfoRequestWithOptions(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long responseBufferPosition, long responseBufferSize) = context.Request.GetBufferType0x22();
|
(ulong responseBufferPosition, ulong responseBufferSize) = context.Request.GetBufferType0x22();
|
||||||
(long optionsBufferPosition, long optionsBufferSize) = context.Request.GetBufferType0x21();
|
(ulong optionsBufferPosition, ulong optionsBufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
return GetAddrInfoRequestImpl(context, responseBufferPosition, responseBufferSize, optionsBufferPosition, optionsBufferSize);
|
return GetAddrInfoRequestImpl(context, responseBufferPosition, responseBufferSize, optionsBufferPosition, optionsBufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResultCode GetHostByNameRequestImpl(ServiceCtx context, long inputBufferPosition, long inputBufferSize, long outputBufferPosition, long outputBufferSize, long optionsBufferPosition, long optionsBufferSize)
|
private ResultCode GetHostByNameRequestImpl(ServiceCtx context, ulong inputBufferPosition, ulong inputBufferSize, ulong outputBufferPosition, ulong outputBufferSize, ulong optionsBufferPosition, ulong optionsBufferSize)
|
||||||
{
|
{
|
||||||
byte[] rawName = new byte[inputBufferSize];
|
byte[] rawName = new byte[inputBufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputBufferPosition, rawName);
|
context.Memory.Read(inputBufferPosition, rawName);
|
||||||
|
|
||||||
string name = Encoding.ASCII.GetString(rawName).TrimEnd('\0');
|
string name = Encoding.ASCII.GetString(rawName).TrimEnd('\0');
|
||||||
|
|
||||||
|
@ -238,7 +238,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
|
|
||||||
NetDbError netDbErrorCode = NetDbError.Success;
|
NetDbError netDbErrorCode = NetDbError.Success;
|
||||||
GaiError errno = GaiError.Overflow;
|
GaiError errno = GaiError.Overflow;
|
||||||
long serializedSize = 0;
|
ulong serializedSize = 0;
|
||||||
|
|
||||||
if (name.Length <= byte.MaxValue)
|
if (name.Length <= byte.MaxValue)
|
||||||
{
|
{
|
||||||
|
@ -294,11 +294,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResultCode GetHostByAddrRequestImpl(ServiceCtx context, long inputBufferPosition, long inputBufferSize, long outputBufferPosition, long outputBufferSize, long optionsBufferPosition, long optionsBufferSize)
|
private ResultCode GetHostByAddrRequestImpl(ServiceCtx context, ulong inputBufferPosition, ulong inputBufferSize, ulong outputBufferPosition, ulong outputBufferSize, ulong optionsBufferPosition, ulong optionsBufferSize)
|
||||||
{
|
{
|
||||||
byte[] rawIp = new byte[inputBufferSize];
|
byte[] rawIp = new byte[inputBufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputBufferPosition, rawIp);
|
context.Memory.Read(inputBufferPosition, rawIp);
|
||||||
|
|
||||||
// TODO: Use params.
|
// TODO: Use params.
|
||||||
uint socketLength = context.RequestData.ReadUInt32();
|
uint socketLength = context.RequestData.ReadUInt32();
|
||||||
|
@ -315,7 +315,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
|
|
||||||
NetDbError netDbErrorCode = NetDbError.Success;
|
NetDbError netDbErrorCode = NetDbError.Success;
|
||||||
GaiError errno = GaiError.AddressFamily;
|
GaiError errno = GaiError.AddressFamily;
|
||||||
long serializedSize = 0;
|
ulong serializedSize = 0;
|
||||||
|
|
||||||
if (rawIp.Length == 4)
|
if (rawIp.Length == 4)
|
||||||
{
|
{
|
||||||
|
@ -349,59 +349,59 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
private long SerializeHostEntries(ServiceCtx context, long outputBufferPosition, long outputBufferSize, IPHostEntry hostEntry, IEnumerable<IPAddress> addresses = null)
|
private ulong SerializeHostEntries(ServiceCtx context, ulong outputBufferPosition, ulong outputBufferSize, IPHostEntry hostEntry, IEnumerable<IPAddress> addresses = null)
|
||||||
{
|
{
|
||||||
long originalBufferPosition = outputBufferPosition;
|
ulong originalBufferPosition = outputBufferPosition;
|
||||||
long bufferPosition = originalBufferPosition;
|
ulong bufferPosition = originalBufferPosition;
|
||||||
|
|
||||||
string hostName = hostEntry.HostName + '\0';
|
string hostName = hostEntry.HostName + '\0';
|
||||||
|
|
||||||
// h_name
|
// h_name
|
||||||
context.Memory.Write((ulong)bufferPosition, Encoding.ASCII.GetBytes(hostName));
|
context.Memory.Write(bufferPosition, Encoding.ASCII.GetBytes(hostName));
|
||||||
bufferPosition += hostName.Length;
|
bufferPosition += (ulong)hostName.Length;
|
||||||
|
|
||||||
// h_aliases list size
|
// h_aliases list size
|
||||||
context.Memory.Write((ulong)bufferPosition, BinaryPrimitives.ReverseEndianness(hostEntry.Aliases.Length));
|
context.Memory.Write(bufferPosition, BinaryPrimitives.ReverseEndianness(hostEntry.Aliases.Length));
|
||||||
bufferPosition += 4;
|
bufferPosition += sizeof(int);
|
||||||
|
|
||||||
// Actual aliases
|
// Actual aliases
|
||||||
foreach (string alias in hostEntry.Aliases)
|
foreach (string alias in hostEntry.Aliases)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)bufferPosition, Encoding.ASCII.GetBytes(alias + '\0'));
|
context.Memory.Write(bufferPosition, Encoding.ASCII.GetBytes(alias + '\0'));
|
||||||
bufferPosition += alias.Length + 1;
|
bufferPosition += (ulong)(alias.Length + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// h_addrtype but it's a short (also only support IPv4)
|
// h_addrtype but it's a short (also only support IPv4)
|
||||||
context.Memory.Write((ulong)bufferPosition, BinaryPrimitives.ReverseEndianness((short)AddressFamily.InterNetwork));
|
context.Memory.Write(bufferPosition, BinaryPrimitives.ReverseEndianness((short)AddressFamily.InterNetwork));
|
||||||
bufferPosition += 2;
|
bufferPosition += sizeof(short);
|
||||||
|
|
||||||
// h_length but it's a short
|
// h_length but it's a short
|
||||||
context.Memory.Write((ulong)bufferPosition, BinaryPrimitives.ReverseEndianness((short)4));
|
context.Memory.Write(bufferPosition, BinaryPrimitives.ReverseEndianness((short)4));
|
||||||
bufferPosition += 2;
|
bufferPosition += sizeof(short);
|
||||||
|
|
||||||
// Ip address count, we can only support ipv4 (blame Nintendo)
|
// Ip address count, we can only support ipv4 (blame Nintendo)
|
||||||
context.Memory.Write((ulong)bufferPosition, addresses != null ? BinaryPrimitives.ReverseEndianness(addresses.Count()) : 0);
|
context.Memory.Write(bufferPosition, addresses != null ? BinaryPrimitives.ReverseEndianness(addresses.Count()) : 0);
|
||||||
bufferPosition += 4;
|
bufferPosition += sizeof(int);
|
||||||
|
|
||||||
if (addresses != null)
|
if (addresses != null)
|
||||||
{
|
{
|
||||||
foreach (IPAddress ip in addresses)
|
foreach (IPAddress ip in addresses)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)bufferPosition, BinaryPrimitives.ReverseEndianness(BitConverter.ToInt32(ip.GetAddressBytes(), 0)));
|
context.Memory.Write(bufferPosition, BinaryPrimitives.ReverseEndianness(BitConverter.ToInt32(ip.GetAddressBytes(), 0)));
|
||||||
bufferPosition += 4;
|
bufferPosition += sizeof(int);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bufferPosition - originalBufferPosition;
|
return bufferPosition - originalBufferPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResultCode GetAddrInfoRequestImpl(ServiceCtx context, long responseBufferPosition, long responseBufferSize, long optionsBufferPosition, long optionsBufferSize)
|
private ResultCode GetAddrInfoRequestImpl(ServiceCtx context, ulong responseBufferPosition, ulong responseBufferSize, ulong optionsBufferPosition, ulong optionsBufferSize)
|
||||||
{
|
{
|
||||||
bool enableNsdResolve = (context.RequestData.ReadInt32() & 1) != 0;
|
bool enableNsdResolve = (context.RequestData.ReadInt32() & 1) != 0;
|
||||||
uint cancelHandle = context.RequestData.ReadUInt32();
|
uint cancelHandle = context.RequestData.ReadUInt32();
|
||||||
|
|
||||||
string host = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[0].Position, context.Request.SendBuff[0].Size);
|
string host = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[0].Position, (long)context.Request.SendBuff[0].Size);
|
||||||
string service = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[1].Position, context.Request.SendBuff[1].Size);
|
string service = MemoryHelper.ReadAsciiString(context.Memory, context.Request.SendBuff[1].Position, (long)context.Request.SendBuff[1].Size);
|
||||||
|
|
||||||
// NOTE: We ignore hints for now.
|
// NOTE: We ignore hints for now.
|
||||||
DeserializeAddrInfos(context.Memory, (ulong)context.Request.SendBuff[2].Position, (ulong)context.Request.SendBuff[2].Size);
|
DeserializeAddrInfos(context.Memory, (ulong)context.Request.SendBuff[2].Position, (ulong)context.Request.SendBuff[2].Size);
|
||||||
|
@ -500,7 +500,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ulong SerializeAddrInfos(ServiceCtx context, long responseBufferPosition, long responseBufferSize, IPHostEntry hostEntry, int port)
|
private ulong SerializeAddrInfos(ServiceCtx context, ulong responseBufferPosition, ulong responseBufferSize, IPHostEntry hostEntry, int port)
|
||||||
{
|
{
|
||||||
ulong originalBufferPosition = (ulong)responseBufferPosition;
|
ulong originalBufferPosition = (ulong)responseBufferPosition;
|
||||||
ulong bufferPosition = originalBufferPosition;
|
ulong bufferPosition = originalBufferPosition;
|
||||||
|
@ -533,7 +533,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
|
||||||
|
|
||||||
// Termination zero value.
|
// Termination zero value.
|
||||||
context.Memory.Write(bufferPosition, 0);
|
context.Memory.Write(bufferPosition, 0);
|
||||||
bufferPosition += 4;
|
bufferPosition += sizeof(int);
|
||||||
|
|
||||||
return bufferPosition - originalBufferPosition;
|
return bufferPosition - originalBufferPosition;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Spl
|
||||||
|
|
||||||
_rng.GetBytes(randomBytes);
|
_rng.GetBytes(randomBytes);
|
||||||
|
|
||||||
context.Memory.Write((ulong)context.Request.ReceiveBuff[0].Position, randomBytes);
|
context.Memory.Write(context.Request.ReceiveBuff[0].Position, randomBytes);
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,12 +26,12 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService
|
||||||
// SetHostName(buffer<bytes, 5>)
|
// SetHostName(buffer<bytes, 5>)
|
||||||
public ResultCode SetHostName(ServiceCtx context)
|
public ResultCode SetHostName(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long hostNameDataPosition = context.Request.SendBuff[0].Position;
|
ulong hostNameDataPosition = context.Request.SendBuff[0].Position;
|
||||||
long hostNameDataSize = context.Request.SendBuff[0].Size;
|
ulong hostNameDataSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
byte[] hostNameData = new byte[hostNameDataSize];
|
byte[] hostNameData = new byte[hostNameDataSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)hostNameDataPosition, hostNameData);
|
context.Memory.Read(hostNameDataPosition, hostNameData);
|
||||||
|
|
||||||
string hostName = Encoding.ASCII.GetString(hostNameData).Trim('\0');
|
string hostName = Encoding.ASCII.GetString(hostNameData).Trim('\0');
|
||||||
|
|
||||||
|
@ -75,12 +75,12 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService
|
||||||
// Write(buffer<bytes, 5>) -> u32
|
// Write(buffer<bytes, 5>) -> u32
|
||||||
public ResultCode Write(ServiceCtx context)
|
public ResultCode Write(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long inputDataPosition = context.Request.SendBuff[0].Position;
|
ulong inputDataPosition = context.Request.SendBuff[0].Position;
|
||||||
long inputDataSize = context.Request.SendBuff[0].Size;
|
ulong inputDataSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
byte[] data = new byte[inputDataSize];
|
byte[] data = new byte[inputDataSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)inputDataPosition, data);
|
context.Memory.Read(inputDataPosition, data);
|
||||||
|
|
||||||
// NOTE: Tell the guest everything is transferred.
|
// NOTE: Tell the guest everything is transferred.
|
||||||
uint transferredSize = (uint)inputDataSize;
|
uint transferredSize = (uint)inputDataSize;
|
||||||
|
|
|
@ -41,8 +41,8 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService
|
||||||
{
|
{
|
||||||
CertificateFormat certificateFormat = (CertificateFormat)context.RequestData.ReadUInt32();
|
CertificateFormat certificateFormat = (CertificateFormat)context.RequestData.ReadUInt32();
|
||||||
|
|
||||||
long certificateDataPosition = context.Request.SendBuff[0].Position;
|
ulong certificateDataPosition = context.Request.SendBuff[0].Position;
|
||||||
long certificateDataSize = context.Request.SendBuff[0].Size;
|
ulong certificateDataSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
context.ResponseData.Write(_serverCertificateId++);
|
context.ResponseData.Write(_serverCertificateId++);
|
||||||
|
|
||||||
|
@ -55,15 +55,15 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService
|
||||||
// ImportClientPki(buffer<bytes, 5> certificate, buffer<bytes, 5> ascii_password) -> u64 certificateId
|
// ImportClientPki(buffer<bytes, 5> certificate, buffer<bytes, 5> ascii_password) -> u64 certificateId
|
||||||
public ResultCode ImportClientPki(ServiceCtx context)
|
public ResultCode ImportClientPki(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long certificateDataPosition = context.Request.SendBuff[0].Position;
|
ulong certificateDataPosition = context.Request.SendBuff[0].Position;
|
||||||
long certificateDataSize = context.Request.SendBuff[0].Size;
|
ulong certificateDataSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long asciiPasswordDataPosition = context.Request.SendBuff[1].Position;
|
ulong asciiPasswordDataPosition = context.Request.SendBuff[1].Position;
|
||||||
long asciiPasswordDataSize = context.Request.SendBuff[1].Size;
|
ulong asciiPasswordDataSize = context.Request.SendBuff[1].Size;
|
||||||
|
|
||||||
byte[] asciiPasswordData = new byte[asciiPasswordDataSize];
|
byte[] asciiPasswordData = new byte[asciiPasswordDataSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)asciiPasswordDataPosition, asciiPasswordData);
|
context.Memory.Read(asciiPasswordDataPosition, asciiPasswordData);
|
||||||
|
|
||||||
string asciiPassword = Encoding.ASCII.GetString(asciiPasswordData).Trim('\0');
|
string asciiPassword = Encoding.ASCII.GetString(asciiPasswordData).Trim('\0');
|
||||||
|
|
||||||
|
|
|
@ -18,11 +18,11 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
|
||||||
uint code = context.RequestData.ReadUInt32();
|
uint code = context.RequestData.ReadUInt32();
|
||||||
uint flags = context.RequestData.ReadUInt32();
|
uint flags = context.RequestData.ReadUInt32();
|
||||||
|
|
||||||
ulong dataPos = (ulong)context.Request.SendBuff[0].Position;
|
ulong dataPos = context.Request.SendBuff[0].Position;
|
||||||
ulong dataSize = (ulong)context.Request.SendBuff[0].Size;
|
ulong dataSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
long replyPos = context.Request.ReceiveBuff[0].Position;
|
ulong replyPos = context.Request.ReceiveBuff[0].Position;
|
||||||
long replySize = context.Request.ReceiveBuff[0].Size;
|
ulong replySize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
ReadOnlySpan<byte> inputParcel = context.Memory.GetSpan(dataPos, (int)dataSize);
|
ReadOnlySpan<byte> inputParcel = context.Memory.GetSpan(dataPos, (int)dataSize);
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)replyPos, outputParcel);
|
context.Memory.Write(replyPos, outputParcel);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -78,10 +78,10 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
|
||||||
uint code = context.RequestData.ReadUInt32();
|
uint code = context.RequestData.ReadUInt32();
|
||||||
uint flags = context.RequestData.ReadUInt32();
|
uint flags = context.RequestData.ReadUInt32();
|
||||||
|
|
||||||
(long dataPos, long dataSize) = context.Request.GetBufferType0x21();
|
(ulong dataPos, ulong dataSize) = context.Request.GetBufferType0x21();
|
||||||
(long replyPos, long replySize) = context.Request.GetBufferType0x22();
|
(ulong replyPos, ulong replySize) = context.Request.GetBufferType0x22();
|
||||||
|
|
||||||
ReadOnlySpan<byte> inputParcel = context.Memory.GetSpan((ulong)dataPos, (int)dataSize);
|
ReadOnlySpan<byte> inputParcel = context.Memory.GetSpan(dataPos, (int)dataSize);
|
||||||
|
|
||||||
Span<byte> outputParcel = new Span<byte>(new byte[replySize]);
|
Span<byte> outputParcel = new Span<byte>(new byte[replySize]);
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger
|
||||||
|
|
||||||
if (result == ResultCode.Success)
|
if (result == ResultCode.Success)
|
||||||
{
|
{
|
||||||
context.Memory.Write((ulong)replyPos, outputParcel);
|
context.Memory.Write(replyPos, outputParcel);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -246,7 +246,7 @@ 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.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize((uint)Marshal.SizeOf<ClockSnapshot>());
|
||||||
|
|
||||||
ResultCode result = _timeManager.StandardUserSystemClock.GetClockContext(context.Thread, out SystemClockContext userContext);
|
ResultCode result = _timeManager.StandardUserSystemClock.GetClockContext(context.Thread, out SystemClockContext userContext);
|
||||||
|
|
||||||
|
@ -274,7 +274,7 @@ 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.Response.PtrBuff[0] = context.Response.PtrBuff[0].WithSize((uint)Marshal.SizeOf<ClockSnapshot>());
|
||||||
|
|
||||||
context.RequestData.BaseStream.Position += 7;
|
context.RequestData.BaseStream.Position += 7;
|
||||||
|
|
||||||
|
@ -404,11 +404,11 @@ namespace Ryujinx.HLE.HOS.Services.Time
|
||||||
|
|
||||||
private ClockSnapshot ReadClockSnapshotFromBuffer(ServiceCtx context, IpcPtrBuffDesc ipcDesc)
|
private ClockSnapshot ReadClockSnapshotFromBuffer(ServiceCtx context, IpcPtrBuffDesc ipcDesc)
|
||||||
{
|
{
|
||||||
Debug.Assert(ipcDesc.Size == Marshal.SizeOf<ClockSnapshot>());
|
Debug.Assert(ipcDesc.Size == (ulong)Marshal.SizeOf<ClockSnapshot>());
|
||||||
|
|
||||||
byte[] temp = new byte[ipcDesc.Size];
|
byte[] temp = new byte[ipcDesc.Size];
|
||||||
|
|
||||||
context.Memory.Read((ulong)ipcDesc.Position, temp);
|
context.Memory.Read(ipcDesc.Position, temp);
|
||||||
|
|
||||||
using (BinaryReader bufferReader = new BinaryReader(new MemoryStream(temp)))
|
using (BinaryReader bufferReader = new BinaryReader(new MemoryStream(temp)))
|
||||||
{
|
{
|
||||||
|
|
|
@ -121,11 +121,11 @@ namespace Ryujinx.HLE.HOS.Services.Time
|
||||||
uint totalLocationNameCount = context.RequestData.ReadUInt32();
|
uint totalLocationNameCount = context.RequestData.ReadUInt32();
|
||||||
UInt128 timeZoneRuleVersion = context.RequestData.ReadStruct<UInt128>();
|
UInt128 timeZoneRuleVersion = context.RequestData.ReadStruct<UInt128>();
|
||||||
|
|
||||||
(long bufferPosition, long bufferSize) = context.Request.GetBufferType0x21();
|
(ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
byte[] temp = new byte[bufferSize];
|
byte[] temp = new byte[bufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)bufferPosition, temp);
|
context.Memory.Read(bufferPosition, temp);
|
||||||
|
|
||||||
using (MemoryStream timeZoneBinaryStream = new MemoryStream(temp))
|
using (MemoryStream timeZoneBinaryStream = new MemoryStream(temp))
|
||||||
{
|
{
|
||||||
|
|
|
@ -51,9 +51,9 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
// LoadLocationNameList(u32 index) -> (u32 outCount, buffer<nn::time::LocationName, 6>)
|
// LoadLocationNameList(u32 index) -> (u32 outCount, buffer<nn::time::LocationName, 6>)
|
||||||
public ResultCode LoadLocationNameList(ServiceCtx context)
|
public ResultCode LoadLocationNameList(ServiceCtx context)
|
||||||
{
|
{
|
||||||
uint index = context.RequestData.ReadUInt32();
|
uint index = context.RequestData.ReadUInt32();
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
ResultCode errorCode = _timeZoneContentManager.LoadLocationNameList(index, out string[] locationNameArray, (uint)bufferSize / 0x24);
|
ResultCode errorCode = _timeZoneContentManager.LoadLocationNameList(index, out string[] locationNameArray, (uint)bufferSize / 0x24);
|
||||||
|
|
||||||
|
@ -70,8 +70,8 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
return ResultCode.LocationNameTooLong;
|
return ResultCode.LocationNameTooLong;
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Memory.Write((ulong)bufferPosition + offset, Encoding.ASCII.GetBytes(locationName));
|
context.Memory.Write(bufferPosition + offset, Encoding.ASCII.GetBytes(locationName));
|
||||||
MemoryHelper.FillWithZeros(context.Memory, bufferPosition + offset + locationName.Length, padding);
|
MemoryHelper.FillWithZeros(context.Memory, bufferPosition + offset + (ulong)locationName.Length, padding);
|
||||||
|
|
||||||
offset += 0x24;
|
offset += 0x24;
|
||||||
}
|
}
|
||||||
|
@ -86,8 +86,8 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
// LoadTimeZoneRule(nn::time::LocationName locationName) -> buffer<nn::time::TimeZoneRule, 0x16>
|
// LoadTimeZoneRule(nn::time::LocationName locationName) -> buffer<nn::time::TimeZoneRule, 0x16>
|
||||||
public ResultCode LoadTimeZoneRule(ServiceCtx context)
|
public ResultCode LoadTimeZoneRule(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long bufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong bufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long bufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong bufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
if (bufferSize != 0x4000)
|
if (bufferSize != 0x4000)
|
||||||
{
|
{
|
||||||
|
|
|
@ -123,7 +123,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
return ResultCode.PermissionDenied;
|
return ResultCode.PermissionDenied;
|
||||||
}
|
}
|
||||||
|
|
||||||
(long bufferPosition, long bufferSize) = context.Request.GetBufferType0x21();
|
(ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
string locationName = Encoding.ASCII.GetString(context.RequestData.ReadBytes(0x24)).TrimEnd('\0');
|
string locationName = Encoding.ASCII.GetString(context.RequestData.ReadBytes(0x24)).TrimEnd('\0');
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
|
|
||||||
byte[] temp = new byte[bufferSize];
|
byte[] temp = new byte[bufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)bufferPosition, temp);
|
context.Memory.Read(bufferPosition, temp);
|
||||||
|
|
||||||
using (MemoryStream timeZoneBinaryStream = new MemoryStream(temp))
|
using (MemoryStream timeZoneBinaryStream = new MemoryStream(temp))
|
||||||
{
|
{
|
||||||
|
@ -145,10 +145,10 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
// ParseTimeZoneBinary(buffer<nn::time::TimeZoneBinary, 0x21> timeZoneBinary) -> buffer<nn::time::TimeZoneRule, 0x16>
|
// ParseTimeZoneBinary(buffer<nn::time::TimeZoneBinary, 0x21> timeZoneBinary) -> buffer<nn::time::TimeZoneRule, 0x16>
|
||||||
public ResultCode ParseTimeZoneBinary(ServiceCtx context)
|
public ResultCode ParseTimeZoneBinary(ServiceCtx context)
|
||||||
{
|
{
|
||||||
(long bufferPosition, long bufferSize) = context.Request.GetBufferType0x21();
|
(ulong bufferPosition, ulong bufferSize) = context.Request.GetBufferType0x21();
|
||||||
|
|
||||||
long timeZoneRuleBufferPosition = context.Request.ReceiveBuff[0].Position;
|
ulong timeZoneRuleBufferPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long timeZoneRuleBufferSize = context.Request.ReceiveBuff[0].Size;
|
ulong timeZoneRuleBufferSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
if (timeZoneRuleBufferSize != 0x4000)
|
if (timeZoneRuleBufferSize != 0x4000)
|
||||||
{
|
{
|
||||||
|
@ -162,7 +162,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
|
|
||||||
byte[] temp = new byte[bufferSize];
|
byte[] temp = new byte[bufferSize];
|
||||||
|
|
||||||
context.Memory.Read((ulong)bufferPosition, temp);
|
context.Memory.Read(bufferPosition, temp);
|
||||||
|
|
||||||
using (MemoryStream timeZoneBinaryStream = new MemoryStream(temp))
|
using (MemoryStream timeZoneBinaryStream = new MemoryStream(temp))
|
||||||
{
|
{
|
||||||
|
@ -188,9 +188,9 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
// ToCalendarTime(nn::time::PosixTime time, buffer<nn::time::TimeZoneRule, 0x15> rules) -> (nn::time::CalendarTime, nn::time::sf::CalendarAdditionalInfo)
|
// ToCalendarTime(nn::time::PosixTime time, buffer<nn::time::TimeZoneRule, 0x15> rules) -> (nn::time::CalendarTime, nn::time::sf::CalendarAdditionalInfo)
|
||||||
public ResultCode ToCalendarTime(ServiceCtx context)
|
public ResultCode ToCalendarTime(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long posixTime = context.RequestData.ReadInt64();
|
long posixTime = context.RequestData.ReadInt64();
|
||||||
long bufferPosition = context.Request.SendBuff[0].Position;
|
ulong bufferPosition = context.Request.SendBuff[0].Position;
|
||||||
long bufferSize = context.Request.SendBuff[0].Size;
|
ulong bufferSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
if (bufferSize != 0x4000)
|
if (bufferSize != 0x4000)
|
||||||
{
|
{
|
||||||
|
@ -220,7 +220,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
|
|
||||||
ResultCode resultCode = _timeZoneManager.ToCalendarTimeWithMyRules(posixTime, out CalendarInfo calendar);
|
ResultCode resultCode = _timeZoneManager.ToCalendarTimeWithMyRules(posixTime, out CalendarInfo calendar);
|
||||||
|
|
||||||
if (resultCode == 0)
|
if (resultCode == ResultCode.Success)
|
||||||
{
|
{
|
||||||
context.ResponseData.WriteStruct(calendar);
|
context.ResponseData.WriteStruct(calendar);
|
||||||
}
|
}
|
||||||
|
@ -232,8 +232,8 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
// ToPosixTime(nn::time::CalendarTime calendarTime, buffer<nn::time::TimeZoneRule, 0x15> rules) -> (u32 outCount, buffer<nn::time::PosixTime, 0xa>)
|
// ToPosixTime(nn::time::CalendarTime calendarTime, buffer<nn::time::TimeZoneRule, 0x15> rules) -> (u32 outCount, buffer<nn::time::PosixTime, 0xa>)
|
||||||
public ResultCode ToPosixTime(ServiceCtx context)
|
public ResultCode ToPosixTime(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long inBufferPosition = context.Request.SendBuff[0].Position;
|
ulong inBufferPosition = context.Request.SendBuff[0].Position;
|
||||||
long inBufferSize = context.Request.SendBuff[0].Size;
|
ulong inBufferSize = context.Request.SendBuff[0].Size;
|
||||||
|
|
||||||
CalendarTime calendarTime = context.RequestData.ReadStruct<CalendarTime>();
|
CalendarTime calendarTime = context.RequestData.ReadStruct<CalendarTime>();
|
||||||
|
|
||||||
|
@ -249,12 +249,12 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
|
|
||||||
ResultCode resultCode = _timeZoneManager.ToPosixTime(rules, calendarTime, out long posixTime);
|
ResultCode resultCode = _timeZoneManager.ToPosixTime(rules, calendarTime, out long posixTime);
|
||||||
|
|
||||||
if (resultCode == 0)
|
if (resultCode == ResultCode.Success)
|
||||||
{
|
{
|
||||||
long outBufferPosition = context.Request.RecvListBuff[0].Position;
|
ulong outBufferPosition = context.Request.RecvListBuff[0].Position;
|
||||||
long outBufferSize = context.Request.RecvListBuff[0].Size;
|
ulong outBufferSize = context.Request.RecvListBuff[0].Size;
|
||||||
|
|
||||||
context.Memory.Write((ulong)outBufferPosition, posixTime);
|
context.Memory.Write(outBufferPosition, posixTime);
|
||||||
context.ResponseData.Write(1);
|
context.ResponseData.Write(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,12 +269,12 @@ namespace Ryujinx.HLE.HOS.Services.Time.StaticService
|
||||||
|
|
||||||
ResultCode resultCode = _timeZoneManager.ToPosixTimeWithMyRules(calendarTime, out long posixTime);
|
ResultCode resultCode = _timeZoneManager.ToPosixTimeWithMyRules(calendarTime, out long posixTime);
|
||||||
|
|
||||||
if (resultCode == 0)
|
if (resultCode == ResultCode.Success)
|
||||||
{
|
{
|
||||||
long outBufferPosition = context.Request.RecvListBuff[0].Position;
|
ulong outBufferPosition = context.Request.RecvListBuff[0].Position;
|
||||||
long outBufferSize = context.Request.RecvListBuff[0].Size;
|
ulong outBufferSize = context.Request.RecvListBuff[0].Size;
|
||||||
|
|
||||||
context.Memory.Write((ulong)outBufferPosition, posixTime);
|
context.Memory.Write(outBufferPosition, posixTime);
|
||||||
|
|
||||||
// There could be only one result on one calendar as leap seconds aren't supported.
|
// There could be only one result on one calendar as leap seconds aren't supported.
|
||||||
context.ResponseData.Write(1);
|
context.ResponseData.Write(1);
|
||||||
|
|
|
@ -61,16 +61,16 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
|
||||||
// ListDisplays() -> (u64, buffer<nn::vi::DisplayInfo, 6>)
|
// ListDisplays() -> (u64, buffer<nn::vi::DisplayInfo, 6>)
|
||||||
public ResultCode ListDisplays(ServiceCtx context)
|
public ResultCode ListDisplays(ServiceCtx context)
|
||||||
{
|
{
|
||||||
long recBuffPtr = context.Request.ReceiveBuff[0].Position;
|
ulong recBuffPtr = context.Request.ReceiveBuff[0].Position;
|
||||||
|
|
||||||
MemoryHelper.FillWithZeros(context.Memory, recBuffPtr, 0x60);
|
MemoryHelper.FillWithZeros(context.Memory, recBuffPtr, 0x60);
|
||||||
|
|
||||||
// Add only the default display to buffer
|
// Add only the default display to buffer
|
||||||
context.Memory.Write((ulong)recBuffPtr, Encoding.ASCII.GetBytes("Default"));
|
context.Memory.Write(recBuffPtr, Encoding.ASCII.GetBytes("Default"));
|
||||||
context.Memory.Write((ulong)recBuffPtr + 0x40, 0x1L);
|
context.Memory.Write(recBuffPtr + 0x40, 0x1UL);
|
||||||
context.Memory.Write((ulong)recBuffPtr + 0x48, 0x1L);
|
context.Memory.Write(recBuffPtr + 0x48, 0x1UL);
|
||||||
context.Memory.Write((ulong)recBuffPtr + 0x50, 1280L);
|
context.Memory.Write(recBuffPtr + 0x50, 1280UL);
|
||||||
context.Memory.Write((ulong)recBuffPtr + 0x58, 720L);
|
context.Memory.Write(recBuffPtr + 0x58, 720UL);
|
||||||
|
|
||||||
context.ResponseData.Write(1L);
|
context.ResponseData.Write(1L);
|
||||||
|
|
||||||
|
@ -120,9 +120,9 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
|
||||||
// TODO: support multi display.
|
// TODO: support multi display.
|
||||||
byte[] displayName = context.RequestData.ReadBytes(0x40);
|
byte[] displayName = context.RequestData.ReadBytes(0x40);
|
||||||
|
|
||||||
long layerId = context.RequestData.ReadInt64();
|
long layerId = context.RequestData.ReadInt64();
|
||||||
long userId = context.RequestData.ReadInt64();
|
long userId = context.RequestData.ReadInt64();
|
||||||
long parcelPtr = context.Request.ReceiveBuff[0].Position;
|
ulong parcelPtr = context.Request.ReceiveBuff[0].Position;
|
||||||
|
|
||||||
IBinder producer = context.Device.System.SurfaceFlinger.OpenLayer(context.Request.HandleDesc.PId, layerId);
|
IBinder producer = context.Device.System.SurfaceFlinger.OpenLayer(context.Request.HandleDesc.PId, layerId);
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
|
||||||
|
|
||||||
ReadOnlySpan<byte> parcelData = parcel.Finish();
|
ReadOnlySpan<byte> parcelData = parcel.Finish();
|
||||||
|
|
||||||
context.Memory.Write((ulong)parcelPtr, parcelData);
|
context.Memory.Write(parcelPtr, parcelData);
|
||||||
|
|
||||||
context.ResponseData.Write((long)parcelData.Length);
|
context.ResponseData.Write((long)parcelData.Length);
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
|
||||||
long layerFlags = context.RequestData.ReadInt64();
|
long layerFlags = context.RequestData.ReadInt64();
|
||||||
long displayId = context.RequestData.ReadInt64();
|
long displayId = context.RequestData.ReadInt64();
|
||||||
|
|
||||||
long parcelPtr = context.Request.ReceiveBuff[0].Position;
|
ulong parcelPtr = context.Request.ReceiveBuff[0].Position;
|
||||||
|
|
||||||
// TODO: support multi display.
|
// TODO: support multi display.
|
||||||
Display disp = _displays.GetData<Display>((int)displayId);
|
Display disp = _displays.GetData<Display>((int)displayId);
|
||||||
|
@ -174,7 +174,7 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
|
||||||
|
|
||||||
ReadOnlySpan<byte> parcelData = parcel.Finish();
|
ReadOnlySpan<byte> parcelData = parcel.Finish();
|
||||||
|
|
||||||
context.Memory.Write((ulong)parcelPtr, parcelData);
|
context.Memory.Write(parcelPtr, parcelData);
|
||||||
|
|
||||||
context.ResponseData.Write(layerId);
|
context.ResponseData.Write(layerId);
|
||||||
context.ResponseData.Write((long)parcelData.Length);
|
context.ResponseData.Write((long)parcelData.Length);
|
||||||
|
@ -250,11 +250,11 @@ namespace Ryujinx.HLE.HOS.Services.Vi.RootService
|
||||||
// The size of the layer buffer should be an aligned multiple of width * height
|
// The size of the layer buffer should be an aligned multiple of width * height
|
||||||
// because it was created using GetIndirectLayerImageRequiredMemoryInfo as a guide.
|
// because it was created using GetIndirectLayerImageRequiredMemoryInfo as a guide.
|
||||||
|
|
||||||
long layerBuffPosition = context.Request.ReceiveBuff[0].Position;
|
ulong layerBuffPosition = context.Request.ReceiveBuff[0].Position;
|
||||||
long layerBuffSize = context.Request.ReceiveBuff[0].Size;
|
ulong layerBuffSize = context.Request.ReceiveBuff[0].Size;
|
||||||
|
|
||||||
// Fill the layer with zeros.
|
// Fill the layer with zeros.
|
||||||
context.Memory.Fill((ulong)layerBuffPosition, (ulong)layerBuffSize, 0x00);
|
context.Memory.Fill(layerBuffPosition, layerBuffSize, 0x00);
|
||||||
|
|
||||||
Logger.Stub?.PrintStub(LogClass.ServiceVi);
|
Logger.Stub?.PrintStub(LogClass.ServiceVi);
|
||||||
|
|
||||||
|
|
|
@ -53,14 +53,14 @@ namespace Ryujinx.HLE.Utilities
|
||||||
|
|
||||||
public static string ReadUtf8String(ServiceCtx context, int index = 0)
|
public static string ReadUtf8String(ServiceCtx context, int index = 0)
|
||||||
{
|
{
|
||||||
long position = context.Request.PtrBuff[index].Position;
|
ulong position = context.Request.PtrBuff[index].Position;
|
||||||
long size = context.Request.PtrBuff[index].Size;
|
ulong size = context.Request.PtrBuff[index].Size;
|
||||||
|
|
||||||
using (MemoryStream ms = new MemoryStream())
|
using (MemoryStream ms = new MemoryStream())
|
||||||
{
|
{
|
||||||
while (size-- > 0)
|
while (size-- > 0)
|
||||||
{
|
{
|
||||||
byte value = context.Memory.Read<byte>((ulong)position++);
|
byte value = context.Memory.Read<byte>(position++);
|
||||||
|
|
||||||
if (value == 0)
|
if (value == 0)
|
||||||
{
|
{
|
||||||
|
@ -86,8 +86,8 @@ namespace Ryujinx.HLE.Utilities
|
||||||
|
|
||||||
public static string ReadUtf8StringSend(ServiceCtx context, int index = 0)
|
public static string ReadUtf8StringSend(ServiceCtx context, int index = 0)
|
||||||
{
|
{
|
||||||
long position = context.Request.SendBuff[index].Position;
|
ulong position = context.Request.SendBuff[index].Position;
|
||||||
long size = context.Request.SendBuff[index].Size;
|
ulong size = context.Request.SendBuff[index].Size;
|
||||||
|
|
||||||
using (MemoryStream ms = new MemoryStream())
|
using (MemoryStream ms = new MemoryStream())
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using Ryujinx.Cpu;
|
using Ryujinx.Cpu;
|
||||||
using Ryujinx.Memory;
|
using Ryujinx.Memory;
|
||||||
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Ryujinx.HLE.Utilities
|
namespace Ryujinx.HLE.Utilities
|
||||||
|
@ -8,39 +9,30 @@ namespace Ryujinx.HLE.Utilities
|
||||||
{
|
{
|
||||||
private IVirtualMemoryManager _memory;
|
private IVirtualMemoryManager _memory;
|
||||||
|
|
||||||
public long Position { get; private set; }
|
public ulong Position { get; private set; }
|
||||||
|
|
||||||
public StructReader(IVirtualMemoryManager memory, long position)
|
public StructReader(IVirtualMemoryManager memory, ulong position)
|
||||||
{
|
{
|
||||||
_memory = memory;
|
_memory = memory;
|
||||||
Position = position;
|
Position = position;
|
||||||
}
|
}
|
||||||
|
|
||||||
public T Read<T>() where T : struct
|
public T Read<T>() where T : unmanaged
|
||||||
{
|
{
|
||||||
T value = MemoryHelper.Read<T>(_memory, Position);
|
T value = MemoryHelper.Read<T>(_memory, Position);
|
||||||
|
|
||||||
Position += Marshal.SizeOf<T>();
|
Position += (uint)Marshal.SizeOf<T>();
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public T[] Read<T>(int size) where T : struct
|
public ReadOnlySpan<T> Read<T>(int size) where T : unmanaged
|
||||||
{
|
{
|
||||||
int structSize = Marshal.SizeOf<T>();
|
ReadOnlySpan<byte> data = _memory.GetSpan(Position, size);
|
||||||
|
|
||||||
int count = size / structSize;
|
Position += (uint)size;
|
||||||
|
|
||||||
T[] output = new T[count];
|
return MemoryMarshal.Cast<byte, T>(data);
|
||||||
|
|
||||||
for (int index = 0; index < count; index++)
|
|
||||||
{
|
|
||||||
output[index] = MemoryHelper.Read<T>(_memory, Position);
|
|
||||||
|
|
||||||
Position += structSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,9 +8,9 @@ namespace Ryujinx.HLE.Utilities
|
||||||
{
|
{
|
||||||
private IVirtualMemoryManager _memory;
|
private IVirtualMemoryManager _memory;
|
||||||
|
|
||||||
public long Position { get; private set; }
|
public ulong Position { get; private set; }
|
||||||
|
|
||||||
public StructWriter(IVirtualMemoryManager memory, long position)
|
public StructWriter(IVirtualMemoryManager memory, ulong position)
|
||||||
{
|
{
|
||||||
_memory = memory;
|
_memory = memory;
|
||||||
Position = position;
|
Position = position;
|
||||||
|
@ -20,10 +20,10 @@ namespace Ryujinx.HLE.Utilities
|
||||||
{
|
{
|
||||||
MemoryHelper.Write(_memory, Position, value);
|
MemoryHelper.Write(_memory, Position, value);
|
||||||
|
|
||||||
Position += Marshal.SizeOf<T>();
|
Position += (ulong)Marshal.SizeOf<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SkipBytes(long count)
|
public void SkipBytes(ulong count)
|
||||||
{
|
{
|
||||||
Position += count;
|
Position += count;
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue