Пример #1
0
        private static uint _ElementSizeForDisplayFormat(DbgMemoryDisplayFormat format, uint pointerSize)
        {
            switch (format)
            {
            case DbgMemoryDisplayFormat.AsciiOnly:
            case DbgMemoryDisplayFormat.Bytes:
                return(1);

            case DbgMemoryDisplayFormat.UnicodeOnly:
            case DbgMemoryDisplayFormat.Words:
            case DbgMemoryDisplayFormat.WordsWithAscii:
                return(2);

            case DbgMemoryDisplayFormat.DWords:
            case DbgMemoryDisplayFormat.DWordsWithAscii:
            case DbgMemoryDisplayFormat.DWordsWithBits:
                return(4);

            case DbgMemoryDisplayFormat.QWords:
            case DbgMemoryDisplayFormat.QWordsWithAscii:
                return(8);

            case DbgMemoryDisplayFormat.Pointers:
            case DbgMemoryDisplayFormat.PointersWithSymbols:
            case DbgMemoryDisplayFormat.PointersWithAscii:
            case DbgMemoryDisplayFormat.PointersWithSymbolsAndAscii:
                return(pointerSize);

            default:
                throw new NotImplementedException();
            }
        }
Пример #2
0
        /// <summary>
        ///    Returns "true" if the number of bytes read (readSize) is evenly divisible
        ///    by the element size implied by the display format.
        /// </summary>
        private static bool _IsDisplayFormatCompatibleWithReadSize(uint readSize,
                                                                   DbgMemoryDisplayFormat format,
                                                                   uint pointerSize)
        {
            uint elemSize = _ElementSizeForDisplayFormat(format, pointerSize);

            return(0 == (readSize % elemSize));
        }
Пример #3
0
        } // end ProcessRecord()

        private static uint _GetDefaultReadSize(DbgMemoryDisplayFormat fmt)
        {
            if ((fmt == DbgMemoryDisplayFormat.AsciiOnly) ||
                (fmt == DbgMemoryDisplayFormat.UnicodeOnly))
            {
                return(704); // This is an oddball default... but it seems to be what windbg does.
            }
            else
            {
                return(128);
            }
        } // end _GetDefaultReadSize()
Пример #4
0
        public ColorString ToColorString(DbgMemoryDisplayFormat format, uint numColumns)
        {
            // This is a little awkward, but we do it like this (temporarily swapping out
            // the DefaultDisplayFormat) because the formatting routines access the
            // Count and indexer properties, which depend on that.
            DbgMemoryDisplayFormat originalDisplayFormat = DefaultDisplayFormat;

            DefaultDisplayFormat = format;

            try
            {
                switch (format)
                {
                case DbgMemoryDisplayFormat.AsciiOnly:
                    return(_FormatCharsOnly(numColumns, 1, (c) =>
                    {
                        if ((c >= 32) && (c < 127))
                        {
                            return c;
                        }
                        else
                        {
                            return '.';
                        }
                    }));

                case DbgMemoryDisplayFormat.Bytes:
                    return(_FormatBlocks(1, 3, numColumns, AddtlInfo.Ascii));

                case DbgMemoryDisplayFormat.UnicodeOnly:
                    return(_FormatCharsOnly(numColumns, 2, (c) =>
                    {
                        // This seems somewhat arbitrary... what about surrogate
                        // pairs, for instance? Will the console ever be able to
                        // display such things?
                        //
                        // The dbgeng "du" command uses "iswprint"... but I don't know
                        // of an easy .NET equivalent. I'll err on the side of trying
                        // to print it; worst case is we get a weird question box
                        // instead of a dot.
                        if (!Char.IsControl(c) &&
                            !Char.IsSeparator(c) &&
                            !(Char.GetUnicodeCategory(c) == UnicodeCategory.PrivateUse) &&
                            !(Char.GetUnicodeCategory(c) == UnicodeCategory.Format) &&
                            !(Char.GetUnicodeCategory(c) == UnicodeCategory.OtherNotAssigned))
                        {
                            return c;
                        }
                        else
                        {
                            return '.';
                        }
                    }));

                case DbgMemoryDisplayFormat.Words:
                    return(_FormatBlocks(2, 5, numColumns));

                case DbgMemoryDisplayFormat.WordsWithAscii:
                    return(_FormatBlocks(2, 5, numColumns, AddtlInfo.Ascii));

                case DbgMemoryDisplayFormat.DWords:
                    return(_FormatBlocks(4, 9, numColumns));

                case DbgMemoryDisplayFormat.DWordsWithAscii:
                    return(_FormatBlocks(4, 9, numColumns, AddtlInfo.Ascii));

                case DbgMemoryDisplayFormat.DWordsWithBits:
                    return(_FormatBits());

                case DbgMemoryDisplayFormat.QWords:
                    return(_FormatBlocks(8, 18, numColumns));

                case DbgMemoryDisplayFormat.QWordsWithAscii:
                    return(_FormatBlocks(8, 18, numColumns, AddtlInfo.Ascii));

                case DbgMemoryDisplayFormat.Pointers:
                    if (m_is32Bit)
                    {
                        return(_FormatBlocks(4, 9, numColumns));
                    }
                    else
                    {
                        return(_FormatBlocks(8, 18, numColumns));
                    }

                case DbgMemoryDisplayFormat.PointersWithSymbols:
                    // I could complain if numColumns is set... but I'll just ignore it instead.
                    if (m_is32Bit)
                    {
                        return(_FormatBlocks(4, 9, 1, AddtlInfo.Symbols));
                    }
                    else
                    {
                        return(_FormatBlocks(8, 18, 1, AddtlInfo.Symbols));
                    }

                case DbgMemoryDisplayFormat.PointersWithAscii:
                    // I could complain if numColumns is set... but I'll just ignore it instead.
                    if (m_is32Bit)
                    {
                        return(_FormatBlocks(4, 9, numColumns, AddtlInfo.Ascii));
                    }
                    else
                    {
                        return(_FormatBlocks(8, 18, numColumns, AddtlInfo.Ascii));
                    }

                case DbgMemoryDisplayFormat.PointersWithSymbolsAndAscii:
                    // I could complain if numColumns is set... but I'll just ignore it instead.
                    if (m_is32Bit)
                    {
                        return(_FormatBlocks(4, 9, 1, AddtlInfo.Symbols | AddtlInfo.Ascii));
                    }
                    else
                    {
                        return(_FormatBlocks(8, 18, 1, AddtlInfo.Symbols | AddtlInfo.Ascii));
                    }

                default:
                    throw new NotImplementedException();
                }
            }
            finally
            {
                DefaultDisplayFormat = originalDisplayFormat;
            }
        } // end ToColorString()
