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