예제 #1
0
파일: CLRMetaData.cs 프로젝트: zzfeed/pe
        internal static async Task <CLRMetaData> GetAsync(PortableExecutableImage image, CLRHeader header)
        {
            var calc           = image.GetCalculator();
            var imageBase      = image.NTHeaders.OptionalHeader.ImageBase;
            var rva            = header.MetaDataAddress;
            var va             = imageBase + rva;
            var offset         = calc.RVAToOffset(rva);
            var size           = header.MetaDataSize;
            var section        = calc.RVAToSection(rva);
            var location       = new Location(image, offset, rva, va, size, size, section);
            var metaDataHeader = await CLRMetaDataHeader.LoadAsync(image, location).ConfigureAwait(false);

            var metaDataStreamTable = await CLRMetaDataStreamTable.LoadAsync(image, metaDataHeader).ConfigureAwait(false);

            var metaDataStreams = await CLRMetaDataStreams.LoadAsync(image, location, metaDataStreamTable).ConfigureAwait(false);

            var metaData = new CLRMetaData(image, location, metaDataHeader, metaDataStreamTable, metaDataStreams);

            return(metaData);
        }