From 6fe1ac9d769dee7d283d15e000d7e3ef0048a41f Mon Sep 17 00:00:00 2001 From: Eusebiu Marcu Date: Sun, 3 Apr 2011 23:39:23 +0300 Subject: [PATCH] Read virtual memory of a process. --- data/resources/StringResources.resx | 11 +- .../image/BitmapResources/BitmapResources.res | 4 +- .../BitmapResources/PadIcons/NextMemory.png | Bin 0 -> 3433 bytes .../PadIcons/PreviousMemory.png | Bin 0 -> 3455 bytes .../Debugger.AddIn/Debugger.AddIn.addin | 26 +++- .../Pads/Commands/MemoryPadCommands.cs | 33 ++++- .../Debugger/Debugger.AddIn/Pads/MemoryPad.cs | 103 ++++++++++---- .../Debugger.Core/Interop/NativeMethods.cs | 131 ++++++++++++++---- .../Src/Gui/Pads/AbstractConsolePad.cs | 1 - .../Resources/BitmapResources.resources | Bin 674415 -> 681759 bytes 10 files changed, 243 insertions(+), 66 deletions(-) create mode 100644 data/resources/image/BitmapResources/PadIcons/NextMemory.png create mode 100644 data/resources/image/BitmapResources/PadIcons/PreviousMemory.png diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index f29cd9261e..c4f3dcf887 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -5735,7 +5735,16 @@ Microsoft.Tools.WindowsInstallerXml.Extensions.NetFxCompiler, WixNetFxExtension< Jump to address: - Refresh + Refresh current addresses + + + Next virtual addresses + + + The address {0} was not found! + + + Previous virtual addresses Parallel Stacks diff --git a/data/resources/image/BitmapResources/BitmapResources.res b/data/resources/image/BitmapResources/BitmapResources.res index 3e8469ea86..2604ffecaf 100644 --- a/data/resources/image/BitmapResources/BitmapResources.res +++ b/data/resources/image/BitmapResources/BitmapResources.res @@ -47,7 +47,9 @@ OutputPad.Toolbar.ClearOutputWindow = OutputPadIcons\ClearOutputWindow.png OutputPad.Toolbar.ToggleWordWrap = OutputPadIcons\ToggleWordWrap.png #Memory pad -MemoryPad.Icon = PadIcons\memory.png +MemoryPad.Icon = PadIcons\memory.png +MemoryPad.NextMemoryIcon = PadIcons\nextmemory.png +MemoryPad.PreviousMemoryIcon = PadIcons\previousmemory.png Icons.16x16.OpenFolderBitmap = ProjectBrowserIcons\Folder.Open.png Icons.16x16.ClosedFolderBitmap = ProjectBrowserIcons\Folder.Closed.png diff --git a/data/resources/image/BitmapResources/PadIcons/NextMemory.png b/data/resources/image/BitmapResources/PadIcons/NextMemory.png new file mode 100644 index 0000000000000000000000000000000000000000..5f62ce83c8a2aecc66f862b515190e77c20be30a GIT binary patch literal 3433 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 hM2!M> - - - + + + + + + + class="ICSharpCode.SharpDevelop.Gui.Pads.RefreshAddressCommand"/> diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/Commands/MemoryPadCommands.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/Commands/MemoryPadCommands.cs index 8b37bbffb0..58bc7e716d 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/Commands/MemoryPadCommands.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/Commands/MemoryPadCommands.cs @@ -40,9 +40,9 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads } } - public sealed class RefreshMemoryCommand : AbstractCommand + public abstract class ItemMemoryCommand : AbstractCommand { - MemoryPad pad; + protected MemoryPad pad; protected override void OnOwnerChanged(EventArgs e) { @@ -52,13 +52,38 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads base.OnOwnerChanged(e); } - + } + + public sealed class RefreshAddressCommand : ItemMemoryCommand + { + public override void Run() + { + if (this.pad == null) + return; + + this.pad.Refresh(); + } + } + + public sealed class NextAddressCommand : ItemMemoryCommand + { + public override void Run() + { + if (this.pad == null) + return; + + this.pad.MoveToNextAddress(); + } + } + + public sealed class PreviousAddressCommand : ItemMemoryCommand + { public override void Run() { if (this.pad == null) return; - this.pad.Refresh(true); + this.pad.MoveToPreviousAddress(); } } } diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/MemoryPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/MemoryPad.cs index 1ba1f5735d..1d6a369c4a 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Pads/MemoryPad.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/MemoryPad.cs @@ -18,11 +18,13 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads { public sealed class MemoryPad : DebuggerPad { - Dictionary addressesMapping = new Dictionary(); + int currentAddressIndex; ConsoleControl console; int addressStep = 16; Process debuggedProcess; + List> memoryAddresses = new List>(); + Dictionary addressesMapping = new Dictionary(); public MemoryPad() { @@ -40,13 +42,12 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads protected override void SelectProcess(Process process) { - if (debuggedProcess != null) { - debuggedProcess.Paused -= OnProcessPaused; - } + if (process == null) + return; + debuggedProcess = process; - if (debuggedProcess != null) { - debuggedProcess.Paused += OnProcessPaused; - } + memoryAddresses = debuggedProcess.GetMemoryAddresses(); + currentAddressIndex = 0; } public override void RefreshPad() @@ -62,16 +63,33 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads address = address.Substring(2); long addr = Int64.Parse(address, NumberStyles.AllowHexSpecifier); - long mod = addr % addressStep; + // find index for the address or the near addess + currentAddressIndex = memoryAddresses.Search(addr); + if (currentAddressIndex == -1) { + MessageService.ShowMessage( + string.Format(ResourceService.GetString("MainWindow.Windows.Debug.MemoryPad.AddressNotFound"), address), + ResourceService.GetString("MainWindow.Windows.Debug.MemoryPad")); + + currentAddressIndex = 0; + return; + } + + // refresh pad + Refresh(); + + // find line + long mod = addr % addressStep; int line; if (addressesMapping.ContainsKey(addr - mod)) line = addressesMapping[addr - mod]; else line = 1; - + + // jump console.SelectText(line, 0, 8); console.JumpToLine(line); + } catch (System.Exception ex) { #if DEBUG LoggingService.Error(ex.Message); @@ -79,34 +97,33 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads } } - public void Refresh(bool force = false) + public void Refresh() { if (debuggedProcess == null || debugger.IsProcessRunning) return; - if (!force && addressesMapping.Count > 0) + if (memoryAddresses.Count == 0) return; - if (force) { - addressesMapping.Clear(); - console.Clear(); - } + console.Clear();addressesMapping.Clear(); - long address; - byte[] memory = debuggedProcess.ReadProcessMemory(out address); + // get current address + var item = memoryAddresses[currentAddressIndex]; + long address = item.Item1; + long size = item.Item2; - if (memory == null) - return; + byte[] memory = debuggedProcess.ReadProcessMemory(address, size); + System.Diagnostics.Debug.Assert(memory != null); - int index = 0; int div = memory.Length / addressStep; int mod = memory.Length % addressStep; + int index = 0; while (index < div) { StringBuilder sb = new StringBuilder(); addressesMapping.Add(address, index + 1); // write address - sb.Append(address.ToString("X8"));address += addressStep; + sb.Append(address.ToString("X8")); address += (long)addressStep; sb.Append(" "); // write bytes @@ -121,13 +138,12 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads string s = sb1.ToString(); s = Regex.Replace(s, @"\r\n", string.Empty); s = Regex.Replace(s, @"\n", string.Empty); - s = Regex.Replace(s, @"\r", string.Empty); + s = Regex.Replace(s, @"\r", string.Empty); sb.Append(s); sb.Append(Environment.NewLine); // start writing in console console.Append(sb.ToString()); - index++; } @@ -151,7 +167,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads string s = sb1.ToString(); s = Regex.Replace(s, @"\r\n", string.Empty); s = Regex.Replace(s, @"\n", string.Empty); - s = Regex.Replace(s, @"\r", string.Empty); + s = Regex.Replace(s, @"\r", string.Empty); sb.Append(s); sb.Append(Environment.NewLine); @@ -161,9 +177,46 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads } } - private void OnProcessPaused(object sender, ProcessEventArgs e) + public void MoveToPreviousAddress() { + if (debuggedProcess == null || debugger.IsProcessRunning) + return; + + if (currentAddressIndex == 0) + return; + + currentAddressIndex--; + Refresh(); + } + + public void MoveToNextAddress() + { + if (debuggedProcess == null || debugger.IsProcessRunning) + return; + + if (currentAddressIndex == memoryAddresses.Count) + return; + + currentAddressIndex++; Refresh(); } } + + internal static class MemoryPadExtensions + { + internal static int Search(this List> source, long item1) + { + if (source == null) + throw new NullReferenceException("Source is null!"); + + for (int i = 0; i < source.Count - 1; i++) { + if (source[i + 1].Item1 < item1) + continue; + + return i; + } + + return -1; + } + } } diff --git a/src/AddIns/Debugger/Debugger.Core/Interop/NativeMethods.cs b/src/AddIns/Debugger/Debugger.Core/Interop/NativeMethods.cs index 5c99cf079c..cfa343243b 100644 --- a/src/AddIns/Debugger/Debugger.Core/Interop/NativeMethods.cs +++ b/src/AddIns/Debugger/Debugger.Core/Interop/NativeMethods.cs @@ -4,6 +4,7 @@ #pragma warning disable 1591 using System; +using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; @@ -38,6 +39,62 @@ namespace Debugger.Interop Synchronize = 0x00100000 } + [StructLayout(LayoutKind.Sequential)] + public struct SYSTEM_INFO + { + internal _PROCESSOR_INFO_UNION uProcessorInfo; + public uint dwPageSize; + public IntPtr lpMinimumApplicationAddress; + public IntPtr lpMaximumApplicationAddress; + public IntPtr dwActiveProcessorMask; + public uint dwNumberOfProcessors; + public uint dwProcessorType; + public uint dwAllocationGranularity; + public ushort dwProcessorLevel; + public ushort dwProcessorRevision; + } + + [StructLayout(LayoutKind.Explicit)] + public struct _PROCESSOR_INFO_UNION + { + [FieldOffset(0)] + internal uint dwOemId; + [FieldOffset(0)] + internal ushort wProcessorArchitecture; + [FieldOffset(2)] + internal ushort wReserved; + } + + [Flags] + public enum AllocationType + { + Commit = 0x1000, + Reserve = 0x2000, + Decommit = 0x4000, + Release = 0x8000, + Reset = 0x80000, + Physical = 0x400000, + TopDown = 0x100000, + WriteWatch = 0x200000, + LargePages = 0x20000000 + } + + [Flags] + public enum MemoryProtection + { + Execute = 0x10, + ExecuteRead = 0x20, + ExecuteReadWrite = 0x40, + ExecuteWriteCopy = 0x80, + NoAccess = 0x01, + ReadOnly = 0x02, + ReadWrite = 0x04, + WriteCopy = 0x08, + GuardModifierflag = 0x100, + NoCacheModifierflag = 0x200, + WriteCombineModifierflag = 0x400 + } + public static class NativeMethods { [DllImport("kernel32.dll")] @@ -63,7 +120,7 @@ namespace Debugger.Interop [DllImport("kernel32.dll", SetLastError = true)] public static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress, - UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect); + UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool ReadProcessMemory( @@ -74,45 +131,59 @@ namespace Debugger.Interop out int lpNumberOfBytesRead ); - public static byte[] ReadProcessMemory(this Process process, out long baseAddress) + [DllImport("kernel32.dll", SetLastError = true)] + public static extern void GetSystemInfo(out SYSTEM_INFO lpSystemInfo); + + [DllImport("kernel32.dll", SetLastError=true, ExactSpelling=true)] + public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect); + + public static List> GetMemoryAddresses(this Process process) { - uint handle = process.CorProcess.GetHandle(); - - var proc = System.Diagnostics.Process.GetProcessById((int)process.Id); - baseAddress = proc.MainModule.BaseAddress.ToInt64(); - long addr = baseAddress; + var result = new List>(); + SYSTEM_INFO sysinfo = new SYSTEM_INFO(); + GetSystemInfo(out sysinfo); - byte[] memory = null; + uint handle = process.CorProcess.GetHandle(); + long address = 0; + MEMORY_BASIC_INFORMATION m = new MEMORY_BASIC_INFORMATION(); - while (true) + while (address < sysinfo.lpMaximumApplicationAddress.ToInt64()) { - byte[] temp = new byte[1024]; - int outSize; - bool success = ReadProcessMemory(new IntPtr(handle), new IntPtr(addr), temp, temp.Length, out outSize); - - addr += 1024; - - if (outSize == 0) + if (!VirtualQueryEx(new IntPtr(handle), new IntPtr(address), out m, (uint)Marshal.SizeOf(m))) break; - if (memory == null) { - memory = new byte[outSize]; - Array.Copy(temp, memory, outSize); - } else { - // expand memory - byte[] newTemp = new byte[memory.Length]; - Array.Copy(memory, newTemp, memory.Length); - - memory = new byte[memory.Length + outSize]; - Array.Copy(newTemp, memory, newTemp.Length); - Array.Copy(temp, 0, memory, newTemp.Length, outSize); + try { + byte[] temp = new byte[m.RegionSize.ToInt64()]; + int outSize; + if (!ReadProcessMemory(new IntPtr(handle), new IntPtr(address), temp, temp.Length, out outSize)) + continue; + } catch { + continue; + } finally { + // next address + address = m.BaseAddress.ToInt64() + m.RegionSize.ToInt64(); } - if (!success) // break when we cannot read anymore - break; + result.Add(new Tuple(m.BaseAddress.ToInt64(), m.RegionSize.ToInt64())); + } + + return result; + } + + public static byte[] ReadProcessMemory(this Process process, long startAddress, long size) + { + uint handle = process.CorProcess.GetHandle(); + + byte[] temp = new byte[size]; + int outSize; + bool success = ReadProcessMemory(new IntPtr(handle), new IntPtr(startAddress), temp, temp.Length, out outSize); + + if (!success || outSize == 0) { + var proc = System.Diagnostics.Process.GetProcessById((int)process.Id); + return process.ReadProcessMemory(proc.MainModule.BaseAddress.ToInt64(), (long)4096); } - return memory; + return temp; } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs b/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs index a1e0e5208a..97b4ba5b48 100755 --- a/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs @@ -294,7 +294,6 @@ namespace ICSharpCode.SharpDevelop.Gui this.Children.Add(editor); editor.TextArea.ReadOnlySectionProvider = readOnlyRegion = new BeginReadOnlySectionProvider(); - editor.TextArea.TextEntered += new TextCompositionEventHandler(editor_TextArea_TextEntered); editor.TextArea.PreviewKeyDown += new KeyEventHandler(editor_TextArea_PreviewKeyDown); } diff --git a/src/Main/StartUp/Project/Resources/BitmapResources.resources b/src/Main/StartUp/Project/Resources/BitmapResources.resources index 929a830270edf97a2d8cc19c06c985ff30aeb656..be36c125ea921f2845352e1b50457b4362abddc0 100644 GIT binary patch delta 3668 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 Co;x!D