コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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?
        }
コード例 #3
0
ファイル: SvcSystem.cs プロジェクト: ckarcz/Ryujinx
        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);
            }
        }
コード例 #4
0
        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?
        }
コード例 #5
0
ファイル: SvcSystem.cs プロジェクト: peng1994/Ryujinx
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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;
            }
        }