コード例 #1
0
        private static TypeSignature ReadTypeSignature(
            MetadataImage image,
            IBinaryStreamReader reader,
            RecursionProtection protection)
        {
            var elementType = (ElementType)reader.ReadByte();

            switch (elementType)
            {
            case ElementType.Array:
                return(ArrayTypeSignature.FromReader(image, reader, protection));

            case ElementType.Boxed:
                return(BoxedTypeSignature.FromReader(image, reader, protection));

            case ElementType.ByRef:
                return(ByReferenceTypeSignature.FromReader(image, reader, protection));

            case ElementType.CModOpt:
                return(OptionalModifierSignature.FromReader(image, reader, protection));

            case ElementType.CModReqD:
                return(RequiredModifierSignature.FromReader(image, reader, protection));

            case ElementType.Class:
                return(TypeDefOrRefSignature.FromReader(image, reader, protection));

            case ElementType.FnPtr:
                return(FunctionPointerTypeSignature.FromReader(image, reader, protection));

            case ElementType.GenericInst:
                return(GenericInstanceTypeSignature.FromReader(image, reader, protection));

            case ElementType.MVar:
                return(GenericParameterSignature.FromReader(image, reader, GenericParameterType.Method));

            case ElementType.Pinned:
                return(PinnedTypeSignature.FromReader(image, reader, protection));

            case ElementType.Ptr:
                return(PointerTypeSignature.FromReader(image, reader, protection));

            case ElementType.Sentinel:
                return(SentinelTypeSignature.FromReader(image, reader, protection));

            case ElementType.SzArray:
                return(SzArrayTypeSignature.FromReader(image, reader, protection));

            case ElementType.ValueType:
                var type = TypeDefOrRefSignature.FromReader(image, reader, protection);
                type.IsValueType = true;
                return(type);

            case ElementType.Var:
                return(GenericParameterSignature.FromReader(image, reader, GenericParameterType.Type));

            default:
                return(MsCorLibTypeSignature.FromElementType(image, elementType));
            }
        }
コード例 #2
0
 public static ParameterSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     return(new ParameterSignature
     {
         ParameterType = TypeSignature.FromReader(header, reader),
     });
 }
コード例 #3
0
        public static CustomAttributeArgument FromReader(MetadataHeader header, TypeSignature typeSignature, IBinaryStreamReader reader)
        {
            var signature = new CustomAttributeArgument()
            {
                StartOffset = reader.Position,
                ArgumentType = typeSignature
            };

            if (typeSignature.ElementType != ElementType.SzArray)
            {
                signature.Elements.Add(ElementSignature.FromReader(header, typeSignature, reader));
            }
            else
            {
                var arrayType = ((SzArrayTypeSignature)typeSignature).BaseType;

                var elementCount = reader.CanRead(sizeof (uint)) ? reader.ReadUInt32() : uint.MaxValue;
                if (elementCount != uint.MaxValue)
                {
                    for (uint i = 0; i < elementCount; i++)
                    {
                        signature.Elements.Add(ElementSignature.FromReader(header, arrayType, reader));
                    }
                }
            }

            return signature;
        }
コード例 #4
0
        /// <summary>
        /// Reads a single custom attribute argument at the current position of the provided stream reader.
        /// </summary>
        /// <param name="image">The image the argument was defined in.</param>
        /// <param name="typeSignature">The type of the argument to read.</param>
        /// <param name="reader">The reader to use.</param>
        /// <returns>The read argument.</returns>
        public static CustomAttributeArgument FromReader(
            MetadataImage image,
            TypeSignature typeSignature,
            IBinaryStreamReader reader)
        {
            var signature = new CustomAttributeArgument
            {
                ArgumentType = typeSignature
            };

            if (typeSignature.ElementType != ElementType.SzArray)
            {
                signature.Elements.Add(ElementSignature.FromReader(image, typeSignature, reader));
            }
            else
            {
                var arrayType = ((SzArrayTypeSignature)typeSignature).BaseType;

                var elementCount = reader.CanRead(sizeof(uint)) ? reader.ReadUInt32() : uint.MaxValue;
                if (elementCount != uint.MaxValue)
                {
                    for (uint i = 0; i < elementCount; i++)
                    {
                        signature.Elements.Add(ElementSignature.FromReader(image, arrayType, reader));
                    }
                }
            }

            return(signature);
        }
コード例 #5
0
        public static CustomAttributeSignature FromReader(CustomAttribute parent, IBinaryStreamReader reader)
        {
            long position = reader.Position;

            if (!reader.CanRead(sizeof (ushort)) || reader.ReadUInt16() != 0x0001)
                throw new ArgumentException("Signature doesn't refer to a valid custom attribute signature.");

            var signature = new CustomAttributeSignature()
            {
                StartOffset = position,
            };

            if (parent.Constructor != null)
            {
                var methodSignature = parent.Constructor.Signature as MethodSignature;
                if (methodSignature != null)
                {
                    foreach (var parameter in methodSignature.Parameters)
                    {
                        signature.FixedArguments.Add(CustomAttributeArgument.FromReader(parent.Header,
                            parameter.ParameterType, reader));
                    }
                }
            }

            var namedElementCount = reader.CanRead(sizeof (ushort)) ? reader.ReadUInt16() : 0;
            for (uint i = 0; i < namedElementCount; i++)
            {
                signature.NamedArguments.Add(CustomAttributeNamedArgument.FromReader(parent.Header, reader));
            }

            return signature;
        }
