Ejemplo n.º 1
0
 public void Write(WriterContext ctxt, BlobWriter writer, bool isFat, Func<OpCode, object, Row> findRow)
 {
     if (isFat)
     {
         writer.WriteUInt32((uint)Flags);
         writer.WriteUInt32((uint)TryOffset);
         writer.WriteUInt32((uint)TryLength);
         writer.WriteUInt32((uint)HandlerOffset);
         writer.WriteUInt32((uint)HandlerLength);
     }
     else
     {
         writer.WriteUInt16((ushort)Flags);
         writer.WriteUInt16((ushort)TryOffset);
         writer.WriteByte((byte)TryLength);
         writer.WriteUInt16((ushort)HandlerOffset);
         writer.WriteByte((byte)HandlerLength);
     }
     var rowRef = default(TokenRef);
     rowRef.Value = Class == null ? null : findRow(OpCode.Ldobj, Class);
     rowRef.PersistIndexes(ctxt);
     rowRef.Write(ctxt, writer);
     if (Flags == CorILExceptionClause.Filter)
         writer.WriteUInt32((uint)FilterOffset);
 }
Ejemplo n.º 2
0
        public void Write(WriterContext ctxt, BlobWriter writer, bool isFat, Func <OpCode, object, Row> findRow)
        {
            if (isFat)
            {
                writer.WriteUInt32((uint)Flags);
                writer.WriteUInt32((uint)TryOffset);
                writer.WriteUInt32((uint)TryLength);
                writer.WriteUInt32((uint)HandlerOffset);
                writer.WriteUInt32((uint)HandlerLength);
            }
            else
            {
                writer.WriteUInt16((ushort)Flags);
                writer.WriteUInt16((ushort)TryOffset);
                writer.WriteByte((byte)TryLength);
                writer.WriteUInt16((ushort)HandlerOffset);
                writer.WriteByte((byte)HandlerLength);
            }
            var rowRef = default(TokenRef);

            rowRef.Value = Class == null ? null : findRow(OpCode.Ldobj, Class);
            rowRef.PersistIndexes(ctxt);
            rowRef.Write(ctxt, writer);
            if (Flags == CorILExceptionClause.Filter)
            {
                writer.WriteUInt32((uint)FilterOffset);
            }
        }
Ejemplo n.º 3
0
        public void Write(WriterContext ctxt, BlobWriter writer, Func <OpCode, object, Row> findRow)
        {
            var bodySize = 0;

            for (var i = 0; i < Instructions.Length; i++)
            {
                bodySize += Instructions[i].Size();
            }

            var isFat = bodySize > 0x3f;

            if (LocalVariables != null && LocalVariables.Variables.Count > 0)
            {
                isFat = true;
            }
            if (ExceptionHandlingClauses.Count > 0 || MaxStack > 8)
            {
                isFat = true;
            }

            if (isFat)
            {
                var flags = CorILMethod.FatFormat;
                if (IsInitLocals)
                {
                    flags |= CorILMethod.InitLocals;
                }
                if (ExceptionHandlingClauses.Count > 0)
                {
                    flags |= CorILMethod.MoreSects;
                }
                var firstWord = (ushort)((uint)flags | (3 << 12));
                writer.WriteUInt16(firstWord);
                writer.WriteUInt16((ushort)MaxStack);
                writer.WriteUInt32((uint)bodySize);
                LocalVarRef.PersistIndexes(ctxt);
                LocalVarRef.Write(ctxt, writer);
            }
            else
            {
                var firstByte = (byte)CorILMethod.TinyFormat;
                firstByte |= (byte)(bodySize << 2);
                writer.WriteByte(firstByte);
            }

            if (Instructions != null && Instructions.Length > 0)
            {
                var beginOffset = writer.Offset;
                for (var i = 0; i < Instructions.Length; i++)
                {
                    Instructions[i].Write(ctxt, writer, beginOffset, findRow);
                }
            }

            if (ExceptionHandlingClauses.Count > 0)
            {
                WriteMethodDataSection(ctxt, writer, false, findRow);
            }
        }
