Пример #1
0
            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));
                }
            }
Пример #2
0
 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);
 }
Пример #3
0
 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);
 }
Пример #4
0
        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();
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
        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();
        }
Пример #7
0
 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);
 }
Пример #8
0
 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;
     }
 }
Пример #9
0
        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";
        }
Пример #10
0
        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();
        }
Пример #11
0
        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);
            }
        }
Пример #12
0
        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));
            }
        }
Пример #13
0
            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);
            }