public unsafe void NativeResources()
        {
            var peStream        = new MemoryStream();
            var ilBuilder       = new BlobBuilder();
            var metadataBuilder = new MetadataBuilder();

            var peBuilder = new ManagedPEBuilder(
                PEHeaderBuilder.CreateLibraryHeader(),
                new MetadataRootBuilder(metadataBuilder),
                ilBuilder,
                nativeResources: new TestResourceSectionBuilder(),
                deterministicIdProvider: content => s_contentId);

            var peBlob = new BlobBuilder();

            var contentId = peBuilder.Serialize(peBlob);

            peBlob.WriteContentTo(peStream);

            peStream.Position = 0;
            var peReader      = new PEReader(peStream);
            var sectionHeader = peReader.PEHeaders.SectionHeaders.Single(s => s.Name == ".rsrc");

            var image = peReader.GetEntireImage();

            var reader = new BlobReader(image.Pointer + sectionHeader.PointerToRawData, sectionHeader.SizeOfRawData);

            Assert.Equal(0x12345678, reader.ReadInt32());
            Assert.Equal(sectionHeader.PointerToRawData, reader.ReadInt32());
            Assert.Equal(sectionHeader.VirtualAddress, reader.ReadInt32());
        }
Example #2
0
        private static void WritePEImage(
            Stream peStream,
            MetadataBuilder metadataBuilder,
            BlobBuilder ilBuilder,
            MethodDefinitionHandle entryPointHandle,
            Blob mvidFixup       = default(Blob),
            byte[] privateKeyOpt = null)
        {
            var peBuilder = new ManagedPEBuilder(
                entryPointHandle.IsNil ? PEHeaderBuilder.CreateLibraryHeader() : PEHeaderBuilder.CreateExecutableHeader(),
                new MetadataRootBuilder(metadataBuilder),
                ilBuilder,
                entryPoint: entryPointHandle,
                flags: CorFlags.ILOnly | (privateKeyOpt != null ? CorFlags.StrongNameSigned : 0),
                deterministicIdProvider: content => s_contentId);

            var peBlob = new BlobBuilder();

            var contentId = peBuilder.Serialize(peBlob);

            if (!mvidFixup.IsDefault)
            {
                new BlobWriter(mvidFixup).WriteGuid(contentId.Guid);
            }

            if (privateKeyOpt != null)
            {
                peBuilder.Sign(peBlob, content => SigningUtilities.CalculateRsaSignature(content, privateKeyOpt));
            }

            peBlob.WriteContentTo(peStream);
        }
        public void ValidateFactoryMethods()
        {
            var peHeaderExe = PEHeaderBuilder.CreateExecutableHeader();

            Assert.NotNull(peHeaderExe);
            Assert.True((peHeaderExe.ImageCharacteristics & Characteristics.ExecutableImage) != 0);

            var peHeaderLib = PEHeaderBuilder.CreateLibraryHeader();

            Assert.NotNull(peHeaderLib);
            Assert.True((peHeaderLib.ImageCharacteristics & Characteristics.ExecutableImage) != 0);
            Assert.True((peHeaderLib.ImageCharacteristics & Characteristics.Dll) != 0);
        }
Example #4
0
        public void EmitToStream(Stream stream)
        {
            foreach (var typeDef in _emittedTypes)
            {
                MethodDefinitionHandle?firstMethodHandle = null;

                foreach (var methodDef in typeDef.Methods)
                {
                    int bodyOffset = _methodBodyStream.AddMethodBody(methodDef.Code);

                    BlobHandle signature = MakeSignatureHandle(methodDef.Signature);

                    MethodDefinitionHandle methodHandle = _metadataBuilder.AddMethodDefinition(
                        MethodAttributes.PrivateScope | MethodAttributes.Static,
                        MethodImplAttributes.IL | MethodImplAttributes.Managed,
                        _metadataBuilder.GetOrAddString(methodDef.Name),
                        signature,
                        bodyOffset,
                        parameterList: default(ParameterHandle));

                    if (firstMethodHandle == null)
                    {
                        firstMethodHandle = methodHandle;
                    }
                }

                _metadataBuilder.AddTypeDefinition(
                    default(TypeAttributes),
                    default(StringHandle),
                    _metadataBuilder.GetOrAddString(typeDef.Name),
                    typeDef.IsValueType ?
                    MakeTypeRefHandle(_typeSystemContext.GetWellKnownType(WellKnownType.ValueType)) :
                    MakeTypeRefHandle(_typeSystemContext.GetWellKnownType(WellKnownType.Object)),
                    fieldList: MetadataTokens.FieldDefinitionHandle(1),
                    methodList: firstMethodHandle.Value);
            }

            BlobBuilder peBlob = new BlobBuilder();

            new ManagedPEBuilder(PEHeaderBuilder.CreateLibraryHeader(), new MetadataRootBuilder(_metadataBuilder), _methodBodyStream.Builder).Serialize(peBlob);

            peBlob.WriteContentTo(stream);

            // Clear some variables to catch any caller trying to emit data after writing the output file
            _emittedTypes     = null;
            _metadataBuilder  = null;
            _methodBodyStream = default(MethodBodyStreamEncoder);
        }
