public AllocateAndWrite ( Stream MemoryStream, MemoryPartition MemoryPartition, uint BaseAddress ) : void | ||
MemoryStream | Stream | |
MemoryPartition | MemoryPartition | |
BaseAddress | uint | |
return | void |
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) { HleModuleGuest = InjectContext.NewInstance <HleModuleGuest>(); ElfLoader = new ElfLoader(); 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; } } ElfLoader.Load(fileStream, moduleName); ElfConfig.InfoExeHasRelocation = ElfLoader.NeedsRelocation; if (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; } ElfConfig.RelocatedBaseAddress = BaseAddress; ElfConfig.GameTitle = gameTitle; ElfLoader.AllocateAndWrite(memoryStream, memoryPartition, BaseAddress); LoadModuleInfo(); if (ElfLoader.NeedsRelocation) { RelocateFromHeaders(); } LoadModuleInfo(); //Console.WriteLine(this.ModuleInfo.ToStringDefault()); HleModuleGuest.InitInfo = new InitInfoStruct() { Pc = ElfLoader.Header.EntryPoint + BaseAddress, Gp = HleModuleGuest.ModuleInfo.Gp, }; UpdateModuleImports(); UpdateModuleExports(); moduleManager.LoadedGuestModules.Add(HleModuleGuest); return(HleModuleGuest); }