예제 #1
0
        public void SaveStateBinary(BinaryWriter bw)
        {
            Enter();
            try
            {
                bw.Write(MAGIC);
                bw.Write(_elfhash);
                bw.Write(_loadoffset);
                foreach (var sec in _elf.Sections.Where(s => (s.Flags & SectionFlags.Writable) != 0))
                {
                    var ms = _base.GetStream((ulong)(sec.LoadAddress + _loadoffset), (ulong)sec.Size, false);
                    bw.Write(sec.Size);
                    ms.CopyTo(bw.BaseStream);
                }

                if (_heap != null)
                {
                    _heap.SaveStateBinary(bw);
                }
                if (_sealedheap != null)
                {
                    _sealedheap.SaveStateBinary(bw);
                }
                bw.Write(MAGIC);
            }
            finally
            {
                Exit();
            }
        }
예제 #2
0
 private void SaveStateBodyBinary(BinaryWriter writer)
 {
     writer.Write(Count);
     for (var i = _firstStateIndex; i != _nextStateIndex; i = (i + 1) & STATEMASK)
     {
         writer.Write(_states[i].Frame);
         writer.Write(_states[i].Size);
     }
     if (Count != 0)
     {
         var startByte = _states[_firstStateIndex].Start;
         var endByte   = (_states[HeadStateIndex].Start + _states[HeadStateIndex].Size) & _sizeMask;
         // TODO: Use spans to avoid these extra copies in .net core
         if (startByte > endByte)
         {
             {
                 var stream = _buffer.GetStream(_buffer.Start + (ulong)startByte, (ulong)(Size - startByte), false);
                 stream.CopyTo(writer.BaseStream);
             }
             startByte = 0;
         }
         {
             var stream = _buffer.GetStream(_buffer.Start + (ulong)startByte, (ulong)(endByte - startByte), false);
             stream.CopyTo(writer.BaseStream);
         }
     }
 }