コード例 #6
0
        public static new GenericInstanceTypeSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            if (!reader.CanRead(sizeof (byte)))
                return null;

            long position = reader.Position;

            var elementType = (ElementType)reader.ReadByte();

            var type = ReadTypeDefOrRef(header, reader);

            var signature = new GenericInstanceTypeSignature(type)
            {
                StartOffset = position,
                IsValueType = elementType == ElementType.ValueType
            };

            uint count;
            if (!reader.TryReadCompressedUInt32(out count))
                return signature;

            for (int i = 0; i < count; i++)
                signature.GenericArguments.Add(TypeSignature.FromReader(header, reader));

            return signature;
        }
コード例 #7
0
        public new static OptionalModifierSignature FromReader(MetadataImage image, IBinaryStreamReader reader)
        {
            long position = reader.Position;

            return(new OptionalModifierSignature(ReadTypeDefOrRef(image, reader),
                                                 TypeSignature.FromReader(image, reader)));
        }
コード例 #8
0
 /// <summary>
 /// Reads a single custom attribute row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the custom attribute table.</param>
 /// <returns>The row.</returns>
 public static CustomAttributeRow FromReader(IBinaryStreamReader reader, TableLayout layout)
 {
     return(new CustomAttributeRow(
                reader.ReadIndex((IndexSize)layout.Columns[0].Size),
                reader.ReadIndex((IndexSize)layout.Columns[1].Size),
                reader.ReadIndex((IndexSize)layout.Columns[2].Size)));
 }
コード例 #9
0
        /// <summary>
        /// Reads a single security attribute at the current position of the provided stream reader.
        /// </summary>
        /// <param name="image">The image the signature resides in.</param>
        /// <param name="reader">The reader to use.</param>
        /// <returns>The read attribute.</returns>
        public static SecurityAttributeSignature FromReader(MetadataImage image, IBinaryStreamReader reader)
        {
            var signature = new SecurityAttributeSignature
            {
                TypeName = reader.ReadSerString(),
            };

            reader.ReadCompressedUInt32();

            if (!reader.TryReadCompressedUInt32(out uint argumentCount))
            {
                return(signature);
            }

            if (argumentCount == 0)
            {
                return(signature);
            }

            for (int i = 0; i < argumentCount; i++)
            {
                signature.NamedArguments.Add(CustomAttributeNamedArgument.FromReader(image, reader));
            }

            return(signature);
        }
コード例 #10
0
ファイル: UserStringStream.cs プロジェクト: xuhaoa/WinPIT
        protected string ReadString(IBinaryStreamReader reader)
        {
            var offset = (uint)(reader.Position - reader.StartPosition);

            string value;

            if (_cachedStrings.TryGetValue(offset, out value))
            {
                reader.Position += 1 + Encoding.Unicode.GetByteCount(value) + 1;
            }
            else
            {
                var length = reader.ReadCompressedUInt32();
                if (length <= 0)
                {
                    return(string.Empty);
                }

                value = Encoding.Unicode.GetString(reader.ReadBytes((int)length - 1));
                reader.Position++;

                _cachedStrings.Add(offset, value);
            }

            return(value);
        }
コード例 #11
0
        /// <summary>
        /// Reads a module import entry from an input stream.
        /// </summary>
        /// <param name="context">The reader context.</param>
        /// <param name="reader">The input stream.</param>
        public SerializedImportedModule(PEReaderContext context, IBinaryStreamReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            _context = context ?? throw new ArgumentNullException(nameof(context));

            _lookupRva     = reader.ReadUInt32();
            TimeDateStamp  = reader.ReadUInt32();
            ForwarderChain = reader.ReadUInt32();
            uint nameRva = reader.ReadUInt32();

            _addressRva = reader.ReadUInt32();

            if (nameRva != 0)
            {
                if (_context.File.TryCreateReaderAtRva(nameRva, out var nameReader))
                {
                    Name = nameReader.ReadAsciiString();
                }
                else
                {
                    _context.BadImage("Import module contains an invalid name RVA.");
                }
            }
        }
コード例 #12
0
        public static PermissionSetSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            var signature = new PermissionSetSignature()
            {
                StartOffset = reader.Position
            };

            var signatureHeader = reader.ReadByte();

            if (signatureHeader != '.')
            {
                throw new ArgumentException("Signature doesn't refer to a valid permission set signature.");
            }

            uint attributeCount;

            if (!reader.TryReadCompressedUInt32(out attributeCount))
            {
                return(signature);
            }

            for (int i = 0; i < attributeCount; i++)
            {
                signature.Attributes.Add(SecurityAttributeSignature.FromReader(header, reader));
            }
            return(signature);
        }
