CSPspEmu.Hle.Loader.ElfPspLoader._UpdateModuleExports C# (CSharp) Method

_UpdateModuleExports() private method

The export section is organized as as sequence of: - 32-bit NID * functionCount - 32-bit NID * variableCount - 32-bit export address * functionCount - 32-bit variable address * variableCount (each variable address references another structure, depending on its NID)
private _UpdateModuleExports ( ) : void
return void
        private void _UpdateModuleExports()
        {
            //var BaseMemoryStream = ElfLoader.MemoryStream.SliceWithLength(BaseAddress);
            var ExportsStream = ElfLoader.MemoryStream.SliceWithBounds(HleModuleGuest.ModuleInfo.ExportsStart, HleModuleGuest.ModuleInfo.ExportsEnd);
            var ModuleExports = ExportsStream.ReadStructVectorUntilTheEndOfStream<ElfPsp.ModuleExport>();

            Console.WriteLine("Exports:");

            foreach (var ModuleExport in ModuleExports)
            {
                String ModuleExportName = "";

                try { ModuleExportName = ElfLoader.MemoryStream.ReadStringzAt(ModuleExport.Name); } catch { }

                Console.WriteLine("  * Export: '{0}'", ModuleExportName);

                var HleModuleExports = new HleModuleExports();
                HleModuleExports.Name = ModuleExportName;
                HleModuleExports.Flags = ModuleExport.Flags;
                HleModuleExports.Version = ModuleExport.Version;

                var ExportsExportsStream = ElfLoader.MemoryStream.SliceWithLength(
                    ModuleExport.Exports,
                    ModuleExport.FunctionCount * sizeof(uint) * 2 + ModuleExport.VariableCount * sizeof(uint) * 2
                );

                var FunctionNIDReader = new BinaryReader(ExportsExportsStream.ReadStream(ModuleExport.FunctionCount * sizeof(uint)));
                var VariableNIDReader = new BinaryReader(ExportsExportsStream.ReadStream(ModuleExport.VariableCount * sizeof(uint)));
                var FunctionAddressReader = new BinaryReader(ExportsExportsStream.ReadStream(ModuleExport.FunctionCount * sizeof(uint)));
                var VariableAddressReader = new BinaryReader(ExportsExportsStream.ReadStream(ModuleExport.VariableCount * sizeof(uint)));

                for (int n = 0; n < ModuleExport.FunctionCount; n++)
                {
                    uint NID = FunctionNIDReader.ReadUInt32();
                    uint CallAddress = FunctionAddressReader.ReadUInt32();
                    HleModuleExports.Functions[NID] = new HleModuleImportsExports.Entry() { Address = CallAddress };

                    Console.WriteLine("  |  - FUNC: {0:X} : {1:X} : {2}", NID, CallAddress, Enum.GetName(typeof(SpecialFunctionNids), NID));
                }

                for (int n = 0; n < ModuleExport.VariableCount; n++)
                {
                    uint NID = VariableNIDReader.ReadUInt32();
                    uint CallAddress = VariableAddressReader.ReadUInt32();
                    HleModuleExports.Variables[NID] = new HleModuleImportsExports.Entry() { Address = CallAddress };

                    Console.WriteLine("  |  - VAR: {0:X} : {1:X} : {2}", NID, CallAddress, Enum.GetName(typeof(SpecialVariableNids), NID));
                }

                HleModuleGuest.ModulesExports.Add(HleModuleExports);
            }

            HleModuleGuest.ExportModules();
        }