public void ShouldAddIntToTable()
        {
            var hashTable = new IntHashTable();

            hashTable.Add(1);

            Assert.True(hashTable.Contains(1));
        }
Beispiel #2
0
        static IntHashTable LoadNameStream(BitAccess bits)
        {
            IntHashTable ht = new IntHashTable();

            uint sig;
            int  ver;

            bits.ReadUInt32(out sig);   //  0..3  Signature
            bits.ReadInt32(out ver);    //  4..7  Version

            // Read (or skip) string buffer.
            int buf;

            bits.ReadInt32(out buf);    //  8..11 Bytes of Strings

            if (sig != 0xeffeeffe || ver != 1)
            {
                throw new PdbDebugException("Unsupported Name Stream version. " +
                                            "(sig={0:x8}, ver={1})",
                                            sig, ver);
            }
            int beg = bits.Position;
            int nxt = bits.Position + buf;

            bits.Position = nxt;

            // Read hash table.
            int siz;

            bits.ReadInt32(out siz);    // n+0..3 Number of hash buckets.
            nxt = bits.Position;

            for (int i = 0; i < siz; i++)
            {
                int    ni;
                string name;

                bits.ReadInt32(out ni);

                if (ni != 0)
                {
                    int saved = bits.Position;
                    bits.Position = beg + ni;
                    bits.ReadCString(out name);
                    bits.Position = saved;

                    ht.Add(ni, name);
                }
            }
            bits.Position = nxt;

            return(ht);
        }
        private static IntHashTable LoadNameStream(BitAccess bits)
        {
            IntHashTable ht = new IntHashTable();

            uint sig;
            int ver;
            bits.ReadUInt32(out sig);   //  0..3  Signature
            bits.ReadInt32(out ver);    //  4..7  Version

            // Read (or skip) string buffer.
            int buf;
            bits.ReadInt32(out buf);    //  8..11 Bytes of Strings

            if (sig != 0xeffeeffe || ver != 1)
            {
                throw new Exception(string.Format("Unsupported Name Stream version. (sig={0:x8}, ver={1})", sig, ver));
            }
            int beg = bits.Position;
            int nxt = bits.Position + buf;
            bits.Position = nxt;

            // Read hash table.
            int siz;
            bits.ReadInt32(out siz);    // n+0..3 Number of hash buckets.
            nxt = bits.Position;

            for (int i = 0; i < siz; i++)
            {
                int ni;
                string name;

                bits.ReadInt32(out ni);

                if (ni != 0)
                {
                    int saved = bits.Position;
                    bits.Position = beg + ni;
                    bits.ReadCString(out name);
                    bits.Position = saved;

                    ht.Add(ni, name);
                }
            }
            bits.Position = nxt;

            return ht;
        }
        private static IntHashTable ReadSourceFileInfo(
            BitAccess bits, uint limit, IntHashTable names, MsfDirectory dir,
            Dictionary<string, int> nameIndex, PdbReader reader)
        {
            IntHashTable checks = new IntHashTable();

            int begin = bits.Position;
            while (bits.Position < limit)
            {
                int sig;
                int siz;
                bits.ReadInt32(out sig);
                bits.ReadInt32(out siz);
                int place = bits.Position;
                int endSym = bits.Position + siz;

                switch ((DEBUG_S_SUBSECTION)sig)
                {
                    case DEBUG_S_SUBSECTION.FILECHKSMS:
                        while (bits.Position < endSym)
                        {
                            CV_FileCheckSum chk;

                            int ni = bits.Position - place;
                            bits.ReadUInt32(out chk.name);
                            bits.ReadUInt8(out chk.len);
                            bits.ReadUInt8(out chk.type);

                            PdbSource src = new PdbSource(/*(uint)ni,*/ (string)names[(int)chk.name], SymDocumentType.Text, Guid.Empty, Guid.Empty);
                            checks.Add(ni, src);
                            bits.Position += chk.len;
                            bits.Align(4);
                        }
                        bits.Position = endSym;
                        break;

                    default:
                        bits.Position = endSym;
                        break;
                }
            }
            return checks;
        }