コード例 #13
0
        /// <summary>
        /// Reads a new resource directory entry from the reader.
        /// </summary>
        /// <param name="context">The containing PE file.</param>
        /// <param name="reader">The input stream to read from.</param>
        public ResourceDirectoryEntry(PEReaderContext context, IBinaryStreamReader reader)
        {
            _idOrNameOffset     = reader.ReadUInt32();
            _dataOrSubDirOffset = reader.ReadUInt32();
            Name = null;

            if (IsByName)
            {
                uint baseRva = context.File.OptionalHeader
                               .GetDataDirectory(DataDirectoryIndex.ResourceDirectory)
                               .VirtualAddress;

                if (!context.File.TryCreateReaderAtRva(baseRva + IdOrNameOffset, out var nameReader))
                {
                    context.Parameters.ErrorListener.BadImage("Resource directory entry contains an invalid name RVA.");
                    return;
                }

                int length = nameReader.ReadUInt16() * 2;
                var data   = new byte[length];
                length = nameReader.ReadBytes(data, 0, length);

                Name = Encoding.Unicode.GetString(data, 0, length);
            }
        }
コード例 #14
0
 /// <summary>
 /// Reads a single field definition row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the field definition table.</param>
 /// <returns>The row.</returns>
 public static FieldDefinitionRow FromReader(IBinaryStreamReader reader, TableLayout layout)
 {
     return(new FieldDefinitionRow(
                (FieldAttributes)reader.ReadUInt16(),
                reader.ReadIndex((IndexSize)layout.Columns[1].Size),
                reader.ReadIndex((IndexSize)layout.Columns[2].Size)));
 }
コード例 #15
0
ファイル: AssemblyOSRow.cs プロジェクト: nuesoss/AsmResolver
 /// <summary>
 /// Reads a single assembly operating system row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the assembly operating system table.</param>
 /// <returns>The row.</returns>
 public static AssemblyOSRow FromReader(IBinaryStreamReader reader, TableLayout layout)
 {
     return(new AssemblyOSRow(
                reader.ReadUInt32(),
                reader.ReadUInt32(),
                reader.ReadUInt32()));
 }
コード例 #16
0
ファイル: DosHeader.cs プロジェクト: nuesoss/AsmResolver
        /// <summary>
        /// Reads a DOS header structure at the current position of the provided input stream.
        /// </summary>
        /// <param name="reader">The input stream to read from.</param>
        /// <returns>The read DOS header.</returns>
        /// <exception cref="BadImageFormatException">Occurs when the input stream does not point to a valid DOS header.</exception>
        public static DosHeader FromReader(IBinaryStreamReader reader)
        {
            ulong offset = reader.Offset;
            uint  rva    = reader.Rva;

            var stub = new byte[DefaultNewHeaderOffset];

            ushort magic = reader.ReadUInt16();

            if (magic != ValidPEMagic)
            {
                throw new BadImageFormatException();
            }

            reader.Offset += NextHeaderFieldOffset - 2;
            uint nextHeaderOffset = reader.ReadUInt32();

            if (nextHeaderOffset != DefaultNewHeaderOffset)
            {
                Array.Resize(ref stub, (int)nextHeaderOffset);
            }

            reader.Offset -= NextHeaderFieldOffset + 4;
            reader.ReadBytes(stub, 0, stub.Length);

            return(new DosHeader(stub)
            {
                Offset = offset,
                Rva = rva,
                NextHeaderOffset = nextHeaderOffset
            });
        }
        /// <summary>
        /// Reads a .NET directory from an input stream.
        /// </summary>
        /// <param name="peFile">The PE file containing the .NET directory.</param>
        /// <param name="reader">The input stream.</param>
        /// <param name="metadataStreamReader"></param>
        /// <exception cref="ArgumentNullException">Occurs when any of the arguments are <c>null</c>.</exception>
        public SerializedDotNetDirectory(IPEFile peFile, IBinaryStreamReader reader,
                                         IMetadataStreamReader metadataStreamReader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }
            _peFile = peFile ?? throw new ArgumentNullException(nameof(peFile));
            _metadataStreamReader = metadataStreamReader;

            Offset = reader.Offset;

            uint cb = reader.ReadUInt32();

            MajorRuntimeVersion = reader.ReadUInt16();
            MinorRuntimeVersion = reader.ReadUInt16();
            _metadataDirectory  = DataDirectory.FromReader(reader);
            Flags                  = (DotNetDirectoryFlags)reader.ReadUInt32();
            Entrypoint             = reader.ReadUInt32();
            _resourcesDirectory    = DataDirectory.FromReader(reader);
            _strongNameDirectory   = DataDirectory.FromReader(reader);
            _codeManagerDirectory  = DataDirectory.FromReader(reader);
            _vtableFixupsDirectory = DataDirectory.FromReader(reader);
            _exportsDirectory      = DataDirectory.FromReader(reader);
            _nativeHeaderDirectory = DataDirectory.FromReader(reader);
        }
コード例 #18
0
        public new static CilRawFatMethodBody FromReader(IBinaryStreamReader reader)
        {
            var body = new CilRawFatMethodBody
            {
                _header  = reader.ReadUInt16(),
                MaxStack = reader.ReadUInt16()
            };

            int codeSize = reader.ReadInt32();

            body.LocalVarSigToken = reader.ReadUInt32();

            body.Code = reader.ReadBytes(codeSize);

            if (body.HasSections)
            {
                reader.Align(4);

                CilExtraSection section;
                do
                {
                    section = CilExtraSection.FromReader(reader);
                    body.ExtraSections.Add(section);
                } while (section.HasMoreSections);
            }

            return(body);
        }
