Example #1
0
		// Unpacks the relocation entries in a LzExe 0.91 binary

		private ImageMap Relocate91(byte [] abUncompressed, ushort segReloc, LoadedImage pgmImgNew, RelocationDictionary relocations)
		{
            const int CompressedRelocationTableAddress = 0x0158;
			int ifile = lzHdrOffset + CompressedRelocationTableAddress;

			int rel_off=0;
			for (;;)
			{
    			ushort span = abUncompressed[ifile++];
				if (span == 0)
				{
					span = abUncompressed[ifile++];
					span |= (ushort) (abUncompressed[ifile++] << 8);
					if (span == 0)
					{
						rel_off += 0x0FFF0;
						continue;
					}
					else if (span == 1)
					{
						break;
					}
				}

				rel_off += span;
				ushort seg = (ushort) (pgmImgNew.ReadLeUInt16((uint)rel_off) + segReloc);
				pgmImgNew.WriteLeUInt16((uint)rel_off, seg);
				relocations.AddSegmentReference((uint)rel_off, seg);
				imageMap.AddSegment(Address.SegPtr(seg, 0), seg.ToString("X4"), AccessMode.ReadWriteExecute);
			}
			return imageMap;
		}
Example #2
0
 private void RelocateSegmentReferences(LoadedImage image)
 {
     foreach (var seg in segments)
     {
         foreach (var reloc in seg.Relocations)
         {
             image.WriteLeUInt16((uint)((reloc.Segment.Selector - addrBase.Selector) * 16u + reloc.Offset), seg.Selector);
         }
     }
 }