Exemple #1
0
        private static CallingConventionSignature ReadSignature(
            ModuleDefinition module,
            IBinaryStreamReader reader,
            RecursionProtection protection)
        {
            byte flag = reader.ReadByte();

            reader.FileOffset--;

            switch ((CallingConventionAttributes)flag & SignatureTypeMask)
            {
            case CallingConventionAttributes.Default:
            case CallingConventionAttributes.C:
            case CallingConventionAttributes.ExplicitThis:
            case CallingConventionAttributes.FastCall:
            case CallingConventionAttributes.StdCall:
            case CallingConventionAttributes.ThisCall:
            case CallingConventionAttributes.VarArg:
                return(MethodSignature.FromReader(module, reader, protection));

            case CallingConventionAttributes.Property:
                return(PropertySignature.FromReader(module, reader, protection));

            case CallingConventionAttributes.Local:
                return(LocalVariablesSignature.FromReader(module, reader, protection));

            case CallingConventionAttributes.GenericInstance:
                return(GenericInstanceMethodSignature.FromReader(module, reader, protection));

            case CallingConventionAttributes.Field:
                return(FieldSignature.FromReader(module, reader, protection));
            }

            throw new NotSupportedException();
        }
Exemple #2
0
 /// <summary>
 /// Reads a single field signature from an input stream.
 /// </summary>
 /// <param name="module">The module containing the signature.</param>
 /// <param name="reader">The blob input stream.</param>
 /// <param name="protection">The object responsible for detecting infinite recursion.</param>
 /// <returns>The field signature.</returns>
 public static FieldSignature FromReader(ModuleDefinition module, IBinaryStreamReader reader,
                                         RecursionProtection protection)
 {
     return(new FieldSignature(
                (CallingConventionAttributes)reader.ReadByte(),
                TypeSignature.FromReader(module, reader, protection)));
 }
Exemple #3
0
        /// <summary>
        /// Reads a single calling convention signature at the current position of the provided stream reader.
        /// </summary>
        /// <param name="module">The module the signature is defined in.</param>
        /// <param name="reader">The reader to use.</param>
        /// <param name="readToEnd">Determines whether any extra data after the signature should be read and
        /// put into the <see cref="ExtendableBlobSignature.ExtraData"/> property.</param>
        /// <param name="protection">The recursion protection that is used to detect malicious loops in the metadata.</param>
        /// <returns>The read signature.</returns>
        public static CallingConventionSignature FromReader(
            ModuleDefinition module,
            IBinaryStreamReader reader,
            bool readToEnd,
            RecursionProtection protection)
        {
            var signature = ReadSignature(module, reader, protection);

            if (readToEnd)
            {
                signature.ExtraData = reader.ReadToEnd();
            }
            return(signature);
        }
        /// <summary>
        /// Reads a single property signature from an input stream.
        /// </summary>
        /// <param name="module">The module containing the signature.</param>
        /// <param name="reader">The blob input stream.</param>
        /// <param name="protection">The object responsible for detecting infinite recursion.</param>
        /// <returns>The property signature.</returns>
        public static PropertySignature FromReader(ModuleDefinition module, IBinaryStreamReader reader,
                                                   RecursionProtection protection)
        {
            var attributes = (CallingConventionAttributes)reader.ReadByte();

            if ((attributes & CallingConventionAttributes.Property) == 0)
            {
                throw new FormatException("Input stream does not point to a valid property signature.");
            }

            var result = new PropertySignature(attributes);

            result.ReadParametersAndReturnType(module, reader, protection);
            return(result);
        }
        /// <summary>
        /// Reads a single method signature from an input stream.
        /// </summary>
        /// <param name="module">The module containing the signature.</param>
        /// <param name="reader">The blob input stream.</param>
        /// <param name="protection">The object responsible for detecting infinite recursion.</param>
        /// <returns>The method signature.</returns>
        public static MethodSignature FromReader(ModuleDefinition module, IBinaryStreamReader reader,
                                                 RecursionProtection protection)
        {
            var result = new MethodSignature((CallingConventionAttributes)reader.ReadByte());

            // Generic parameter count.
            if (result.IsGeneric)
            {
                if (!reader.TryReadCompressedUInt32(out uint genericParameterCount))
                {
                    return(result);
                }
                result.GenericParameterCount = (int)genericParameterCount;
            }

            result.ReadParametersAndReturnType(module, reader, protection);
            return(result);
        }