コード例 #19
0
        public static ExceptionHandler FromReader(MethodBody methodBody, IBinaryStreamReader reader, bool fatFormat)
        {
            var offset                   = reader.Position;
            var handerType               = fatFormat ? reader.ReadUInt32() : reader.ReadUInt16();
            var tryOffset                = fatFormat ? reader.ReadInt32() : reader.ReadUInt16();
            var tryLength                = fatFormat ? reader.ReadInt32() : reader.ReadByte();
            var handlerOffset            = fatFormat ? reader.ReadInt32() : reader.ReadUInt16();
            var handlerLength            = fatFormat ? reader.ReadInt32() : reader.ReadByte();
            var classTokenOrFilterOffset = reader.ReadUInt32();

            var handler = new ExceptionHandler((ExceptionHandlerType)handerType)
            {
                StartOffset  = offset,
                IsFat        = fatFormat,
                MethodBody   = methodBody,
                TryStart     = methodBody.GetInstructionByOffset(tryOffset),
                TryEnd       = methodBody.GetInstructionByOffset(tryOffset + tryLength),
                HandlerStart = methodBody.GetInstructionByOffset(handlerOffset),
                HandlerEnd   = methodBody.GetInstructionByOffset(handlerOffset + handlerLength),
            };

            switch (handler.HandlerType)
            {
            case ExceptionHandlerType.Exception:
                handler.CatchType = (ITypeDefOrRef)((IOperandResolver)methodBody).ResolveMember(new MetadataToken(classTokenOrFilterOffset));
                break;

            case ExceptionHandlerType.Filter:
                handler.FilterStart = methodBody.GetInstructionByOffset((int)classTokenOrFilterOffset);
                break;
            }

            return(handler);
        }
コード例 #20
0
 /// <summary>
 /// Reads a single pinned type signature at the current position of the provided stream reader.
 /// </summary>
 /// <param name="image">The image the signature resides in.</param>
 /// <param name="reader">The reader to use.</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 PinnedTypeSignature FromReader(
     MetadataImage image,
     IBinaryStreamReader reader,
     RecursionProtection protection)
 {
     return(new PinnedTypeSignature(TypeSignature.FromReader(image, reader, false, protection)));
 }
コード例 #21
0
        /// <summary>
        /// Reads a single generic instance type signature at the current position of the provided stream reader.
        /// </summary>
        /// <param name="image">The image the signature was defined in.</param>
        /// <param name="reader">The reader to use.</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 GenericInstanceTypeSignature FromReader(
            MetadataImage image,
            IBinaryStreamReader reader,
            RecursionProtection protection)
        {
            if (!reader.CanRead(sizeof(byte)))
            {
                return(null);
            }

            var elementType = (ElementType)reader.ReadByte();
            var type        = ReadTypeDefOrRef(image, reader, protection);

            var signature = new GenericInstanceTypeSignature(type)
            {
                IsValueType = elementType == ElementType.ValueType
            };

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

            for (int i = 0; i < count; i++)
            {
                signature.GenericArguments.Add(TypeSignature.FromReader(image, reader, false, protection));
            }

            return(signature);
        }
コード例 #22
0
ファイル: TypeSignature.cs プロジェクト: JerreS/AsmResolver
 public static TypeSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     long position = reader.Position;
     var signature = ReadTypeSignature(header, reader);
     signature.StartOffset = position;
     return signature;
 }
コード例 #23
0
ファイル: X86Disassembler.cs プロジェクト: JerreS/AsmResolver
 public X86Disassembler(IBinaryStreamReader reader, long baseAddress)
 {
     if (reader == null)
         throw new ArgumentNullException("reader");
     _reader = reader;
     BaseAddress = baseAddress;
 }
コード例 #24
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)));
 }
コード例 #25
0
ファイル: MethodSignature.cs プロジェクト: JerreS/AsmResolver
        public static new MethodSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            if (!reader.CanRead(sizeof (byte)))
                return null;

            var signature = new MethodSignature
            {
                StartOffset = reader.Position,
                Attributes = (CallingConventionAttributes)reader.ReadByte()
            };

            if (signature.IsGeneric)
            {
                uint genericParameterCount;
                if (!reader.TryReadCompressedUInt32(out genericParameterCount))
                    return signature;
                signature.GenericParameterCount = (int)genericParameterCount;
            }

            uint parameterCount;
            if (!reader.TryReadCompressedUInt32(out parameterCount))
                return signature;

            signature.ReturnType = TypeSignature.FromReader(header, reader);
            for (int i = 0; i < parameterCount; i++)
            {
                signature.Parameters.Add(ParameterSignature.FromReader(header, reader));
            }

            return signature;
        }
コード例 #26
0
        public static CustomAttributeSignature FromReader(CustomAttribute parent, IBinaryStreamReader reader)
        {
            if (!reader.CanRead(sizeof(ushort)) || reader.ReadUInt16() != 0x0001)
            {
                throw new ArgumentException("Signature doesn't refer to a valid custom attribute signature.");
            }

            var signature = new CustomAttributeSignature();

            if (parent.Constructor != null)
            {
                var methodSignature = parent.Constructor.Signature as MethodSignature;
                if (methodSignature != null)
                {
                    foreach (var parameter in methodSignature.Parameters)
                    {
                        signature.FixedArguments.Add(CustomAttributeArgument.FromReader(parent.Image, parameter.ParameterType, reader));
                    }
                }
            }

            var namedElementCount = reader.CanRead(sizeof(ushort)) ? reader.ReadUInt16() : 0;

            for (uint i = 0; i < namedElementCount; i++)
            {
                signature.NamedArguments.Add(CustomAttributeNamedArgument.FromReader(parent.Image, reader));
            }

            return(signature);
        }
