private TextMap GetTextMap(MetadataBuildResult metadata, ByteBuffer resources, ByteBuffer data) { TextMap map = new TextMap(); map.Add(TextSegment.ImportAddressTable, SIZE_OF_IAT); map.Add(TextSegment.CLRHeader, (uint)ByteBuffer.SizeOf <CLRHeader>(), 8); map.Add(TextSegment.ILCode, (uint)metadata.ILCode.Length, 4); map.Add(TextSegment.Resources, (uint)resources.Length, 8); map.Add(TextSegment.Data, (uint)data.Length, 4); map.Add(TextSegment.StrongNameSignature, 0, 4); map.Add(TextSegment.MetadataHeader, GetMetadataHeaderLength()); map.Add(TextSegment.TableHeap, (uint)metadata.Heaps.Tables.Length, 4); map.Add(TextSegment.StringHeap, (uint)metadata.Heaps.Strings.Length, 4); map.Add(TextSegment.UserStringHeap, (uint)metadata.Heaps.UserStrings.Length, 4); map.Add(TextSegment.GuidHeap, (uint)metadata.Heaps.Guids.Length, 4); map.Add(TextSegment.BlobHeap, (uint)metadata.Heaps.Blobs.Length, 4); map.Add(TextSegment.DebugDirectory, 0, 4); uint importDirRVA = map.GetVirtualAddressAfter(TextSegment.DebugDirectory); uint importHintRVA = BitArithmetic.Align(importDirRVA + 48u, 16u); uint importDirLength = (importHintRVA - importDirRVA) + 27u; uint startupStubRVA = 2u + BitArithmetic.Align(importDirRVA + importDirLength, 4u); map.Add(TextSegment.ImportDirectory, new DataDirectory(importDirRVA, importDirLength)); map.Add(TextSegment.ImportHintNameTable, new DataDirectory(importHintRVA, 0)); map.Add(TextSegment.StartupStub, new DataDirectory(startupStubRVA, 6)); return(map); }
private CLRHeader GetCLRHeader(AssemblyDefinition assemblyDef, TextMap map, MetadataBuildResult metadata) { return(new CLRHeader() { cb = map[TextSegment.CLRHeader].Size, MajorRuntimeVersion = 0x0002, MinorRuntimeVersion = 0x0005, Metadata = new DataDirectory( map[TextSegment.MetadataHeader].RVA, map.GetOffset(TextSegment.MetadataHeader, TextSegment.DebugDirectory) ), PEKind = PEFileKinds.ILOnly, EntryPointToken = metadata.EntryPointToken }); }