예제 #1
0
        /// <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();
        }
예제 #2
0
        /// <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();
        }