コード例 #27
0
        public static CallingConventionSignature FromReader(MetadataImage image, IBinaryStreamReader reader)
        {
            var flag = reader.ReadByte();

            reader.Position--;

            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(image, reader));

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

            case CallingConventionAttributes.Local:
                return(LocalVariableSignature.FromReader(image, reader));

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

            case CallingConventionAttributes.Field:
                return(FieldSignature.FromReader(image, reader));
            }
            throw new NotSupportedException();
        }
コード例 #28
0
 /// <summary>
 /// Reads a single file row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the file table.</param>
 /// <returns>The row.</returns>
 public static FileReferenceRow FromReader(IBinaryStreamReader reader, TableLayout layout)
 {
     return(new FileReferenceRow(
                (FileAttributes)reader.ReadUInt32(),
                reader.ReadIndex((IndexSize)layout.Columns[1].Size),
                reader.ReadIndex((IndexSize)layout.Columns[2].Size)));
 }
コード例 #29
0
ファイル: ClassLayoutRow.cs プロジェクト: nuesoss/AsmResolver
 /// <summary>
 /// Reads a single class layout row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the class layout table.</param>
 /// <returns>The row.</returns>
 public static ClassLayoutRow FromReader(IBinaryStreamReader reader, TableLayout layout)
 {
     return(new ClassLayoutRow(
                reader.ReadUInt16(),
                reader.ReadUInt32(),
                reader.ReadIndex((IndexSize)layout.Columns[2].Size)));
 }
コード例 #30
0
 /// <summary>
 /// Reads a single security declaration row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the security declaration table.</param>
 /// <returns>The row.</returns>
 public static SecurityDeclarationRow FromReader(IBinaryStreamReader reader, TableLayout layout)
 {
     return(new SecurityDeclarationRow(
                (SecurityAction)reader.ReadUInt16(),
                reader.ReadIndex((IndexSize)layout.Columns[1].Size),
                reader.ReadIndex((IndexSize)layout.Columns[2].Size)));
 }
コード例 #31
0
        /// <summary>
        /// Reads a version resource from an input stream.
        /// </summary>
        /// <param name="reader">The input stream.</param>
        /// <returns>The parsed version resource.</returns>
        /// <exception cref="FormatException">
        /// Occurs when the input stream does not point to a valid version resource.
        /// </exception>
        public static VersionInfoResource FromReader(IBinaryStreamReader reader)
        {
            uint start = reader.FileOffset;

            // Read header.
            var header = VersionTableEntryHeader.FromReader(reader);

            if (header.Key != VsVersionInfoKey)
            {
                throw new FormatException($"Input stream does not point to a {VsVersionInfoKey} entry.");
            }

            var result = new VersionInfoResource();

            // Read fixed version info.
            reader.Align(4);
            result.FixedVersionInfo = FixedVersionInfo.FromReader(reader);

            // Read children.
            while (reader.FileOffset - start < header.Length)
            {
                reader.Align(4);
                result.AddEntry(ReadNextEntry(reader));
            }

            return(result);
        }
コード例 #32
0
        /// <summary>
        /// Reads a single fixed version info structure from an input stream.
        /// </summary>
        /// <param name="reader">The input stream.</param>
        /// <returns>The read structure.</returns>
        public static FixedVersionInfo FromReader(IBinaryStreamReader reader)
        {
            var result = new FixedVersionInfo();

            result.UpdateOffsets(reader.FileOffset, reader.Rva);

            uint signature = reader.ReadUInt32();

            if (signature != Signature)
            {
                throw new FormatException($"Input stream does not point to a valid FixedVersionInfo structure.");
            }

            uint structVersion = reader.ReadUInt32();

            result.FileVersion    = ReadVersion(reader);
            result.ProductVersion = ReadVersion(reader);
            result.FileFlagsMask  = (FileFlags)reader.ReadUInt32();
            result.FileFlags      = (FileFlags)reader.ReadUInt32();
            result.FileOS         = (FileOS)reader.ReadUInt32();
            result.FileType       = (FileType)reader.ReadUInt32();
            result.FileSubType    = (FileSubType)reader.ReadUInt32();
            result.FileDate       = reader.ReadUInt64();

            return(result);
        }
コード例 #33
0
 /// <summary>
 /// Reads a single type reference row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the type reference table.</param>
 /// <returns>The row.</returns>
 public static TypeReferenceRow FromReader(IBinaryStreamReader reader, TableLayout layout)
 {
     return(new TypeReferenceRow(
                reader.ReadIndex((IndexSize)layout.Columns[0].Size),
                reader.ReadIndex((IndexSize)layout.Columns[1].Size),
                reader.ReadIndex((IndexSize)layout.Columns[2].Size)));
 }
