public HleModuleGuest LoadModule(Stream FileStream, Stream MemoryStream, MemoryPartition MemoryPartition, HleModuleManager ModuleManager, String GameTitle, string ModuleName, bool IsMainModule)
{
this.HleModuleGuest = InjectContext.NewInstance<HleModuleGuest>();
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;
}
}
this.ElfLoader.Load(FileStream, ModuleName);
ElfConfig.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;
}
ElfConfig.RelocatedBaseAddress = BaseAddress;
ElfConfig.GameTitle = GameTitle;
this.ElfLoader.AllocateAndWrite(MemoryStream, MemoryPartition, BaseAddress);
LoadModuleInfo();
if (this.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;
}