Esempio n. 1
0
 void Add(VTableFixups fixups)
 {
     if (fixups == null)
     {
         return;
     }
     foreach (var fixup in fixups)
     {
         foreach (var method in fixup)
         {
             Push(method);
         }
     }
 }
        public override void UpdateReferences(EmitContext context)
        {
            ImportBuffer.UpdateTableRvas();
            VTableFixups?.UpdateTableRvas(context);
            if (DebugDirectory != null)
            {
                DebugDirectory.PointerToRawData = (uint)DebugDirectory.Data.StartOffset;
                DebugDirectory.AddressOfRawData =
                    (uint)context.Builder.Assembly.FileOffsetToRva(DebugDirectory.PointerToRawData);
                DebugDirectory.SizeOfData = DebugDirectory.Data.GetPhysicalLength();
            }

            UpdateNetDirectory(context);
            base.UpdateReferences(context);
        }
Esempio n. 3
0
 MethodBase[] GetVTableMethods(VTableFixups fixups)
 {
     var methods = new MethodBase[fixups.Count];
     byte[] buf = new byte[8];
     int fixuprva = fixups.RVA;
     for (int i = 0; i < fixups.Count; i++)
     {
         module.__ReadDataFromRVA(fixuprva, buf, 0, 4);
         methods[i] = module.ResolveMethod(BitConverter.ToInt32(buf, 0));
         if ((fixups.Type & COR_VTABLE_32BIT) != 0)
         {
             fixuprva += 4;
         }
         if ((fixups.Type & COR_VTABLE_64BIT) != 0)
         {
             fixuprva += 8;
         }
     }
     return methods;
 }
Esempio n. 4
0
 VTableFixups[] GetVTableFixups()
 {
     int rva;
     int length;
     module.__GetDataDirectoryEntry(14, out rva, out length);
     byte[] buf = new byte[8];
     module.__ReadDataFromRVA(rva + 48, buf, 0, 8);
     rva = BitConverter.ToInt32(buf, 0);
     if (rva == 0)
     {
         return new VTableFixups[0];
     }
     VTableFixups[] entries = new VTableFixups[BitConverter.ToInt32(buf, 4) / 8];
     for (int i = 0; i < entries.Length; i++)
     {
         module.__ReadDataFromRVA(rva + i * 8, buf, 0, 8);
         entries[i].RVA = BitConverter.ToInt32(buf, 0);
         entries[i].Count = BitConverter.ToInt16(buf, 4);
         entries[i].Type = BitConverter.ToInt16(buf, 6);
     }
     return entries;
 }
Esempio n. 5
0
        MethodBase[] GetVTableMethods(VTableFixups fixups)
        {
            var methods = new MethodBase[fixups.Count];

            byte[] buf      = new byte[8];
            int    fixuprva = fixups.RVA;

            for (int i = 0; i < fixups.Count; i++)
            {
                module.__ReadDataFromRVA(fixuprva, buf, 0, 4);
                methods[i] = module.ResolveMethod(BitConverter.ToInt32(buf, 0));
                if ((fixups.Type & COR_VTABLE_32BIT) != 0)
                {
                    fixuprva += 4;
                }
                if ((fixups.Type & COR_VTABLE_64BIT) != 0)
                {
                    fixuprva += 8;
                }
            }
            return(methods);
        }
Esempio n. 6
0
        VTableFixups[] GetVTableFixups()
        {
            int rva;
            int length;

            module.__GetDataDirectoryEntry(14, out rva, out length);
            byte[] buf = new byte[8];
            module.__ReadDataFromRVA(rva + 48, buf, 0, 8);
            rva = BitConverter.ToInt32(buf, 0);
            if (rva == 0)
            {
                return(new VTableFixups[0]);
            }
            VTableFixups[] entries = new VTableFixups[BitConverter.ToInt32(buf, 4) / 8];
            for (int i = 0; i < entries.Length; i++)
            {
                module.__ReadDataFromRVA(rva + i * 8, buf, 0, 8);
                entries[i].RVA   = BitConverter.ToInt32(buf, 0);
                entries[i].Count = BitConverter.ToInt16(buf, 4);
                entries[i].Type  = BitConverter.ToInt16(buf, 6);
            }
            return(entries);
        }
Esempio n. 7
0
 void Add(VTableFixups fixups)
 {
     if (fixups == null)
         return;
     foreach (var fixup in fixups) {
         foreach (var method in fixup)
             Push(method);
     }
 }
Esempio n. 8
0
        protected override void LoadInternal(VirtualReader rdr)
        {
            s              = rdr.ReadUInt32();
            maVer          = rdr.ReadUInt16();
            miVer          = rdr.ReadUInt16();
            dats           = new CLRDatas(this);
            dats.IsLoading = true;

            Rva  mdAdr = rdr.ReadRva();
            uint mdSze = rdr.ReadUInt32();

            f = (RuntimeFlags)rdr.ReadUInt32();
            if ((f & RuntimeFlags.NativeEntryPoint) == RuntimeFlags.NativeEntryPoint)
            {
                Rva ep = rdr.ReadRva();
                rdr.SaveLocation();
                rdr.SetPosition(ep);
                byte[] ec = NativeHelper.GetNativeCodes(rdr);
                rdr.LoadLocation();
                e = ep;
                dats.Add(new CLRData()
                {
                    Address = ep, Data = ec
                });
            }
            else
            {
                t = rdr.ReadUInt32();
            }
            Rva  resAdr = rdr.ReadRva();
            uint resSze = rdr.ReadUInt32();
            Rva  snAdr  = rdr.ReadRva();
            uint snSze  = rdr.ReadUInt32();
            Rva  cmAdr  = rdr.ReadRva();
            uint cmSze  = rdr.ReadUInt32();
            Rva  vtAdr  = rdr.ReadRva();
            uint vtSze  = rdr.ReadUInt32();
            Rva  eatAdr = rdr.ReadRva();
            uint eatSze = rdr.ReadUInt32();
            Rva  mnAdr  = rdr.ReadRva();
            uint mnSze  = rdr.ReadUInt32();

            rdr.SetPosition(resAdr);
            res = rdr.ReadBytes((int)resSze);

            rdr.SetPosition(snAdr);
            sn = rdr.ReadBytes((int)snSze);

            rdr.SetPosition(cmAdr);
            cm = rdr.ReadBytes((int)cmSze);

            rdr.SetPosition(eatAdr);
            eat = rdr.ReadBytes((int)eatSze);

            rdr.SetPosition(mnAdr);
            mn = rdr.ReadBytes((int)mnSze);

            vt = new VTableFixups(this);
            vt.Load(rdr, vtAdr, vtSze);

            md = new MetadataRoot(this);
            md.Load(rdr, mdAdr);

            dats.IsLoading = false;

            // Save the read info
            MetadataDirEntry                = new CLRDataDirectoryEntry("MetaData", mdAdr, mdSze);
            ResourceDirEntry                = new CLRDataDirectoryEntry("Resources", resAdr, resSze);
            StrongNameDirEntry              = new CLRDataDirectoryEntry("Strong Name Signature", snAdr, snSze);
            CodeManagerTableDirEntry        = new CLRDataDirectoryEntry("Code Manager Table", cmAdr, cmSze);
            VTableFixupsDirEntry            = new CLRDataDirectoryEntry("VTable Fixups", vtAdr, vtSze);
            ExportAddressTableJumpsDirEntry = new CLRDataDirectoryEntry("Export Address Table Jumps", eatAdr, eatSze);
            ManagedNativeHeaderDirEntry     = new CLRDataDirectoryEntry("Managed Native Header", mnAdr, mnSze);
        }