internal void Save(VirtualWriter wtr) { wtr.Write(pr); wtr.Write(s); foreach (RelocationEntry i in Items) { wtr.Write((ushort)(((uint)i.Type << 12) | (i.Offest - pr))); } }
internal void Save(VirtualWriter wtr) { foreach (CLRData i in Items) { i.Address = wtr.GetPosition(); wtr.Write(i.Data); wtr.Write(new byte[((i.Data.Length + 3) & ~3) - i.Data.Length]); } }
public void Save(VirtualWriter wtr, Rva adr) { wtr.SetPosition(adr); foreach (FixupEntry i in Items) { wtr.Write(i.VTable); wtr.Write((ushort)i.Size); wtr.Write((ushort)i.Type); } }
internal void Save(VirtualWriter wtr, ResourceDirectory dir) { uint datOffset = dir.datO[dat]; wtr.Write(datOffset); wtr.Write(dat.Length); wtr.Write(cp); wtr.Write((uint)0); wtr.SaveLocation(); wtr.SetPosition(datOffset); wtr.Write(dat); wtr.LoadLocation(); }
internal void Write(VirtualWriter wtr) { foreach (MetadataToken tkn in Items) { wtr.Write(tkn); } }
internal void Save(VirtualWriter wtr) { foreach (ushort i in Items) { wtr.Write(i); } }
internal void Save(VirtualWriter wtr) { foreach (string i in Items) { wtr.Write(i); } }
protected override void SaveInternal(VirtualWriter wtr) { root = Location.Address; ComputeOffset(); wtr.Write(c); wtr.WriteStamp(stamp); wtr.Write(maVer); wtr.Write(miVer); wtr.Write(noName); wtr.Write(noID); foreach (ResourceEntry i in es) { if ((i.Type & EntryType.Name) == EntryType.Name) { uint strOffset = strO[i.Name]; wtr.Write(strOffset | 0x80000000); wtr.SaveLocation(); wtr.SetPosition(root + strOffset); wtr.WriteUnicodeString(i.Name); wtr.LoadLocation(); } else if ((i.Type & EntryType.ID) == EntryType.ID) { wtr.Write(i.ID); } if ((i.Type & EntryType.Subdirectory) == EntryType.Subdirectory) { uint dirOffset = dirO[i.Data as Subdirectory]; wtr.Write(dirOffset | 0x80000000); wtr.SaveLocation(); wtr.SetPosition(root + dirOffset); (i.Data as Subdirectory).Save(wtr, this); wtr.LoadLocation(); } else if ((i.Type & EntryType.DataEntry) == EntryType.DataEntry) { uint dateOffset = dateO[i.Data as DataEntry]; wtr.Write(dateOffset); wtr.SaveLocation(); wtr.SetPosition(root + dateOffset); (i.Data as DataEntry).Save(wtr, this); wtr.LoadLocation(); } } }
internal void Save(VirtualWriter wtr, ResourceDirectory dir) { wtr.Write(c); wtr.WriteStamp(stamp); wtr.Write(maVer); wtr.Write(miVer); wtr.Write(noName); wtr.Write(noID); foreach (ResourceEntry i in Items) { if ((i.Type & EntryType.Name) == EntryType.Name) { uint strOffset = dir.strO[i.Name]; wtr.Write(strOffset | 0x80000000); wtr.SaveLocation(); wtr.SetPosition(dir.root + strOffset); wtr.WriteUnicodeString(i.Name); wtr.LoadLocation(); } else if ((i.Type & EntryType.ID) == EntryType.ID) { wtr.Write(i.ID); } if ((i.Type & EntryType.Subdirectory) == EntryType.Subdirectory) { uint dirOffset = dir.dirO[i.Data as Subdirectory]; wtr.Write(dirOffset | 0x80000000); wtr.SaveLocation(); wtr.SetPosition(dir.root + dirOffset); (i.Data as Subdirectory).Save(wtr, dir); wtr.LoadLocation(); } else if ((i.Type & EntryType.DataEntry) == EntryType.DataEntry) { uint dateOffset = dir.dateO[i.Data as DataEntry]; wtr.Write(dateOffset); wtr.SaveLocation(); wtr.SetPosition(dir.root + dateOffset); (i.Data as DataEntry).Save(wtr, dir); wtr.LoadLocation(); } } }
internal void Save(VirtualWriter wtr) { Rva fdrAdr = (Rva)wtr.GetPosition() + GetPointersSize(); foreach (ExportAddressEntry i in Items) { if (i.Type == ExportAddressType.RealExport) { wtr.Write(i.Address); } else { wtr.Write(fdrAdr); fdrAdr += (uint)i.Forwarder.Length + 1; wtr.SaveLocation(); wtr.SetPosition(fdrAdr); wtr.Write(i.Forwarder); wtr.LoadLocation(); } } }
protected override void SaveInternal(VirtualWriter wtr) { wtr.Write((uint)c); wtr.WriteStamp(stamp); wtr.Write((ushort)maVer); wtr.Write((ushort)miVer); wtr.Write((uint)t); wtr.Write((uint)s); wtr.Write(this.adr); wtr.Write((uint)ptr); }
internal void Save(VirtualWriter wtr) { if (wtr.BaseStream.File.OptionalHeader.Type == OptionalHeader.ExecutableType.PE32Plus) { foreach (ImportFunction func in Items) { switch (func.Type) { case ImportFunctionType.Binded: wtr.Write((ulong)func.FunctionAddress); break; case ImportFunctionType.Name: wtr.Write((ulong)entry.Directory.GetFunctionAddress(this, func)); break; case ImportFunctionType.Ordinal: wtr.Write(0x8000000000000000 | func.Ordinal); break; } } wtr.Write(0UL); } else { foreach (ImportFunction func in Items) { switch (func.Type) { case ImportFunctionType.Binded: wtr.Write((uint)func.FunctionAddress); break; case ImportFunctionType.Name: wtr.Write((uint)entry.Directory.GetFunctionAddress(this, func)); break; case ImportFunctionType.Ordinal: wtr.Write(0x80000000 | func.Ordinal); break; } } wtr.Write(0U); } }
protected override void SaveInternal(VirtualWriter wtr) { wtr.Write(s); wtr.Write(maVer); wtr.Write(miVer); Rva mdAdr = 0; uint mdSize = 0; Rva resAdr = 0; Rva snAdr = 0; Rva cmAdr = 0; Rva vtAdr = 0; uint vtSize = 0; Rva eatAdr = 0; Rva mnAdr = 0; Rva mdHdrAdr = wtr.GetPosition(); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)f); if ((f & RuntimeFlags.NativeEntryPoint) == RuntimeFlags.NativeEntryPoint) { wtr.Write(e); } else { wtr.Write(t); } Rva otherHdrAdr = wtr.GetPosition(); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); ////////////////////////////////////////////// if (dats.DatasLocation == 0) { dats.DatasLocation = this.Location.Address + 72; dats.Save(wtr); wtr.Write(new byte[((wtr.BaseStream.Position + 3) & ~3) - wtr.BaseStream.Position]); } else { //wtr.SaveLocation(); wtr.SetPosition(dats.DatasLocation); dats.Save(wtr); wtr.Write(new byte[((wtr.BaseStream.Position + 3) & ~3) - wtr.BaseStream.Position]); //wtr.LoadLocation(); } mdAdr = wtr.GetPosition(); mdSize = md.GetSize(); md.Save(wtr, wtr.GetPosition()); wtr.Write(new byte[(mdSize + 3) & ~3 - mdSize]); if (res.Length != 0) { resAdr = wtr.GetPosition(); wtr.Write(res); wtr.Write(new byte[(res.Length + 3) & ~3 - res.Length]); } if (sn.Length != 0) { snAdr = wtr.GetPosition(); wtr.Write(sn); wtr.Write(new byte[(sn.Length + 3) & ~3 - sn.Length]); } if (cm.Length != 0) { cmAdr = wtr.GetPosition(); wtr.Write(cm); wtr.Write(new byte[(cm.Length + 3) & ~3 - cm.Length]); } if (vtSize != 0) { vtAdr = wtr.GetPosition(); vtSize = vt.GetSize(); vt.Save(wtr, vtAdr); wtr.Write(new byte[(vtSize + 3) & ~3 - vtSize]); } if (eat.Length != 0) { eatAdr = wtr.GetPosition(); wtr.Write(eat); wtr.Write(new byte[(eat.Length + 3) & ~3 - eat.Length]); } if (mn.Length != 0) { mnAdr = wtr.GetPosition(); wtr.Write(mn); wtr.Write(new byte[(mn.Length + 3) & ~3 - mn.Length]); } ////////////////////////////////////////////////////// wtr.SetPosition(mdHdrAdr); wtr.Write(mdAdr); wtr.Write(mdSize); wtr.SetPosition(otherHdrAdr); wtr.Write(resAdr); wtr.Write((uint)res.Length); wtr.Write(snAdr); wtr.Write((uint)sn.Length); wtr.Write(cmAdr); wtr.Write((uint)cm.Length); wtr.Write(vtAdr); wtr.Write(vtSize); wtr.Write(eatAdr); wtr.Write((uint)eat.Length); wtr.Write(mnAdr); wtr.Write((uint)mn.Length); }
protected override void SaveInternal(VirtualWriter wtr) { Rva baseAdr = wtr.GetPosition(); wtr.Write(f); wtr.WriteStamp(stamp); wtr.Write((ushort)maVer); wtr.Write((ushort)miVer); wtr.Write(baseAdr + 40); wtr.Write((uint)bas); wtr.Write((uint)noAdr); wtr.Write((uint)noName); Rva adrsAdr = (Rva)(baseAdr + 40 + n.Length + 1); Rva nptAdr = adrsAdr + adr.GetPointersSize() + adr.GetForwardersSize(); Rva otAdr = nptAdr + nt.GetPointersSize() + nt.GetDataSize(); wtr.Write(adrsAdr); wtr.Write(nptAdr); wtr.Write(otAdr); wtr.SetPosition(baseAdr + 40); wtr.Write(n); wtr.SetPosition(adrsAdr); adr.Save(wtr); wtr.SetPosition(nptAdr); uint nameOffset = nt.GetPointersSize(); foreach (string str in nt) { wtr.Write(nptAdr + nameOffset); nameOffset += (uint)str.Length + 1; } nt.Save(wtr); wtr.SetPosition(otAdr); ot.Save(wtr); }
protected override void SaveInternal(VirtualWriter wtr) { ulong bas = wtr.BaseStream.File.OptionalHeader.WindowsSpecificFields.ImageBase; if (wtr.BaseStream.File.OptionalHeader.Type == OptionalHeader.ExecutableType.PE32Plus) { wtr.Write((ulong)s + bas); wtr.Write((ulong)e + bas); wtr.Write((ulong)idx + bas); wtr.Write((ulong)s + bas); wtr.Write((ulong)cb + bas); } else { wtr.Write((uint)(s + bas)); wtr.Write((uint)(e + bas)); wtr.Write((uint)(idx + bas)); wtr.Write((uint)(s + bas)); wtr.Write((uint)(cb + bas)); } wtr.Write(sz); wtr.Write(c); }
protected override void SaveInternal(VirtualWriter wtr) { Rva iats = wtr.BaseStream.File.OptionalHeader.DataDirectories[DataDirectoryType.IAT].Address; Rva ptr = (uint)this.items.Count * 20 + 20; Rva funcs = GetFunctionsAddress(); Rva names = GetNamesAddress(); uint iatFuncsOffset = 0; uint iltFuncsOffset = 0; foreach (ImportDirectoryEntry i in items) { wtr.Write(Location.Address + ptr + iltFuncsOffset); wtr.WriteStamp(i.DateTimeStamp); wtr.Write(i.ForwarderChain); wtr.Write(names); if (iats == 0) { wtr.Write(Location.Address + ptr + iltFuncsOffset); } else { wtr.Write(iats + ptr + iatFuncsOffset); } iltFuncsOffset += i.LookupTable.GetPointersSize(); iatFuncsOffset += i.AddressTable.GetPointersSize(); names += (uint)i.Name.Length + 1; } wtr.Write(new byte[20]); foreach (ImportDirectoryEntry i in items) { i.LookupTable.Save(wtr); } foreach (ImportDirectoryEntry i in items) { foreach (ImportFunction func in i.LookupTable) { if (func.Type == ImportFunctionType.Name) { wtr.Write(func.Hint); wtr.Write(func.Name); } } } foreach (ImportDirectoryEntry i in items) { wtr.Write(i.Name); } if (iats != 0) { wtr.SetPosition(iats); foreach (ImportDirectoryEntry i in items) { i.AddressTable.Save(wtr); } } }
public void Save(VirtualWriter wtr, Rva adr) { wtr.SetPosition(adr); wtr.Write(sig); wtr.Write(maVer); wtr.Write(miVer); wtr.Write(res); wtr.Write((ver.Length + 3) & ~3); wtr.Write(Encoding.ASCII.GetBytes(ver)); wtr.Write(new byte[((ver.Length + 1 + 3) & ~3) - ver.Length]); wtr.Write(f); wtr.Write((ushort)Items.Count); uint datOffset = (uint)(20 + ((ver.Length + 3) & ~3) + this.Count * 8); foreach (MetadataStream str in Items) { datOffset += (uint)((str.Name.Length + 1 + 3) & ~3); } foreach (MetadataStream str in Items) { wtr.Write(datOffset); datOffset += (uint)((str.Length + 3) & ~3); wtr.Write((uint)((str.Length + 3) & ~3)); wtr.Write(Encoding.ASCII.GetBytes(str.Name)); wtr.Write(new byte[((str.Name.Length + 1 + 3) & ~3) - str.Name.Length]); } foreach (MetadataStream str in Items) { wtr.Write(str.Data); wtr.Write(new byte[((str.Length + 3) & ~3) - str.Length]); } }