AllocateAndWrite() public method

public AllocateAndWrite ( Stream MemoryStream, MemoryPartition MemoryPartition, uint BaseAddress ) : void
MemoryStream Stream
MemoryPartition MemoryPartition
BaseAddress uint
return void
Example #1
0
        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);
        }
Example #2
0
        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);
        }