public void Load(Stream FileStream, Stream MemoryStream, MemoryPartition MemoryPartition, HleModuleManager ModuleManager) { this.ElfLoader = new ElfLoader(); this.ModuleManager = ModuleManager; this.ElfLoader.Load(FileStream); PspEmulatorContext.PspConfig.InfoExeHasRelocation = this.ElfLoader.NeedsRelocation; BaseAddress = (uint)(this.ElfLoader.NeedsRelocation ? 0x08900000 : 0); this.ElfLoader.AllocateAndWrite(MemoryStream, MemoryPartition, BaseAddress); if (this.ElfLoader.NeedsRelocation) { RelocateFromHeaders(); } this.ModuleInfo = ElfLoader.SectionHeaderFileStream(ElfLoader.SectionHeadersByName[".rodata.sceModuleInfo"]).ReadStruct<ElfPsp.ModuleInfo>(); ; //Console.WriteLine(this.ModuleInfo.ToStringDefault()); this.InitInfo.PC = ElfLoader.Header.EntryPoint + BaseAddress; this.InitInfo.GP = this.ModuleInfo.GP + BaseAddress; UpdateModuleImports(); }
public void ElfLoaderConstructorTest() { var InjectContext = new InjectContext(); InjectContext.SetInstanceType<PspMemory, LazyPspMemory>(); var Memory = InjectContext.GetInstance<PspMemory>(); var MemoryStream = new PspMemoryStream(Memory); var MemoryPartition = new MemoryPartition(InjectContext, PspMemory.MainOffset, PspMemory.MainOffset + PspMemory.MainSize); var ElfLoader = new ElfLoader(); ElfLoader.Load(File.OpenRead("../../../TestInput/minifire.elf"), "minifire.elf"); ElfLoader.AllocateAndWrite(MemoryStream, MemoryPartition); Assert.AreEqual(1, ElfLoader.ProgramHeaders.Length); Assert.AreEqual(3, ElfLoader.SectionHeaders.Length); Assert.AreEqual( "['','.rodata.sceModuleInfo']".Replace('\'', '"'), ElfLoader.SectionHeadersByName.Keys.ToJson() ); //ElfLoader.LoadAllocateMemory(MemoryPartition); //ElfLoader.LoadWriteToMemory(MemoryStream); //var ModuleInfo = ElfLoader.ModuleInfo; var PC = ElfLoader.Header.EntryPoint; //var GP = ModuleInfo.GP; Assert.AreEqual(0x08900008, (int)PC); //Assert.AreEqual(0x00004821, (int)GP); }
public HleModuleGuest LoadModule(Stream FileStream, Stream MemoryStream, MemoryPartition MemoryPartition, HleModuleManager ModuleManager, String GameTitle, string ModuleName, bool IsMainModule) { this.HleModuleGuest = new HleModuleGuest(PspEmulatorContext); this.ElfLoader = new ElfLoader(); this.ModuleManager = ModuleManager; var Magic = FileStream.SliceWithLength(0, 4).ReadString(4); Logger.Info("Magic: '{0}'", Magic); if (Magic == "~PSP") { try { var DecryptedData = new EncryptedPrx().Decrypt(FileStream.ReadAll(), true); File.WriteAllBytes("last_decoded_prx.bin", DecryptedData); FileStream = new MemoryStream(DecryptedData); } catch (Exception Exception) { Logger.Error(Exception); throw (Exception); } } this.ElfLoader.Load(FileStream, ModuleName); PspEmulatorContext.PspConfig.InfoExeHasRelocation = this.ElfLoader.NeedsRelocation; if (this.ElfLoader.NeedsRelocation) { var DummyPartition = MemoryPartition.Allocate( 0x4000, Name: "Dummy" ); BaseAddress = MemoryPartition.ChildPartitions.OrderByDescending(Partition => Partition.Size).First().Low; Logger.Info("BASE ADDRESS (Try ): 0x{0:X}", BaseAddress); BaseAddress = MathUtils.NextAligned(BaseAddress, 0x1000); Logger.Info("BASE ADDRESS (Aligned): 0x{0:X}", BaseAddress); } else { BaseAddress = 0; } PspEmulatorContext.PspConfig.RelocatedBaseAddress = BaseAddress; PspEmulatorContext.PspConfig.GameTitle = GameTitle; this.ElfLoader.AllocateAndWrite(MemoryStream, MemoryPartition, BaseAddress); if (this.ElfLoader.NeedsRelocation) { RelocateFromHeaders(); } if (!ElfLoader.SectionHeadersByName.ContainsKey(".rodata.sceModuleInfo")) { throw(new Exception("Can't find segment '.rodata.sceModuleInfo'")); } HleModuleGuest.ModuleInfo = ElfLoader.SectionHeaderFileStream(ElfLoader.SectionHeadersByName[".rodata.sceModuleInfo"]).ReadStruct<ElfPsp.ModuleInfo>(); ; //Console.WriteLine(this.ModuleInfo.ToStringDefault()); HleModuleGuest.InitInfo = new InitInfoStruct() { PC = ElfLoader.Header.EntryPoint + BaseAddress, GP = HleModuleGuest.ModuleInfo.GP + BaseAddress, }; UpdateModuleImports(); UpdateModuleExports(); ModuleManager.LoadedGuestModules.Add(HleModuleGuest); return HleModuleGuest; }