示例#1
0
        public void Write(Nso nso)
        {
            byte[] raw = new byte[HEADER_SIZE];
            using (MemoryStream ms = new MemoryStream(raw))
            {
                BinaryWriter bw = new BinaryWriter(ms);
                bw.Write(Encoding.ASCII.GetBytes(HEADER_MAGIC));
                bw.Write(dynAddr);
                bw.Write(bssStart);
                bw.Write(bssEnd);
                bw.Write(ehFrameStart);
                bw.Write(ehFrameEnd);
                bw.Write(moduleObj);
            }

            nso.WriteNso(4, BitConverter.GetBytes((uint)baseAddr));
            nso.WriteNso((uint)baseAddr, raw);
        }
示例#2
0
        public void WriteExeFs(long addr, byte[] data)
        {
            var page = GetAddressPage(addr);

            if ((page.Permission & SegPerm.R) == SegPerm.R)
            {
                Nso curNso = GetAddressNso(addr);

                var baseAddr = GetNsoAddress(GetAddressNsoType(addr).Value);
                curNso.WriteNso((uint)(addr - baseAddr), data);
            }

            /*
             * long pos = addr;
             * int dataOff = 0;
             *
             * while (pos < addr + data.Length)
             * {
             *  var page = GetAddressPage(pos);
             *  if ((page.Permission & SegPerm.R) == SegPerm.R)
             *  {
             *      Nso curNso = GetAddressNso(pos);
             *      long baseAddr = GetNsoAddress((NsoType)Nsos.ToList().IndexOf(curNso));
             *      long off = pos - page.Address;
             *      int curSize = (int)Math.Min(page.Size - off, data.Length);
             *
             *      byte[] sub = curNso.ReadNso((uint)(pos - baseAddr), curSize);
             *      byte[] sub = new byte[curSize];
             *      curNso.WriteNso();
             *      Buffer.BlockCopy(sub, 0, fullBuffer, (int)(pos - addr), sub.Length);
             *      pos += curSize;
             *  }
             *  else pos += page.Size;
             * }
             */
        }