CSPspEmu.Hle.Modules.modulemgr.ModuleMgrForUser.sceKernelLoadModuleWithStream C# (CSharp) Метод

sceKernelLoadModuleWithStream() публичный Метод

public sceKernelLoadModuleWithStream ( Func GetStreamAction, string Path, uint Flags, SceKernelLMOption SceKernelLMOption ) : int
GetStreamAction Func
Path string
Flags uint
SceKernelLMOption SceKernelLMOption
Результат int
        public int sceKernelLoadModuleWithStream(Func<Stream> GetStreamAction, string Path, uint Flags, SceKernelLMOption* SceKernelLMOption)
        {
            var Module = InjectContext.NewInstance<HleModuleGuest>();

            try
            {
                Path = Path.ToLowerInvariant();

                if (Path.StartsWith(@"disc0:/PSP_GAME/USRDIR/kmodule"))
                {
                    throw (new Exception("Ignore kmodule!"));
                }

                if (
                    Path.EndsWith(@"/libatrac3plus.prx") ||
                    Path.EndsWith(@"/videocodec.prx") ||
                    Path.EndsWith(@"/audiocodec.prx") ||
                    Path.EndsWith(@"/mpeg.prx") ||
                    Path.EndsWith(@"/mpegbase.prx") ||
                    Path.EndsWith(@"/libfont.prx") ||
                false)
                {
                    Logger.Warning("Ignore {0}!", Path);
                    throw (new Exception("Ignore " + Path + "!"));

                    //var ModuleId = Modules.Create(new HleModule());
                    //Module.ID = ModuleId;
                    //return ModuleId;

                }

                var ModuleStream = GetStreamAction();

                var HleModuleGuest = Loader.LoadModule(
                    ModuleStream,
                    new PspMemoryStream(Memory),
                    MemoryManager.GetPartition(MemoryPartitions.User),
                    ModuleManager,
                    "",
                    ModuleName: Path,
                    IsMainModule: false
                );

                var SceModulePartition = MemoryManager.GetPartition(MemoryPartitions.Kernel0).Allocate(sizeof(SceModule));

                var SceModulePtr = (SceModule*)Memory.PspAddressToPointerSafe(SceModulePartition.Low, Marshal.SizeOf(typeof(SceModule)));

                SceModulePtr->Attributes = HleModuleGuest.ModuleInfo.ModuleAtributes;
                SceModulePtr->Version = HleModuleGuest.ModuleInfo.ModuleVersion;
                SceModulePtr->ModuleName = HleModuleGuest.ModuleInfo.Name;
                SceModulePtr->GP = HleModuleGuest.ModuleInfo.GP;
                SceModulePtr->ent_top = HleModuleGuest.ModuleInfo.ExportsStart;
                SceModulePtr->ent_size = HleModuleGuest.ModuleInfo.ExportsEnd - HleModuleGuest.ModuleInfo.ExportsStart;
                SceModulePtr->stub_top = HleModuleGuest.ModuleInfo.ImportsStart;
                SceModulePtr->stub_size = HleModuleGuest.ModuleInfo.ImportsEnd - HleModuleGuest.ModuleInfo.ImportsStart;

                Module.ModuleInfo = HleModuleGuest.ModuleInfo;
                Module.InitInfo = HleModuleGuest.InitInfo;
                Module.Loaded = true;
                Module.SceModuleStructPartition = SceModulePartition;

                //Loader.InitInfo.GP
            }
            catch (Exception Exception)
            {
                Console.WriteLine(Exception);
                Module.Loaded = false;
            }

            var ModuleId = Modules.Create(Module);
            Module.ID = ModuleId;
            return ModuleId;
        }