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(); }
/// <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))); }
/// <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); }
/// <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); }
/// <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())); }
/// <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());
/// <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())); }