From 521751795a1c97c0d97f6f8904a3be69b13d3a9d Mon Sep 17 00:00:00 2001 From: gdkchan Date: Thu, 16 Aug 2018 20:47:36 -0300 Subject: Code style fixes and nits on the HLE project (#355) * Some style fixes and nits on ITimeZoneService * Remove some unneeded usings * Remove the Ryujinx.HLE.OsHle.Handles namespace * Remove hbmenu automatic load on process exit * Rename Ns to Device, rename Os to System, rename SystemState to State * Move Exceptions and Utilities out of OsHle * Rename OsHle to HOS * Rename OsHle folder to HOS * IManagerDisplayService and ISystemDisplayService style fixes * BsdError shouldn't be public * Add a empty new line before using static * Remove unused file * Some style fixes on NPDM * Exit gracefully when the application is closed * Code style fixes on IGeneralService * Add 0x prefix on values printed as hex * Small improvements on finalization code * Move ProcessId and ThreadId out of AThreadState * Rename VFs to FileSystem * FsAccessHeader shouldn't be public. Also fix file names casing * More case changes on NPDM * Remove unused files * Move using to the correct place on NPDM * Use properties on KernelAccessControlMmio * Address PR feedback --- Ryujinx.HLE/HOS/Ipc/IpcHandler.cs | 140 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 Ryujinx.HLE/HOS/Ipc/IpcHandler.cs (limited to 'Ryujinx.HLE/HOS/Ipc/IpcHandler.cs') diff --git a/Ryujinx.HLE/HOS/Ipc/IpcHandler.cs b/Ryujinx.HLE/HOS/Ipc/IpcHandler.cs new file mode 100644 index 00000000..08a4cdb5 --- /dev/null +++ b/Ryujinx.HLE/HOS/Ipc/IpcHandler.cs @@ -0,0 +1,140 @@ +using ChocolArm64.Memory; +using Ryujinx.HLE.HOS.Kernel; +using System; +using System.IO; + +namespace Ryujinx.HLE.HOS.Ipc +{ + static class IpcHandler + { + public static long IpcCall( + Switch Ns, + Process Process, + AMemory Memory, + KSession Session, + IpcMessage Request, + long CmdPtr) + { + IpcMessage Response = new IpcMessage(); + + using (MemoryStream Raw = new MemoryStream(Request.RawData)) + { + BinaryReader ReqReader = new BinaryReader(Raw); + + if (Request.Type == IpcMessageType.Request || + Request.Type == IpcMessageType.RequestWithContext) + { + Response.Type = IpcMessageType.Response; + + using (MemoryStream ResMS = new MemoryStream()) + { + BinaryWriter ResWriter = new BinaryWriter(ResMS); + + ServiceCtx Context = new ServiceCtx( + Ns, + Process, + Memory, + Session, + Request, + Response, + ReqReader, + ResWriter); + + Session.Service.CallMethod(Context); + + Response.RawData = ResMS.ToArray(); + } + } + else if (Request.Type == IpcMessageType.Control || + Request.Type == IpcMessageType.ControlWithContext) + { + long Magic = ReqReader.ReadInt64(); + long CmdId = ReqReader.ReadInt64(); + + switch (CmdId) + { + case 0: + { + Request = FillResponse(Response, 0, Session.Service.ConvertToDomain()); + + break; + } + + case 3: + { + Request = FillResponse(Response, 0, 0x500); + + break; + } + + //TODO: Whats the difference between IpcDuplicateSession/Ex? + case 2: + case 4: + { + int Unknown = ReqReader.ReadInt32(); + + int Handle = Process.HandleTable.OpenHandle(Session); + + Response.HandleDesc = IpcHandleDesc.MakeMove(Handle); + + Request = FillResponse(Response, 0); + + break; + } + + default: throw new NotImplementedException(CmdId.ToString()); + } + } + else if (Request.Type == IpcMessageType.CloseSession) + { + //TODO + } + else + { + throw new NotImplementedException(Request.Type.ToString()); + } + + Memory.WriteBytes(CmdPtr, Response.GetBytes(CmdPtr)); + } + + return 0; + } + + private static IpcMessage FillResponse(IpcMessage Response, long Result, params int[] Values) + { + using (MemoryStream MS = new MemoryStream()) + { + BinaryWriter Writer = new BinaryWriter(MS); + + foreach (int Value in Values) + { + Writer.Write(Value); + } + + return FillResponse(Response, Result, MS.ToArray()); + } + } + + private static IpcMessage FillResponse(IpcMessage Response, long Result, byte[] Data = null) + { + Response.Type = IpcMessageType.Response; + + using (MemoryStream MS = new MemoryStream()) + { + BinaryWriter Writer = new BinaryWriter(MS); + + Writer.Write(IpcMagic.Sfco); + Writer.Write(Result); + + if (Data != null) + { + Writer.Write(Data); + } + + Response.RawData = MS.ToArray(); + } + + return Response; + } + } +} -- cgit v1.2.3