コード例 #34
0
ファイル: CilExtraSection.cs プロジェクト: xuhaoa/WinPIT
        public static CilExtraSection FromReader(IBinaryStreamReader reader)
        {
            var section = new CilExtraSection
            {
                Attributes = (CilExtraSectionAttributes)reader.ReadByte()
            };

            if (!section.IsExceptionHandler)
            {
                throw new NotSupportedException("Invalid or unsupported extra section.");
            }

            int dataSize;

            if (section.IsFat)
            {
                dataSize = reader.ReadByte() |
                           (reader.ReadByte() << 0x08) |
                           (reader.ReadByte() << 0x10);
            }
            else
            {
                dataSize = reader.ReadByte();
                reader.ReadUInt16();
            }
            section.Data = reader.ReadBytes(dataSize);

            return(section);
        }
        /// <summary>
        /// Reads a single resource directory from an input stream.
        /// </summary>
        /// <param name="peFile">The PE file containing the resource.</param>
        /// <param name="entry">The entry to read. If this value is <c>null</c>, the root directory is assumed.</param>
        /// <param name="directoryReader">The input stream.</param>
        /// <param name="depth">
        /// The current depth of the resource directory tree structure.
        /// If this value exceeds <see cref="MaxDepth"/>, this class will not initialize any entries.
        /// </param>
        public SerializedResourceDirectory(IPEFile peFile, ResourceDirectoryEntry?entry,
                                           IBinaryStreamReader directoryReader, int depth = 0)
        {
            _peFile = peFile ?? throw new ArgumentNullException(nameof(peFile));

            _depth = depth;

            if (entry.HasValue)
            {
                var value = entry.Value;
                if (value.IsByName)
                {
                    Name = value.Name;
                }
                else
                {
                    Id = value.IdOrNameOffset;
                }
            }

            if (directoryReader != null)
            {
                Characteristics = directoryReader.ReadUInt32();
                TimeDateStamp   = directoryReader.ReadUInt32();
                MajorVersion    = directoryReader.ReadUInt16();
                MinorVersion    = directoryReader.ReadUInt16();

                _namedEntries = directoryReader.ReadUInt16();
                _idEntries    = directoryReader.ReadUInt16();
                _entriesRva   = directoryReader.Rva;

                directoryReader.Offset =
                    (directoryReader.Offset + (ulong)((_namedEntries + _idEntries) * ResourceDirectoryEntry.EntrySize));
            }
        }
コード例 #36
0
 /// <summary>
 /// Reads a single method semantics row from an input stream.
 /// </summary>
 /// <param name="reader">The input stream.</param>
 /// <param name="layout">The layout of the method semantics table.</param>
 /// <returns>The row.</returns>
 public static MethodSemanticsRow FromReader(IBinaryStreamReader reader, TableLayout layout)
 {
     return(new MethodSemanticsRow(
                (MethodSemanticsAttributes)reader.ReadUInt16(),
                reader.ReadIndex((IndexSize)layout.Columns[1].Size),
                reader.ReadIndex((IndexSize)layout.Columns[2].Size)));
 }
コード例 #37
0
 public static VariableSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     long position = reader.Position;
     return new VariableSignature(TypeSignature.FromReader(header, reader))
     {
         StartOffset = position
     };
 }
コード例 #38
0
 public static DataBlobSignature FromReader(IBinaryStreamReader reader)
 {
     long position = reader.Position;
     return new DataBlobSignature(reader.ReadBytes((int) reader.Length))
     {
         StartOffset = position
     };
 }
コード例 #39
0
 public static ElementSignature FromReader(MetadataHeader header, TypeSignature typeSignature, IBinaryStreamReader reader)
 {
     long position = reader.Position;
     return new ElementSignature(ReadValue(header, typeSignature, reader))
     {
         StartOffset = position
     };
 }
コード例 #40
0
 public static new PinnedTypeSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     long position = reader.StartPosition;
     return new PinnedTypeSignature(TypeSignature.FromReader(header, reader))
     {
         StartOffset = reader.Position,
     };
 }
コード例 #41
0
 public static new FunctionPointerTypeSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     long position = reader.Position;
     return new FunctionPointerTypeSignature(MethodSignature.FromReader(header, reader))
     {
         StartOffset = position
     };
 }
コード例 #42
0
 public static ParameterSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     return new ParameterSignature
     {
         StartOffset = reader.Position,
         ParameterType = TypeSignature.FromReader(header, reader),
     };
 }
コード例 #43
0
 public static new TypeDefOrRefSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     long position = reader.Position;
     var type = ReadTypeDefOrRef(header, reader);
     return type == null ? null : new TypeDefOrRefSignature(type)
     {
         StartOffset = position
     };
 }
コード例 #44
0
 public static new OptionalModifierSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     long position = reader.Position;
     return new OptionalModifierSignature(ReadTypeDefOrRef(header, reader),
         TypeSignature.FromReader(header, reader))
     {
         StartOffset = position
     };
 }
コード例 #45
0
ファイル: FieldSignature.cs プロジェクト: JerreS/AsmResolver
 public static new FieldSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     return new FieldSignature
     {
         StartOffset = reader.Position,
         Attributes = (CallingConventionAttributes)reader.ReadByte(),
         FieldType = TypeSignature.FromReader(header, reader),
     };
 }
コード例 #46
0
        public static new SafeArrayMarshalDescriptor FromReader(IBinaryStreamReader reader)
        {
            var descriptor = new SafeArrayMarshalDescriptor()
            {
                StartOffset = reader.Position,
            };

            if (reader.CanRead((sizeof (byte))))
                descriptor.ElementType = (VariantType)reader.ReadByte();

            return descriptor;
        }
