public FileInfoSubstream(Stream s) { NumModules = StreamHelper.ReadU16(s); NumSourceFiles = StreamHelper.ReadU16(s); for (int i = 0; i < NumModules; i++) { ModIndices.Add(StreamHelper.ReadU16(s)); } uint totalCount = 0; for (int i = 0; i < NumModules; i++) { ModFileCounts.Add(StreamHelper.ReadU16(s)); totalCount += ModFileCounts[i]; } for (int i = 0; i < totalCount; i++) { FileNameOffsets.Add(StreamHelper.ReadU32(s)); } FileNameOffsets = FileNameOffsets.Distinct().ToList(); long pos = s.Position; foreach (uint offset in FileNameOffsets) { s.Seek(pos + offset, 0); NamesBuffer.Add(offset, StreamHelper.ReadCString(s)); } }
public SectionMapEntry(Stream s) { Flags = StreamHelper.ReadU16(s); Ovl = StreamHelper.ReadU16(s); Group = StreamHelper.ReadU16(s); Frame = StreamHelper.ReadU16(s); SectionName = StreamHelper.ReadU16(s); ClassName = StreamHelper.ReadU16(s); Offset = StreamHelper.ReadU32(s); SectionLength = StreamHelper.ReadU32(s); }
public SectionContribEntry(Stream s) { Section = StreamHelper.ReadU16(s); StreamHelper.ReadU16(s); Offset = StreamHelper.ReadU32(s); Size = StreamHelper.ReadU32(s); Characteristics = StreamHelper.ReadU32(s); DataCrc = StreamHelper.ReadU32(s); RelocCrc = StreamHelper.ReadU32(s); ModuleIndex = StreamHelper.ReadU16(s); StreamHelper.ReadU16(s); }
public SymbolRecord(Stream s) { reclen = StreamHelper.ReadU16(s); long pos = s.Position; rectyp = StreamHelper.ReadU16(s); pubsymflags = StreamHelper.ReadU32(s); off = StreamHelper.ReadU32(s); seg = StreamHelper.ReadU16(s); name = StreamHelper.ReadCString(s); while (s.Position - pos < reclen) { s.ReadByte(); } }
public DebugInfoStream(Stream s) { VersionSignature = StreamHelper.ReadU32(s); VersionHeader = StreamHelper.ReadU32(s); Age = StreamHelper.ReadU32(s); GlobalStreamIndex = StreamHelper.ReadU16(s); BuildNumber = StreamHelper.ReadU16(s); PublicStreamIndex = StreamHelper.ReadU16(s); PdbDllVersion = StreamHelper.ReadU16(s); SymRecordStream = StreamHelper.ReadU16(s); PdbDllRbld = StreamHelper.ReadU16(s); ModInfoSize = StreamHelper.ReadU32(s); SectionContributionSize = StreamHelper.ReadU32(s); SectionMapSize = StreamHelper.ReadU32(s); SourceInfoSize = StreamHelper.ReadU32(s); TypeServerMapSize = StreamHelper.ReadU32(s); MFCTypeServerIndex = StreamHelper.ReadU32(s); OptionalDbgHeaderSize = StreamHelper.ReadU32(s); ECSubstreamSize = StreamHelper.ReadU32(s); Flags = StreamHelper.ReadU16(s); Machine = StreamHelper.ReadU16(s); StreamHelper.ReadU32(s); long pos = s.Position; while (s.Position - pos < ModInfoSize) { modInfo.Add(new ModInfo(s)); } pos = s.Position; uint magic = StreamHelper.ReadU32(s); while (s.Position - pos < SectionContributionSize) { contribs.Add(new SectionContribEntry(s)); if (magic == 0xF13151E4) { StreamHelper.ReadU32(s); } } pos = s.Position; StreamHelper.ReadU32(s); while (s.Position - pos < SectionMapSize) { sectionMap.Add(new SectionMapEntry(s)); } fileInfo = new FileInfoSubstream(s); }
public PDBFile(string filename) { raw = new MemoryStream(File.ReadAllBytes(filename)); raw.Seek(0, 0); string magic = StreamHelper.ReadFixedString(raw, 24); if (magic != "Microsoft C/C++ MSF 7.00") { return; } raw.Seek(0x20, 0); dPageBytes = StreamHelper.ReadU32(raw); dFlagPage = StreamHelper.ReadU32(raw); dFilePages = StreamHelper.ReadU32(raw); dRootBytes = StreamHelper.ReadU32(raw); dReserved = StreamHelper.ReadU32(raw); pAdIndexPages = StreamHelper.ReadU32(raw); raw.Seek(pAdIndexPages * dPageBytes, 0); List <uint> pages = new List <uint>(); uint count = dRootBytes / dPageBytes; if ((dRootBytes / dPageBytes) != 0) { count++; } for (int i = 0; i < count; i++) { uint u = StreamHelper.ReadU32(raw); if (u != 0) { pages.Add(u); } } adIndexPages = pages.ToArray(); Console.WriteLine("Reading root streams..."); ReadRootStreams(); Console.WriteLine("Reading global name table..."); ReadGlobalNameTable(); Console.WriteLine("Reading TPI stream..."); ReadTPIStream(); Console.WriteLine("Reading debug info streams..."); ReadDebugInfoStream(); Console.WriteLine("Reading symbol record streams..."); ReadSymbolRecordStream(); }
public ModInfo(Stream s) { StreamHelper.ReadU32(s); sce = new SectionContribEntry(s); Flags = StreamHelper.ReadU16(s); ModuleSymStream = StreamHelper.ReadU16(s); SymByteSize = StreamHelper.ReadU32(s); C11ByteSize = StreamHelper.ReadU32(s); C13ByteSize = StreamHelper.ReadU32(s); SourceFileCount = StreamHelper.ReadU16(s); StreamHelper.ReadU16(s); StreamHelper.ReadU32(s); SourceFileNameIndex = StreamHelper.ReadU32(s); PdbFilePathNameIndex = StreamHelper.ReadU32(s); ModuleName = StreamHelper.ReadCString(s); ObjFileName = StreamHelper.ReadCString(s); StreamHelper.Align(s); }
public void ReadGlobalNameTable() { toc = new TOCStream(new MemoryStream(GetStreamData(rootStreams[1]))); names = new List <string>(); foreach (KeyValuePair <string, uint> pair in toc.files) { if (pair.Key == "/names") { MemoryStream m = new MemoryStream(GetStreamData(rootStreams[pair.Value])); m.Seek(0x8, 0); uint size = StreamHelper.ReadU32(m) + 0xC; while (m.Position < size) { names.Add(StreamHelper.ReadCString(m)); } } rootStreams[pair.Value].name1 = pair.Key; } }
public void ReadRootStreams() { MemoryStream m = new MemoryStream(); foreach (uint page in adIndexPages) { CopyPage(page, raw, m); } m.Seek(0, 0); uint count = StreamHelper.ReadU32(m); rootStreams = new RootStream[count]; for (int i = 0; i < count; i++) { rootStreams[i] = new RootStream(); rootStreams[i].size = StreamHelper.ReadU32(m); if (rootStreams[i].size == 0xFFFFFFFF) { rootStreams[i].size = 0; } } for (int i = 0; i < count; i++) { uint subcount = rootStreams[i].size / dPageBytes; if ((rootStreams[i].size % dPageBytes) != 0) { subcount++; } rootStreams[i].pages = new uint[subcount]; for (int j = 0; j < subcount; j++) { rootStreams[i].pages[j] = StreamHelper.ReadU32(m); } } rootStreams[0].name1 = "Old Directory"; rootStreams[1].name1 = "TOC Stream"; rootStreams[2].name1 = "TPI Stream"; rootStreams[3].name1 = "DBI Stream"; }
public PDBFile(string filename) { raw = new MemoryStream(File.ReadAllBytes(filename)); raw.Seek(0, 0); string magic = StreamHelper.ReadFixedString(raw, 24); if (magic != "Microsoft C/C++ MSF 7.00") { return; } raw.Seek(0x20, 0); dPageBytes = StreamHelper.ReadU32(raw); dFlagPage = StreamHelper.ReadU32(raw); dFilePages = StreamHelper.ReadU32(raw); dRootBytes = StreamHelper.ReadU32(raw); dReserved = StreamHelper.ReadU32(raw); pAdIndexPages = StreamHelper.ReadU32(raw); raw.Seek(pAdIndexPages * dPageBytes, 0); List <uint> pages = new List <uint>(); while (raw.Position < pAdIndexPages * dPageBytes + dRootBytes) { uint u = StreamHelper.ReadU32(raw); if (u != 0) { pages.Add(u); } else { break; } } adIndexPages = pages.ToArray(); ReadRootStreams(); ReadGlobalNameTable(); ReadTPIStream(); ReadDebugInfoStream(); ReadSymbolRecordStream(); }
public TOCStream(Stream s) { s.Seek(0x1C, 0); uint stringTableSize = StreamHelper.ReadU32(s); byte[] sTable = new byte[stringTableSize]; s.Read(sTable, 0, (int)stringTableSize); MemoryStream st = new MemoryStream(sTable); uint count = StreamHelper.ReadU32(s); s.Seek(0x10, SeekOrigin.Current); int pos = (int)s.Position; for (int i = 0; i < count; i++) { s.Seek(pos + i * 8, 0); uint start = StreamHelper.ReadU32(s); uint streamIdx = StreamHelper.ReadU32(s); st.Seek(start, 0); string name = StreamHelper.ReadCString(st); files.Add(name, streamIdx); } }
public TPIStream(Stream s) { Version = StreamHelper.ReadU32(s); HeaderSize = StreamHelper.ReadU32(s); TypeIndexBegin = StreamHelper.ReadU32(s); TypeIndexEnd = StreamHelper.ReadU32(s); TypeRecordBytes = StreamHelper.ReadU32(s); HashStreamIndex = StreamHelper.ReadU16(s); HashAuxStreamIndex = StreamHelper.ReadU16(s); HashKeySize = StreamHelper.ReadU32(s); NumHashBuckets = StreamHelper.ReadU32(s); HashValueBufferOffset = StreamHelper.ReadU32(s); HashValueBufferLength = StreamHelper.ReadU32(s); IndexOffsetBufferOffset = StreamHelper.ReadU32(s); IndexOffsetBufferLength = StreamHelper.ReadU32(s); HashAdjBufferOffset = StreamHelper.ReadU32(s); HashAdjBufferLength = StreamHelper.ReadU32(s); long pos = s.Position; while (s.Position - pos < TypeRecordBytes) { records.Add(new TypeRecord(s)); } }
public FieldListEntry(Stream s) { pos = (uint)s.Position; u1 = StreamHelper.ReadU16(s); switch (u1) { case 0x1502: u2 = StreamHelper.ReadU16(s); u3 = StreamHelper.ReadU16(s); if ((u3 & 0x8000) != 0) { u4 = StreamHelper.ReadU32(s); } name = StreamHelper.ReadCString(s); break; case 0x150D: u2 = StreamHelper.ReadU16(s); u3 = StreamHelper.ReadU16(s); u4 = StreamHelper.ReadU32(s); if ((u4 & 0x80000000) != 0) { u5 = StreamHelper.ReadU32(s); } name = StreamHelper.ReadCString(s); break; case 0x150E: case 0x150F: case 0x1510: case 0x1511: u2 = StreamHelper.ReadU16(s); u3 = StreamHelper.ReadU16(s); u4 = StreamHelper.ReadU16(s); if ((u2 & 0x10) != 0 && u2 != 0x16) { u5 = StreamHelper.ReadU32(s); } name = StreamHelper.ReadCString(s); break; case 0x1400: u2 = StreamHelper.ReadU16(s); u3 = StreamHelper.ReadU16(s); u4 = StreamHelper.ReadU32(s); name = ""; break; case 0x1401: u2 = StreamHelper.ReadU16(s); u3 = StreamHelper.ReadU16(s); u4 = StreamHelper.ReadU32(s); StreamHelper.ReadU32(s); StreamHelper.ReadU16(s); name = ""; break; case 0x1402: u2 = StreamHelper.ReadU16(s); u3 = StreamHelper.ReadU16(s); u4 = StreamHelper.ReadU32(s); u5 = StreamHelper.ReadU32(s); StreamHelper.ReadU16(s); name = ""; break; case 0x1404: u2 = StreamHelper.ReadU16(s); u3 = StreamHelper.ReadU16(s); u4 = StreamHelper.ReadU16(s); u5 = StreamHelper.ReadU16(s); StreamHelper.ReadU16(s); name = ""; break; case 0x1409: u2 = StreamHelper.ReadU16(s); u3 = StreamHelper.ReadU16(s); u4 = StreamHelper.ReadU16(s); name = ""; break; default: throw new Exception(); } StreamHelper.Align(s); }