[ProcessWindows] Implement read / write process memory.
authorZachary Turner <zturner@google.com>
Mon, 17 Nov 2014 17:46:27 +0000 (17:46 +0000)
committerZachary Turner <zturner@google.com>
Mon, 17 Nov 2014 17:46:27 +0000 (17:46 +0000)
llvm-svn: 222147

lldb/include/lldb/Host/HostNativeProcessBase.h
lldb/source/Plugins/Process/Windows/ProcessWindows.cpp
lldb/source/Plugins/Process/Windows/ProcessWindows.h

index 1eb5a5f..ba16bf2 100644 (file)
@@ -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:
index 3c8e4a6..da61ba9 100644 (file)
@@ -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<void *>(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<void *>(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
index 0505393..0956f88 100644 (file)
@@ -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;