internal void ExitProcess(int ProcessId) { if (Processes.TryGetValue(ProcessId, out Process Process) && Process.NeedsHbAbi) { string NextNro = Homebrew.ReadHbAbiNextLoadPath(Process.Memory, Process.HbAbiDataPosition); Ns.Log.PrintInfo(LogClass.Loader, $"HbAbi NextLoadPath {NextNro}"); if (NextNro == string.Empty) { NextNro = "sdmc:/hbmenu.nro"; } NextNro = NextNro.Replace("sdmc:", string.Empty); NextNro = Ns.VFs.GetFullPath(Ns.VFs.GetSdCardPath(), NextNro); if (File.Exists(NextNro)) { LoadProgram(NextNro); } } if (Processes.TryRemove(ProcessId, out Process)) { Process.StopAllThreadsAsync(); Process.Dispose(); if (Processes.Count == 0) { Ns.OnFinish(EventArgs.Empty); } } }
public bool Run(bool UseHbAbi = false) { if (Executables.Count == 0) { return(false); } long StackBot = TlsPageAddr - MaxStackSize; Memory.Manager.MapPhys(StackBot, MaxStackSize, (int)MemoryType.Normal, AMemoryPerm.RW); int Handle = MakeThread(Executables[0].ImageBase, TlsPageAddr, 0, 0, 0); if (Handle == -1) { return(false); } MainThread = Ns.Os.Handles.GetData <HThread>(Handle); if (UseHbAbi) { long HbAbiDataPosition = (Executables[0].ImageEnd + 0xfff) & ~0xfff; Homebrew.WriteHbAbiData(Memory, HbAbiDataPosition, Handle); MainThread.Thread.ThreadState.X0 = (ulong)HbAbiDataPosition; MainThread.Thread.ThreadState.X1 = ulong.MaxValue; } Scheduler.StartThread(MainThread); return(true); }
public bool Run(bool NeedsHbAbi = false) { if (Disposed) { throw new ObjectDisposedException(nameof(Process)); } this.NeedsHbAbi = NeedsHbAbi; if (Executables.Count == 0) { return(false); } MakeSymbolTable(); MapRWMemRegion( MemoryRegions.MainStackAddress, MemoryRegions.MainStackSize, MemoryType.Normal); long StackTop = MemoryRegions.MainStackAddress + MemoryRegions.MainStackSize; int Handle = MakeThread(Executables[0].ImageBase, StackTop, 0, 44, 0); if (Handle == -1) { return(false); } MainThread = HandleTable.GetData <KThread>(Handle); if (NeedsHbAbi) { HbAbiDataPosition = AMemoryHelper.PageRoundUp(Executables[0].ImageEnd); Homebrew.WriteHbAbiData(Memory, HbAbiDataPosition, Handle); MainThread.Thread.ThreadState.X0 = (ulong)HbAbiDataPosition; MainThread.Thread.ThreadState.X1 = ulong.MaxValue; } Scheduler.StartThread(MainThread); return(true); }
internal void ExitProcess(int ProcessId) { if (Processes.TryGetValue(ProcessId, out Process Process) && Process.NeedsHbAbi) { string NextNro = Homebrew.ReadHbAbiNextLoadPath(Process.Memory, Process.HbAbiDataPosition); Logging.Info($"HbAbi NextLoadPath {NextNro}"); if (NextNro == string.Empty) { NextNro = "sdmc:/hbmenu.nro"; } NextNro = NextNro.Replace("sdmc:", string.Empty); NextNro = Ns.VFs.GetFullPath(Ns.VFs.GetSdCardPath(), NextNro); if (File.Exists(NextNro)) { //TODO: Those dictionaries shouldn't even exist, //the Mutex and CondVar helper classes should be static. Mutexes.Clear(); CondVars.Clear(); LoadProgram(NextNro); } } if (Processes.TryRemove(ProcessId, out Process)) { Process.StopAllThreadsAsync(); Process.Dispose(); if (Processes.Count == 0) { Ns.OnFinish(EventArgs.Empty); } } }