Ejemplo n.º 4
0
        private void WriteMethodDataSection(WriterContext ctxt, BlobWriter writer, bool isMoreSects, Func <OpCode, object, Row> findRow)
        {
            writer.Align(4);

            var size  = ExceptionHandlingClauses.Count * 12 + 4;
            var isFat = size > 0xff || ExceptionHandlingClauses.Any(m => m.IsFat());

            var flags = CorILMethodSect.EHTable;

            if (isFat)
            {
                flags |= CorILMethodSect.FatFormat;
            }
            if (isMoreSects)
            {
                flags |= CorILMethodSect.MoreSects;
            }
            writer.WriteByte((byte)flags);

            if (isFat)
            {
                size = ExceptionHandlingClauses.Count * 24 + 4;
                writer.WriteUInt24((uint)size);
            }
            else
            {
                writer.WriteByte((byte)size);
                writer.WriteUInt16(0);
            }

            for (var i = 0; i < ExceptionHandlingClauses.Count; i++)
            {
                ExceptionHandlingClauses[i].Write(ctxt, writer, isFat, findRow);
            }
        }
Ejemplo n.º 5
0
 public void Write(WriterContext ctxt, BlobWriter writer)
 {
     var word = (ushort)(((byte)Type) << 12 | Offset);
     writer.WriteUInt16(word);
 }
Ejemplo n.º 6
0
 public void Write(WriterContext ctxt, BlobWriter writer)
 {
     writer.WriteUInt16(hint);
     writer.WriteAsciiZeroTerminatedString(Name, 1);
 }
Ejemplo n.º 7
0
 public void Write(WriterContext ctxt, BlobWriter writer)
 {
     var name = default(string);
     switch (Section)
     {
     case Section.Text:
         name = ".text"; break;
     case Section.Rsrc:
         name = ".rsrc"; break;
     case Section.Reloc:
         name = ".reloc"; break;
     default:
         throw new ArgumentOutOfRangeException();
     }
     writer.WriteAsciiZeroPaddedString(name, 8);
     writer.WriteUInt32(VirtualSize);
     writer.WriteUInt32(VirtualAddress);
     writer.WriteUInt32(SizeOfRawData);
     PointerToRawData.Write(writer);
     writer.WriteUInt32(PointerToRelocations);
     writer.WriteUInt32(pointerToLinenumbers);
     writer.WriteUInt16(NumberOfRelocations);
     writer.WriteUInt16(numberOfLinenumbers);
     writer.WriteUInt32((uint)Characteristics);
 }
Ejemplo n.º 8
0
 public void Write(WriterContext ctxt, BlobWriter writer)
 {
     writer.WriteUInt32(ImageBase);
     writer.WriteUInt32(sectionAlignment);
     writer.WriteUInt32(FileAlignment);
     writer.WriteUInt16(osMajor);
     writer.WriteUInt16(osMinor);
     writer.WriteUInt16(userMajor);
     writer.WriteUInt16(userMinor);
     writer.WriteUInt16(subSysMajor);
     writer.WriteUInt16(subSysMinor);
     writer.WriteUInt32(reserved);
     writer.WriteUInt32(ImageSize);
     writer.WriteUInt32(HeaderSize);
     writer.WriteUInt32(FileChecksum);
     writer.WriteUInt16((ushort)SubSystem);
     writer.WriteUInt16(DllFlags);
     writer.WriteUInt32(stackReserveSize);
     writer.WriteUInt32(StackCommitSize);
     writer.WriteUInt32(HeapReserveSize);
     writer.WriteUInt32(HeapCommitSize);
     writer.WriteUInt32(loaderFlags);
     writer.WriteUInt32(numberOfDataDirectories);
 }
Ejemplo n.º 9
0
 public void Write(WriterContext ctxt, BlobWriter writer)
 {
     writer.WriteUInt16(magic);
     writer.WriteByte(LMajor);
     writer.WriteByte(lMinor);
     writer.WriteUInt32(CodeSize);
     writer.WriteUInt32(InitializedDataSize);
     writer.WriteUInt32(uninitializedDataSize);
     EntryPoint.Write(writer);
     BaseOfCode.Write(writer);
     BaseOfData.Write(writer);
 }
