private static IpcMessage IpcQueryBufferPointerSize(IpcMessage Response) { return(FillResponse(Response, 0, 0x500)); }
public static void 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) { 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) { 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()); } AMemoryHelper.WriteBytes(Memory, CmdPtr, Response.GetBytes(CmdPtr)); } }
public static void IpcCall( Switch Ns, AMemory Memory, HSession Session, IpcMessage Request, int ThreadId, long CmdPtr, int HndId) { IpcMessage Response = new IpcMessage(Request.IsDomain && Request.Type == IpcMessageType.Request); using (MemoryStream Raw = new MemoryStream(Request.RawData)) { BinaryReader ReqReader = new BinaryReader(Raw); if (Request.Type == IpcMessageType.Request) { string ServiceName = Session.Service.GetType().Name; ServiceProcessRequest ProcReq = null; bool IgnoreNullPR = false; string DbgServiceName = string.Empty; if (Session is HDomain Dom) { if (Request.DomCmd == IpcDomCmd.SendMsg) { long Magic = ReqReader.ReadInt64(); int CmdId = (int)ReqReader.ReadInt64(); object Obj = Dom.GetObject(Request.DomObjId); if (Obj is HDomain) { Session.Service.Commands.TryGetValue(CmdId, out ProcReq); DbgServiceName = $"{ProcReq?.Method.Name ?? CmdId.ToString()}"; } else if (Obj != null) { ((IIpcService)Obj).Commands.TryGetValue(CmdId, out ProcReq); DbgServiceName = $"{Obj.GetType().Name} {ProcReq?.Method.Name ?? CmdId.ToString()}"; } } else if (Request.DomCmd == IpcDomCmd.DeleteObj) { Dom.DeleteObject(Request.DomObjId); Response = FillResponse(Response, 0); IgnoreNullPR = true; } } else { long Magic = ReqReader.ReadInt64(); int CmdId = (int)ReqReader.ReadInt64(); if (Session is HSessionObj) { object Obj = ((HSessionObj)Session).Obj; ((IIpcService)Obj).Commands.TryGetValue(CmdId, out ProcReq); DbgServiceName = $"{Obj.GetType().Name} {ProcReq?.Method.Name ?? CmdId.ToString()}"; } else { Session.Service.Commands.TryGetValue(CmdId, out ProcReq); DbgServiceName = $"{ProcReq?.Method.Name ?? CmdId.ToString()}"; } } DbgServiceName = $"Tid {ThreadId} {ServiceName} {DbgServiceName}"; Logging.Debug($"IpcMessage: {DbgServiceName}"); if (ProcReq != null) { using (MemoryStream ResMS = new MemoryStream()) { BinaryWriter ResWriter = new BinaryWriter(ResMS); ServiceCtx Context = new ServiceCtx( Ns, Memory, Session, Request, Response, ReqReader, ResWriter); long Result = ProcReq(Context); Response = FillResponse(Response, Result, ResMS.ToArray()); } } else if (!IgnoreNullPR) { throw new NotImplementedException(DbgServiceName); } } else if (Request.Type == IpcMessageType.Control) { long Magic = ReqReader.ReadInt64(); long CmdId = ReqReader.ReadInt64(); switch (CmdId) { case 0: Request = IpcConvertSessionToDomain(Ns, Session, Response, HndId); break; case 3: Request = IpcQueryBufferPointerSize(Response); break; case 2: //IpcDuplicateSession, differences is unknown. case 4: Request = IpcDuplicateSessionEx(Ns, Session, Response, ReqReader); break; default: throw new NotImplementedException(CmdId.ToString()); } } else if (Request.Type == IpcMessageType.Unknown2) { //TODO } else { throw new NotImplementedException(Request.Type.ToString()); } AMemoryHelper.WriteBytes(Memory, CmdPtr, Response.GetBytes(CmdPtr)); } }