aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS')
-rw-r--r--Ryujinx.HLE/HOS/Horizon.cs20
-rw-r--r--Ryujinx.HLE/HOS/LibHacHorizonManager.cs38
-rw-r--r--Ryujinx.HLE/HOS/ServiceCtx.cs44
-rw-r--r--Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs3
-rw-r--r--Ryujinx.HLE/HOS/Services/Sdb/Pl/ISharedFontManager.cs12
-rw-r--r--Ryujinx.HLE/HOS/Services/Sdb/Pl/SharedFontManager.cs (renamed from Ryujinx.HLE/HOS/Font/SharedFontManager.cs)55
-rw-r--r--Ryujinx.HLE/HOS/Services/Sdb/Pl/Types/SharedFontType.cs (renamed from Ryujinx.HLE/HOS/Font/SharedFontType.cs)2
-rw-r--r--Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs1
-rw-r--r--Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs155
-rw-r--r--Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/WSAError.cs134
-rw-r--r--Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs1
11 files changed, 381 insertions, 84 deletions
diff --git a/Ryujinx.HLE/HOS/Horizon.cs b/Ryujinx.HLE/HOS/Horizon.cs
index 05ebdbb9..76ab1bc4 100644
--- a/Ryujinx.HLE/HOS/Horizon.cs
+++ b/Ryujinx.HLE/HOS/Horizon.cs
@@ -9,7 +9,6 @@ using Ryujinx.Audio.Output;
using Ryujinx.Audio.Renderer.Device;
using Ryujinx.Audio.Renderer.Server;
using Ryujinx.HLE.FileSystem.Content;
-using Ryujinx.HLE.HOS.Font;
using Ryujinx.HLE.HOS.Kernel;
using Ryujinx.HLE.HOS.Kernel.Memory;
using Ryujinx.HLE.HOS.Kernel.Process;
@@ -25,6 +24,7 @@ using Ryujinx.HLE.HOS.Services.Nfc.Nfp.NfpManager;
using Ryujinx.HLE.HOS.Services.Nv;
using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl;
using Ryujinx.HLE.HOS.Services.Pcv.Bpc;
+using Ryujinx.HLE.HOS.Services.Sdb.Pl;
using Ryujinx.HLE.HOS.Services.Settings;
using Ryujinx.HLE.HOS.Services.Sm;
using Ryujinx.HLE.HOS.Services.SurfaceFlinger;
@@ -87,11 +87,10 @@ namespace Ryujinx.HLE.HOS
internal KTransferMemory AppletCaptureBufferTransfer { get; private set; }
- internal SharedFontManager Font { get; private set; }
-
- internal AccountManager AccountManager { get; private set; }
- internal ContentManager ContentManager { get; private set; }
- internal CaptureManager CaptureManager { get; private set; }
+ internal SharedFontManager SharedFontManager { get; private set; }
+ internal AccountManager AccountManager { get; private set; }
+ internal ContentManager ContentManager { get; private set; }
+ internal CaptureManager CaptureManager { get; private set; }
internal KEvent VsyncEvent { get; private set; }
@@ -175,15 +174,14 @@ namespace Ryujinx.HLE.HOS
AppletState.SetFocus(true);
- Font = new SharedFontManager(device, fontStorage);
-
VsyncEvent = new KEvent(KernelContext);
DisplayResolutionChangeEvent = new KEvent(KernelContext);
- AccountManager = device.Configuration.AccountManager;
- ContentManager = device.Configuration.ContentManager;
- CaptureManager = new CaptureManager(device);
+ SharedFontManager = new SharedFontManager(device, fontStorage);
+ AccountManager = device.Configuration.AccountManager;
+ ContentManager = device.Configuration.ContentManager;
+ CaptureManager = new CaptureManager(device);
LibHacHorizonManager = device.Configuration.LibHacHorizonManager;
diff --git a/Ryujinx.HLE/HOS/LibHacHorizonManager.cs b/Ryujinx.HLE/HOS/LibHacHorizonManager.cs
index 61e0227f..f8975dd1 100644
--- a/Ryujinx.HLE/HOS/LibHacHorizonManager.cs
+++ b/Ryujinx.HLE/HOS/LibHacHorizonManager.cs
@@ -16,16 +16,15 @@ namespace Ryujinx.HLE.HOS
public class LibHacHorizonManager
{
private LibHac.Horizon Server { get; set; }
- public HorizonClient RyujinxClient { get; private set; }
+ public HorizonClient RyujinxClient { get; private set; }
public HorizonClient ApplicationClient { get; private set; }
-
- public HorizonClient AccountClient { get; private set; }
- public HorizonClient AmClient { get; private set; }
- public HorizonClient BcatClient { get; private set; }
- public HorizonClient FsClient { get; private set; }
- public HorizonClient NsClient { get; private set; }
- public HorizonClient SdbClient { get; private set; }
+ public HorizonClient AccountClient { get; private set; }
+ public HorizonClient AmClient { get; private set; }
+ public HorizonClient BcatClient { get; private set; }
+ public HorizonClient FsClient { get; private set; }
+ public HorizonClient NsClient { get; private set; }
+ public HorizonClient SdbClient { get; private set; }
internal LibHacIReader ArpIReader { get; private set; }
@@ -49,8 +48,7 @@ namespace Ryujinx.HLE.HOS
public void InitializeBcatServer()
{
- BcatClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Bcat, StorageId.BuiltInSystem),
- BcatFsPermissions);
+ BcatClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Bcat, StorageId.BuiltInSystem), BcatFsPermissions);
_ = new BcatServer(BcatClient);
}
@@ -66,23 +64,15 @@ namespace Ryujinx.HLE.HOS
public void InitializeSystemClients()
{
- AccountClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Account, StorageId.BuiltInSystem),
- AccountFsPermissions);
-
- AmClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Am, StorageId.BuiltInSystem),
- AmFsPermissions);
-
- NsClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Ns, StorageId.BuiltInSystem),
- NsFsPermissions);
-
- SdbClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Sdb, StorageId.BuiltInSystem),
- SdbFacData, SdbFacDescriptor);
+ AccountClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Account, StorageId.BuiltInSystem), AccountFsPermissions);
+ AmClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Am, StorageId.BuiltInSystem), AmFsPermissions);
+ NsClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Ns, StorageId.BuiltInSystem), NsFsPermissions);
+ SdbClient = Server.CreateHorizonClient(new ProgramLocation(SystemProgramId.Sdb, StorageId.BuiltInSystem), SdbFacData, SdbFacDescriptor);
}
public void InitializeApplicationClient(ProgramId programId, in Npdm npdm)
{
- ApplicationClient = Server.CreateHorizonClient(new ProgramLocation(programId, StorageId.BuiltInUser),
- npdm.FsAccessControlData, npdm.FsAccessControlDescriptor);
+ ApplicationClient = Server.CreateHorizonClient(new ProgramLocation(programId, StorageId.BuiltInUser), npdm.FsAccessControlData, npdm.FsAccessControlDescriptor);
}
// This function was added to avoid errors that come from a user's keys or SD encryption seed changing.
@@ -147,4 +137,4 @@ namespace Ryujinx.HLE.HOS
0x01, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
};
}
-}
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/ServiceCtx.cs b/Ryujinx.HLE/HOS/ServiceCtx.cs
index 36d4163e..659b212a 100644
--- a/Ryujinx.HLE/HOS/ServiceCtx.cs
+++ b/Ryujinx.HLE/HOS/ServiceCtx.cs
@@ -8,32 +8,32 @@ namespace Ryujinx.HLE.HOS
{
class ServiceCtx
{
- public Switch Device { get; }
- public KProcess Process { get; }
- public IVirtualMemoryManager Memory { get; }
- public KThread Thread { get; }
- public IpcMessage Request { get; }
- public IpcMessage Response { get; }
- public BinaryReader RequestData { get; }
- public BinaryWriter ResponseData { get; }
+ public Switch Device { get; }
+ public KProcess Process { get; }
+ public IVirtualMemoryManager Memory { get; }
+ public KThread Thread { get; }
+ public IpcMessage Request { get; }
+ public IpcMessage Response { get; }
+ public BinaryReader RequestData { get; }
+ public BinaryWriter ResponseData { get; }
public ServiceCtx(
- Switch device,
- KProcess process,
+ Switch device,
+ KProcess process,
IVirtualMemoryManager memory,
- KThread thread,
- IpcMessage request,
- IpcMessage response,
- BinaryReader requestData,
- BinaryWriter responseData)
+ KThread thread,
+ IpcMessage request,
+ IpcMessage response,
+ BinaryReader requestData,
+ BinaryWriter responseData)
{
- Device = device;
- Process = process;
- Memory = memory;
- Thread = thread;
- Request = request;
- Response = response;
- RequestData = requestData;
+ Device = device;
+ Process = process;
+ Memory = memory;
+ Thread = thread;
+ Request = request;
+ Response = response;
+ RequestData = requestData;
ResponseData = responseData;
}
}
diff --git a/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs b/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs
index aa17f6ac..4097eddf 100644
--- a/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs
+++ b/Ryujinx.HLE/HOS/Services/Ro/IRoInterface.cs
@@ -53,8 +53,7 @@ namespace Ryujinx.HLE.HOS.Services.Ro
return ResultCode.InvalidAddress;
}
- StructReader reader = new StructReader(_owner.CpuMemory, nrrAddress);
- NrrHeader header = reader.Read<NrrHeader>();
+ NrrHeader header = _owner.CpuMemory.Read<NrrHeader>(nrrAddress);
if (header.Magic != NrrMagic)
{
diff --git a/Ryujinx.HLE/HOS/Services/Sdb/Pl/ISharedFontManager.cs b/Ryujinx.HLE/HOS/Services/Sdb/Pl/ISharedFontManager.cs
index 048e11da..82e246b7 100644
--- a/Ryujinx.HLE/HOS/Services/Sdb/Pl/ISharedFontManager.cs
+++ b/Ryujinx.HLE/HOS/Services/Sdb/Pl/ISharedFontManager.cs
@@ -1,6 +1,6 @@
-using Ryujinx.HLE.HOS.Font;
using Ryujinx.HLE.HOS.Ipc;
using Ryujinx.HLE.HOS.Kernel.Common;
+using Ryujinx.HLE.HOS.Services.Sdb.Pl.Types;
using System;
namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
@@ -43,7 +43,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
{
SharedFontType fontType = (SharedFontType)context.RequestData.ReadInt32();
- context.ResponseData.Write(context.Device.System.Font.GetFontSize(fontType));
+ context.ResponseData.Write(context.Device.System.SharedFontManager.GetFontSize(fontType));
return ResultCode.Success;
}
@@ -54,7 +54,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
{
SharedFontType fontType = (SharedFontType)context.RequestData.ReadInt32();
- context.ResponseData.Write(context.Device.System.Font.GetSharedMemoryAddressOffset(fontType));
+ context.ResponseData.Write(context.Device.System.SharedFontManager.GetSharedMemoryAddressOffset(fontType));
return ResultCode.Success;
}
@@ -63,7 +63,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
// GetSharedMemoryNativeHandle() -> handle<copy>
public ResultCode GetSharedMemoryNativeHandle(ServiceCtx context)
{
- context.Device.System.Font.EnsureInitialized(context.Device.System.ContentManager);
+ context.Device.System.SharedFontManager.EnsureInitialized(context.Device.System.ContentManager);
if (_fontSharedMemHandle == 0)
{
@@ -131,8 +131,8 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
}
context.Memory.Write(typesPosition + offset, (int)fontType);
- context.Memory.Write(offsetsPosition + offset, context.Device.System.Font.GetSharedMemoryAddressOffset(fontType));
- context.Memory.Write(fontSizeBufferPosition + offset, context.Device.System.Font.GetFontSize(fontType));
+ context.Memory.Write(offsetsPosition + offset, context.Device.System.SharedFontManager.GetSharedMemoryAddressOffset(fontType));
+ context.Memory.Write(fontSizeBufferPosition + offset, context.Device.System.SharedFontManager.GetFontSize(fontType));
return true;
}
diff --git a/Ryujinx.HLE/HOS/Font/SharedFontManager.cs b/Ryujinx.HLE/HOS/Services/Sdb/Pl/SharedFontManager.cs
index fda1633f..13bb9ff5 100644
--- a/Ryujinx.HLE/HOS/Font/SharedFontManager.cs
+++ b/Ryujinx.HLE/HOS/Services/Sdb/Pl/SharedFontManager.cs
@@ -7,19 +7,20 @@ using Ryujinx.HLE.Exceptions;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.FileSystem.Content;
using Ryujinx.HLE.HOS.Kernel.Memory;
+using Ryujinx.HLE.HOS.Services.Sdb.Pl.Types;
using System;
using System.Buffers.Binary;
using System.Collections.Generic;
using System.IO;
-using static Ryujinx.HLE.Utilities.FontUtils;
-
-namespace Ryujinx.HLE.HOS.Font
+namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
{
class SharedFontManager
{
- private readonly Switch _device;
+ private static readonly uint FontKey = 0x06186249;
+ private static readonly uint BFTTFMagic = 0x18029a7f;
+ private readonly Switch _device;
private readonly SharedMemoryStorage _storage;
private struct FontInfo
@@ -42,7 +43,7 @@ namespace Ryujinx.HLE.HOS.Font
_storage = storage;
}
- public void Initialize(ContentManager contentManager)
+ public void Initialize()
{
_fontData?.Clear();
_fontData = null;
@@ -59,8 +60,7 @@ namespace Ryujinx.HLE.HOS.Font
FontInfo CreateFont(string name)
{
- if (contentManager.TryGetFontTitle(name, out ulong fontTitle) &&
- contentManager.TryGetFontFilename(name, out string fontFilename))
+ if (contentManager.TryGetFontTitle(name, out ulong fontTitle) && contentManager.TryGetFontFilename(name, out string fontFilename))
{
string contentPath = contentManager.GetInstalledContentPath(fontTitle, StorageId.NandSystem, NcaContentType.Data);
string fontPath = _device.FileSystem.SwitchPathToSystemPath(contentPath);
@@ -71,8 +71,8 @@ namespace Ryujinx.HLE.HOS.Font
using (IStorage ncaFileStream = new LocalStorage(fontPath, FileAccess.Read, FileMode.Open))
{
- Nca nca = new Nca(_device.System.KeySet, ncaFileStream);
- IFileSystem romfs = nca.OpenFileSystem(NcaSectionType.Data, _device.System.FsIntegrityCheckLevel);
+ Nca nca = new Nca(_device.System.KeySet, ncaFileStream);
+ IFileSystem romfs = nca.OpenFileSystem(NcaSectionType.Data, _device.System.FsIntegrityCheckLevel);
romfs.OpenFile(out IFile fontFile, ("/" + fontFilename).ToU8Span(), OpenMode.Read).ThrowIfFailure();
@@ -122,22 +122,19 @@ namespace Ryujinx.HLE.HOS.Font
if (fontOffset > Horizon.FontSize)
{
- throw new InvalidSystemResourceException(
- $"The sum of all fonts size exceed the shared memory size. " +
- $"Please make sure that the fonts don't exceed {Horizon.FontSize} bytes in total. " +
- $"(actual size: {fontOffset} bytes).");
+ throw new InvalidSystemResourceException("The sum of all fonts size exceed the shared memory size. " +
+ $"Please make sure that the fonts don't exceed {Horizon.FontSize} bytes in total. (actual size: {fontOffset} bytes).");
}
}
}
private void WriteMagicAndSize(ulong offset, int size)
{
- const int decMagic = 0x18029a7f;
- const int key = 0x49621806;
+ const int key = 0x49621806;
int encryptedSize = BinaryPrimitives.ReverseEndianness(size ^ key);
- _storage.GetRef<int>(offset + 0) = decMagic;
+ _storage.GetRef<int>(offset + 0) = (int)BFTTFMagic;
_storage.GetRef<int>(offset + 4) = encryptedSize;
}
@@ -154,5 +151,29 @@ namespace Ryujinx.HLE.HOS.Font
return _fontData[fontType].Offset + 8;
}
+
+ private static byte[] DecryptFont(Stream bfttfStream)
+ {
+ static uint KXor(uint data) => data ^ FontKey;
+
+ using (BinaryReader reader = new BinaryReader(bfttfStream))
+ using (MemoryStream ttfStream = new MemoryStream())
+ using (BinaryWriter output = new BinaryWriter(ttfStream))
+ {
+ if (KXor(reader.ReadUInt32()) != BFTTFMagic)
+ {
+ throw new InvalidDataException("Error: Input file is not in BFTTF format!");
+ }
+
+ bfttfStream.Position += 4;
+
+ for (int i = 0; i < (bfttfStream.Length - 8) / 4; i++)
+ {
+ output.Write(KXor(reader.ReadUInt32()));
+ }
+
+ return ttfStream.ToArray();
+ }
+ }
}
-}
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Font/SharedFontType.cs b/Ryujinx.HLE/HOS/Services/Sdb/Pl/Types/SharedFontType.cs
index 53dca626..90ee4f03 100644
--- a/Ryujinx.HLE/HOS/Font/SharedFontType.cs
+++ b/Ryujinx.HLE/HOS/Services/Sdb/Pl/Types/SharedFontType.cs
@@ -1,4 +1,4 @@
-namespace Ryujinx.HLE.HOS.Font
+namespace Ryujinx.HLE.HOS.Services.Sdb.Pl.Types
{
public enum SharedFontType
{
diff --git a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs
index 63f639cb..355ef864 100644
--- a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs
+++ b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs
@@ -1,5 +1,4 @@
using Ryujinx.Common.Logging;
-using Ryujinx.HLE.Utilities;
using System;
using System.Buffers.Binary;
using System.Collections.Generic;
diff --git a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs
new file mode 100644
index 00000000..b1326985
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/LinuxError.cs
@@ -0,0 +1,155 @@
+using System.Diagnostics.CodeAnalysis;
+
+namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
+{
+ [SuppressMessage("ReSharper", "InconsistentNaming")]
+ enum LinuxError
+ {
+ SUCCESS = 0,
+ EPERM = 1 /* Operation not permitted */,
+ ENOENT = 2 /* No such file or directory */,
+ ESRCH = 3 /* No such process */,
+ EINTR = 4 /* Interrupted system call */,
+ EIO = 5 /* I/O error */,
+ ENXIO = 6 /* No such device or address */,
+ E2BIG = 7 /* Argument list too long */,
+ ENOEXEC = 8 /* Exec format error */,
+ EBADF = 9 /* Bad file number */,
+ ECHILD = 10 /* No child processes */,
+ EAGAIN = 11 /* Try again */,
+ ENOMEM = 12 /* Out of memory */,
+ EACCES = 13 /* Permission denied */,
+ EFAULT = 14 /* Bad address */,
+ ENOTBLK = 15 /* Block device required */,
+ EBUSY = 16 /* Device or resource busy */,
+ EEXIST = 17 /* File exists */,
+ EXDEV = 18 /* Cross-device link */,
+ ENODEV = 19 /* No such device */,
+ ENOTDIR = 20 /* Not a directory */,
+ EISDIR = 21 /* Is a directory */,
+ EINVAL = 22 /* Invalid argument */,
+ ENFILE = 23 /* File table overflow */,
+ EMFILE = 24 /* Too many open files */,
+ ENOTTY = 25 /* Not a typewriter */,
+ ETXTBSY = 26 /* Text file busy */,
+ EFBIG = 27 /* File too large */,
+ ENOSPC = 28 /* No space left on device */,
+ ESPIPE = 29 /* Illegal seek */,
+ EROFS = 30 /* Read-only file system */,
+ EMLINK = 31 /* Too many links */,
+ EPIPE = 32 /* Broken pipe */,
+ EDOM = 33 /* Math argument out of domain of func */,
+ ERANGE = 34 /* Math result not representable */,
+ EDEADLK = 35 /* Resource deadlock would occur */,
+ ENAMETOOLONG = 36 /* File name too long */,
+ ENOLCK = 37 /* No record locks available */,
+
+ /*
+ * This error code is special: arch syscall entry code will return
+ * -ENOSYS if users try to call a syscall that doesn't exist. To keep
+ * failures of syscalls that really do exist distinguishable from
+ * failures due to attempts to use a nonexistent syscall, syscall
+ * implementations should refrain from returning -ENOSYS.
+ */
+ ENOSYS = 38 /* Invalid system call number */,
+ ENOTEMPTY = 39 /* Directory not empty */,
+ ELOOP = 40 /* Too many symbolic links encountered */,
+ EWOULDBLOCK = EAGAIN /* Operation would block */,
+ ENOMSG = 42 /* No message of desired type */,
+ EIDRM = 43 /* Identifier removed */,
+ ECHRNG = 44 /* Channel number out of range */,
+ EL2NSYNC = 45 /* Level 2 not synchronized */,
+ EL3HLT = 46 /* Level 3 halted */,
+ EL3RST = 47 /* Level 3 reset */,
+ ELNRNG = 48 /* Link number out of range */,
+ EUNATCH = 49 /* Protocol driver not attached */,
+ ENOCSI = 50 /* No CSI structure available */,
+ EL2HLT = 51 /* Level 2 halted */,
+ EBADE = 52 /* Invalid exchange */,
+ EBADR = 53 /* Invalid request descriptor */,
+ EXFULL = 54 /* Exchange full */,
+ ENOANO = 55 /* No anode */,
+ EBADRQC = 56 /* Invalid request code */,
+ EBADSLT = 57 /* Invalid slot */,
+ EDEADLOCK = EDEADLK,
+ EBFONT = 59 /* Bad font file format */,
+ ENOSTR = 60 /* Device not a stream */,
+ ENODATA = 61 /* No data available */,
+ ETIME = 62 /* Timer expired */,
+ ENOSR = 63 /* Out of streams resources */,
+ ENONET = 64 /* Machine is not on the network */,
+ ENOPKG = 65 /* Package not installed */,
+ EREMOTE = 66 /* Object is remote */,
+ ENOLINK = 67 /* Link has been severed */,
+ EADV = 68 /* Advertise error */,
+ ESRMNT = 69 /* Srmount error */,
+ ECOMM = 70 /* Communication error on send */,
+ EPROTO = 71 /* Protocol error */,
+ EMULTIHOP = 72 /* Multihop attempted */,
+ EDOTDOT = 73 /* RFS specific error */,
+ EBADMSG = 74 /* Not a data message */,
+ EOVERFLOW = 75 /* Value too large for defined data type */,
+ ENOTUNIQ = 76 /* Name not unique on network */,
+ EBADFD = 77 /* File descriptor in bad state */,
+ EREMCHG = 78 /* Remote address changed */,
+ ELIBACC = 79 /* Can not access a needed shared library */,
+ ELIBBAD = 80 /* Accessing a corrupted shared library */,
+ ELIBSCN = 81 /* .lib section in a.out corrupted */,
+ ELIBMAX = 82 /* Attempting to link in too many shared libraries */,
+ ELIBEXEC = 83 /* Cannot exec a shared library directly */,
+ EILSEQ = 84 /* Illegal byte sequence */,
+ ERESTART = 85 /* Interrupted system call should be restarted */,
+ ESTRPIPE = 86 /* Streams pipe error */,
+ EUSERS = 87 /* Too many users */,
+ ENOTSOCK = 88 /* Socket operation on non-socket */,
+ EDESTADDRREQ = 89 /* Destination address required */,
+ EMSGSIZE = 90 /* Message too long */,
+ EPROTOTYPE = 91 /* Protocol wrong type for socket */,
+ ENOPROTOOPT = 92 /* Protocol not available */,
+ EPROTONOSUPPORT = 93 /* Protocol not supported */,
+ ESOCKTNOSUPPORT = 94 /* Socket type not supported */,
+ EOPNOTSUPP = 95 /* Operation not supported on transport endpoint */,
+ EPFNOSUPPORT = 96 /* Protocol family not supported */,
+ EAFNOSUPPORT = 97 /* Address family not supported by protocol */,
+ EADDRINUSE = 98 /* Address already in use */,
+ EADDRNOTAVAIL = 99 /* Cannot assign requested address */,
+ ENETDOWN = 100 /* Network is down */,
+ ENETUNREACH = 101 /* Network is unreachable */,
+ ENETRESET = 102 /* Network dropped connection because of reset */,
+ ECONNABORTED = 103 /* Software caused connection abort */,
+ ECONNRESET = 104 /* Connection reset by peer */,
+ ENOBUFS = 105 /* No buffer space available */,
+ EISCONN = 106 /* Transport endpoint is already connected */,
+ ENOTCONN = 107 /* Transport endpoint is not connected */,
+ ESHUTDOWN = 108 /* Cannot send after transport endpoint shutdown */,
+ ETOOMANYREFS = 109 /* Too many references: cannot splice */,
+ ETIMEDOUT = 110 /* Connection timed out */,
+ ECONNREFUSED = 111 /* Connection refused */,
+ EHOSTDOWN = 112 /* Host is down */,
+ EHOSTUNREACH = 113 /* No route to host */,
+ EALREADY = 114 /* Operation already in progress */,
+ EINPROGRESS = 115 /* Operation now in progress */,
+ ESTALE = 116 /* Stale file handle */,
+ EUCLEAN = 117 /* Structure needs cleaning */,
+ ENOTNAM = 118 /* Not a XENIX named type file */,
+ ENAVAIL = 119 /* No XENIX semaphores available */,
+ EISNAM = 120 /* Is a named type file */,
+ EREMOTEIO = 121 /* Remote I/O error */,
+ EDQUOT = 122 /* Quota exceeded */,
+ ENOMEDIUM = 123 /* No medium found */,
+ EMEDIUMTYPE = 124 /* Wrong medium type */,
+ ECANCELED = 125 /* Operation Canceled */,
+ ENOKEY = 126 /* Required key not available */,
+ EKEYEXPIRED = 127 /* Key has expired */,
+ EKEYREVOKED = 128 /* Key has been revoked */,
+ EKEYREJECTED = 129 /* Key was rejected by service */,
+
+ /* for robust mutexes */
+ EOWNERDEAD = 130 /* Owner died */,
+ ENOTRECOVERABLE = 131 /* State not recoverable */,
+
+ ERFKILL = 132 /* Operation not possible due to RF-kill */,
+
+ EHWPOISON = 133 /* Memory page has hardware error */
+ }
+} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/WSAError.cs b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/WSAError.cs
new file mode 100644
index 00000000..d87e72d8
--- /dev/null
+++ b/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/WSAError.cs
@@ -0,0 +1,134 @@
+using System.Diagnostics.CodeAnalysis;
+
+namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd
+{
+ [SuppressMessage("ReSharper", "InconsistentNaming")]
+ enum WsaError
+ {
+ /*
+ * All Windows Sockets error constants are biased by WSABASEERR from
+ * the "normal"
+ */
+ WSABASEERR = 10000,
+
+ /*
+ * Windows Sockets definitions of regular Microsoft C error constants
+ */
+ WSAEINTR = (WSABASEERR + 4),
+ WSAEBADF = (WSABASEERR + 9),
+ WSAEACCES = (WSABASEERR + 13),
+ WSAEFAULT = (WSABASEERR + 14),
+ WSAEINVAL = (WSABASEERR + 22),
+ WSAEMFILE = (WSABASEERR + 24),
+
+ /*
+ * Windows Sockets definitions of regular Berkeley error constants
+ */
+ WSAEWOULDBLOCK = (WSABASEERR + 35),
+ WSAEINPROGRESS = (WSABASEERR + 36),
+ WSAEALREADY = (WSABASEERR + 37),
+ WSAENOTSOCK = (WSABASEERR + 38),
+ WSAEDESTADDRREQ = (WSABASEERR + 39),
+ WSAEMSGSIZE = (WSABASEERR + 40),
+ WSAEPROTOTYPE = (WSABASEERR + 41),
+ WSAENOPROTOOPT = (WSABASEERR + 42),
+ WSAEPROTONOSUPPORT = (WSABASEERR + 43),
+ WSAESOCKTNOSUPPORT = (WSABASEERR + 44),
+ WSAEOPNOTSUPP = (WSABASEERR + 45),
+ WSAEPFNOSUPPORT = (WSABASEERR + 46),
+ WSAEAFNOSUPPORT = (WSABASEERR + 47),
+ WSAEADDRINUSE = (WSABASEERR + 48),
+ WSAEADDRNOTAVAIL = (WSABASEERR + 49),
+ WSAENETDOWN = (WSABASEERR + 50),
+ WSAENETUNREACH = (WSABASEERR + 51),
+ WSAENETRESET = (WSABASEERR + 52),
+ WSAECONNABORTED = (WSABASEERR + 53),
+ WSAECONNRESET = (WSABASEERR + 54),
+ WSAENOBUFS = (WSABASEERR + 55),
+ WSAEISCONN = (WSABASEERR + 56),
+ WSAENOTCONN = (WSABASEERR + 57),
+ WSAESHUTDOWN = (WSABASEERR + 58),
+ WSAETOOMANYREFS = (WSABASEERR + 59),
+ WSAETIMEDOUT = (WSABASEERR + 60),
+ WSAECONNREFUSED = (WSABASEERR + 61),
+ WSAELOOP = (WSABASEERR + 62),
+ WSAENAMETOOLONG = (WSABASEERR + 63),
+ WSAEHOSTDOWN = (WSABASEERR + 64),
+ WSAEHOSTUNREACH = (WSABASEERR + 65),
+ WSAENOTEMPTY = (WSABASEERR + 66),
+ WSAEPROCLIM = (WSABASEERR + 67),
+ WSAEUSERS = (WSABASEERR + 68),
+ WSAEDQUOT = (WSABASEERR + 69),
+ WSAESTALE = (WSABASEERR + 70),
+ WSAEREMOTE = (WSABASEERR + 71),
+
+ /*
+ * Extended Windows Sockets error constant definitions
+ */
+ WSASYSNOTREADY = (WSABASEERR + 91),
+ WSAVERNOTSUPPORTED = (WSABASEERR + 92),
+ WSANOTINITIALISED = (WSABASEERR + 93),
+ WSAEDISCON = (WSABASEERR + 101),
+ WSAENOMORE = (WSABASEERR + 102),
+ WSAECANCELLED = (WSABASEERR + 103),
+ WSAEINVALIDPROCTABLE = (WSABASEERR + 104),
+ WSAEINVALIDPROVIDER = (WSABASEERR + 105),
+ WSAEPROVIDERFAILEDINIT = (WSABASEERR + 106),
+ WSASYSCALLFAILURE = (WSABASEERR + 107),
+ WSASERVICE_NOT_FOUND = (WSABASEERR + 108),
+ WSATYPE_NOT_FOUND = (WSABASEERR + 109),
+ WSA_E_NO_MORE = (WSABASEERR + 110),
+ WSA_E_CANCELLED = (WSABASEERR + 111),
+ WSAEREFUSED = (WSABASEERR + 112),
+
+ /*
+ * Error return codes from gethostbyname() and gethostbyaddr()
+ * (when using the resolver). Note that these errors are
+ * retrieved via WSAGetLastError() and must therefore follow
+ * the rules for avoiding clashes with error numbers from
+ * specific implementations or language run-time systems.
+ * For this reason the codes are based at WSABASEERR+1001.
+ * Note also that [WSA]NO_ADDRESS is defined only for
+ * compatibility purposes.
+ */
+
+ /* Authoritative Answer: Host not found */
+ WSAHOST_NOT_FOUND = (WSABASEERR + 1001),
+
+ /* Non-Authoritative: Host not found, or SERVERFAIL */
+ WSATRY_AGAIN = (WSABASEERR + 1002),
+
+ /* Non-recoverable errors, FORMERR, REFUSED, NOTIMP */
+ WSANO_RECOVERY = (WSABASEERR + 1003),
+
+ /* Valid name, no data record of requested type */
+ WSANO_DATA = (WSABASEERR + 1004),
+
+ /*
+ * Define QOS related error return codes
+ *
+ */
+ WSA_QOS_RECEIVERS = (WSABASEERR + 1005),
+ /* at least one Reserve has arrived */
+ WSA_QOS_SENDERS = (WSABASEERR + 1006),
+ /* at least one Path has arrived */
+ WSA_QOS_NO_SENDERS = (WSABASEERR + 1007),
+ /* there are no senders */
+ WSA_QOS_NO_RECEIVERS = (WSABASEERR + 1008),
+ /* there are no receivers */
+ WSA_QOS_REQUEST_CONFIRMED = (WSABASEERR + 1009),
+ /* Reserve has been confirmed */
+ WSA_QOS_ADMISSION_FAILURE = (WSABASEERR + 1010),
+ /* error due to lack of resources */
+ WSA_QOS_POLICY_FAILURE = (WSABASEERR + 1011),
+ /* rejected for administrative reasons - bad credentials */
+ WSA_QOS_BAD_STYLE = (WSABASEERR + 1012),
+ /* unknown or conflicting style */
+ WSA_QOS_BAD_OBJECT = (WSABASEERR + 1013),
+ /* problem with some part of the filterspec or providerspecific
+ * buffer in general */
+ WSA_QOS_TRAFFIC_CTRL_ERROR = (WSABASEERR + 1014),
+ /* problem with some part of the flowspec */
+ WSA_QOS_GENERIC_ERROR = (WSABASEERR + 1015)
+ }
+}
diff --git a/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs b/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs
index c77c472e..95ea9d4d 100644
--- a/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs
+++ b/Ryujinx.HLE/HOS/Services/Time/TimeZone/TimeZone.cs
@@ -1,4 +1,5 @@
using Ryujinx.Common;
+using Ryujinx.Common.Utilities;
using Ryujinx.HLE.Utilities;
using System;
using System.IO;