예제 #1
0
        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);
        }
예제 #2
0
 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
     });
 }