private void SendSyncRequest(AThreadState ThreadState, long CmdPtr, long Size, int Handle) { KThread CurrThread = Process.GetThread(ThreadState.Tpidr); byte[] CmdData = Memory.ReadBytes(CmdPtr, Size); KSession Session = Process.HandleTable.GetData <KSession>(Handle); if (Session != null) { Process.Scheduler.Suspend(CurrThread); IpcMessage Cmd = new IpcMessage(CmdData, CmdPtr); long Result = IpcHandler.IpcCall(Device, Process, Memory, Session, Cmd, CmdPtr); Thread.Yield(); Process.Scheduler.Resume(CurrThread); ThreadState.X0 = (ulong)Result; } else { Device.Log.PrintWarning(LogClass.KernelSvc, $"Invalid session handle 0x{Handle:x8}!"); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); } }
public void Start() { this.portMonitor = new PortMonitor(); IpcHandler ipcHandler = new IpcHandler(); ipcHandler.AddMonitorPort += new IpcHandler.AddMonitorPortEventHandler(portMonitor.AddPort); ipcHandler.DeleteMonitorPort += new IpcHandler.DeleteMonitorPortEventHandler(portMonitor.DeletePort); ipcHandler.OpenMonitorPort += new IpcHandler.OpenMonitorPortEventHandler(portMonitor.OpenPort); ipcHandler.CloseMonitorPort += new IpcHandler.CloseMonitorPortEventHandler(portMonitor.ClosePort); ipcHandler.StartDocMonitorPort += new IpcHandler.StartDocMonitorPortEventHandler(portMonitor.StartDoc); ipcHandler.EndDocMonitorPort += new IpcHandler.EndDocMonitorPortEventHandler(portMonitor.EndDoc); ipcHandler.WriteMonitorPort +=new IpcHandler.WriteMonitorPortEventHandler(portMonitor.Write); this.pipeServer = new PipeServer(ipcHandler); //this.pipeServer.ClientConnected += new PipeServer.ClientConnectedEventHandler(this.ClientConnected); //this.pipeServer.ReadCompleted += new PipeServer.ReadCompletedEventHandler(this.ReadCompleted); //this.pipeServer.WriteCompleted += new PipeServer.WriteCompletedEventHandler(this.WriteCompleted); this.pipeServer.Start(); while (this.pipeServer.Step()) { // could do some other work here } // fixme: dispose pipeServer? }
private void SendSyncRequest(AThreadState ThreadState, long CmdPtr, long Size, int Handle) { KThread CurrThread = Process.GetThread(ThreadState.Tpidr); byte[] CmdData = AMemoryHelper.ReadBytes(Memory, CmdPtr, Size); KSession Session = Process.HandleTable.GetData <KSession>(Handle); if (Session != null) { Process.Scheduler.Suspend(CurrThread.ProcessorId); IpcMessage Cmd = new IpcMessage(CmdData, CmdPtr); IpcHandler.IpcCall(Ns, Process, Memory, Session, Cmd, CmdPtr); Thread.Yield(); Process.Scheduler.Resume(CurrThread); ThreadState.X0 = 0; } else { Logging.Warn($"Tried to SendSyncRequest on invalid session handle 0x{Handle:x8}!"); ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidHandle); } }
public void Start() { this.portMonitor = new PortMonitor(); IpcHandler ipcHandler = new IpcHandler(); ipcHandler.AddMonitorPort += new IpcHandler.AddMonitorPortEventHandler(portMonitor.AddPort); ipcHandler.DeleteMonitorPort += new IpcHandler.DeleteMonitorPortEventHandler(portMonitor.DeletePort); ipcHandler.OpenMonitorPort += new IpcHandler.OpenMonitorPortEventHandler(portMonitor.OpenPort); ipcHandler.CloseMonitorPort += new IpcHandler.CloseMonitorPortEventHandler(portMonitor.ClosePort); ipcHandler.StartDocMonitorPort += new IpcHandler.StartDocMonitorPortEventHandler(portMonitor.StartDoc); ipcHandler.EndDocMonitorPort += new IpcHandler.EndDocMonitorPortEventHandler(portMonitor.EndDoc); ipcHandler.WriteMonitorPort += new IpcHandler.WriteMonitorPortEventHandler(portMonitor.Write); this.pipeServer = new PipeServer(ipcHandler); //this.pipeServer.ClientConnected += new PipeServer.ClientConnectedEventHandler(this.ClientConnected); //this.pipeServer.ReadCompleted += new PipeServer.ReadCompletedEventHandler(this.ReadCompleted); //this.pipeServer.WriteCompleted += new PipeServer.WriteCompletedEventHandler(this.WriteCompleted); this.pipeServer.Start(); while (this.pipeServer.Step()) { // could do some other work here } // fixme: dispose pipeServer? }
private void ProcessIpcRequest(object State) { HleIpcMessage IpcMessage = (HleIpcMessage)State; IpcMessage.Thread.ObjSyncResult = (int)IpcHandler.IpcCall( Device, Process, Memory, IpcMessage.Session, IpcMessage.Message, IpcMessage.MessagePtr); IpcMessage.Thread.Reschedule(ThreadSchedState.Running); }
private void ProcessIpcRequest(object state) { HleIpcMessage ipcMessage = (HleIpcMessage)state; ipcMessage.Thread.ObjSyncResult = IpcHandler.IpcCall( _device, _process, _process.CpuMemory, ipcMessage.Session, ipcMessage.Message, ipcMessage.MessagePtr); _system.ThreadCounter.Signal(); ipcMessage.Thread.Reschedule(ThreadSchedState.Running); }
private void SendSyncRequest(AThreadState ThreadState, bool UserBuffer) { long CmdPtr = ThreadState.Tpidr; long Size = 0x100; int Handle = 0; if (UserBuffer) { CmdPtr = (long)ThreadState.X0; Size = (long)ThreadState.X1; Handle = (int)ThreadState.X2; } else { Handle = (int)ThreadState.X0; } HThread CurrThread = Process.GetThread(ThreadState.Tpidr); Process.Scheduler.Suspend(CurrThread.ProcessorId); byte[] CmdData = AMemoryHelper.ReadBytes(Memory, CmdPtr, (int)Size); HSession Session = Ns.Os.Handles.GetData <HSession>(Handle); IpcMessage Cmd = new IpcMessage(CmdData, CmdPtr, Session is HDomain); if (Session != null) { IpcHandler.IpcCall(Ns, Memory, Session, Cmd, CmdPtr, Handle); byte[] Response = AMemoryHelper.ReadBytes(Memory, CmdPtr, (int)Size); ThreadState.X0 = (int)SvcResult.Success; } else { ThreadState.X0 = (int)SvcResult.ErrBadIpcReq; } Thread.Yield(); Process.Scheduler.Resume(CurrThread); }
private void SendSyncRequest(ARegisters Registers, bool UserBuffer) { long CmdPtr = Registers.Tpidr; long Size = 0x100; int Handle = 0; if (UserBuffer) { CmdPtr = (long)Registers.X0; Size = (long)Registers.X1; Handle = (int)Registers.X2; } else { Handle = (int)Registers.X0; } byte[] CmdData = AMemoryHelper.ReadBytes(Memory, CmdPtr, (int)Size); HSession Session = Ns.Os.Handles.GetData <HSession>(Handle); IpcMessage Cmd = new IpcMessage(CmdData, CmdPtr, Session is HDomain); if (Session != null) { IpcHandler.IpcCall(Ns, Memory, Session, Cmd, CmdPtr, Handle); byte[] Response = AMemoryHelper.ReadBytes(Memory, CmdPtr, (int)Size); Registers.X0 = (int)SvcResult.Success; } else { Registers.X0 = (int)SvcResult.ErrBadIpcReq; } }