Example #5
0
        public void BlahBlahBlah()
        {
            var peHeader = PEHeaderBuilder.CreateLibraryHeader();

            var meta = new MetadataBuilder();

            var module = meta.AddModule(1,
                                        meta.GetOrAddString("Module1"),
                                        meta.GetOrAddGuid(Guid.Parse("11112222-3333-4444-5555-666677778888")),
                                        meta.GetOrAddGuid(Guid.Parse("88887777-6666-5555-4444-333322221111")),
                                        meta.GetOrAddGuid(Guid.Parse("22223333-4444-5555-6666-777788889999"))
                                        );

            var tObject = meta.AddTypeReference(
                EntityHandle.ModuleDefinition,
                meta.GetOrAddString("System"),
                meta.GetOrAddString("Object"));

            var fields  = new FieldDefinitionHandle();  //EMPTY!!
            var methods = new MethodDefinitionHandle(); //EMPTY!!

            meta.AddTypeDefinition(
                TypeAttributes.Class | TypeAttributes.Public,
                meta.GetOrAddString("Namespace1"),
                meta.GetOrAddString("Class1"),
                tObject,
                fields,
                methods);

            meta.GetOrAddString("Module1");



            var metadataRoot = new MetadataRootBuilder(meta);

            var ilBlob = new BlobBuilder();

            ilBlob.WriteByte(0);
            ilBlob.WriteByte(42);

            var pe = new ManagedPEBuilder(peHeader, metadataRoot, ilBlob);

            var blob = new BlobBuilder();

            pe.Serialize(blob);

            Assembly.Load(blob.ToArray());
        }
        public unsafe void NativeResources_BadImpl()
        {
            var peStream        = new MemoryStream();
            var ilBuilder       = new BlobBuilder();
            var metadataBuilder = new MetadataBuilder();

            var peBuilder = new ManagedPEBuilder(
                PEHeaderBuilder.CreateLibraryHeader(),
                new MetadataRootBuilder(metadataBuilder),
                ilBuilder,
                nativeResources: new BadResourceSectionBuilder(),
                deterministicIdProvider: content => s_contentId);

            var peBlob = new BlobBuilder();

            Assert.Throws <NotImplementedException>(() => peBuilder.Serialize(peBlob));
        }
