コード例 #1
0
        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);
        }