Beispiel #5
0
        private void RepairPropTypes()
        {
            int propID       = GetPropId("ID");
            int propName     = GetPropId("Name");
            int propDataType = GetPropId("DataType");
            int propFlags    = GetPropId("Flags");
            int typePropType = GetResourceTypeId("PropType");

            bool needRebuildIndexes = false;

            if (_propTypes.PeekNextID() > 65536)
            {
                needRebuildIndexes = true;
            }

            using (IResultSet rs = _propTypes.CreateResultSet(0))
            {
                foreach (IRecord rec in rs)
                {
                    int    typeId   = rec.GetIntValue(0);
                    string name     = rec.GetStringValue(1);
                    int    dataType = rec.GetIntValue(2);
                    int    flags    = rec.GetIntValue(3);

                    if (typeId < 0 || typeId > 65536)
                    {
                        ReportError("Invalid property type ID " + typeId);
                        if (_fixErrors)
                        {
                            rec.Delete();
                            _fixCount++;
                            needRebuildIndexes = true;
                            continue;
                        }
                    }

                    if (_propTypeMap.Contains(typeId))
                    {
                        ReportError("Duplicate property ID " + typeId);
                    }
                    if (_propTypeNames.Contains(name))
                    {
                        ReportError("Duplicate property name " + name);
                    }
                    _propTypeMap.Add(typeId, name);
                    _propTypeNames.Add(name);
                    _propDataTypes [typeId] = dataType;

                    if (_dumpStructure)
                    {
                        ShowProgress("Property type {0}, name {1}, dataType {2}, flags {3}",
                                     typeId, name, dataType, (PropTypeFlags)flags);
                    }

                    int resID;
                    try
                    {
                        resID = FindResource(typePropType, _stringProps, propName, name);
                    }
                    catch (Exception e)
                    {
                        ReportError("Property " + name + ": " + e.Message);
                        continue;
                    }
                    if (resID == -1)
                    {
                        ReportError("Could not find matching resource for property name " + name);
                        if (_fixErrors)
                        {
                            try
                            {
                                int resourceId = CreateResource(typePropType);
                                CreatePropValue(_stringProps, resourceId, propName, name);
                                CreatePropValue(_intProps, resourceId, propID, typeId);
                                CreatePropValue(_intProps, resourceId, propDataType, dataType);
                                CreatePropValue(_intProps, resourceId, propFlags, flags);
                                _fixCount++;
                            }
                            catch (Exception e)
                            {
                                ReportError("Failed to create property type resource: " + e.Message);
                            }
                        }
                        continue;
                    }

                    object idValue = GetPropValueSafe(_intProps, resID, propID);
                    if (idValue == null)
                    {
                        ReportError("ID property not found for property " + name);
                    }
                    else if ((int)idValue != typeId)
                    {
                        ReportError("ID property for property " + name + " does not match ID value");
                        if (_fixErrors)
                        {
                            Trace.WriteLine("Set ID property of PropType resource " + name + " to " + typeId);
                            UpdatePropValue(_intProps, resID, propID, typeId);
                            _fixCount++;
                        }
                    }

                    object dataTypeValue = GetPropValueSafe(_intProps, resID, propDataType);
                    if (dataTypeValue == null)
                    {
                        ReportError("DataType property not found for property " + name);
                    }
                    else if ((int)dataTypeValue != dataType)
                    {
                        ReportError("DataType property for property " + name + " does not match Type value");
                    }

                    object flagsValue = GetPropValueSafe(_intProps, resID, propFlags);
                    if (flagsValue == null)
                    {
                        ReportError("Flags property not found for property " + name);
                    }
                    else if ((int)flagsValue != flags)
                    {
                        ReportError("Flags property for property " + name + " does not match Flags value. Fixing...");
                        UpdatePropValue(_intProps, resID, propFlags, flags);
                        _fixCount++;
                    }
                }
            }

            if (needRebuildIndexes)
            {
                _propTypes.RebuildIndexes(true);
            }
        }
Beispiel #6
0
    public static int Main()
    {
        Console.WriteLine("Lab №4, Ozierski Vital, group 052004");

        IntHashTable ih = new IntHashTable(50);
        StringHashTable sh = new StringHashTable(16);

        string cmd, command, mode;
        bool found;
        while (true)
        {
            Console.WriteLine();
            Console.WriteLine("Commands: add, find, print");
            Console.WriteLine("Format: <command> <int|string> or exit");
            Console.Write("? ");
            cmd = Console.ReadLine();
            if (cmd == "exit")
                break;
            if (cmd.Split(' ').Length != 2)
                Console.WriteLine("Incorrect command format");
            else
            {
                command = cmd.Split(' ')[0];
                mode = cmd.Split(' ')[1];
                if (mode != "string" && mode != "int")
                    Console.WriteLine("Incorrect mode");
                else
                {
                    if (command == "add")
                    {
                        Console.Write("Value: ");
                        cmd = Console.ReadLine();
                        if (mode == "string")
                            sh.Add(cmd);
                        else if (mode == "int")
                            ih.Add(Int32.Parse(cmd));
                    }
                    else if (command == "find")
                    {
                        Console.Write("Value: ");
                        cmd = Console.ReadLine();
                        found = false;
                        if (mode == "string")
                            found = sh.Find(cmd);
                        else if (mode == "int")
                            found = ih.Find(Int32.Parse(cmd));
                        Console.WriteLine(found ? "Found" : "No found");
                    }
                    else if (command == "print")
                    {
                        if (mode == "string")
                            sh.Print();
                        else if (mode == "int")
                            ih.Print();
                    }
                    else
                        Console.WriteLine("Incorrect Command");
                }
                Console.WriteLine();
            }
        }

        return 0;
    }