Example #7
0
        public static byte[] BuildPEWithDebugDirectory(DebugDirectoryBuilder debugDirectoryBuilder)
        {
            var peStream        = new MemoryStream();
            var ilBuilder       = new BlobBuilder();
            var metadataBuilder = new MetadataBuilder();

            var peBuilder = new ManagedPEBuilder(
                PEHeaderBuilder.CreateLibraryHeader(),
                new MetadataRootBuilder(metadataBuilder),
                ilBuilder,
                debugDirectoryBuilder: debugDirectoryBuilder);

            var peImageBuilder = new BlobBuilder();

            peBuilder.Serialize(peImageBuilder);
            return(peImageBuilder.ToArray());
        }
            public override ConstraintResult ApplyTo <TActual>(TActual actual)
            {
                string actualContract;

                switch (actual)
                {
                case string sourceCode:
                    actualContract = isVisualBasic
                            ? AssemblyUtils.GenerateContract(generator, sourceCode, Microsoft.CodeAnalysis.VisualBasic.LanguageVersion.Latest, assemblyResolver)
                            : AssemblyUtils.GenerateContract(generator, sourceCode, Microsoft.CodeAnalysis.CSharp.LanguageVersion.Latest, assemblyResolver);
                    break;

                case Compilation compilation:
                    using (var stream = new MemoryStream())
                    {
                        AssemblyUtils.EmitCompilation(compilation, stream);
                        stream.Seek(0, SeekOrigin.Begin);
                        actualContract = AssemblyUtils.GenerateContract(generator, stream, assemblyResolver);
                    }
                    break;

                case MetadataBuilder metadataBuilder:
                    var blobBuilder = new BlobBuilder();

                    var peBuilder = new ManagedPEBuilder(
                        PEHeaderBuilder.CreateLibraryHeader(),
                        new MetadataRootBuilder(metadataBuilder),
                        ilStream: new BlobBuilder());

                    peBuilder.Serialize(blobBuilder);

                    using (var stream = new MemoryStream(blobBuilder.ToArray(), writable: false))
                        actualContract = AssemblyUtils.GenerateContract(generator, stream, assemblyResolver);
                    break;

                default:
                    throw new ArgumentException("Expected source code as string or library IL as MetadataBuilder.", nameof(actual));
                }

                return(new ContractConstraintResult(this, actualContract, expected));
            }
Example #9
0
        private static void WritePEImage(
            Stream peStream,
            MetadataBuilder metadataBuilder,
            BlobBuilder ilBuilder,
            MethodDefinitionHandle entryPointHandle,
            byte[] privateKeyOpt = null)
        {
            var mappedFieldDataBuilder     = new BlobBuilder();
            var managedResourceDataBuilder = new BlobBuilder();

            var peBuilder = new ManagedPEBuilder(
                entryPointHandle.IsNil ? PEHeaderBuilder.CreateLibraryHeader() : PEHeaderBuilder.CreateExecutableHeader(),
                new TypeSystemMetadataSerializer(metadataBuilder, "v4.0.30319", isMinimalDelta: false),
                ilBuilder,
                mappedFieldDataBuilder,
                managedResourceDataBuilder,
                nativeResourceSectionSerializer: null,
                strongNameSignatureSize: 128,
                entryPoint: entryPointHandle,
                pdbPathOpt: null,
                nativePdbContentId: default(ContentId),
                portablePdbContentId: default(ContentId),
                corFlags: CorFlags.ILOnly | (privateKeyOpt != null ? CorFlags.StrongNameSigned : 0),
                deterministicIdProvider: content => s_contentId);

            var peBlob = new BlobBuilder();

            ContentId contentId;

            peBuilder.Serialize(peBlob, out contentId);

            if (privateKeyOpt != null)
            {
                peBuilder.Sign(peBlob, content => SigningUtilities.CalculateRsaSignature(content, privateKeyOpt));
            }

            peBlob.WriteContentTo(peStream);
        }
        public byte[] GenerateAssemblyBytes()
        {
            var name = _currentAssembly.GetName();

            var assemblyHandle = _metadataBuilder.AddAssembly(
                GetString(name.Name),
                name.Version,
                GetString(name.CultureName),
                GetBlob(name.GetPublicKey()),
                _assemblyNameFlagsConvert(name.Flags),
                _assemblyHashAlgorithmConvert(name.HashAlgorithm));

            CreateReferencedAssemblies(_currentAssembly.GetReferencedAssemblies());
            CreateCustomAttributes(assemblyHandle, _currentAssembly.GetCustomAttributesData());

            CreateModules(_currentAssembly.GetModules());
            CreateTypes(_currentAssembly.GetTypes());

            var entryPoint = GetMethodDefinitionHandle(_currentAssembly.EntryPoint);


            var metadataRootBuilder = new MetadataRootBuilder(_metadataBuilder);
            var header = PEHeaderBuilder.CreateLibraryHeader();

            var peBuilder = new ManagedPEBuilder(
                header,
                metadataRootBuilder,
                _ilBuilder,
                debugDirectoryBuilder: _debugDirectoryBuilder,
                entryPoint: entryPoint);

            var peImageBuilder = new BlobBuilder();

            peBuilder.Serialize(peImageBuilder);

            return(peImageBuilder.ToArray());
        }