From a2fc3a4090bf1f7110712460a8194e169a210e9f Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Mon, 17 Nov 2014 17:46:27 +0000 Subject: [ProcessWindows] Implement read / write process memory. llvm-svn: 222147 --- .../Plugins/Process/Windows/ProcessWindows.cpp | 30 ++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'lldb/source/Plugins/Process/Windows/ProcessWindows.cpp') diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp index 3c8e4a60010..da61ba9d193 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 -- cgit v1.2.3