Exemple #6
0
        /// <summary>
        /// Reads a single local variables signature from the provided input stream.
        /// </summary>
        /// <param name="parentModule">The module containing the signature.</param>
        /// <param name="reader">The input stream.</param>
        /// <param name="protection">The object responsible for detecting infinite recursion.</param>
        /// <returns>The signature.</returns>
        public static LocalVariablesSignature FromReader(ModuleDefinition parentModule, IBinaryStreamReader reader, RecursionProtection protection)
        {
            var result = new LocalVariablesSignature();

            result.Attributes = (CallingConventionAttributes)reader.ReadByte();

            if (!reader.TryReadCompressedUInt32(out uint count))
            {
                return(result);
            }

            for (int i = 0; i < count; i++)
            {
                result.VariableTypes.Add(TypeSignature.FromReader(parentModule, reader, protection));
            }

            return(result);
        }
Exemple #7
0
 /// <summary>
 /// Reads a single local variables signature from the provided input stream.
 /// </summary>
 /// <param name="parentModule">The module containing the signature.</param>
 /// <param name="reader">The input stream.</param>
 /// <returns>The signature.</returns>
 public static LocalVariablesSignature FromReader(ModuleDefinition parentModule, IBinaryStreamReader reader)
 {
     return(FromReader(parentModule, reader, RecursionProtection.CreateNew()));
 }
        internal static GenericInstanceMethodSignature FromReader(ModuleDefinition parentModule,
                                                                  IBinaryStreamReader reader, RecursionProtection protection)
        {
            if (!reader.CanRead(sizeof(byte)))
            {
                return(null);
            }

            var attributes = (CallingConventionAttributes)reader.ReadByte();
            var result     = new GenericInstanceMethodSignature(attributes);

            if (!reader.TryReadCompressedUInt32(out uint count))
            {
                return(result);
            }

            for (int i = 0; i < count; i++)
            {
                result.TypeArguments.Add(TypeSignature.FromReader(parentModule, reader, protection));
            }

            return(result);
        }
 internal static GenericInstanceMethodSignature FromReader(ModuleDefinition parentModule,
                                                           IBinaryStreamReader reader)
 {
     return(FromReader(parentModule, reader, RecursionProtection.CreateNew()));
 }
Exemple #10
0
 /// <summary>
 /// Reads a single field signature from an input stream.
 /// </summary>
 /// <param name="module">The module containing the signature.</param>
 /// <param name="reader">The blob input stream.</param>
 /// <returns>The field signature.</returns>
 public static FieldSignature FromReader(ModuleDefinition module, IBinaryStreamReader reader) =>
 FromReader(module, reader, RecursionProtection.CreateNew());
Exemple #11
0
 /// <summary>
 /// Reads a single calling convention signature at the current position of the provided stream reader.
 /// </summary>
 /// <param name="module">The module the signature is defined in.</param>
 /// <param name="reader">The reader to use.</param>
 /// <param name="readToEnd">Determines whether any extra data after the signature should be read and
 /// put into the <see cref="ExtendableBlobSignature.ExtraData"/> property.</param>
 /// <returns>The read signature.</returns>
 public static CallingConventionSignature FromReader(ModuleDefinition module, IBinaryStreamReader reader,
                                                     bool readToEnd = false)
 {
     return(FromReader(module, reader, readToEnd, RecursionProtection.CreateNew()));
 }