Ejemplo n.º 10
0
 public void Write(WriterContext ctxt, BlobWriter writer)
 {
     writer.WriteUInt32(prefix);
     writer.WriteUInt16(machine);
     writer.WriteUInt16(NumberOfSections);
     var seconds = (uint)(DateTimeStamp.ToUniversalTime() - nineteenSeventy).TotalSeconds;
     writer.WriteUInt32(seconds);
     writer.WriteUInt32(pointerToSymbolTable);
     writer.WriteUInt32(numberOfSymbols);
     writer.WriteUInt16(PEOptionalHeader.Size);
     writer.WriteUInt16((ushort)Flags);
 }
Ejemplo n.º 11
0
        public override void Write(WriterContext ctxt, BlobWriter writer)
        {
            if (FixedArgs.Count > 0 || FieldArgs.Count > 0 || PropertyArgs.Count > 0)
            {
                writer.WriteUInt16(prolog);

                foreach (var p in FixedArgs)
                    p.Type.WriteValue(writer, p.Value);

                writer.WriteUInt16((ushort)(FieldArgs.Count + PropertyArgs.Count));

                foreach (var kv in FieldArgs)
                {
                    writer.WriteByte((byte)TypeSigTag.CUSTOM_ATTRIBUTE_FIELD);
                    kv.Value.Type.Write(writer);
                    writer.WriteUTF8SizedString(kv.Key);
                    kv.Value.Type.WriteValue(writer, kv.Value.Value);
                }
                foreach (var kv in PropertyArgs)
                {
                    writer.WriteByte((byte)TypeSigTag.CUSTOM_ATTRIBUTE_PROPERTY);
                    kv.Value.Type.Write(writer);
                    writer.WriteUTF8SizedString(kv.Key);
                    kv.Value.Type.WriteValue(writer, kv.Value.Value);
                }
            }
        }
Ejemplo n.º 12
0
        private void WriteMethodDataSection(WriterContext ctxt, BlobWriter writer, bool isMoreSects, Func<OpCode, object, Row> findRow)
        {
            writer.Align(4);

            var size = ExceptionHandlingClauses.Count * 12 + 4;
            var isFat = size > 0xff || ExceptionHandlingClauses.Any(m => m.IsFat());

            var flags = CorILMethodSect.EHTable;
            if (isFat)
                flags |= CorILMethodSect.FatFormat;
            if (isMoreSects)
                flags |= CorILMethodSect.MoreSects;
            writer.WriteByte((byte)flags);

            if (isFat)
            {
                size = ExceptionHandlingClauses.Count * 24 + 4;
                writer.WriteUInt24((uint)size);
            }
            else
            {
                writer.WriteByte((byte)size);
                writer.WriteUInt16(0);
            }

            for (var i = 0; i < ExceptionHandlingClauses.Count; i++)
                ExceptionHandlingClauses[i].Write(ctxt, writer, isFat, findRow);
        }
Ejemplo n.º 13
0
        public void Write(WriterContext ctxt, BlobWriter writer, Func<OpCode, object, Row> findRow)
        {
            var bodySize = 0;
            for (var i = 0; i < Instructions.Length; i++)
                bodySize += Instructions[i].Size();

            var isFat = bodySize > 0x3f;
            if (LocalVariables != null && LocalVariables.Variables.Count > 0)
                isFat = true;
            if (ExceptionHandlingClauses.Count > 0 || MaxStack > 8)
                isFat = true;

            if (isFat)
            {
                var flags = CorILMethod.FatFormat;
                if (IsInitLocals)
                    flags |= CorILMethod.InitLocals;
                if (ExceptionHandlingClauses.Count > 0)
                    flags |= CorILMethod.MoreSects;
                var firstWord = (ushort)((uint)flags | (3 << 12));
                writer.WriteUInt16(firstWord);
                writer.WriteUInt16((ushort)MaxStack);
                writer.WriteUInt32((uint)bodySize);
                LocalVarRef.PersistIndexes(ctxt);
                LocalVarRef.Write(ctxt, writer);
            }
            else
            {
                var firstByte = (byte)CorILMethod.TinyFormat;
                firstByte |= (byte)(bodySize << 2);
                writer.WriteByte(firstByte);
            }

            if (Instructions != null && Instructions.Length > 0)
            {
                var beginOffset = writer.Offset;
                for (var i = 0; i < Instructions.Length; i++)
                    Instructions[i].Write(ctxt, writer, beginOffset, findRow);
            }

            if (ExceptionHandlingClauses.Count > 0)
                WriteMethodDataSection(ctxt, writer, false, findRow);
        }
