/// <inheritdoc />
        public PEImageBuildResult CreateImage(ModuleDefinition module)
        {
            var context = new PEImageBuildContext();

            PEImage image = null;

            try
            {
                image = new PEImage
                {
                    MachineType        = module.MachineType,
                    PEKind             = module.PEKind,
                    Characteristics    = module.FileCharacteristics,
                    SubSystem          = module.SubSystem,
                    DllCharacteristics = module.DllCharacteristics,
                    DotNetDirectory    = DotNetDirectoryFactory.CreateDotNetDirectory(module, context.DiagnosticBag),
                    Resources          = module.NativeResourceDirectory,
                };
            }
            catch (Exception ex)
            {
                context.DiagnosticBag.Exceptions.Add(ex);
                context.DiagnosticBag.MarkAsFatal();
            }

            return(new PEImageBuildResult(image, context.DiagnosticBag));
        }
Esempio n. 2
0
        /// <inheritdoc />
        public PEImageBuildResult CreateImage(ModuleDefinition module)
        {
            var context = new PEImageBuildContext();

            PEImage       image        = null;
            ITokenMapping tokenMapping = null;

            try
            {
                // Create basic PE image skeleton.
                image = new PEImage
                {
                    MachineType        = module.MachineType,
                    PEKind             = module.PEKind,
                    Characteristics    = module.FileCharacteristics,
                    SubSystem          = module.SubSystem,
                    DllCharacteristics = module.DllCharacteristics,
                    Resources          = module.NativeResourceDirectory,
                    TimeDateStamp      = module.TimeDateStamp
                };

                // Construct new .NET directory.
                var symbolProvider = new NativeSymbolsProvider(image.ImageBase);
                var result         = DotNetDirectoryFactory.CreateDotNetDirectory(
                    module,
                    symbolProvider,
                    context.DiagnosticBag);
                image.DotNetDirectory = result.Directory;
                tokenMapping          = result.TokenMapping;

                // Copy any collected native symbols over to the image.
                foreach (var import in symbolProvider.GetImportedModules())
                {
                    image.Imports.Add(import);
                }

                // Copy any collected base relocations over to the image.
                foreach (var relocation in symbolProvider.GetBaseRelocations())
                {
                    image.Relocations.Add(relocation);
                }

                // Copy over debug data.
                for (int i = 0; i < module.DebugData.Count; i++)
                {
                    image.DebugData.Add(module.DebugData[i]);
                }
            }
            catch (Exception ex)
            {
                context.DiagnosticBag.Exceptions.Add(ex);
                context.DiagnosticBag.MarkAsFatal();
            }

            tokenMapping ??= new TokenMapping();
            return(new PEImageBuildResult(image, context.DiagnosticBag, tokenMapping));
        }