Beispiel #7
0
        static void LoadManagedLines(PdbFunction[] funcs,
                                     IntHashTable names,
                                     BitAccess bits,
                                     uint limit)
        {
            Array.Sort(funcs, PdbFunction.byAddress);
            checks.Clear();

            // Read the files first
            int begin = bits.Position;

            while (bits.Position < limit)
            {
                int sig;
                int siz;
                bits.ReadInt32(out sig);
                bits.ReadInt32(out siz);
                int place  = bits.Position;
                int endSym = bits.Position + siz;

                switch ((DEBUG_S_SUBSECTION)sig)
                {
                case DEBUG_S_SUBSECTION.FILECHKSMS:
                    while (bits.Position < endSym)
                    {
                        CV_FileCheckSum chk;

                        int ni = bits.Position - place;
                        bits.ReadUInt32(out chk.name);
                        bits.ReadUInt8(out chk.len);
                        bits.ReadUInt8(out chk.type);

                        string    name = (string)names[(int)chk.name];
                        PdbSource src  = new PdbSource((uint)ni, name);
                        checks.Add(ni, src);
                        bits.Position += chk.len;
                        bits.Align(4);
                    }
                    bits.Position = endSym;
                    break;

                default:
                    bits.Position = endSym;
                    break;
                }
            }

            // Read the lines next.
            bits.Position = begin;
            while (bits.Position < limit)
            {
                int sig;
                int siz;
                bits.ReadInt32(out sig);
                bits.ReadInt32(out siz);
                int endSym = bits.Position + siz;

                switch ((DEBUG_S_SUBSECTION)sig)
                {
                case DEBUG_S_SUBSECTION.LINES: {
                    CV_LineSection sec;

                    bits.ReadUInt32(out sec.off);
                    bits.ReadUInt16(out sec.sec);
                    bits.ReadUInt16(out sec.flags);
                    bits.ReadUInt32(out sec.cod);
                    PdbFunction func = FindFunction(funcs, sec.sec, sec.off);

                    // Count the line blocks.
                    int begSym = bits.Position;
                    int blocks = 0;
                    while (bits.Position < endSym)
                    {
                        CV_SourceFile file;
                        bits.ReadUInt32(out file.index);
                        bits.ReadUInt32(out file.count);
                        bits.ReadUInt32(out file.linsiz);       // Size of payload.
                        int linsiz = (int)file.count * (8 + ((sec.flags & 1) != 0 ? 4 : 0));
                        bits.Position += linsiz;
                        blocks++;
                    }

                    func.lines = new PdbLines[blocks];
                    int block = 0;

                    bits.Position = begSym;
                    while (bits.Position < endSym)
                    {
                        CV_SourceFile file;
                        bits.ReadUInt32(out file.index);
                        bits.ReadUInt32(out file.count);
                        bits.ReadUInt32(out file.linsiz);       // Size of payload.

                        PdbSource src = (PdbSource)checks[(int)file.index];
                        PdbLines  tmp = new PdbLines(src, file.count);
                        func.lines[block++] = tmp;
                        PdbLine[] lines = tmp.lines;

                        int plin = bits.Position;
                        int pcol = bits.Position + 8 * (int)file.count;

                        for (int i = 0; i < file.count; i++)
                        {
                            CV_Line   line;
                            CV_Column column = new CV_Column();

                            bits.Position = plin + 8 * i;
                            bits.ReadUInt32(out line.offset);
                            bits.ReadUInt32(out line.flags);

                            uint delta     = (line.flags & 0x7f000000) >> 24;
                            bool statement = ((line.flags & 0x80000000) == 0);
                            if ((sec.flags & 1) != 0)
                            {
                                bits.Position = pcol + 4 * i;
                                bits.ReadUInt16(out column.offColumnStart);
                                bits.ReadUInt16(out column.offColumnEnd);
                            }

                            lines[i] = new PdbLine(line.offset,
                                                   line.flags & 0xffffff,
                                                   column.offColumnStart,
                                                   column.offColumnEnd);
                        }
                    }
                    break;
                }
                }
                bits.Position = endSym;
            }
        }