示例#1
0
        public void AddSessionObj(KServerSession serverSession, IpcService obj)
        {
            // Ensure that the sever loop is running.
            InitDone.WaitOne();

            _selfProcess.HandleTable.GenerateHandle(serverSession, out int serverSessionHandle);
            AddSessionObj(serverSessionHandle, obj);
        }
示例#2
0
 public void AddSessionObj(KServerSession serverSession, IpcService obj)
 {
     _selfProcess.HandleTable.GenerateHandle(serverSession, out int serverSessionHandle);
     AddSessionObj(serverSessionHandle, obj);
 }
示例#3
0
        public KernelResult ReplyAndReceive64(
            ulong handlesPtr,
            int handlesCount,
            int replyTargetHandle,
            long timeout,
            out int handleIndex)
        {
            handleIndex = 0;

            if ((uint)handlesCount > 0x40)
            {
                return(KernelResult.MaximumExceeded);
            }

            KProcess currentProcess = _system.Scheduler.GetCurrentProcess();

            ulong copySize = (ulong)((long)handlesCount * 4);

            if (!currentProcess.MemoryManager.InsideAddrSpace(handlesPtr, copySize))
            {
                return(KernelResult.UserCopyFailed);
            }

            if (handlesPtr + copySize < handlesPtr)
            {
                return(KernelResult.UserCopyFailed);
            }

            int[] handles = new int[handlesCount];

            if (!KernelTransfer.UserToKernelInt32Array(_system, handlesPtr, handles))
            {
                return(KernelResult.UserCopyFailed);
            }

            KSynchronizationObject[] syncObjs = new KSynchronizationObject[handlesCount];

            for (int index = 0; index < handlesCount; index++)
            {
                KSynchronizationObject obj = currentProcess.HandleTable.GetObject <KSynchronizationObject>(handles[index]);

                if (obj == null)
                {
                    return(KernelResult.InvalidHandle);
                }

                syncObjs[index] = obj;
            }

            KernelResult result;

            if (replyTargetHandle != 0)
            {
                KServerSession replyTarget = currentProcess.HandleTable.GetObject <KServerSession>(replyTargetHandle);

                if (replyTarget == null)
                {
                    return(KernelResult.InvalidHandle);
                }

                result = replyTarget.Reply();

                if (result != KernelResult.Success)
                {
                    return(result);
                }
            }

            while ((result = _system.Synchronization.WaitFor(syncObjs, timeout, out handleIndex)) == KernelResult.Success)
            {
                KServerSession session = currentProcess.HandleTable.GetObject <KServerSession>(handles[handleIndex]);

                if (session == null)
                {
                    break;
                }

                if ((result = session.Receive()) != KernelResult.NotFound)
                {
                    break;
                }
            }

            return(result);
        }