private static TPIHeader ImportJGOld(JGHeaderOld oldHeader) { TPIHeader hdr = new TPIHeader() { MinTypeIndex = oldHeader.MinTi, MaxTypeIndex = oldHeader.MaxTi, GpRecSize = oldHeader.GpRecSize }; return(hdr); }
public TPIReader(IServiceContainer ctx, SpanStream stream) : base(stream) { this.ctx = ctx; PDBFile pdb = ctx.GetService <PDBFile>(); if (pdb.Type == PDBType.Old) { this.TypeReader = new ReadTypeDelegate(ReadTypeOld); JGHeaderOld oldHdr = ctx.GetService <JGHeaderOld>(); Header = ImportJGOld(oldHdr); } else { Header = Read <TPIHeader>(); if (Header.HeaderSize != Marshal.SizeOf <TPIHeader>()) { throw new InvalidDataException(); } if (!Enum.IsDefined(typeof(TPIVersion), Header.Version)) { throw new InvalidDataException(); } this.TypeReader = new ReadTypeDelegate(ReadType); } #if false if (Header.Version != TPIVersion.V80) { throw new NotImplementedException($"TPI Version {Header.Version} not supported yet"); } #endif lazyLeafContainers = LazyFactory.CreateLazy(ReadTypes); }
public PDBFile(FileStream stream) { this.fs = stream; this.mf = MemoryMappedFile.CreateFromFile(stream, null, 0, MemoryMappedFileAccess.Read, HandleInheritability.Inheritable, true); this.memSpan = new MemoryMappedSpan <byte>(mf, (int)fs.Length); this.StreamTable = Services.GetService <StreamTableReader>(); Services.AddService <PDBFile>(this); this.Type = MSFReader.DetectPdbType(memSpan.GetSpan()); MSFReader msf = null; StreamTableReader streamTable = null; if (Type != PDBType.Old) { switch (Type) { case PDBType.Big: msf = new MSFReaderDS(memSpan.Memory); break; case PDBType.Small: msf = new MSFReaderJG(memSpan.Memory); break; default: throw new InvalidOperationException(); } Services.AddService <MSFReader>(msf); // init stream table { byte[] streamTableData = msf.StreamTable(); streamTable = new StreamTableReader(Services, streamTableData); } Services.AddService <StreamTableReader>(streamTable); DBIReader dbi; // init DBI { byte[] dbiData = streamTable.GetStream(DefaultStreams.DBI); dbi = new DBIReader(Services, dbiData); OnDbiInit?.Invoke(dbi); } Services.AddService <DBIReader>(dbi); } TPIReader tpi; // init TPI { SpanStream tpiStream; if (Type != PDBType.Old) { byte[] tpiData = streamTable.GetStream(DefaultStreams.TPI); tpiStream = new SpanStream(tpiData); } else { Span <byte> span = memSpan.GetSpan(); JGHeaderOld header = span.Read <JGHeaderOld>(0); // $TODO: the MSFReader interface should be abstracted into a more generic PDBHeader Services.AddService <JGHeaderOld>(header); tpiStream = new SpanStream(span.Slice(header.SIZE).ToArray()); } tpi = new TPIReader(Services, tpiStream); OnTpiInit?.Invoke(tpi); } Services.AddService <TPIReader>(tpi); TPIHashReader tpiHash = null; // init TPIHash if (Type != PDBType.Old && tpi.Header.Hash.StreamNumber != -1) { byte[] tpiHashData = streamTable.GetStream(tpi.Header.Hash.StreamNumber); tpiHash = new TPIHashReader(Services, tpiHashData); Services.AddService <TPIHashReader>(tpiHash); } // init resolver TypeResolver resolver = new TypeResolver(Services); Services.AddService <TypeResolver>(resolver); // init Hasher HasherV2 hasher = new HasherV2(Services); Services.AddService <HasherV2>(hasher); if (Type != PDBType.Old) { { // init NameMap byte[] nameMapData = streamTable.GetStream(DefaultStreams.PDB); PdbStreamReader nameMap = new PdbStreamReader(nameMapData); Services.AddService <PdbStreamReader>(nameMap); } NamedStreamTableReader namedStreamTable = new NamedStreamTableReader(Services); Services.AddService <NamedStreamTableReader>(namedStreamTable); { // init UdtNameMap byte[] namesData = namedStreamTable.GetStreamByName("/names"); if (namesData != null) { UdtNameTableReader udtNameTable = new UdtNameTableReader(Services, namesData); Services.AddService <UdtNameTableReader>(udtNameTable); } } } }