public GRPDEFRecord(RecordReader reader, RecordContext context) : base(reader, context) { this.Definition = new GroupDefinition(); UInt16 groupNameIndex = reader.ReadIndex(); if (groupNameIndex == 0 || groupNameIndex > context.Names.Count) { throw new InvalidDataException("GroupNameIndex is out of range."); } this.Definition.Name = context.Names[groupNameIndex - 1]; while (!reader.IsEOF) { reader.ReadByte(); // 'type' ignored UInt16 segmentIndex = reader.ReadIndex(); if (segmentIndex == 0 || segmentIndex > context.Segments.Count) { throw new InvalidDataException("SegmentIndex is out of range."); } this.Definition.Segments.Add(context.Segments[segmentIndex - 1]); } context.Groups.Add(Definition); }
public COMDEFRecord(RecordReader reader, RecordContext context) : base(reader, context) { int startIndex = context.ExternalNames.Count; while (!reader.IsEOF) { CommunalNameDefinition def = new CommunalNameDefinition(); def.DefinedBy = reader.RecordNumber; def.Name = reader.ReadPrefixedString(); def.TypeIndex = reader.ReadIndex(); def.DataType = reader.ReadByte(); def.ElementCount = ReadEncodedInteger(reader); if (def.DataType == 0x61) // FAR data: count, elemsize { def.ElementSize = ReadEncodedInteger(reader); } else { def.ElementSize = 1; } context.ExternalNames.Add(def); } int endIndex = context.ExternalNames.Count; this.Definitions = context.ExternalNames.Slice( startIndex, endIndex - startIndex); }
public SEGDEFRecord(RecordReader reader, RecordContext context) : base(reader, context) { SegmentDefinition def = new SegmentDefinition(); // Read the record. byte acbp = reader.ReadByte(); def.Alignment = GetAlignment(acbp); def.Combination = GetCombination(acbp); def.IsUse32 = GetUse32(acbp); if (def.Alignment == SegmentAlignment.Absolute) { def.Frame = reader.ReadUInt16(); def.Offset = reader.ReadByte(); } UInt32 storedLength=reader.ReadUInt16Or32(); def.Length = GetLength(acbp, storedLength, reader.RecordNumber); UInt16 segmentNameIndex = reader.ReadIndex(); if (segmentNameIndex > context.Names.Count) throw new InvalidDataException("SegmentNameIndex is out of range."); if (segmentNameIndex > 0) def.SegmentName = context.Names[segmentNameIndex - 1]; UInt16 classNameIndex = reader.ReadIndex(); if (classNameIndex > context.Names.Count) throw new InvalidDataException("ClassNameIndex is out of range."); if (classNameIndex > 0) def.ClassName = context.Names[classNameIndex - 1]; UInt16 overlayNameIndex = reader.ReadIndex(); if (overlayNameIndex > context.Names.Count) throw new InvalidDataException("OverlayNameIndex is out of range."); if (overlayNameIndex > 0) def.OverlayName = context.Names[overlayNameIndex - 1]; def.Data = new byte[def.Length]; //def.Fixups = new List<FixupDefinition>(); this.Definition = def; context.Segments.Add(def); }
public MODENDRecord(RecordReader reader, RecordContext context) : base(reader, context) { byte type = reader.ReadByte(); this.IsMainModule = (type & 0x80) != 0; this.IsStartAddressPresent = (type & 0x40) != 0; this.IsStartAddressRelocatable = (type & 0x01) != 0; // TODO: read the start address field... }
private FixupThreadDefinition ParseThreadSubrecord(RecordReader reader) { FixupThreadDefinition thread = new FixupThreadDefinition(); byte b = reader.ReadByte(); thread.Kind = ((b & 0x40) == 0) ? FixupThreadKind.Target : FixupThreadKind.Frame; thread.Method = (byte)((b >> 2) & 3); thread.ThreadNumber = (byte)(b & 3); if (thread.Method <= 2) // TBD: should be 3 for intel { thread.IndexOrFrame = reader.ReadIndex(); } thread.IsDefined = true; return(thread); }
private static UInt32 ReadEncodedInteger(RecordReader reader) { byte b = reader.ReadByte(); if (b == 0x81) { return(reader.ReadUInt16()); } else if (b == 0x84) { return(reader.ReadUInt24()); } else if (b == 0x88) { return(reader.ReadUInt32()); } else { return(b); } }
internal MemoryModelComment(RecordReader reader) { while (!reader.IsEOF) { byte b = reader.ReadByte(); switch ((char)b) { case '0': InstructionSet = 8086; break; case '1': InstructionSet = 80186; break; case '2': InstructionSet = 80286; break; case '3': InstructionSet = 80386; break; case 'O': Optimized = true; break; case 's': MemoryModel = Disassembler.MemoryModel.Small; break; case 'm': MemoryModel = Disassembler.MemoryModel.Medium; break; case 'c': MemoryModel = Disassembler.MemoryModel.Compact; break; case 'l': MemoryModel = Disassembler.MemoryModel.Large; break; case 'h': MemoryModel = Disassembler.MemoryModel.Huge; break; case 'A': InstructionSet = 68000; break; case 'B': InstructionSet = 68010; break; case 'C': InstructionSet = 68020; break; case 'D': InstructionSet = 68030; break; } } }
public COMDEFRecord(RecordReader reader, RecordContext context) : base(reader, context) { int startIndex = context.ExternalNames.Count; while (!reader.IsEOF) { CommunalNameDefinition def = new CommunalNameDefinition(); def.DefinedBy = reader.RecordNumber; def.Name = reader.ReadPrefixedString(); def.TypeIndex = reader.ReadIndex(); def.DataType = reader.ReadByte(); def.ElementCount = ReadEncodedInteger(reader); if (def.DataType == 0x61) // FAR data: count, elemsize def.ElementSize = ReadEncodedInteger(reader); else def.ElementSize = 1; context.ExternalNames.Add(def); } int endIndex = context.ExternalNames.Count; this.Definitions = context.ExternalNames.Slice( startIndex, endIndex - startIndex); }
internal CommentRecord(RecordReader reader, RecordContext context) : base(reader, context) { byte commentType = reader.ReadByte(); this.IsPreserved = (commentType & 0x80) != 0; this.IsHidden = (commentType & 0x40) != 0; byte commentClass = reader.ReadByte(); switch (commentClass) { case 0: Comment = new TextComment(reader, "Translator"); break; case 1: Comment = new TextComment(reader, "Copyright"); break; case 0x81: case 0x9F: Comment = new TextComment(reader, "DefaultLibrarySearchName"); break; case 0x9C: // not supported break; case 0x9D: Comment = new MemoryModelComment(reader); break; case 0x9E: Comment = new DOSSEGComment(reader); break; case 0xA0: // OMF Extensions Comment = ParseOmfExtensions(reader); break; case 0xA1: // debug symbol type, such as CV; ignored break; case 0xA2: Comment = new LinkPassSeparatorComment(reader); break; case 0xA3: Comment = new LIBMODComment(reader, context); break; case 0xA4: // EXESTR break; case 0xA6: // INCERR break; case 0xA7: // NOPAD break; case 0xA8: // WKEXT Comment = new WKEXTComment(reader); break; case 0xA9: // LZEXT break; case 0xDA: Comment = new TextComment(reader, "Comment"); break; case 0xDB: Comment = new TextComment(reader, "Compiler"); break; case 0xDC: Comment = new TextComment(reader, "Date"); break; case 0xDD: Comment = new TextComment(reader, "Timestamp"); break; case 0xDF: Comment = new TextComment(reader, "User"); break; case 0xE9: // borland Comment = new TextComment(reader, "Dependencies"); break; case 0xFF: // MS QuickC Comment = new TextComment(reader, "CommandLine"); break; } if (Comment == null) { Comment = new UnknownComment(reader, commentClass); } }
internal LinkPassSeparatorComment(RecordReader reader) { byte subtype = reader.ReadByte(); IsPresent = (subtype == 1); }
/// <summary> /// The presence of any unrecognized subtype causes the linker to /// generate a fatal error. /// </summary> private static Comment ParseOmfExtensions(RecordReader reader) { byte subtype = reader.ReadByte(); return null; }
public SEGDEFRecord(RecordReader reader, RecordContext context) : base(reader, context) { SegmentDefinition def = new SegmentDefinition(); // Read the record. byte acbp = reader.ReadByte(); def.Alignment = GetAlignment(acbp); def.Combination = GetCombination(acbp); def.IsUse32 = GetUse32(acbp); if (def.Alignment == SegmentAlignment.Absolute) { def.Frame = reader.ReadUInt16(); def.Offset = reader.ReadByte(); } UInt32 storedLength = reader.ReadUInt16Or32(); def.Length = GetLength(acbp, storedLength, reader.RecordNumber); UInt16 segmentNameIndex = reader.ReadIndex(); if (segmentNameIndex > context.Names.Count) { throw new InvalidDataException("SegmentNameIndex is out of range."); } if (segmentNameIndex > 0) { def.SegmentName = context.Names[segmentNameIndex - 1]; } UInt16 classNameIndex = reader.ReadIndex(); if (classNameIndex > context.Names.Count) { throw new InvalidDataException("ClassNameIndex is out of range."); } if (classNameIndex > 0) { def.ClassName = context.Names[classNameIndex - 1]; } UInt16 overlayNameIndex = reader.ReadIndex(); if (overlayNameIndex > context.Names.Count) { throw new InvalidDataException("OverlayNameIndex is out of range."); } if (overlayNameIndex > 0) { def.OverlayName = context.Names[overlayNameIndex - 1]; } def.Data = new byte[def.Length]; //def.Fixups = new List<FixupDefinition>(); this.Definition = def; context.Segments.Add(def); }
private FixupDefinition ParseFixupSubrecord(RecordReader reader, RecordContext context) { FixupDefinition fixup = new FixupDefinition(); byte b1 = reader.ReadByte(); byte b2 = reader.ReadByte(); UInt16 w = (UInt16)((b1 << 8) | b2); // big endian fixup.Mode = (w & 0x4000) != 0 ? FixupMode.SegmentRelative : FixupMode.SelfRelative; fixup.Location = (FixupLocation)((w >> 10) & 0x0F); fixup.DataOffset = (UInt16)(w & 0x03FF); byte b = reader.ReadByte(); bool useFrameThread = (b & 0x80) != 0; if (useFrameThread) { int frameNumber = (b >> 4) & 0x3; FixupThreadDefinition thread = context.FrameThreads[frameNumber]; if (!thread.IsDefined) throw new InvalidDataException("Frame thread " + frameNumber + " is not defined."); FixupFrame spec = new FixupFrame(); spec.Method = (FixupFrameMethod)thread.Method; spec.IndexOrFrame = thread.IndexOrFrame; fixup.Frame = spec; } else { FixupFrame spec = new FixupFrame(); spec.Method = (FixupFrameMethod)((b >> 4) & 7); if ((int)spec.Method <= 3) { spec.IndexOrFrame = reader.ReadIndex(); } fixup.Frame = spec; } bool useTargetThread = (b & 0x08) != 0; if (useTargetThread) { bool hasTargetDisplacement = (b & 0x04) != 0; int targetNumber = b & 3; FixupThreadDefinition thread = context.TargetThreads[targetNumber]; if (!thread.IsDefined) throw new InvalidDataException("Target thread " + targetNumber + " is not defined."); FixupTargetMethod method = (FixupTargetMethod)((int)thread.Method & 3); if (hasTargetDisplacement) method |= (FixupTargetMethod)4; FixupTarget spec = new FixupTarget(); spec.Referent = ResolveFixupReferent(context, method, thread.IndexOrFrame); if ((int)method <= 3) { spec.Displacement = reader.ReadUInt16Or32(); } fixup.Target = spec; } else { FixupTargetMethod method = (FixupTargetMethod)(b & 7); UInt16 indexOrFrame = reader.ReadIndex(); FixupTarget spec = new FixupTarget(); spec.Referent = ResolveFixupReferent(context, method, indexOrFrame); if ((int)method <= 3) { spec.Displacement = reader.ReadUInt16Or32(); } fixup.Target = spec; } return fixup; }
/// <summary> /// The presence of any unrecognized subtype causes the linker to /// generate a fatal error. /// </summary> private static Comment ParseOmfExtensions(RecordReader reader) { byte subtype = reader.ReadByte(); return(null); }
private FixupDefinition ParseFixupSubrecord(RecordReader reader, RecordContext context) { FixupDefinition fixup = new FixupDefinition(); byte b1 = reader.ReadByte(); byte b2 = reader.ReadByte(); UInt16 w = (UInt16)((b1 << 8) | b2); // big endian fixup.Mode = (w & 0x4000) != 0 ? FixupMode.SegmentRelative : FixupMode.SelfRelative; fixup.Location = (FixupLocation)((w >> 10) & 0x0F); fixup.DataOffset = (UInt16)(w & 0x03FF); byte b = reader.ReadByte(); bool useFrameThread = (b & 0x80) != 0; if (useFrameThread) { int frameNumber = (b >> 4) & 0x3; FixupThreadDefinition thread = context.FrameThreads[frameNumber]; if (!thread.IsDefined) { throw new InvalidDataException("Frame thread " + frameNumber + " is not defined."); } FixupFrame spec = new FixupFrame(); spec.Method = (FixupFrameMethod)thread.Method; spec.IndexOrFrame = thread.IndexOrFrame; fixup.Frame = spec; } else { FixupFrame spec = new FixupFrame(); spec.Method = (FixupFrameMethod)((b >> 4) & 7); if ((int)spec.Method <= 3) { spec.IndexOrFrame = reader.ReadIndex(); } fixup.Frame = spec; } bool useTargetThread = (b & 0x08) != 0; if (useTargetThread) { bool hasTargetDisplacement = (b & 0x04) != 0; int targetNumber = b & 3; FixupThreadDefinition thread = context.TargetThreads[targetNumber]; if (!thread.IsDefined) { throw new InvalidDataException("Target thread " + targetNumber + " is not defined."); } FixupTargetMethod method = (FixupTargetMethod)((int)thread.Method & 3); if (hasTargetDisplacement) { method |= (FixupTargetMethod)4; } FixupTarget spec = new FixupTarget(); spec.Referent = ResolveFixupReferent(context, method, thread.IndexOrFrame); if ((int)method <= 3) { spec.Displacement = reader.ReadUInt16Or32(); } fixup.Target = spec; } else { FixupTargetMethod method = (FixupTargetMethod)(b & 7); UInt16 indexOrFrame = reader.ReadIndex(); FixupTarget spec = new FixupTarget(); spec.Referent = ResolveFixupReferent(context, method, indexOrFrame); if ((int)method <= 3) { spec.Displacement = reader.ReadUInt16Or32(); } fixup.Target = spec; } return(fixup); }
private FixupThreadDefinition ParseThreadSubrecord(RecordReader reader) { FixupThreadDefinition thread = new FixupThreadDefinition(); byte b = reader.ReadByte(); thread.Kind = ((b & 0x40) == 0) ? FixupThreadKind.Target : FixupThreadKind.Frame; thread.Method = (byte)((b >> 2) & 3); thread.ThreadNumber = (byte)(b & 3); if (thread.Method <= 2) // TBD: should be 3 for intel thread.IndexOrFrame = reader.ReadIndex(); thread.IsDefined = true; return thread; }
private static UInt32 ReadEncodedInteger(RecordReader reader) { byte b = reader.ReadByte(); if (b == 0x81) return reader.ReadUInt16(); else if (b == 0x84) return reader.ReadUInt24(); else if (b == 0x88) return reader.ReadUInt32(); else return b; }