/// <summary> /// 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) /// </summary> private void _UpdateModuleExports() { var BaseMemoryStream = ElfLoader.MemoryStream.SliceWithLength(BaseAddress); var ExportsStream = BaseMemoryStream.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(); }
/// <summary> /// 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) /// </summary> 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>(); Logger.Info("Exports:"); foreach (var moduleExport in moduleExports) { var moduleExportName = moduleExport.Name > 0 ? ElfLoader.MemoryStream.ReadStringzAt(moduleExport.Name) : ""; Logger.Info(" * Export: '{0}'", moduleExportName); var hleModuleExports = new HleModuleExports { Name = moduleExportName, Flags = moduleExport.Flags, 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 (var n = 0; n < moduleExport.FunctionCount; n++) { var nid = functionNidReader.ReadUInt32(); var callAddress = functionAddressReader.ReadUInt32(); hleModuleExports.Functions[nid] = new HleModuleImportsExports.Entry() { Address = callAddress }; Logger.Info(" | - FUNC: {0:X} : {1:X} : {2}", nid, callAddress, Enum.GetName(typeof(SpecialFunctionNids), nid)); } for (var n = 0; n < moduleExport.VariableCount; n++) { var nid = variableNidReader.ReadUInt32(); var callAddress = variableAddressReader.ReadUInt32(); hleModuleExports.Variables[nid] = new HleModuleImportsExports.Entry() { Address = callAddress }; Logger.Info(" | - VAR: {0:X} : {1:X} : {2}", nid, callAddress, Enum.GetName(typeof(SpecialVariableNids), nid)); } HleModuleGuest.ModulesExports.Add(hleModuleExports); } HleModuleGuest.ExportModules(); }