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); }
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; }
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; }
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); }
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); }
void Add(VTableFixups fixups) { if (fixups == null) return; foreach (var fixup in fixups) { foreach (var method in fixup) Push(method); } }
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); }