コード例 #47
0
        public static new ArrayMarshalDescriptor FromReader(IBinaryStreamReader reader)
        {
            var descriptor = new ArrayMarshalDescriptor((NativeType) reader.ReadByte());

            uint value;
            if (!reader.TryReadCompressedUInt32(out value))
                return descriptor;
            descriptor.ParameterIndex = (int)value;
            if (!reader.TryReadCompressedUInt32(out value))
                return descriptor;
            descriptor.NumberOfElements = (int)value;
            return descriptor;
        }
コード例 #48
0
        public static new LocalVariableSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            var signature = new LocalVariableSignature()
            {
                StartOffset = reader.Position,
                Attributes = (CallingConventionAttributes)reader.ReadByte()
            };

            var count = reader.ReadCompressedUInt32();

            for (int i = 0; i < count; i++)
                signature.Variables.Add(VariableSignature.FromReader(header, reader));
            return signature;
        }
コード例 #49
0
ファイル: TypeSignature.cs プロジェクト: JerreS/AsmResolver
 public static TypeSignature ReadFieldOrPropType(MetadataHeader header, IBinaryStreamReader reader)
 {
     var elementType = (ElementType)reader.ReadByte();
     switch (elementType)
     {
         case ElementType.Boxed:
             return header.TypeSystem.Object;
         case ElementType.SzArray:
             return new SzArrayTypeSignature(ReadFieldOrPropType(header, reader));
         case ElementType.Enum:
             return FromAssemblyQualifiedName(header, reader.ReadSerString());
         default:
             return MsCorLibTypeSignature.FromElementType(header, elementType);
     }
 }
コード例 #50
0
 public static CustomAttributeNamedArgument FromReader(MetadataHeader header, IBinaryStreamReader reader)
 {
     var signature = new CustomAttributeNamedArgument
     {
         StartOffset = reader.Position,
         ArgumentMemberType =
             (reader.CanRead(sizeof (byte))
                 ? (CustomAttributeArgumentMemberType)reader.ReadByte()
                 : CustomAttributeArgumentMemberType.Field),
         ArgumentType = TypeSignature.ReadFieldOrPropType(header, reader),
         MemberName = reader.ReadSerString(),
     };
     signature.Argument = CustomAttributeArgument.FromReader(header, signature.ArgumentType, reader);
     return signature;
 }
コード例 #51
0
        public static new FixedArrayMarshalDescriptor FromReader(IBinaryStreamReader reader)
        {
            var descriptor = new FixedArrayMarshalDescriptor()
            {
                StartOffset = reader.Position,
            };

            uint value;
            if (!reader.TryReadCompressedUInt32(out value))
                return descriptor;
            descriptor.NumberOfElements = (int)value;

            if (reader.CanRead(sizeof(byte)))
                descriptor.ElementType = (NativeType)reader.ReadByte();
            return descriptor;
        }
コード例 #52
0
        public static new CustomMarshalDescriptor FromReader(IBinaryStreamReader reader)
        {
            var descriptor = new CustomMarshalDescriptor()
            {
                StartOffset = reader.Position
            };

            Guid guid;
            Guid.TryParse(reader.ReadSerString(), out guid);
            descriptor.Guid = guid;

            descriptor.UnmanagedType = reader.ReadSerString();
            descriptor.ManagedType = reader.ReadSerString();
            descriptor.Cookie = reader.ReadSerString();

            return descriptor;
        }
コード例 #53
0
 public static MarshalDescriptor FromReader(IBinaryStreamReader reader)
 {
     var type = (NativeType)reader.ReadByte();
     switch (type)
     {
         case NativeType.Array:
             return ArrayMarshalDescriptor.FromReader(reader);
         case NativeType.FixedArray:
             return FixedArrayMarshalDescriptor.FromReader(reader);
         case NativeType.SafeArray:
             return SafeArrayMarshalDescriptor.FromReader(reader);
         case NativeType.CustomMarshaler:
             return CustomMarshalDescriptor.FromReader(reader);
         default:
             return new SimpleMarshalDescriptor(type);
     }
 }
コード例 #54
0
        public static new GenericInstanceMethodSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            var signature = new GenericInstanceMethodSignature()
            {
                StartOffset = reader.Position,
                Attributes = (CallingConventionAttributes)reader.ReadByte()
            };

            uint count;
            if (!reader.TryReadCompressedUInt32(out count))
                return signature;

            for (int i = 0; i < count; i++)
                signature.GenericArguments.Add(TypeSignature.FromReader(header, reader));

            return signature;
        }
コード例 #55
0
        public static new ArrayTypeSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            long position = reader.Position;
            var signature = new ArrayTypeSignature(TypeSignature.FromReader(header, reader))
            {
                StartOffset = position
            };

            uint rank;
            if (!reader.TryReadCompressedUInt32(out rank))
                return signature;

            uint numSizes;
            if (!reader.TryReadCompressedUInt32(out numSizes))
                return signature;

            var sizes = new uint[numSizes];
            for (int i = 0; i < numSizes; i++)
            {
                if (!reader.TryReadCompressedUInt32(out sizes[i]))
                    return signature;
            }

            uint numLoBounds;
            if (!reader.TryReadCompressedUInt32(out numLoBounds))
                return signature;

            var loBounds = new uint[numLoBounds];
            for (int i = 0; i < numLoBounds; i++)
            {
                if (!reader.TryReadCompressedUInt32(out loBounds[i]))
                    return signature;
            }

            for (int i = 0; i < rank; i++)
            {
                var dimension = new ArrayDimension();
                if (i < numSizes)
                    dimension.Size = (int)sizes[i];
                if (i < numLoBounds)
                    dimension.LowerBound = (int)loBounds[i];
                signature.Dimensions.Add(dimension);
            }

            return signature;
        }
