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); }
public void AddSessionObj(KServerSession serverSession, IpcService obj) { _selfProcess.HandleTable.GenerateHandle(serverSession, out int serverSessionHandle); AddSessionObj(serverSessionHandle, obj); }
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); }