diff options
Diffstat (limited to 'lldb/source')
| -rw-r--r-- | lldb/source/Plugins/Process/Windows/ProcessWindows.cpp | 30 | ||||
| -rw-r--r-- | lldb/source/Plugins/Process/Windows/ProcessWindows.h | 3 | 
2 files changed, 30 insertions, 3 deletions
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<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 diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.h b/lldb/source/Plugins/Process/Windows/ProcessWindows.h index 050539331df..0956f882fbd 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;  | 