Ejemplo n.º 14
0
 public void Write(WriterContext ctxt, BlobWriter writer)
 {
     writer.WriteUInt32(cb);
     writer.WriteUInt16(MajorRuntimeVersion);
     writer.WriteUInt16(MinorRuntimeVersion);
     MetaData.Write(writer);
     writer.WriteUInt32((uint)Flags);
     writer.WriteUInt32(EntryPointToken);
     Resources.Write(writer);
     StrongNameSignature.Write(writer);
     writer.WriteUInt64(codeManagerTable);
     VtableFixups.Write(writer);
     writer.WriteUInt64(exportAddressTableJumps);
     writer.WriteUInt64(managedNativeHeader);
 }
Ejemplo n.º 15
0
 public void Write(WriterContext ctxt, BlobWriter writer)
 {
     writer.WriteUInt32(signature);
     writer.WriteUInt16(MajorVersion);
     writer.WriteUInt16(MinorVersion);
     writer.WriteUInt32(reserved);
     writer.WriteUTF8SizedZeroPaddedString(Version, 4);
     writer.WriteUInt16(flags);
     writer.WriteUInt16((ushort)StreamHeaders.Length);
     for (var i = 0; i < StreamHeaders.Length; i++)
         StreamHeaders[i].Write(ctxt, writer);
 }
Ejemplo n.º 16
0
 public void Write(WriterContext ctxt, BlobWriter writer)
 {
     writer.WriteUInt32(VirtualAddress);
     writer.WriteUInt16(Size);
     writer.WriteUInt16((ushort)Type);
 }
Ejemplo n.º 17
0
 public override void  WriteValue(BlobWriter writer, object value)
 {
     switch (Type)
     {
     case PrimitiveType.Boolean:
         {
             var b = (bool)value;
             writer.WriteByte(b ? (byte)1 : (byte)0);
         }
         break;
     case PrimitiveType.Char:
         {
             var c = (char)value;
             writer.WriteUInt16(c);
         }
         break;
     case PrimitiveType.Int8:
         {
             var i = (sbyte)value;
             writer.WriteSByte(i);
         }
         break;
     case PrimitiveType.Int16:
         {
             var i = (short)value;
             writer.WriteInt16(i);
         }
         break;
     case PrimitiveType.Int32:
         {
             var i = (int)value;
             writer.WriteInt32(i);
         }
         break;
     case PrimitiveType.Int64:
         {
             var i = (long)value;
             writer.WriteInt64(i);
         }
         break;
     case PrimitiveType.UInt8:
         {
             var i = (byte)value;
             writer.WriteByte(i);
         }
         break;
     case PrimitiveType.UInt16:
         {
             var i = (ushort)value;
             writer.WriteUInt16(i);
         }
         break;
     case PrimitiveType.UInt32:
         {
             var i = (uint)value;
             writer.WriteUInt32(i);
         }
         break;
     case PrimitiveType.UInt64:
         {
             var i = (ulong)value;
             writer.WriteUInt64(i);
         }
         break;
     case PrimitiveType.IntNative:
     case PrimitiveType.UIntNative:
         throw new InvalidOperationException("cannot write native integers");
     case PrimitiveType.Single:
         {
             var f = (float)value;
             writer.WriteSingle(f);
         }
         break;
     case PrimitiveType.Double:
         {
             var d = (double)value;
             writer.WriteDouble(d);
         }
         break;
     case PrimitiveType.String:
         {
             var s = (string)value;
             writer.WriteUTF8SizedString(s);
         }
         break;
     case PrimitiveType.Type:
         {
             var t = (TypeCustomAttributePropertyValue)value;
             writer.WriteUTF8SizedString(t.Name);
         }
         break;
     case PrimitiveType.Object:
     case PrimitiveType.TypedRef:
     case PrimitiveType.Void:
         throw new PEException("invalid type tag in custom attribute");
     default:
         throw new ArgumentOutOfRangeException();
     }
 }