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(); } }
/// <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)); }
} // 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()
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()
public ColorString ToColorString(DbgMemoryDisplayFormat format) { return(ToColorString(format, DefaultDisplayColumns)); }
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()