Пример #5
0
 public ColorString ToColorString(DbgMemoryDisplayFormat format)
 {
     return(ToColorString(format, DefaultDisplayColumns));
 }
Пример #6
0
        public ColorString ToColorString(DbgMemoryDisplayFormat format, uint numColumns)
        {
            // This is a little awkward, but we do it like this (temporarily swapping out
            // the DefaultDisplayFormat) because the formatting routines access the
            // Count and indexer properties, which depend on that.
            DbgMemoryDisplayFormat originalDisplayFormat = DefaultDisplayFormat;

            DefaultDisplayFormat = format;

            try
            {
                switch (format)
                {
                case DbgMemoryDisplayFormat.AsciiOnly:
                    return(_FormatCharsOnly(numColumns, (c) =>
                    {
                        if ((c >= 32) && (c < 127))
                        {
                            return c;
                        }
                        else
                        {
                            return '.';
                        }
                    }));

                case DbgMemoryDisplayFormat.Bytes:
                    return(_FormatBlocks(1, 3, numColumns, AddtlInfo.Ascii));

                case DbgMemoryDisplayFormat.UnicodeOnly:
                    return(_FormatCharsOnly(numColumns, (c) =>
                    {
                        // This seems wrong... what about surrogate pairs, for instance? I should
                        // look at what the actual code for the "du" command does.
                        if (!Char.IsControl(c) &&
                            !Char.IsSeparator(c))
                        {
                            return c;
                        }
                        else
                        {
                            return '.';
                        }
                    }));

                case DbgMemoryDisplayFormat.Words:
                    return(_FormatBlocks(2, 5, numColumns));

                case DbgMemoryDisplayFormat.WordsWithAscii:
                    return(_FormatBlocks(2, 5, numColumns, AddtlInfo.Ascii));

                case DbgMemoryDisplayFormat.DWords:
                    return(_FormatBlocks(4, 9, numColumns));

                case DbgMemoryDisplayFormat.DWordsWithAscii:
                    return(_FormatBlocks(4, 9, numColumns, AddtlInfo.Ascii));

                case DbgMemoryDisplayFormat.DWordsWithBits:
                    return(_FormatBits());

                case DbgMemoryDisplayFormat.QWords:
                    return(_FormatBlocks(8, 18, numColumns));

                case DbgMemoryDisplayFormat.QWordsWithAscii:
                    return(_FormatBlocks(8, 18, numColumns, AddtlInfo.Ascii));

                case DbgMemoryDisplayFormat.Pointers:
                    if (m_is32Bit)
                    {
                        return(_FormatBlocks(4, 9, numColumns));
                    }
                    else
                    {
                        return(_FormatBlocks(8, 18, numColumns));
                    }

                case DbgMemoryDisplayFormat.PointersWithSymbols:
                    // I could complain if numColumns is set... but I'll just ignore it instead.
                    if (m_is32Bit)
                    {
                        return(_FormatBlocks(4, 9, 1, AddtlInfo.Symbols));
                    }
                    else
                    {
                        return(_FormatBlocks(8, 18, 1, AddtlInfo.Symbols));
                    }

                case DbgMemoryDisplayFormat.PointersWithAscii:
                    // I could complain if numColumns is set... but I'll just ignore it instead.
                    if (m_is32Bit)
                    {
                        return(_FormatBlocks(4, 9, numColumns, AddtlInfo.Ascii));
                    }
                    else
                    {
                        return(_FormatBlocks(8, 18, numColumns, AddtlInfo.Ascii));
                    }

                case DbgMemoryDisplayFormat.PointersWithSymbolsAndAscii:
                    // I could complain if numColumns is set... but I'll just ignore it instead.
                    if (m_is32Bit)
                    {
                        return(_FormatBlocks(4, 9, 1, AddtlInfo.Symbols | AddtlInfo.Ascii));
                    }
                    else
                    {
                        return(_FormatBlocks(8, 18, 1, AddtlInfo.Symbols | AddtlInfo.Ascii));
                    }

                default:
                    throw new NotImplementedException();
                }
            }
            finally
            {
                DefaultDisplayFormat = originalDisplayFormat;
            }
        } // end ToColorString()