From a2fc3a4090bf1f7110712460a8194e169a210e9f Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Mon, 17 Nov 2014 17:46:27 +0000 Subject: [PATCH] [ProcessWindows] Implement read / write process memory. llvm-svn: 222147 --- lldb/include/lldb/Host/HostNativeProcessBase.h | 6 +++++ .../Plugins/Process/Windows/ProcessWindows.cpp | 30 ++++++++++++++++++++-- .../Plugins/Process/Windows/ProcessWindows.h | 3 ++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lldb/include/lldb/Host/HostNativeProcessBase.h b/lldb/include/lldb/Host/HostNativeProcessBase.h index 1eb5a5f..ba16bf2 100644 --- a/lldb/include/lldb/Host/HostNativeProcessBase.h +++ b/lldb/include/lldb/Host/HostNativeProcessBase.h @@ -40,6 +40,12 @@ class HostNativeProcessBase virtual lldb::pid_t GetProcessId() const = 0; virtual bool IsRunning() const = 0; + lldb::process_t + GetSystemHandle() const + { + return m_process; + } + virtual HostThread StartMonitoring(HostProcess::MonitorCallback callback, void *callback_baton, bool monitor_signals) = 0; protected: diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp index 3c8e4a6..da61ba9 100644 --- a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp +++ b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp @@ -19,6 +19,7 @@ #include "lldb/Core/State.h" #include "lldb/Host/Host.h" #include "lldb/Host/HostProcess.h" +#include "lldb/Host/HostNativeProcessBase.h" #include "lldb/Host/MonitoringProcessLauncher.h" #include "lldb/Host/ThreadLauncher.h" #include "lldb/Host/windows/ProcessLauncherWindows.h" @@ -224,7 +225,7 @@ Error ProcessWindows::DoDestroy() { Error error; - if (GetPrivateState() != eStateExited && GetPrivateState() != eStateDetached) + if (GetPrivateState() != eStateExited && GetPrivateState() != eStateDetached && m_session_data) { DebugActiveProcessStop(m_session_data->m_debugger->GetProcess().GetProcessId()); SetPrivateState(eStateExited); @@ -260,7 +261,32 @@ ProcessWindows::DoReadMemory(lldb::addr_t vm_addr, size_t size, Error &error) { - return 0; + if (!m_session_data) + return 0; + + HostProcess process = m_session_data->m_debugger->GetProcess(); + void *addr = reinterpret_cast(vm_addr); + SIZE_T bytes_read = 0; + if (!ReadProcessMemory(process.GetNativeProcess().GetSystemHandle(), addr, buf, size, &bytes_read)) + error.SetError(GetLastError(), eErrorTypeWin32); + return bytes_read; +} + +size_t +ProcessWindows::DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Error &error) +{ + if (!m_session_data) + return 0; + + HostProcess process = m_session_data->m_debugger->GetProcess(); + void *addr = reinterpret_cast(vm_addr); + SIZE_T bytes_written = 0; + lldb::process_t handle = process.GetNativeProcess().GetSystemHandle(); + if (WriteProcessMemory(handle, addr, buf, size, &bytes_written)) + FlushInstructionCache(handle, addr, bytes_written); + else + error.SetError(GetLastError(), eErrorTypeWin32); + return bytes_written; } bool diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.h b/lldb/source/Plugins/Process/Windows/ProcessWindows.h index 0505393..0956f88 100644 --- a/lldb/source/Plugins/Process/Windows/ProcessWindows.h +++ b/lldb/source/Plugins/Process/Windows/ProcessWindows.h @@ -112,7 +112,8 @@ public: virtual bool IsAlive (); - virtual size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, lldb_private::Error &error); + virtual size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, lldb_private::Error &error) override; + virtual size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, lldb_private::Error &error) override; // IDebugDelegate overrides. virtual void OnExitProcess(uint32_t exit_code) override; -- 2.7.4