コード例 #56
0
        private static object ReadRawOperand(IBinaryStreamReader reader, MsilOperandType msilOperandType)
        {
            switch (msilOperandType)
            {
                case MsilOperandType.InlineNone:
                    return null;

                case MsilOperandType.InlineArgument:
                case MsilOperandType.InlineVar:
                    return reader.ReadUInt16();

                case MsilOperandType.InlineI:
                case MsilOperandType.InlineBrTarget:
                    return reader.ReadInt32();

                case MsilOperandType.ShortInlineArgument:
                case MsilOperandType.ShortInlineVar:
                    return reader.ReadByte();

                case MsilOperandType.ShortInlineBrTarget:
                case MsilOperandType.ShortInlineI:
                    return reader.ReadSByte();

                case MsilOperandType.ShortInlineR:
                    return reader.ReadSingle();
                case MsilOperandType.InlineR:
                    return reader.ReadDouble();
                case MsilOperandType.InlineI8:
                    return reader.ReadInt64();

                case MsilOperandType.InlineField :
                case MsilOperandType.InlineMethod :
                case MsilOperandType.InlineSig:
                case MsilOperandType.InlineTok:
                case MsilOperandType.InlineType:
                case MsilOperandType.InlineString:
                    return new MetadataToken(reader.ReadUInt32());

                case MsilOperandType.InlineSwitch:
                    var offsets = new int[reader.ReadUInt32()];
                    for (int i = 0; i < offsets.Length; i++)
                        offsets[i] = reader.ReadInt32();
                    return offsets;
            }
            throw new NotSupportedException();
        }
コード例 #57
0
        public static new PropertySignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            var signature = new PropertySignature
            {
                StartOffset = reader.Position,
                Attributes = (CallingConventionAttributes)reader.ReadByte(),
            };

            uint paramCount;
            if (!reader.TryReadCompressedUInt32(out paramCount))
                return null;

            signature.PropertyType = TypeSignature.FromReader(header, reader);

            for (int i = 0; i < paramCount; i++)
                signature.Parameters.Add(ParameterSignature.FromReader(header, reader));

            return signature;
        }
コード例 #58
0
        public static PermissionSetSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            var signature = new PermissionSetSignature()
            {
                StartOffset = reader.Position
            };

            var signatureHeader = reader.ReadByte();
            if (signatureHeader != '.')
                throw new ArgumentException("Signature doesn't refer to a valid permission set signature.");

            uint attributeCount;
            if (!reader.TryReadCompressedUInt32(out attributeCount))
                return signature;

            for (int i = 0; i < attributeCount; i++)
                signature.Attributes.Add(SecurityAttributeSignature.FromReader(header, reader));
            return signature;
        }
コード例 #59
0
        public static SecurityAttributeSignature FromReader(MetadataHeader header, IBinaryStreamReader reader)
        {
            var signature = new SecurityAttributeSignature()
            {
                StartOffset = reader.Position,
                TypeName = reader.ReadSerString(),
            };

            reader.ReadCompressedUInt32();

            uint argumentCount;
            if (!reader.TryReadCompressedUInt32(out argumentCount))
                return signature;

            if (argumentCount == 0)
                return signature;

            for (int i = 0; i < argumentCount; i++)
                signature.NamedArguments.Add(CustomAttributeNamedArgument.FromReader(header, reader));

            return signature;
        }
コード例 #60
0
        public static ExceptionHandler FromReader(MethodBody methodBody, IBinaryStreamReader reader, bool fatFormat)
        {
            var offset = reader.Position;
            var handerType = fatFormat ? reader.ReadUInt32() : reader.ReadUInt16();
            var tryOffset = fatFormat ? reader.ReadInt32() : reader.ReadUInt16();
            var tryLength = fatFormat ? reader.ReadInt32() : reader.ReadByte();
            var handlerOffset = fatFormat ? reader.ReadInt32() : reader.ReadUInt16();
            var handlerLength = fatFormat ? reader.ReadInt32() : reader.ReadByte();
            var classTokenOrFilterOffset = reader.ReadUInt32();

            var handler = new ExceptionHandler((ExceptionHandlerType)handerType)
            {
                StartOffset = offset,
                IsFat = fatFormat,
                TryStart = methodBody.GetInstructionByOffset(tryOffset),
                TryEnd = methodBody.GetInstructionByOffset(tryOffset + tryLength),
                HandlerStart = methodBody.GetInstructionByOffset(handlerOffset),
                HandlerEnd = methodBody.GetInstructionByOffset(handlerOffset + handlerLength),
            };

            switch (handler.HandlerType)
            {
                case ExceptionHandlerType.Exception:
                    handler.CatchType = (ITypeDefOrRef)((IOperandResolver)methodBody).ResolveMember(new MetadataToken(classTokenOrFilterOffset));
                    break;
                case ExceptionHandlerType.Filter:
                    handler.FilterStart = methodBody.GetInstructionByOffset((int)classTokenOrFilterOffset);
                    break;
            }

            return handler;
        }