private static IpcMessage IpcDuplicateSessionEx( Switch Ns, HSession Session, IpcMessage Response, BinaryReader ReqReader) { int Unknown = ReqReader.ReadInt32(); int Handle = Ns.Os.Handles.GenerateId(Session); Response.HandleDesc = IpcHandleDesc.MakeMove(Handle); return(FillResponse(Response, 0)); }
private void Initialize(BinaryReader Reader, long CmdPtr) { int Word0 = Reader.ReadInt32(); int Word1 = Reader.ReadInt32(); Type = (IpcMessageType)(Word0 & 0xffff); int PtrBuffCount = (Word0 >> 16) & 0xf; int SendBuffCount = (Word0 >> 20) & 0xf; int RecvBuffCount = (Word0 >> 24) & 0xf; int XchgBuffCount = (Word0 >> 28) & 0xf; int RawDataSize = (Word1 >> 0) & 0x3ff; int RecvListFlags = (Word1 >> 10) & 0xf; bool HndDescEnable = ((Word1 >> 31) & 0x1) != 0; if (HndDescEnable) { HandleDesc = new IpcHandleDesc(Reader); } for (int Index = 0; Index < PtrBuffCount; Index++) { PtrBuff.Add(new IpcPtrBuffDesc(Reader)); } void ReadBuff(List <IpcBuffDesc> Buff, int Count) { for (int Index = 0; Index < Count; Index++) { Buff.Add(new IpcBuffDesc(Reader)); } } ReadBuff(SendBuff, SendBuffCount); ReadBuff(ReceiveBuff, RecvBuffCount); ReadBuff(ExchangeBuff, XchgBuffCount); RawDataSize *= 4; long RecvListPos = Reader.BaseStream.Position + RawDataSize; long Pad0 = GetPadSize16(Reader.BaseStream.Position + CmdPtr); Reader.BaseStream.Seek(Pad0, SeekOrigin.Current); int RecvListCount = RecvListFlags - 2; if (RecvListCount == 0) { RecvListCount = 1; } else if (RecvListCount < 0) { RecvListCount = 0; } RawData = Reader.ReadBytes(RawDataSize); Reader.BaseStream.Seek(RecvListPos, SeekOrigin.Begin); for (int Index = 0; Index < RecvListCount; Index++) { RecvListBuff.Add(new IpcRecvListBuffDesc(Reader)); } }
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)); } }